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

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

3天内不再提示

嵌入式软件底层开发的框架陈述

璟琰乀 来源:羽林君 作者:羽林君 2020-12-22 14:57 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

总述

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.前后台执行程序

mmmErq.jpeg

这种程序特点是,后台大循环中一直执行默认的程序,中断服务程序(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延时的线程切换,抢占式任务切换这些更为复杂一些的功能等。

InuQVb.png

时间片轮循程序

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

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

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、MCUDSP、SOC等提供类同的API接口,这是RTOS基于设备独立的应用程序开发基础。因此,基于RTOS的C语言程序具有极大的可移植性。目前针对微嵌入式或者单片机的操作系统有VxWorksUCOS、Free RTOS、国产的RTT,这些操作系统大同小异,基本的功能都类似:任务管理、任务间同步和通信、内存管理、实时时钟服务、中断管理服务。

Vraaiq.jpeg

(图片来源博客)

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

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

责任编辑:haq

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

    关注

    5186

    文章

    20159

    浏览量

    328993
  • 软件
    +关注

    关注

    69

    文章

    5300

    浏览量

    90900
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    做医疗嵌入式软件研发以后好跳槽吗?

    做医疗嵌入式软件研发,以后想跳槽一点儿也不难。别看医疗行业门槛高、规矩多,你手里攒下的那套本事,到哪儿都吃得开。嵌入式这东西,甭管在哪个行当里折腾,说到底六个基本部分跑不掉:嵌入式C、
    的头像 发表于 12-03 11:04 258次阅读
    做医疗<b class='flag-5'>嵌入式</b><b class='flag-5'>软件</b>研发以后好跳槽吗?

    CW32嵌入式软件开发的必备知识

    嵌入式软件开发作为计算机科学和电子工程的交叉领域,要求开发人员具备一系列的专业知识和技能。 而基于CW32的嵌入式软件开发必备知识包括以下
    发表于 11-28 07:48

    深入探讨AMD嵌入式开发框架的三大基石

    随着嵌入式系统复杂性日趋提升,嵌入式开发已不再只是编写软件/固件,更是关乎对软硬件生态系统进行协调。硬件与软件的相互依赖性与系统复杂性,实际上可能减缓产品的普及速度并延迟盈利时间,因此
    的头像 发表于 11-24 09:52 274次阅读
    深入探讨AMD<b class='flag-5'>嵌入式开发</b><b class='flag-5'>框架</b>的三大基石

    LuatOS脚本开发入门:嵌入式运行框架全解析!

    想搞懂LuatOS如何运行Lua脚本?本文深入剖析其嵌入式运行框架,涵盖虚拟机加载、任务协程、系统初始化等关键环节,适合初学者。 一、LuatOS 编程起步 1.1 底层固件怎么启动 LuatOS
    的头像 发表于 09-26 17:45 271次阅读
    LuatOS脚本<b class='flag-5'>开发</b>入门:<b class='flag-5'>嵌入式</b>运行<b class='flag-5'>框架</b>全解析!

    嵌入式开发新选择:LuatOS脚本框架入门教程

    LuatOS正成为嵌入式开发的新趋势!本教程带你从基础入手,全面了解其基于Lua的脚本开发模式与轻量级运行框架。 一、LuatOS 编程起步 1.1 底层固件怎么启动 LuatOS 脚
    的头像 发表于 09-26 17:34 308次阅读
    <b class='flag-5'>嵌入式开发</b>新选择:LuatOS脚本<b class='flag-5'>框架</b>入门教程

    RT-Thread 2025嵌入式软件大赛重磅来袭

    为激发开发者潜能、促进技术交流,RT-Thread 正式启动2025年度嵌入式软件大赛! 本赛道为嵌入式软件大赛,聚焦
    的头像 发表于 09-22 16:40 3261次阅读
    RT-Thread 2025<b class='flag-5'>嵌入式</b><b class='flag-5'>软件</b>大赛重磅来袭

    RT-Thread 2025嵌入式软件大赛重磅来袭

    为激发开发者潜能、促进技术交流,RT-Thread正式启动2025年度嵌入式软件大赛!本赛道为嵌入式软件大赛,聚焦
    的头像 发表于 09-20 10:06 1300次阅读
    RT-Thread 2025<b class='flag-5'>嵌入式</b><b class='flag-5'>软件</b>大赛重磅来袭

    新一代嵌入式开发平台 AMD嵌入式软件和工具2025.1版现已推出

    AMD 2025.1 版嵌入式软件和工具是面向新一代嵌入式系统开发而打造的综合平台,全面加速概念构想到部署落地。 2025.1 版嵌入式
    的头像 发表于 08-20 09:15 3640次阅读

    AMD 2025.1版嵌入式软件和工具的新增功能

    AMD 2025.1 版嵌入式软件和工具是面向新一代嵌入式系统开发而打造的综合平台,全面加速概念构想到部署落地。
    的头像 发表于 08-15 15:32 1044次阅读

    嵌入式软件开发常用的软件有哪些?

    对于初学嵌入式的朋友们,会想要了解嵌入式软件开发常用的软件有些,有什么用。那么看以下常用的软件介绍。 1.Visual Studio Cod
    发表于 07-03 17:06

    嵌入式开发入门指南:从零开始学习嵌入式

    (设备驱动、内核编译) 4. 推荐的学习资源书籍:《嵌入式系统软件设计基础》《ARM Cortex-M系列嵌入式开发》在线课程:慕课网、B站嵌入式教学视频实践平台:Arduino、ST
    发表于 05-15 09:29

    硬核升级!华清远见STM32MP157驱动开发课程助力嵌入式Linux底层开发入门进阶

    嵌入式Linux系统开发中,驱动程序开发是一项关键技术,它作为硬件与软件之间的桥梁,实现了操作系统对硬件设备的控制。相较于嵌入式Linux
    的头像 发表于 04-03 16:40 715次阅读
    硬核升级!华清远见STM32MP157驱动<b class='flag-5'>开发</b>课程助力<b class='flag-5'>嵌入式</b>Linux<b class='flag-5'>底层</b><b class='flag-5'>开发</b>入门进阶

    嵌入式主板开发详细指南

    嵌入式主板开发涉及硬件设计、软件集成、系统优化等多个环节,需要结合具体应用场景进行深度定制。以下是嵌入式主板开发的详细指南,涵盖关键步骤、工
    的头像 发表于 04-02 11:35 940次阅读
    <b class='flag-5'>嵌入式</b>主板<b class='flag-5'>开发</b>详细指南

    底层开发与应用开发到底怎么选?

    定义底层开发主要关注硬件与软件的交互,包括驱动程序开发、操作系统内核开发、硬件接口编程、嵌入式
    发表于 03-06 10:10

    嵌入式机器学习的应用特性与软件开发环境

    设备和智能传感器)上,这些设备通常具有有限的计算能力、存储空间和功耗。本文将您介绍嵌入式机器学习的应用特性,以及常见的机器学习开发软件开发环境。 嵌入式机器学习的应用特性与优势 由于
    的头像 发表于 01-25 17:05 1220次阅读
    <b class='flag-5'>嵌入式</b>机器学习的应用特性与<b class='flag-5'>软件开发</b>环境