样品申请 | 资料下载 | 替换型号咨询

基于灵动微电子MM32 MCU的OS移植与应用

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


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

一般简单的嵌入式系统软件的编程思路是下面这样的:


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必须等到当前任务的时间片用完,并且后面的任务时间片还没有来,32位单片机才有机会获得“执行时间”。


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


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


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