嵌入式跟其他纯软件开发不一样,嵌入式软件的基础是要懂硬件原理,要会看懂硬件电路图,所以要有数电和模电基础。

哪些知识是嵌入式软件开发工程师必备的?有哪些要注意的问题?

嵌入式软件开发涉及的知识点很多,我仅简单说一下:

1、具备简单的硬件电路设计能力,包括数字电路和模拟电路;做嵌入式软件对硬件一样要有一定的基础;

2、MCU设计与应用,从单片机到ARM到DSP等要具备根据客户要求设计产品的能力;外围端口和设备的设计使用以及驱动程序的编写能力,包括ADC、FLASH、EEPROM、RTC、Timer、GPIO、CAN、UART、I2C、SPI、以太网、液晶显示器等等;

3、操作系统方面至少要精通一种嵌入式操作系统,比如uCOSIII、freeRTOS 、Vxworks等,并且一定要学嵌入式linux ,搞明白多任务调度、信号量、邮箱等的原理和使用;在实际的项目中使用这些操作系统并逐渐掌握它们;

4、能编写常见的linux平台下的外围设备驱动,包括但不限于ADC、GPIO、UART、I2C、摄像头、SD卡、网卡、SPI等等,搞明白字符设备、块设备以及网络设备的常用设备驱动程序架构;

5、具备GUI设计能力,可以学习Qt,它的跨平台特性使得一套设计可以应用于不同的平台包括windows以及linux;

6、具备多线程编程能力,弄懂线程池的原理并应用到实际工作中;

7、具备高并发网络通信编程能力,epoll以及libevent 的使用和设计;

8、精通C/C++,并涉猎其他编程语言比如python

9、具备至少一种数据库编程能力,嵌入式可以学习SQLite ;

10、掌握常用数据结构及算法的原理以及编程实现,包括链表、队列、二叉树等,掌握常用排序、查找等算法的实现;多关注一些开源项目,从中学习编程能力,提高自己;

掌握这些已经基本具备嵌入式系统开发能力,一定要保持时刻学习的能力,接下来就是多做项目,多解决客户问题,在实际工作中历练自己提高自己。

嵌入式开发项目中,首先需要做需求分析,然后根据需求分析进行综合考虑,这里给出几个特别要注意的问题。

1.MCU的选择

选择 MCU 时要考虑 MCU 所能够完成的功能、MCU 的价格、功耗、供电电压、I/O 口电平、管脚数目以及 MCU 的封装等因素。MCU 的功耗可以从其电气性能参数中查到。供电电压有 5V、3.3V 以及 1.8V 超低电压供电模式。为了能合理分配 MCU 的I/O资源,在 MCU 选型时可绘制一张引脚分配表,供以后的设计使用。

2.电源

(1)考虑系统对电源的需求,例如系统需要几种电源,如24V、12V、5V或者3.3V等,估计各需要多少功率或最大电流(mA)。在计算电源总功率时要考虑一定的余量,可按公式“电源总功率=2×器件总功率”来计算。

(2)考虑芯片与器件对电源波动性的需求。一般允许电源波动幅度在 ±5% 以内。对于A/D转换芯片的参考电压一般要求 ±1% 以内。

(3)考虑工作电源是使用电源模块还是使用外接电源。

3.普通I/O口

(1)上拉、下拉电阻:考虑用内部或者外部上/下拉电阻,内部上/下拉阻值一般在 700Ω 左右,低功耗模式不宜使用。外部上/下拉电阻根据需要可选 10KΩ~1MΩ 之间。

(2)开关量输入:一定要保证高低电压分明。理想情况下高电平就是电源电压,低电平就是地的电平。如果外部电路无法正确区分高低电平,但高低仍有较大压差,可考虑用 A/D 采集的方式设计处理。对分压方式中的采样点,要考虑分压电阻的选择,使该点通过采样端口的电流不小于采样最小输入电流,否则无法进行采样。

(3)开关量输出:基本原则是保证输出高电平接近电源电压,低电平接近地电平。I/O 口的吸纳电流一般大于放出电流。对小功率元器件控制最好是采用低电平控制的方式。一般情况下,若负载要求小于10mA,则可用芯片引脚直接控制;电流在 10~100mA 时可用三极管控制,在 100mA~1A 时用 IC 控制;更大的电流则适合用继电器控制,同时建议使用光电隔离芯片。

4.A/D电路与D/A电路

(1)A/D电路:要清楚前端采样基本原理,对电阻型、电流型和电压型传感器采用不同的采集电路。如果采集的信号微弱,还要考虑如何进行信号放大。

(2)D/A电路:考虑 MCU 的引脚通过何种输出电路控制实际对象。

5.控制电路

对外控制电路要注意设计的冗余与反测,要有合适的信号隔离措施等。在评估设计的布板时,一定要在构件的输入输出端引出检测孔,以方便排查错误时测量。

6. 考虑低功耗

低功耗设计并不仅仅是为了省电,更多的好处在于降低了电源模块及散热系统的成本。由于电流的减小也减少了电磁辐射和热噪声的干扰。随着设备温度的降低,器件寿命则相应延长,要做到低功耗一般需要注意以下几点:

(1)并不是所有的总线信号都要上拉。上下拉电阻也有功耗问题需要考虑。上下拉电阻拉一个单纯的输入信号,电流也就几十微安以下。但拉一个被驱动了的信号,其电流将达毫安级。所以需要考虑上下拉电阻对系统总功耗的影响。

(2)不用的I/O口不要悬空,如果悬空的话,受外界的一点点干扰就可能成为反复振荡的输入信号,而MOS器件的功耗基本取决于门电路的翻转次数。

(3)对一些外围小芯片的功耗也需要考虑。对于内部不太复杂的芯片功耗是很难确定的,它主要由引脚上的电流确定。例如有的芯片引脚在没有负载时,耗电大概不到1毫安,但负载增大以后,可能功耗很大。

7.考虑低成本

(1)正确选择电阻值与电容值。比如一个上拉电阻,可以使用4.5K-5.3K的电阻,你觉得就选个整数5K,事实上市场上不存在5K的阻值,最接近的是4.99K(精度1%),其次是5.1K(精度5%),其成本分别比精度为20%的4.7K高4倍和2倍。20%精度的电阻阻值只有1、1.5、2.2、3.3、4.7、6.8几个类别(含10的整数倍);类似地,20%精度的电容也只有以上几种值,如果选了其它的值就必须使用更高的精度,成本就翻了几倍,却不能带来任何好处。

(2)指示灯的选择。面板上的指示灯选什么颜色呢?有些人按颜色选,比如自己喜欢蓝色就选蓝色。但是其它红绿黄橙等颜色的不管大小(5mm以下)封装如何,都已成熟了几十年,价格一般都在5毛钱以下,而蓝色却是近三四年才发明的,技术成熟度和供货稳定度都较差,价格却要贵四五倍。

(3)不要什么都选最好的。在一个高速系统中并不是每一部分都工作在高速状态,而器件速度每提高一个等级,价格差不多要翻倍,另外还给信号完整性问题带来极大的负面影响。

作者:亓霂_宣萧