文章目录
嵌入式软件开发二十年经验总结
自我介绍
本人自研究生毕业后直接进入中科院研究所工作,中间经历了产业化公司过程,最近又回到研究所工作。接近二十年的工作时间,工作内容先后涉及物联网协议设计及相关产品研发,面向油田行业的数字化、智能化终端产品设计与开发,包括基于2.4G物理层和Lora物理层的WIA-PA无线传感器网络设备开发、压力、温度、RTU、示功仪、具备边缘计算能力的抽油机远程控制器开发、NB-IoT模组开发、4G-LTE模块开发等;相关技术包括物联网通信协议、低功耗、时间同步、离群值检测及处理、快速傅里叶分析、巴特沃斯/小波等滤波算法、抽油机matlab建模仿真等;相关技能包括熟练使用C/C++,C#、matlab、Python语言开发、软件架构设计、精通msp430、efm32、efr32、GD32、stm32系列等仪表用MCU、精通atmel9x25、瑞芯微、imx6ul等主控设备所用MCU,精通ucos、freertos、linux操作系统,在linux方面能够进行uboot、内核裁剪配置、基于build-root进行文件系统制作、设备树开发调试,基于gdbserver应用程序仿真、基于qemu的仿真环境下与真实串口、网口交互的应用程序开发与仿真。在后续的文章中,我会将上述技术、技能逐一展开陈述;如希望获取开发过的产品源码(身份必须是公司,个人免谈),可联系作者;如开展项目合作,也可联系作者。
第一部分:嵌入式软件开发
前言
嵌入式软件开发主要使用C语言开发,程序经编译后下载到单片机中去执行。那么对C语言的运用程度、软件架构思维直接决定程序的可读性、可维护性、可移植性;对单片机的理解程度关乎驱动程序、芯片级初始化、bsp引导程序、在线升级等与芯片密切相关的功能组件开发。本文不会重复C语言的语法教材、也不会赘述单片机的相关原理,只是从应用和提升的角度,有侧重点的梳理在我在工作中用的知识,结合源程序、原理图进行说明。
第一章 单片机
1.1 侧重学习单片机的哪些知识
对于一个刚入门的小白来讲,推荐了解下述知识:
1.了解单片机的基础架构
下面的两幅图,摘抄自EFM32GG系列、STM32F10x系列、at91sam9x25单片机用户参考手册的系统框图。
从上述框图中,我们可以看出单片机内部的基本构成,各种型号的单片机内部各不相同,但共性是均由内核、ram/flash、外设构成;内核由专业的内核厂商设计,现在大多数单片机均使用ARM公司设计的内核,像msp430、pic系列的单片机使用自主设计内核的单片机越来越少见了。各个厂商在ARM内核的基础上,按照各自产品的定位,设计个性化的外设。内核和外设之间对于应用程序开发者关系最大的地方就是中断,也就是说外设产生中断时,通知内核进行处理,至于当几个中断同时到来时,哪个中断先处理,哪个中断延后处理,这是通过配置内核的中断优先级来实现的。当入手一款新单片机时,系统框图不是程序开发者研究的重点,大体知道是什么内核、有哪些外设即可。
2.了解或者弄明白取指令、执行指令等流水线过程。
下图摘抄自《Cortex-M3权威指南CnR2(电子书).pdf》。
内核在晶振的作用下,依次执行取指令、解码、执行操作;当上一条指令执行到解码时,开始下一条指令的取指令操作,以此类推;因内核型号的不同,流水线的级数可能会更多。
本小结内容在过往开发过程中,仅在异常发生时,回溯异常发生的程序具体地址时使用过。
at91sam9x25程序示例:
Undefine_Instruction
MOV r13,#0
CMP r13,#0
BNE wait1
LDR R0,=0xFFFFF434
LDR R1,=0x1F
STR R1,[R0]
B