- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C语言模块化程序设计(好) Free
——修改整理
C语言模块化程序设计需理解如下概念:
(1) 模块即是一个.c 文件和一个.h 文件的结合,头文件(.h)中是对于该模
块接口的声明;
(2 ) 某模块提供给其它模块调用的外部函数及数据需在.h中文件中冠以
extern关键字声明;
(3 ) 模块内的函数和全局变量需在.c 文件开头冠以 static 关键字声明;
(4 ) 永远不要在.h 文件中定义变量!定义变量和声明变量的区别在于定义
会产生内存分配的操作,是汇编阶段的概念;而声明则只是告诉包含该声明的模
块在连接阶段从其它模块寻找外部函数和变量。
一个嵌入式系统通常包括两类模块:
(1)硬件驱动模块,一种特定硬件对应一个模块;
(2 )软件功能模块,其模块的划分应满足低偶合、高内聚的要求。
多任务还是单任务
所谓单任务系统是指该系统不能支持多任务并发操作,宏观串行地执行一
个任务。而多任务系统则可以宏观并行(微观上可能串行)地同时执行多个任
务。
多任务的并发执行通常依赖于一个多任务操作系统(OS ),多任务 OS 的核
心是系统调度器,它使用任务控制块(TCB )来管理任务调度功能。TCB 包括
任务的当前状态、优先级、要等待的事件或资源、任务程序码的起始地址、初始
堆栈指针等信息。调度器在任务被激活时,要用到这些信息。此外,TCB 还被
用来存放任务的上下文 (context) 。任务的上下文就是当一个执行中的任务被停
止时,所要保存的所有信息。通常,上下文就是计算机当前的状态,也即各个寄
存器的内容。当发生任务切换时,当前运行的任务的上下文被存入 TCB,并将
要被执行的任务的上下文从它的 TCB 中取出,放入各个寄存器中。
究竟选择多任务还是单任务方式,依赖于软件的体系是否庞大。例如,绝大多数
手机程序都是多任务的,但也有一些小灵通的协议栈是单任务的,没有操作系统,
它们的主程序轮流调用各个软件模块的处理程序,模拟多任务环境。
单任务程序典型架构
(1)从CPU复位时的指定地址开始执行;
(2 )跳转至汇编代码startup 处执行;
(3 )跳转至用户主程序main 执行,在 main 中完成:
a.初试化各硬件设备;
b.初始化各软件模块;
c.进入死循环(无限循环),调用各模块的处理函数
用户主程序和各模块的处理函数都以 C 语言完成。用户主程序最后都进入
了一个死循环,其首选方案是:
while(1)
{
}
中断服务程序
中断是嵌入式系统中重要的组成部分,但是在标准 C 中不包含中断。许多
编译开发商在标准 C 上增加了对中断的支持,提供新的关键字用于标示中断服
务程序(ISR),类似于__interrupt 、#program interrupt 等。当一个函数被定义为 ISR
的时候,编译器会自动为该函数增加中断服务程序所需要的中断现场入栈和出栈
代码。
中断服务程序需要满足如下要求:
(1)不能返回值;
(2)不能向 ISR 传递参数;
(3) ISR 应该尽可能的短小精悍;
(4) printf(char * lpFormatString,…)函数会带来重入和性能问题,不能在 ISR
中采用。
硬件驱动模块
一个硬件驱动模块通常应包括如下函数:
(1)中断服务程序ISR
(2 )硬件初始化
a.修改寄存器,设置硬件参数(如 UART 应设置其波特率,AD/DA 设备应
设置其采样速率等);
b.将中断服务程序入口地址写入中断向量表:
/* 设置中断向量表 */
m_myPtr = make_far_pointer(0l); /* 返回 void far 型指针 void far * */
m_myPtr += ITYPE_UART; /* ITYPE_UART : uart 中断服务程序 */
/* 相对于中断向量表首地址的偏移 */
*m_myPtr = UART _Isr; /* UART _Isr:UART 的中断服务程序 */
(3 )设置CPU 针对该硬件的控制线
a.如果控制线可作 PIO (可编程I/O )和控制信号用,则设置
文档评论(0)