一个经典的嵌入式裸机系统

CSDN话题挑战赛第2期
参赛话题:学习笔记

学习之路,长路漫漫,写学习笔记的过程就是把知识讲给自己听的过程。这个过程中,我们去记录思考的过程,便于日后复习,梳理自己的思路。学习之乐,独乐乐,不如众乐乐,把知识讲给更多的人听,何乐而不为呢?

裸机系统

在嵌入式中,裸机系统通常指的是在main函数中跑一个大循环,通过轮询的方式实现任务处理的单线程操作系统。裸机系统又以前后台系统为主后台指的是main函数大循环中的任务轮询,前台指的是中断服务程序。后台的任务轮询可以被前台中断,跳转到中断服务程序,中断完成后再返回轮询任务中。为了任务执行的实时性,需要尽可能压缩中断服务程序的执行时间,将复杂任务交由后台处理。这种设计方法,可以保证任务在大多数情况下不会丢失。

前后台程序架构图:

来源: µC/OS-III 文档

前后台系统中的运行过程:

  • 在大循环中进行后台任务的轮询。
  • 在执行到Task3时,进入中断服务程序ISR1,Task4flag设置为1
  • ISR1返回后,继续执行完Task3,然后执行Task4
  • 在执行Task4的时候进入ISR2,在ISR2中又进入嵌套的中断ISR3
  • ……

前后台程序的伪代码实现:

int flag1 = 0;
int flag2 = 0;
int flag3 = 0;

int main(void){    
    /* 初始化硬件 */
    hardware_init();
    /* 前台的大循环 */
    while(1){
        if(flag1) handle_event_1(); /* 处理中断1的事件 */
        if(flag2) handle_event_2(); /* 处理中断2的事件 */
        if(flag3) handle_event_3(); /* 处理中断3的事件 */
        ...
    }
}

/* 中断服务程序 ISR1 */
void interrupt1(void){
    flag1 = 1; 
}

/* 中断服务程序 ISR2 */
void interrupt2(void){
    flag2 = 1;
}

/* 中断服务程序 ISR3 */
void interrupt3(void){
    flag3 = 1;
}

裸机 VS RTOS

前后台系统的缺点主要有:

  • CPU在轮询过程中一直被占用,导致了资源的浪费,同时MCU的功耗会比较高。
  • 高优先级的任务只能等当前任务执行完成后才能在下次轮询中被执行,导致实时性不高。
  • 需要自己造轮子,需求变动后维护代码本高,代码复用需要有一定的门槛。

关于第一点,针对以上的伪代码可以进行优化。当后台大循环没有任务要执行时,可以让MCU进入低功耗模式,这样便能够降低功耗。

关于第二点,在前后台的机制下即便是高优先级的任务被中断触发,也只能等待当前任务完成后才能被执行。在RTOS中,有相应的机制来保证高优先级任务能够被及时执行。

关于第三点,一个完备的前后台系统的开发和维护成本很高,但可移植性相对较低。无论是新需求的实现还是工程复用,都需要工程师对现有的系统架构非常熟悉,对于新人不是很友好。相较之下,主流的RTOS提供通用的架构和API,且被充分测试验证过,所以可靠性和可复用性会更好。

相比于RTOS,裸机系统在程序的实时性、任务调度和代码维护上都不占优势,那我们为什么还要学习裸机系统呢?

第一,RTOS并不能移植到所有的MCU上。主流RTOS剪裁的最小系统中对FLASH和RAM大小的要求,超过了许多MCU的上限。

第二,裸机系统是深入理解RTOS的基础。在实际的项目中,裸机系统也需要深思熟虑的架构,来实现对中断的处理和硬件资源的调度。在裸机系统的开发中,能够加深入对MCU中断和各个硬件模块的理解,对于进一步学习RTOS是有极大帮助的。

第三,应用场景的适配。作为一个全面的嵌入式工程师,应该能够活用各种技术满足客户的需求。在很多低功耗场景中,裸机系统是不可替代的。有应用场景,就有值得学习的必要。

所以,虽然前后台系统有以上的缺点,但是并不妨碍其在中小型系统中的广泛应用。

写在最后

以上便是嵌入式前后台系统的学习笔记,虽然做嵌入式也有几年了,但也是最近才开始意识到总结和回顾的必要性。如果一个知识点你没办法转换为语言或者文字,你恐怕难以说服自己是真的掌握了。感谢这次的主题活动,让我也有机会总结和回顾嵌入式的知识。

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值