My First Linux Module

My First Linux Module

Today, I successfully build my first linux hello module.
So, I write this blog to record this process.

  1. First of all add a directory named hello in the kernel/driver, and add a file hello.c, write codes like bellow:

Bitmap每个像素值由指定的掩码决定

Bitmap每个像素值由指定的掩码决定

前面写了一个小工具来转换Bitmap到不同的颜色深度,程序主要的逻辑是:
Bitmap文件头 + Bitmap信息头 + Bitmap数据
在RGB32(RGB888)转RGB565的过程中也有遇到一个小问题:输出的颜色和原图的颜色显示不正确,但是像素值是正确的。
但是使用GIMP导出的图片又是正确的。

通过比较发现内容上有一定的差异,如下图,左边是不正确的图片,右边是正确的图片:

注:图中使用的是MadEdit工具查看二进制数据。

比较发现差异的地方在于:biCompression = 3

查阅资料发现:表示每个像素值由指定的掩码决定。

而多余的16个字节依次就是RGBA的颜色掩码,这个掩码来与颜色值进行与运算,得到颜色值。

Bitmap RGB24 4字节对齐

Bitmap RGB24 4字节对齐

因为Bitmap支持最少2种颜色,并且可以支持RLC等压缩方式,所以Bitmap在嵌入式领域使用还是比较广泛的。
最近在写一个Bitmap相关的小工具时,发现自己处理出来的Bitmap,系统总是不能正常地识别,但是读出来的数据又都是正确的。而且同样的图片,通过系统工具生成的Bitmap,总会大一些,大小也超过图片LengthxWidthXColotBit + Header

问题

需求:将RGB32或RGB24的Bitmap转换成为RGB565的Bitmap,并且可以将RGB565转成RGB32和RGB24。
实现算法:

1
2
3
pixel565[0] = color[0] >> 3;// R
pixel565[1] = color[1] >> 2;// G
pixel565[2] = color[2] >> 3;// B

代码在RGB32、RGB24转RGB565和RGB565转RGB32过程中没有问题,但是在RGB565转RGB24时,出现了问题。
使用高宽均为10px的图片,转出来的图片,系统不能正确识别显示。但是用Windows绘图程序绘制出来的同样大小的图片却能正确显示。通过比较文件大小发现:

自己工具生成图片大小绘图生成图片大小
374354

读取文件时,使用file.eof()判断结尾注意事项

读取文件时,使用file.eof()判断结尾注意事项

今天写一个小功能需要读取文件,在判断文件结尾时使用了以下语句:

1
2
3
4
5
6
while(infile.eof() && infile.good())
{
infile.read((char*)&data, 1);
encodeData = data ^ CODE;
outfile.write((char*)&encodeData, 1);
}

结果最后一个字符会读取两次,后来换了种方式,事先读取文件长度,再循环,就能争取读取文件

1
2
3
4
5
6
for(int i=3; i<file_len; ++i)
{
infile.read((char*)&data, 1);
encodeData = data ^ CODE;
outfile.write((char*)&encodeData, 1);
}

最后了解到,是因为read函数需要读取失败时才将eofbit置位,所以置位时,循环还会执行一次。修改代码就没有问题了:

1
2
3
4
5
while(infile.read((char*)&data, 1) && !infile.eof() && infile.good())
{
encodeData = data ^ CODE;
outfile.write((char*)&encodeData, 1);
}

嵌入式开发一个月随笔

嵌入式开发一个月随笔

从事嵌入式开发已经有一月有余,平心而论,我还是比较喜欢嵌入式开发的,不仅因为其涉及面广可以学习到很多知识,而且嵌入式开发对动手能力要求比较高,让我不觉得无聊。

工作以来了解了嵌入式开发的相关流程,也实际动手做了几个需求。过程中遇到了很多问题也解决了很多问题,下面一一道来。

调试,纯软件开发的调试可能没那么麻烦,IDE都会集成好调试工具,就算不使用IDE,也可以单独使用调试工具进行调试,像gdb之类的。这些调试工具可以进行断点设定、单步调试、多步调试、监视内存值等等十分有用的调试手段。但是呢,到了嵌入式板级调试,现在我们就主要使用的串口打印的方法进行调试,调试起来十分麻烦,想多测几个值就必须多写几句打印语句,用起来十分繁琐(当然嵌入式板级调试也有方法可以实现高效的调试手段,比如ARM提供的调试器,JTAG等,但是我对这些都不了解,以后提升开发效率可以从这些地方入手)。