发 帖  
原厂入驻New
[原创] 灵动微课堂 (第121讲) |基于MM32 MCU的OS移植与应用
2020-5-15 16:30:02  249
分享
1.jpg 一般简单的嵌入式系统软件的编程思路是下面这样的:
main
{
{任务1};
{任务2};
{任务3};
.......
{任务N};
}

isr_server
{
{处理中断};
}
这是嵌入式工程师编程的一般思路,对于一个简单的系统当然是够用了,但在这样的系统中每个任务的实时性是很差的,比如如果“任务1”用于用户输入的检测,当用户输入时,如果程序正在执行其他的任务进程,那么这次用户输入将失效,用户的体验是“这个按键不灵敏,这个机器很慢”。

而我们如果把所有任务都放到中断里去处理,虽然改善了实时性,却会导致另外一个问题:一个任务在处理的时候有可能会引发其它的中断丢失。这个后果有时候比“慢一点”更加严重和恶劣!又比如任务2是一个只需要1s钟处理一次的任务,那么显然任务2会白白浪费CPU的时间。

这时,我们可能需要改进我们的编程思路,一般我们会尝试采用“时间片”的方式。这时候软件结构会变成下面的方式:
main
{
{如果任务1的时间片到了则执行任务1};
{如果任务2的时间片到了则执行任务2};
.......
{如果任务N的时间片到了则执行任务N};
}
timer_isr_server
{
{判断每个任务的时间片是否到来,并进行标记};
}
isr_server
{
{处理中断};
}

我们可以看到,这种改进后的思路,使得任务的执行时间得到控制,任务只在自己的时间片到来后,才会去执行。但你可以发现,这种方式仍然不能彻底解决“实时性”的问题,因为某个任务的时间片到来后,也不能立即就执行,MCU必须等到当前任务的时间片用完,并且后面的任务时间片还没有来,MCU才有机会获得“执行时间”。

这时候我们需要继续改进思路。为了使得某个任务的时间片到来以后能立即执行,我们需要在时钟中断里判断完时间片后,改变程序的返回位置,让程序不返回到刚刚被打断的位置,而从最新获得了时间片的任务处开始执行,这样就彻底解决了任务的实时问题。

我们在这个思路上进行改进。在每次进入时钟中断前,MCU保存当前状态和当前任务的关键数据,然后进入时钟中断进行时间片处理。如果这时判断有新的更紧急的任务的时间片到来,则执行任务切换,恢复这个更紧急的任务的现场,然后返回中断开始执行这个更紧急的任务。

到这里,我们终于知道了操作系统的作用了。事实上,操作系统的用处远不止帮你完成这个“任务时间片的处理”,操作系统还能帮你处理各种超时,进行内存管理,完成任务间的通信等。有了操作系统,程序的层次也更加清晰,给系统添加功能也更方便,这一切在大型项目中越发的明显!

近年来,物联网IOT概念广为普及,物联网市场发展迅猛,嵌入式设备的联网已然成为趋势。终端联网使得软件复杂性大幅增加,传统的 RTOS 内核已经越来越难满足市场的需求。正是在这种情况下,物联网操作系统(IoT OS)的概念应运而生。

物联网操作系统是指以操作系统内核(可以是 RTOS、Linux 等)为基础,包括文件系统、图形库等较为完整的中间件组件,具备低功耗、安全、通信协议支持和云端连接能力的软件平台。

灵动微电子MM32系列MCU获得了AMetal、RT-Thread、Alios、Liteos、mbed、FreeRTOS等众多操作系统官方鼎立支持,面对越来越多的MM32 MCU用户对于操作系统的使用需求,灵动微电子官方微信公众号将在接下来的微课堂针对各家OS进行详细的移植及应用讲解,欢迎广大爱好者关注并指导!

参考链接:


AMetal:


https://github.com/zlgopen/ametal
https://gitee.com/zlgopen/ametal


RT-Thread:

https://github.com/RT-Thread/rt-thread/tree/master/bsp/mm32l3xx

Alios:

https://certIFication.iot.aliyun.com/open/#/awarDVIew?key=C39AEF360BC5F533183C458C5A70009F

Liteos:

https://gitee.com/LiteOS

0
2020-5-15 16:30:02   评论 分享淘帖

只有小组成员才能发言,加入小组>>

1474个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /7 下一条

快速回复 返回顶部 返回列表