0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言模块化程序设计需理解概念

Q4MP_gh_c472c21 来源:未知 作者:李倩 2018-06-08 14:49 次阅读

模块划分的"划"是规划的意思,意指怎样合理的将一个很大的软件划分为一系列功能独立的部分合作完成系统的需求。C语言作为一种结构化的程序设计语言,在模块的划分上主要依据功能(依功能进行划分在面向对象设计中成为一个错误,牛顿定律遇到了>相对论),C语言模块化程序设计需理解如下概念:

(1) 模块即是一个.c文件和一个.h文件的结合,头文件(.h)中是对于该模块接口的声明;

(2)某模块提供给其它模块调用的外部函数及数据需在.h中文件中冠以extern关键字声明;

(3)模块内的函数和全局变量需在.c文件开头冠以static关键字声明;

(4)永远不要在.h文件中定义变量!定义变量和声明变量的区别在于定义会产生内存分配的操作,是汇编阶段的概念;而声明则只是告诉包含该声明的模块在连接阶段从其它模块寻找外部函数和变量。如:

以上程序的结果是在模块1、2、3中都定义了整型变量a,a在不同的模块中对应不同的地址单元,这个世界上从来不需要这样的程序。正确的做法是:

这样如果模块1、2、3操作a的话,对应的是同一片内存单元。一个嵌入式系统通常包括两类模块:

(1)硬件驱动模块,一种特定硬件对应一个模块;

(2)软件功能模块,其模块的划分应满足低偶合、高内聚的要求。多任务还是单任务所谓"单任务系统"是指该系统不能支持多任务并发操作,宏观串行地执行一个任务。而多任务系统则可以宏观并行(微观上可能串行)地"同时"执行多个任务。多任务的并发执行通常依赖于一个多任务操作系统(OS),多任务OS的核心是系统调度器,它使用任务控制块(TCB)来管理任务调度功能。TCB包括任务的当前状态、优先级、要等待的事件或资源、任务程序码的起始地址、初始堆栈指针等信息。调度器在任务被激活时,要用到这些信息。

此外,TCB还被用来存放任务的"上下文"(context)。任务的上下文就是当一个执行中的任务被停止时,所要保存的所有信息。通常,上下文就是计算机当前的状态,也即各个寄存器的内容。当发生任务切换时,当前运行的任务的上下文被存入TCB,并将要被执行的任务的上下文从它的TCB中取出,放入各个寄存器中。嵌入式多任务OS的典型例子有Vxworks、ucLinux等。嵌入式OS并非遥不可及的神坛之物,我们可以用不到1000行代码实现一个针对80186处理器的功能最简单的OS内核。究竟选择多任务还是单任务方式,依赖于软件的体系是否庞大。例如,绝大多数手机程序都是多任务的,但也有一些小灵通的协议栈是单任务的,没有操作系统,它们的主程序轮流调用各个软件模块的处理程序,模拟多任务环境。

单任务程序典型架构(1)从CPU复位时的指定地址开始执行;(2)跳转至汇编代码startup处执行;(3)跳转至用户主程序main执行,在main中完成:a.初试化各硬件设备;

b.初始化各软件模块;c.进入死循环(无限循环),调用各模块的处理函数用户主程序和各模块的处理函数都以C语言完成。用户主程序最后都进入了一个死循环,其首选方案是:

有的程序员这样写:

这个语法没有确切表达代码的含义,我们从for(;;)看不出什么,只有弄明白for(;;)在C语言中意味着无条件循环才明白其意。

下面是几个"著名"的死循环:

(1)操作系统是死循环;

(2)WIN32程序是死循环;

(3)嵌入式系统软件是死循环;

(4)多线程程序的线程处理函数是死循环。

你可能会辩驳,大声说:"凡事都不是绝对的,2、3、4都可以不是死循环"。Yes,you are right,但是你得不到鲜花和掌声。实际上,这是一个没有太大意义的牛角尖,因为这个世界从来不需要一个处理完几个消息就喊着要OS杀死它的WIN32 程序,不需要一个刚开始RUN就自行了断的嵌入式系统,不需要莫名其妙启动一个做一点事就干掉自己的线程。有时候,过于严谨制造的不是便利而是麻烦。君不见,五层的TCP/IP协议栈超越严谨的ISO/OSI七层协议栈大行其道成为事实上的标准?经常有网友讨论:

等类似问题。面对这些问题,我们只能发出由衷的感慨:世界上还有很多有意义的事情等着我们去消化摄入的食物。实际上,嵌入式系统要运行到世界末日。中断服务程序中断是嵌入式系统中重要的组成部分,但是在标准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.将中断服务程序入口地址写入中断向量表:

(3)设置CPU针对该硬件的控制线a.如果控制线可作PIO(可编程I/O)和控制信号用,则设置CPU内部对应寄存器使其作为控制信号;b.设置CPU内部的针对该设备的中断屏蔽位,设置中断方式(电平触发还是边缘触发)。(4)提供一系列针对该设备的操作接口函数。例如,对于LCD,其驱动模块应提供绘制像素、画线、绘制矩阵、显示字符点阵等函数;而对于实时钟,其驱动模块则需提供获取时间、设置时间等函数。C的面向对象化在面向对象的语言里面,出现了类的概念。类是对特定数据的特定操作的集合体。类包含了两个范畴:数据和操作。而C语言中的struct仅仅是数据的集合,我们可以利用函数指针将struct模拟为一个包含数据和操作的"类"。下面的C程序模拟了一个最简单的"类":

我们可以利用C语言模拟出面向对象的三个特性:封装、继承和多态,但是更多的时候,我们只是需要将数据与行为封装以解决软件结构混乱的问题。C模拟面向对象思想的目的不在于模拟行为本身,而在于解决某些情况下使用C语言编程时程序整体框架结构分散、数据和函数脱节的问题。我们在后续章节会看到这样的例子。

最后总结一下今天介绍了嵌入式系统编程软件架构方面的知识,主要包括模块划分、多任务还是单任务选取、单任务程序典型架构、中断服务程序、硬件驱动模块设计等,从宏观上给出了一个嵌入式系统软件所包含的主要元素。请记住:软件结构是软件的灵魂!结构混乱的程序面目可憎,调试、测试、维护、升级都极度困难。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式系统
    +关注

    关注

    40

    文章

    3426

    浏览量

    128209
  • C语言
    +关注

    关注

    180

    文章

    7527

    浏览量

    128205
  • 函数
    +关注

    关注

    3

    文章

    3864

    浏览量

    61304

原文标题:软件结构很重要!嵌入式C语言修炼之道

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言程序设计模块化程序设计总结#硬声创作季

    C语言语言模块化
    学习硬声知识
    发布于 :2022年11月16日 19:52:43

    C语言程序模块化写法

    C语言程序模块化写法
    发表于 12-05 20:42

    单片机C语言模块化程序

    求大神给下我单片机C语言模块化程序,让我好好学习,规范我的代码编写
    发表于 07-23 14:57

    C语言程序模块化编程资料

    本帖最后由 发烧友之麒麟 于 2014-10-6 11:05 编辑 C语言程序模块化,个人觉得写得还不错,拿出来分享一
    发表于 09-27 00:46

    VerilogHDL模块化程序设计

    VerilogHDL模块化程序设计中文期刊文章作  者:向兵作者机构:[1]绵阳职业技术学院,四川绵阳621000出 版 物:《科技资讯》 (科技资讯)年 卷 期:2017年 第27期摘  要
    发表于 05-04 12:06

    c语言程序设计案例教程

    据类型和运算符、顺序程序设计、分支程序设计、循环结构、数组等。学习C语言一定要知道它的利器——指针。这正是C
    发表于 07-20 07:25

    嵌入式模块化程序设计的相关资料分享

    模块化程序设计是指在进行程序设计时将一个大程序按照功能划分为若干小程序模块,每个小程序模块完成一
    发表于 11-09 08:20

    嵌入式C语言程序设计基础大汇总

    是运行速度快、编译效率高、移植性好和可读性强。C语言具有简单的语法结构和强大的处理功能,并可方便地实现对系统硬件的直接操作。C语言支持模块化
    发表于 11-09 07:13

    嵌入式编程中C语言模块化和模拟面向对象的相关资料推荐

    模块的划分上主要依据功能(依功能进行划分在面向对象设计中成为一个错误,牛顿定律遇到了>相对论), C语言模块化程序设计
    发表于 12-15 08:51

    C语言模块化程序设计理解

    程序设计语言,在模块的划分上主要依据功能(依功能进行划分在面向对象设计中成为一个错误,牛顿定律遇到了相对论),C语言模块化
    发表于 12-15 06:34

    C语言模块化程序设计理解哪些呢

    (依功能进行划分在面向对象设计中成为一个错误,牛顿定律遇到了>相对论), C语言模块化程序设计理解
    发表于 12-15 06:04

    模块化程序设计简单解释

    模块化程序设计模块化程序设计是指在进行程序设计时将一个大程序按照功能划分为若干小
    发表于 02-23 06:05

    模块化程序设计

    模块化程序设计思想,单片机c语言模块化设计,方便移植,将程序封装备用。
    发表于 03-22 15:29 9次下载

    模块化程序设计

    模块化程序设计,利用c语言的移植性好特点,更好的利用c语言
    发表于 03-23 09:25 0次下载

    嵌入式系统编程软件架构的C语言模块化程序设计概念

    模块划分的"划"是规划的意思,意指怎样合理的将一个很大的软件划分为一系列功能独立的部分合作完成系统的需求。C语言作为一种结构化的程序设计语言,在模块的划分上主要依据功能(依功能进行划分
    的头像 发表于 12-23 11:56 5525次阅读