嵌入式系统编程软件架构该注意哪些方面?
内容提要
本文介绍了嵌入式系统编程软件架构方面的知识,包括模块划分、多任务还是单任务选取、单任务程序典型架构、中断服务程序、硬件驱动模块设计等。强调了软件结构的重要性。
延伸解读
模块划分的实践要点
文章强调C语言模块划分需遵循特定规则:每个模块由.c和.h文件组成,接口在.h中用extern声明,内部函数和全局变量用static限制作用域。特别指出不要在.h中定义变量,否则会导致重复定义。这些规则有助于实现低耦合高内聚,是嵌入式软件结构清晰的基础。
单任务与多任务的权衡
选择单任务还是多任务取决于软件体系是否庞大。多任务依赖操作系统调度器,通过任务控制块管理任务状态和上下文切换;单任务则宏观串行执行,主程序轮流调用各模块处理函数,模拟多任务环境。文章举例说明,手机程序多为多任务,而某些小灵通协议栈采用单任务,没有操作系统。
中断服务程序的设计约束
中断服务程序(ISR)需满足特定要求:不能返回值、不能传递参数、应尽可能短小精悍,且避免使用printf等可能引起重入和性能问题的函数。文章介绍了一种实用模式:在ISR中仅将中断类型加入队列,主程序循环中再取出处理,从而将实际工作移出ISR,保证中断响应效率。
用C模拟面向对象的动机
C语言可通过结构体和函数指针模拟面向对象的封装、继承和多态。但文章指出,这样做的主要目的不是模拟行为本身,而是解决C编程中程序框架结构分散、数据和函数脱节的问题。通过将数据与行为封装,可以改善软件结构,降低调试和维护难度。
Q&A
嵌入式系统编程中,C语言模块划分有哪些关键规则?
C语言模块划分需遵循:模块由.c和.h文件组成,.h中声明接口;外部函数和数据用extern声明;内部函数和全局变量用static声明;永远不要在.h文件中定义变量,因为定义会导致内存分配,而声明只是告诉模块在连接阶段寻找外部符号。
嵌入式系统中,如何选择多任务还是单任务架构?
选择取决于软件体系的复杂性。如果软件体系庞大,通常采用多任务方式,依赖多任务操作系统和调度器;如果软件较小,可以采用单任务方式,主程序轮流调用各模块处理程序,模拟多任务环境。
单任务程序典型架构是怎样的?
单任务程序从CPU复位地址开始,跳转到汇编startup,再跳转到main函数。在main中初始化硬件设备、初始化软件模块,然后进入死循环,在死循环中调用各模块的处理函数。
嵌入式中断服务程序(ISR)有哪些编写要求?
ISR不能返回值,不能传递参数,应尽可能短小精悍,不能使用printf等可能引起重入和性能问题的函数。通常ISR只做最紧急的处理,如将中断类型加入队列,实际处理交由主程序完成。
硬件驱动模块通常包含哪些函数?
硬件驱动模块通常包括:中断服务程序ISR、硬件初始化函数(修改寄存器、设置硬件参数、设置中断向量表、控制线、中断屏蔽位等),以及针对该设备的操作接口函数(如LCD的绘制像素、画线等,实时钟的获取/设置时间等)。
在C语言中如何模拟面向对象的特性?
可以利用结构体和函数指针模拟面向对象的封装、继承和多态。例如,在结构体中包含函数指针作为行为,数据作为成员,通过传递this指针实现操作。这样做的目的是解决程序框架结构分散、数据和函数脱节的问题。