嵌入式底层开发的软件框架简述
在底层代码编写中,初始的框架设计总会面临选择,针对实际的硬件使用环境,大家对于使用的软件框架有很多选择,今天我简单描述一些比较常用的架构,让大家能够理解并选择合适的架构。
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语言程序具有极大的可移植性。目前针对微嵌入式或者单片机的操作系统有VxWorks、UCOS、Free RTOS、国产的RTT,这些操作系统大同小异,基本的功能都类似:任务管理、任务间同步和通信、内存管理、实时时钟服务、中断管理服务。
(图片来源博客)
RTOS在时间轮循的架构上继续增加了任务挂起以及恢复,阻塞切换线程等,属于功能累加,进一步的优化。由于本次不是对RTOS的讲解,本人学习应用有UCOS、RTT、Free RTOS几个操作系统,因为篇幅有限,时间有限,我抽时间再进行详细的RTOS系统架构学习等的介绍。
目前RTOS系统有很多,很多项目都倾向于使用RTOS,但是通过几种架构的分析明白不同的项目需要不同的架构,并不是所有项目都需要,也都适合使用RTOS,例如项目中各个任务耦合性过大,如果用RTOS需要很多的任务同步,甚至都无法进行线程的规划。这样就完全失去RTOS意义,此时用某些裸机的架构反而更合适。
扫描二维码关注我的个人公众号
文章:良知犹存 排版:良知犹存 校稿:回梦游先
嵌入式底层开发的软件框架简述相关推荐
- android嵌入式底层开发教程
android嵌入式底层开发教程 课程针对人群 熟悉.NET,J2EE应用开发,希望往嵌入式底层学习的工程师 熟悉Android应用和框架开发,希望从上到下走通Android系统的工程师 不希望局限在 ...
- 嵌入式底层开发为什么选择C语言
嵌入式底层开发为什么选择C语言 嵌入式系统的编写语言主要是C语言,部分底层代码会用到汇编语言. 嵌入式(C/C++):在软件(嵌入式应用开发)和硬件(嵌入式硬件开发)中嵌入操作系统(嵌入式底层开发). ...
- 六.面向对象的嵌入式底层开发-LED(C面向对象开发)
内容参考于<抽象接口技术和组件开发规范及其思想>.<面向ametal框架和接口的C编程> 六.面向对象的嵌入式底层开发-LED Ametal中LED的实现 资源图 1. dem ...
- 嵌入式系统的软件框架简述
目录 总述 1.循环轮询系统 2.前后台系统 3.时间片轮循系统 4.操作系统RTOS 4.1单处理器多任务系统 4.2多处理器多任务系统 在底层代码编写中,初始的框架设计总会面临选择,针对实际的硬件 ...
- Android嵌入式底层开发技术
目录 第一章 Android 操作系统概述 Android 软件架构介绍(五层架构)(填空题) Android的子系统 Android 应用程序开发过程(2种形式的开发,开发过程) 第二章 Andro ...
- 基于ROS搭建简易软件框架实现ROV水下目标跟踪(三)--软件框架简述
项目链接:GitHub - cabinx/cabin_auv_ws: A simple demo for rov/auv underwater object tracking based on ros ...
- ARM嵌入式系统开发:软件设计与优化--第二章ARM处理器基础
注:本文资料全部来源于网络或书籍,同时加上个人理解.若有侵权,告知即删.若有错误,留言商讨. 1.寄存器: 总共有37个寄存器,最多可以有17个活动寄存器(16个数据寄存器,2个状态寄存器:CPSR和 ...
- 直播软件框架及功能介绍
作为互联网的新生力量,一种新型的社交互动方式,直播软件快速在互联网行业占有一席之地. 查看全文 http://www.taodudu.cc/news/show-3884724.html 相关文章: 什 ...
- 嵌入式入门学习笔记4:[转]什么是嵌入式底层驱动开发和嵌入式底层软件开发...
我们知道嵌入式操作系统(Embedded System)是指以应用为中心.以计算机技术为基础,软件硬件可裁剪.适应应用系统对功能.可靠性.成本.体积.功耗严格要求的专用计算机系统.嵌入式开发分两种,一 ...
最新文章
- 高德API+Python解决租房问题
- 基于大数据审计的信息安全日志分析法
- 如何编程实现开启或关闭GPS(转)
- 白话Elasticsearch50-深入聚合数据分析之doc values机制
- 【C++】39. std::ofstream把程序中的中的变量值存储到文件中
- 思科交换机ping得通 traceroute不通_网络中经常接触的Ping 一次性教你弄懂如何检测三层网络...
- log4j2 mysql_spring boot使用log4j2将日志写入mysql数据库
- 商务与经济统计++原书第12版+[(美)安德森著][机械工业出版社][2015.07][515页][13854037]第一章读书笔记
- 计算机专业页面特效期末考试,《网页设计与制作》期末考试试题及答案.doc
- 安装VMWare Tools教程
- html中的背景颜色渐变效果,如何CSS实现网页背景三种颜色渐变效果?
- excel去掉单元格的隐藏字符
- 未婚同居能白头偕老吗
- python中write写入后文件依然空白
- 转载:【SQL练习】经典SQL练习题
- Android 解决 adapter.notifyDataSetChanged() 不起作用
- 光纤连接器的种类你知道吗?
- 重新开始:第一篇,创建GitHub 仓库,搭建项目基础
- 35个电子商务购物网站界面设计欣赏
- 无人便利店是风口吗?来看看行业人士怎么说
热门文章
- MapReduce实现之 查找共同好友
- 【1252. 奇数值单元格的数目】
- 敏捷开晨会不是汇报工作
- 软件成本评估时是否在预算阶段也要考虑企业的毛利润?毛利润一般取30%吗?
- MFC中的DoDataExchange(CDataExchange *pDX)
- 明日之后android和ios,明日之后安卓和ios可以联机吗 两个互通吗
- 《视觉slam十四讲从理论到实践》第一讲习题自测解答
- 魅族android os 耗电,魅族魅蓝metal耗电快怎么办 魅蓝metal省电教程【详解】
- 你真的知道判断语句吗?
- brk(); sbrk()使用