C语言嵌入式系统编程之软件架构篇_百家乐网app

本文摘要:模块区分  模块区分的划是规划的意思,意指怎样合理的将一个相当大的软件区分为一系列功能独立国家的部分合作已完成系统的市场需求。

百家乐网app

模块区分  模块区分的划是规划的意思,意指怎样合理的将一个相当大的软件区分为一系列功能独立国家的部分合作已完成系统的市场需求。C语言作为一种结构化的程序设计语言,在模块的区分上主要依据功能(依功能展开区分在面向对象设计中沦为一个错误,牛顿定律遇上了相对论),C语言模块化程序设计须要解读如下概念:  (1)模块即是一个.c文件和一个.h文件的融合,头文件(.h)中是对于该模块接口的声明;  (2)某模块获取给其它模块调用的外部函数及数据需在.h中文件中冠上extern关键字声明;  (3)模块内的函数和全局变量需在.c文件结尾冠上static关键字声明;  (4)总有一天不要在.h文件中定义变量!定义变量和声明变量的区别在于定义不会产生内存分配的操作者,是编撰阶段的概念;而声明则只是告诉他包括该声明的模块在相连阶段从其它模块找寻外部函数和变量。如:  /*module1.h*/  inta=5;/*在模块1的.h文件中定义inta*/  /*module1.c*/  #includemodule1.h/*在模块1中包括模块1的.h文件*/  /*module2.c*/  #includemodule1.h/*在模块2中包括模块1的.h文件*/  /*module3.c*/  #includemodule1.h/*在模块3中包括模块1的.h文件*/  以上程序的结果是在模块1、2、3中都定义了整型变量a,a在有所不同的模块中对应有所不同的地址单元,这个世界上从不必须这样的程序。

准确的作法是:  /*module1.h*/  externinta;/*在模块1的.h文件中声明inta*/  /*module1.c*/  #includemodule1.h/*在模块1中包括模块1的.h文件*/  inta=5;/*在模块1的.c文件中定义inta*/  /*module2.c*/  #includemodule1.h/*在模块2中包括模块1的.h文件*/  /*module3.c*/  #includemodule1.h/*在模块3中包括模块1的.h文件*/  这样如果模块1、2、3操作者a的话,对应的是同一片内存单元。  一个嵌入式系统一般来说还包括两类模块:  (1)硬件驱动模块,一种特定硬件对应一个模块;  (2)软件功能模块,其模块的区分不应符合较低偶合、低内聚的拒绝。  多任务还是单任务  所谓单任务系统是指该系统无法反对多任务所发操作者,宏观串行地继续执行一个任务。

而多任务系统则可以宏观分段(微观上有可能串行)地同时继续执行多个任务。  多任务的所发继续执行一般来说依赖一个多任务操作系统(OS),多任务OS的核心是系统调度器,它用于任务掌控块(TCB)来管理任务调度功能。TCB还包括任务的当前状态、优先级、要等候的事件或资源、任务程序字节的接续地址、初始堆栈指针等信息。

调度器在任务被转录时,要中用这些信息。此外,TCB还被用来存放在任务的上下文(context)。任务的上下文就是当一个继续执行中的任务被暂停时,所要留存的所有信息。一般来说,上下文就是计算机当前的状态,也即各个寄存器的内容。

当再次发生任务转换时,当前运营的任务的上下文被现金TCB,并即将被继续执行的任务的上下文从它的TCB中放入,放进各个寄存器中。  嵌入式多任务OS的典型例子有Vxworks、ucLinux等。嵌入式OS并非遥不可及的神坛之物,我们可以用将近1000行代码构建一个针对80186处理器的功能最简单的OS内核,作者于是以打算展开此项工作,期望能将所学贡献给大家。

  到底自由选择多任务还是单任务方式,依赖软件的体系否可观。例如,绝大多数手机程序都是多任务的,但也有一些小灵通的协议栈是单任务的,没操作系统,它们的主程序轮流调用各个软件模块的处理程序,仿真多任务环境。

百家乐网app

  单任务程序典型架构  (1)从CPU废黜时的登录地址开始继续执行;  (2)函数调用至编撰代码startup一处继续执行;  (3)函数调用至用户主程序main继续执行,在main中已完成:  a.初试化各硬件设备;  b.初始化各软件模块;  c.转入死循环(无限循环),调用各模块的处理函数  用户主程序和各模块的处理函数都以C语言已完成。用户主程序最后都转入了一个死循环,其选用方案是:  while(1)  {  }  有的程序员这样写出:  for(;;)  {  }  这个语法没清楚传达代码的含义,我们从for(;;)没什么什么,只有摸明白for(;;)在C语言中意味著无条件循环才明白此意。  下面是几个值得一提的是的死循环:  (1)操作系统是死循环;  (2)WIN32程序是死循环;  (3)嵌入式系统软件是死循环;  (4)多线程程序的线程处理函数是死循环。

  你可能会反驳,大声说道:凡事都不是意味著的,2、3、4都可以不是死循环。Yes,youareright,但是你得到鲜花和掌声。实质上,这是一个没过于大意义的牛角尖,因为这个世界从不必须一个处置完了几个消息就喊着要OS杀掉它的WIN32程序,不必须一个刚开始RUN就自行了断的嵌入式系统,不必须莫名其妙启动一个做到一点事就杀掉自己的线程。

百家乐网app

有时候,过分缜密生产的不是便捷而是困难。君不见,五层的TCP/IP协议栈打破缜密的ISO/OSI  OSI是一个开放性的通行系统点对点参考模型,他是一个定义的十分好的协议规范。

OSI模型有7层结构,每层都可以有几个子层。  七层协议栈大行其道沦为事实上的标准?  常常有网友辩论:  printf(%d,%d,++i,i++);/*输入是什么?*/  c=a+++b;/*c=?*/  等类似于问题。

面临这些问题,我们不能收到衷心的感叹:世界上还有很多有意义的事情等着我们去消化摄取的食物。  实质上,嵌入式系统要运营到世界末日。

本文关键词:百家乐网app

本文来源:百家乐网app-www.kajjjj.com