在底层代码编写中,初始的框架设计总会面临选择,针对实际的硬件使用环境,大家对于使用的软件框架有很多选择,今天我简单描述一些比较常用的架构,让大家能够理解并选择合适的架构。

   1. 简单的顺序执行程序:这类写法是大多数人使用的方法,不需用思考程序的具体架构,直接按照执行顺序编写应用程序即可。

    2.前后台执行程序:在顺序执行的情况上增添中断前台处理机制,配置顺序执行的后台大循环程序,组合成可以实时响应的程序。

    3. 时间片轮循法:在前后台的执行架构上,通过计数器进一步规划程序,定时执行特定的片段。

    4. 实时操作系统:实时操作系统又叫RTOS,实时性,RTOS的内核负责管理所有的任务,内核决定了运行哪个任务,何时停止当前任务切换到其  他任务,这个是内核的多任务管理能力。多任务 管理给人的感觉就好像芯片有多个CPU,多任务管理实现了CPU资源的最大化利用,多任务管理有助于实现程序的模块化开发,能够实现复杂的实时应用。

除了实时性,还有可剥夺内核,顾名思义就是可以剥夺其他任务的CPU使用权,它总是运行就绪任务中的优先级最高的那个任务。

                                                                                              1.简单的顺序执行程序

这种应用程序比较简单,一般作为初阶简单使用,实时性以及要求不太高的情况下,可以使用。程序的设计比较简单,思路比较清晰。但是主循环的逻辑比较复杂的时候,如果没有完整的流程图指导,其他人很难看懂程序运行逻辑。

下面写一个顺序执行的程序模型

int main(void)
{      uint8 TaskValue;     InitSys();                  // 初始化    while (1)     {         TaskValue= GetTaskValue();         switch (TaskValue)        {             case x: TaskDispStatus(); break;             ...             default:break;         }     }
}

                                                                                        2.前后台执行程序

这种程序特点是,后台大循环中一直执行默认的程序,中断服务程序(ISR)产生相应中断标记,主程序运行与中断标记相关联的任务程序。一般实现有如下思路:

通过设置标志变量,然后在前台响应中断的时候进行对标志变量的置位或者复位,实现事件的信号获取,再在后台主循环进行中断所对应事物或者数据的处理,将程序流程转移到主程序。

前后台执行的程序

void IRQHandler(void)
{if(GetITStatus == 1){ SysFlag = 1;GetITStatus = 0;}
}
int main(void)
{      uint8 TaskValue;     InitSys();                  // 初始化    while (1)     {TaskValue= GetTaskValue();         switch (TaskValue)        {             case x: if(SysFlag == 1){TaskDispStatus(); SysFlag == 0;}break;             ...             default:break;         }     }
}

                                                                                 3.时间片轮循架构

时间片轮循法,大家看到它的时候,一般会将它与操作系统进行比较。不是说操作系统包含这种方法,而是在前后台程序中配合时间管理形成时间片轮循架构。

这种架构已经最大限度接近RTOS,时间管理,中断管理,任务管理,已经都有了,只不过RTOS会对内核进行更深入的修改,有针对delay延时的线程切换,抢占式任务切换这些更为复杂一些的功能等。

时间片轮循程序

时间片管理主要是通过对定时多处复用,在定时器计数,定时进行标志位的变化,继而主程序对标志真假的判断,实现不同时间不同任务状态执行。

因为此架构代码比较好,我适当进行详细描述。

step

  1:初始化相应的定时器:注意设置定时器的间隔频率,可以按照芯片的性能设置。例如,设置定时中断为1ms,也可以设置为10ms,轮循架构中的定时器部分与操作系统的定时器部分具有一样的功能,中断过于频繁,影响主程的序执行效率;中断间隔过长,实时响应效果差。

    2:针对定时器运行的任务设置一个函数结构体标志,用来在定时程序进行时间计数以及标志操作。

#define TaskTAB_NUM  6 //任务数量__packed typedef struct{  u8 flag;  //定时标志  u32 numcount;//按照定时中断进行计数  u32 target;  //设置的定时目标数值  int(*fun)(void);//设置定时执行的目标任务函数}TaskTimTypeDef

step

  3:建立一个任务表,通过结构体表的设置,确定任务执行的时间表。

在定义变量时,我们已经初始化了值,这些值的初始化,非常重要,跟具体的执行时间优先级等都有关系,这个需要自己掌握。

/*MdmSendTimTab任务函数默认周期,单位5ms,TIM7*/static TaskTimTypeDef TaskTimTab[TaskTAB_NUM] ={                                                 {1, 0, 30000,      *Task00},          //Task00 3000数值是设置的定时目标值,如果觉得反应过慢,可以将此值设置小  {1, 0, 3000,       *Task01},          //Task01  {1, 0, 300,        *Task02},          //Task02  {1, 0, 30,         *Task03},          //Task03  {1, 0, 3,          *Task04},          //Task04  {1, 0, 0xFFFFFFFF, *Task05},          //Task05    //可以按照TaskTAB_NUM数量添加任务};int Task00(void)//按照结构体的函数模板(int(*fun)(void);)写任务函数{...}//假设执行按键操作int Task01(void){...}//假设执行USART发送任务int Task02(void){...}//假设执行CAN通讯int Task03(void){...}//假设执行继电器控制int Task04(void){...}//假设执行网络解析int Task06(void){...}//假设执行空

step

    4:定时中断服务函数,按照我们需要的时间以及标志操作进行计时。

 //定时中断服务函数 void TimerInterrupt(void) {    for(char i=0; i<TaskTAB_NUM; i++)    {      if(TaskTimTab[i].flag == 1)      {            (TaskTimTab[i].numcount< TaskTimTab[i].target)//比较目前定时计数与目标时间        ?        (TaskTimTab[i].numcount++):(TaskTimTab[i].flag = 0);      }    }  }

step

    5:主函数进行任务函数执行。

int main(void) {        InitSys();                  // 初始化       while (1)       {                 for(char i=0; i<TaskTAB_NUM; i++) 任务处理            {        if(TaskTimTab[i].flag == 0)        {          if(TaskTimTab.flag == 0)          {            TaskTimTab[i].flag  = 1;            TaskTimTab[i].numcount= 0;            TaskTimTab[i].fun();          }        }  } } 

                                                                                                 4.操作系统RTOS

嵌入式操作系统是更加优化的执行框架,针对多任务,功能复杂,扩展性要求强项目的代码有非常好的使用。RTOS是针对不同处理器优化设计的高效率实时多任务内核,RTOS可以面对几十个系列的嵌入式处理器MPU、MCU、DSP、SOC等提供类同的API接口,这是RTOS基于设备独立的应用程序开发基础。因此,基于RTOS的C语言程序具有极大的可移植性。目前针对微嵌入式或者单片机的操作系统有VxWorksUCOS、Free RTOS、国产的RTT,这些操作系统大同小异,基本的功能都类似:任务管理、任务间同步和通信、内存管理、实时时钟服务、中断管理服务

(图片来源博客)

RTOS在时间轮循的架构上继续增加了任务挂起以及恢复,阻塞切换线程等,属于功能累加,进一步的优化。由于本次不是对RTOS的讲解,本人学习应用有UCOS、RTT、Free RTOS几个操作系统,因为篇幅有限,时间有限,我抽时间再进行详细的RTOS系统架构学习等的介绍

目前RTOS系统有很多,很多项目都倾向于使用RTOS,但是通过几种架构的分析明白不同的项目需要不同的架构,并不是所有项目都需要,也都适合使用RTOS,例如项目中各个任务耦合性过大,如果用RTOS需要很多的任务同步,甚至都无法进行线程的规划。这样就完全失去RTOS意义,此时用某些裸机的架构反而更合适。

                          扫描二维码关注我的个人公众号

           文章:良知犹存            排版:良知犹存          校稿:回梦游先

嵌入式底层开发的软件框架简述相关推荐

  1. android嵌入式底层开发教程

    android嵌入式底层开发教程 课程针对人群 熟悉.NET,J2EE应用开发,希望往嵌入式底层学习的工程师 熟悉Android应用和框架开发,希望从上到下走通Android系统的工程师 不希望局限在 ...

  2. 嵌入式底层开发为什么选择C语言

    嵌入式底层开发为什么选择C语言 嵌入式系统的编写语言主要是C语言,部分底层代码会用到汇编语言. 嵌入式(C/C++):在软件(嵌入式应用开发)和硬件(嵌入式硬件开发)中嵌入操作系统(嵌入式底层开发). ...

  3. 六.面向对象的嵌入式底层开发-LED(C面向对象开发)

    内容参考于<抽象接口技术和组件开发规范及其思想>.<面向ametal框架和接口的C编程> 六.面向对象的嵌入式底层开发-LED Ametal中LED的实现 资源图 1. dem ...

  4. 嵌入式系统的软件框架简述

    目录 总述 1.循环轮询系统 2.前后台系统 3.时间片轮循系统 4.操作系统RTOS 4.1单处理器多任务系统 4.2多处理器多任务系统 在底层代码编写中,初始的框架设计总会面临选择,针对实际的硬件 ...

  5. Android嵌入式底层开发技术

    目录 第一章 Android 操作系统概述 Android 软件架构介绍(五层架构)(填空题) Android的子系统 Android 应用程序开发过程(2种形式的开发,开发过程) 第二章 Andro ...

  6. 基于ROS搭建简易软件框架实现ROV水下目标跟踪(三)--软件框架简述

    项目链接:GitHub - cabinx/cabin_auv_ws: A simple demo for rov/auv underwater object tracking based on ros ...

  7. ARM嵌入式系统开发:软件设计与优化--第二章ARM处理器基础

    注:本文资料全部来源于网络或书籍,同时加上个人理解.若有侵权,告知即删.若有错误,留言商讨. 1.寄存器: 总共有37个寄存器,最多可以有17个活动寄存器(16个数据寄存器,2个状态寄存器:CPSR和 ...

  8. 直播软件框架及功能介绍

    作为互联网的新生力量,一种新型的社交互动方式,直播软件快速在互联网行业占有一席之地. 查看全文 http://www.taodudu.cc/news/show-3884724.html 相关文章: 什 ...

  9. 嵌入式入门学习笔记4:[转]什么是嵌入式底层驱动开发和嵌入式底层软件开发...

    我们知道嵌入式操作系统(Embedded System)是指以应用为中心.以计算机技术为基础,软件硬件可裁剪.适应应用系统对功能.可靠性.成本.体积.功耗严格要求的专用计算机系统.嵌入式开发分两种,一 ...

最新文章

  1. 高德API+Python解决租房问题
  2. 基于大数据审计的信息安全日志分析法
  3. 如何编程实现开启或关闭GPS(转)
  4. 白话Elasticsearch50-深入聚合数据分析之doc values机制
  5. 【C++】39. std::ofstream把程序中的中的变量值存储到文件中
  6. 思科交换机ping得通 traceroute不通_网络中经常接触的Ping 一次性教你弄懂如何检测三层网络...
  7. log4j2 mysql_spring boot使用log4j2将日志写入mysql数据库
  8. 商务与经济统计++原书第12版+[(美)安德森著][机械工业出版社][2015.07][515页][13854037]第一章读书笔记
  9. 计算机专业页面特效期末考试,《网页设计与制作》期末考试试题及答案.doc
  10. 安装VMWare Tools教程
  11. html中的背景颜色渐变效果,如何CSS实现网页背景三种颜色渐变效果?
  12. excel去掉单元格的隐藏字符
  13. 未婚同居能白头偕老吗
  14. python中write写入后文件依然空白
  15. 转载:【SQL练习】经典SQL练习题
  16. Android 解决 adapter.notifyDataSetChanged() 不起作用
  17. 光纤连接器的种类你知道吗?
  18. 重新开始:第一篇,创建GitHub 仓库,搭建项目基础
  19. 35个电子商务购物网站界面设计欣赏
  20. 无人便利店是风口吗?来看看行业人士怎么说

热门文章

  1. MapReduce实现之 查找共同好友
  2. 【1252. 奇数值单元格的数目】
  3. 敏捷开晨会不是汇报工作
  4. 软件成本评估时是否在预算阶段也要考虑企业的毛利润?毛利润一般取30%吗?
  5. MFC中的DoDataExchange(CDataExchange *pDX)
  6. 明日之后android和ios,明日之后安卓和ios可以联机吗 两个互通吗
  7. 《视觉slam十四讲从理论到实践》第一讲习题自测解答
  8. 魅族android os 耗电,魅族魅蓝metal耗电快怎么办 魅蓝metal省电教程【详解】
  9. 你真的知道判断语句吗?
  10. brk(); sbrk()使用