在做软件开发之前,总认为这是格外高精尖的工作,当踏入这个领域,发现也就那么回事儿。后来应聘嵌入式的工作,面试官问:你没有这方面的经验,这个不是你想象的那么简单。潜在意思就是你做不了,后来有幸入行,发现也就那么回事儿。再后来面试服务端的工作,人事说:嵌入式那么小的程序怎么能跟服务端的复杂比?iphone开发又说:客户端跟后台开发两码事,你会UI么,网络请求使用哪个类库什么方法?
一路走来,发现也就那么回事儿。如果你是新手,不要相信他们怎么说,坚持自己的,一点儿问题没有。
在开始进入工作之前,有点儿基础知识能事半功倍:
- 懂点儿数据结构、算法
- 懂点儿数字电路,一点儿就行
- c语言要会
你看,一点儿都不难。现在嵌入式基本都带操作系统了,所以会点儿操作系统原理和linux比较好。
接下来,我们正式进入项目开发,嵌入式的项目一般较小,只要控制好存储和运行效率就没大问题了。
在嵌入式设备上开发一个txt文本阅读器。 假如你用手机看过txt小说,对,需求就是这个,实现上下翻页,自动滚屏,书签等常用功能。
这里的嵌入式设备不带操作系统的,都是裸机。
为了简化理解,突出核心主题,省略旁枝末节的依赖,我们的开发资源只有一个:帧缓冲。简单吧。
我们知道最终数据都是绘制到帧缓冲区,通过硬件中断将帧缓冲的数据显示到显示器上。那么就可以这么理解:帧缓冲就是我们的绘制区域。
下来干什么?
我们的资源只有帧缓冲,那么要想显示文字,首先要创建文字,这是标准的废话,但确确实实需要自己实现。
-
实现文字显示
文字是一种图形图像,也就分为两种格式:位图和矢量图。这里我们使用位图,比较简单。
位图就是一个个的像素点组成,也就是字库了,首先要建造自己的字库。简单理解就是在pc上找个字库,自己写个工具,把pc上的字库转换为适合帧缓冲显示的字库。
显示某个字,就是查找字库中对应的像素信息,拷贝到帧缓冲区。
至于字间距,行间距,段落间距,字体颜色等,由你全方位控制。然后你会发现,直接控制底层更简单,原理很容明白,而衍生的上层建筑也就很容易理解,所谓一通百通就是这个道理。
-
文本格式识别
输出搞定,下面就是输入了。常见的文本编码有gbk、ucs和uft-8,至于ASCII都被兼容。当然还要处理一些细节如BMP、BOM以及大小端等,但这都不是问题。
字符编码转换:
- ucs和utf-8之间的转换有内在规律,很简单
- gbk与utf-8之间完全没规律,怎么办?做个映射表。怎么做?当然是写个工具喽。
注意:文本内容编码和文件名称编码可能不同的,要分开处理
两大主要问题解决了,就可以实现功能了。
功能实现都是逻辑问题,不复杂。需要注意的的是嵌入式开发ROM和RAM都很小,需要些技巧,尽量少的占用资源。如:
- 如何实现ram对大文件的加载
- 如何绘制帧缓冲不闪烁
- 如何在8位机上实现真色彩
- 如何在滚屏滑动时不卡顿
- 如何实现外存的热插拔
- 如何解决栈空间小无法递归
至于UI问题,我们实现了一套简单的动画库,用美工切图加动画效果做出漂亮的界面,当然,这是另外一个故事了。
嵌入式开发对数据结构和算法应用较多,因为资源有限,我们的c库连malloc都不支撑,所有代码都需要自行搭建。程序员的快乐是解决问题,如果很巧妙的解决了问题,那种快乐是不言而喻的。