《2022年C语言模块化程序设 .pdf》由会员分享,可在线阅读,更多相关《2022年C语言模块化程序设 .pdf(3页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C 语言模块化程序设计模块划分C 语言模块化程序 设计需理解如下概念:(1) 模块即是一个 .c 文件和一个 .h 文件的结合,头文件 (.h)中是对于该模块接口的声明;(2) 某模块提供给 其它 模块调用的外部函数及数据需在.h 中文件中冠以 extern 关键字声明;(3) 模块内的函数和全局变量需在.c 文件开头冠以 static 关键字声明;(4) 永远不要在 .h 文件中定义变量!定义变量和声明变量的区别在于定义会产生内存分配的操作, 是汇编阶段的概念; 而声明则只是告诉包含该声明的模块在连接阶段从其它模块寻找外部函数和变量。一个嵌入式系统通常包括两类模块:(1)硬件驱动模块,一种特
2、定硬件对应一个模块;(2)软件功能模块,其模块的划分应满足低偶合、高内聚的要求。多任务还是单任务所谓单任务系统 是指该系统不能支持多任务并发操作,宏观串行地执行一个任务。而多任务系统则可以宏观并行(微观上可能串行)地同时执行多个任务。多任务的并发执行通常依赖于一个多任务操作系统(OS),多任务 OS 的核心是系统调度器,它使用任务控制块(TCB)来管理任务调度功能。 TCB 包括任务的当前状态、优先级、要等待的事件或资源、任务程序码的起始地址、初始堆栈指针等信息。调度器在任务被激活时,要用到这些信息。此外,TCB 还被用来存放任务的 上下文 (context) 。任务的上下文就是当一个执行中的
3、任务被停止时,所要保存的所有信息。通常,上下文就是计算机当前的状态,也即各个寄存器的内容。 当发生任务切换时,当前运行的任务的上下文被存入TCB,并将要被执行的任务的上下文从它的TCB 中取出,放入各个寄存器中。究竟选择多任务还是单任务方式,依赖于软件的体系是否庞大。例如,绝大多数手机程序都是多任务的, 但也有一些小灵通的协议栈是单任务的,没有操作系统,它们的主程序轮流调用各个软件模块的处理程序,模拟多任务环境。单任务程序典型架构(1)从 CPU 复位时的指定地址 开始执行;(2)跳转至汇编代码startup 处执行;(3)跳转至用户主程序main 执行,在 main 中完成:a.初试化各硬件
4、设备;b.初始化各软件模块;c.进入死循环(无限循环),调用各模块的处理函数用户主程序和各模块的处理函数都以C 语言完成。用户主程序最后都进入了一个死循环,其首选方案是:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 3 页 - - - - - - - - - while(1) 中断服务程序中断是嵌入式系统中重要的组成部分,但是在标准C 中不包含中断。许多编译开发商在标准C 上增加了对中断的支持,提供新的关键字用于标示中断服务程序 (ISR),类似于 _interrupt
5、 、#program interrupt 等。当一个函数被定义为ISR 的时候,编译器会自动为该函数增加中断服务程序所需要的中断现场入栈和出栈代码。中断服务程序需要满足如下要求:(1)不能返回值;(2)不能向 ISR 传递参数;(3) ISR 应该尽可能的短小精悍;(4) printf(char * lpFormatString,) 函数会带来重入和性能问题, 不能在ISR 中采用。硬件驱动模块一个硬件驱动模块通常应包括如下函数:(1)中断服务程序 ISR (2)硬件初始化a.修改寄存器,设置硬件参数(如UART 应设置其波特率, AD/DA 设备应设置其采样速率等);b.将中断服务程序入口地
6、址写入中断向量表:/* 设置中断向量表*/ 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)和控制信号用, 则设置 CPU 内部对应寄存器使其作为控制信号;b.设置 CPU 内部的针对该设
7、备的中断屏蔽位,设置中断方式(电平触发还是边缘触发)。(4)提供一系列针对该设备的操作接口函数。例如,对于LCD,其驱动模块应提供绘制像素、画线、绘制矩阵、显示字符点阵等函数;而对于实时钟,其驱动模块则需提供获取时间、设置时间等函数。C 的面向对象 化在面向对象的语言里面, 出现了类的概念。 类是对特定数据的特定操作的集合体。类包含了两个范畴:数据和操作。而C 语言中的 struct 仅仅是数据的集合,我们可以利用函数指针将struct 模拟为一个包含数据和操作的类。下面的C 程序模拟了一个最简单的 类:#ifndef C_Class #define C_Class struct 名师资料总结
8、 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 3 页 - - - - - - - - - #endif C_Class A C_Class A *A_this; /* this 指针 */ void (*Foo)(C_Class A *A_this); /* 行为:函数指针*/ int a; /* 数据 */ int b; ; 我们可以利用 C 语言模拟出面向对象的三个特性:封装、继承和多态,但是更多的时候,我们只是需要将数据与行为封装以解决软件结构混乱的问题。C模拟面向对象思想的
9、目的不在于模拟行为本身,而在于解决某些情况下使用C语言编程时程序整体框架结构分散、 数据和函数脱节的问题。 我们在后续章节会看到这样的例子。总结本篇介绍了嵌入式系统编程软件架构方面的知识,主要包括模块划分、 多任务还是单任务选取、 单任务程序典型架构、 中断服务程序、硬件驱动模块设计等,从宏观上给出了一个嵌入式系统软件所包含的主要元素。请记住:软件结构是软件的灵魂!结构混乱的程序面目可憎,调试、测试、维护、升级都极度困难。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 3 页 - - - - - - - - -