嵌入式八股文总结(FreeRTOS篇)

        最近在准备秋招,在此每天总结一些面试常问的问题,希望可以和大家一起进步。(持续更新中……)

目录

1. 优先级反转

2.如何合理地设定任务栈地大小

3. 前后台程序与实时操作系统的区别是什么?

4. 剥夺型内核和不可剥夺型内核的区别


1. 优先级反转

        在使用二值信号量和计数型信号量的时候会遇到优先级反转的问题,比如现在有三个任务:H、M、L,H任务优先级最高,L任务优先级最低。L先运行,H、M处于阻塞态,此时L要访问共享资源,所以获取到信号量。此时H开始运行,抢占L任务,H要访问共享资源,但信号量无资源了,H阻塞等待,L继续运行。此时M任务开始运行,抢占任务L。M运行完毕,L继续运行,L释放信号量,H任务唤醒,运行任务H。可见,H任务的任务优先级最高,但却最后执行,图示如下:

解决方法:

        优先级继承,低优先级获取到信号量时,若高优先级任务尝试获取信号量,则临时将低优先级任务的等级提升至 和高优先级任务相等,高优先级获取到信号量后恢复地任务优先级等级。优先级继承并不能完全的消除优先级翻转的问题,它只是尽可能的降低优先级翻转带来的影响。

补充:互斥信号量其实就是一个拥有优先级继承的二值信号量,注意互斥信号量不能用于中断服务函数中,原因如下:

        (1) 互斥信号量有任务优先级继承的机制,但是中断不是任务,没有任务优先级,所以互斥信号量只能用与任务中,不能用于中断服务函数。

        (2) 中断服务函数中不能因为要等待互斥信号量而设置阻塞时间进入阻塞态。

2.如何合理地设定任务栈地大小

        可以先给任务设置比较大的任务栈,确保不会出现栈溢出的情况,然后让系统运行一段比较长的时间,同时尽量触发各种可能的情况,可通过uxTaskGetStackHighWaterMark() 函数来查看任务最多使用了多少栈空间,一般将最终的栈大小设置为该值的1.5~2倍是比较合适的。

3. 前后台程序与实时操作系统的区别是什么?

        前后台系统中所有任务都是平级的,都放在一个大循环中,运行一个任务前必须等待前面的任务执行完成,实时性比较差。单片机为了处理紧急事件,设置了中断机制,我们把中断机制成为前台。执行中断时要花费时间去处理中断点的信息,所以频繁使用中断的话会占用较多的CPU资源。

        而实时操作系统采用时间片轮转的方式来执行任务,并会为每个任务分配不同的优先级,高优先级的任务先执行,极大地提高了CPU的利用率,并且提供系统的实时性。   

4. 剥夺型内核和不可剥夺型内核的区别

        不可剥夺型内核是指在执行任务过程中,一个任务可以一直运行,只有当前运行的任务主动放弃CPU控制权才会进行任务切换。可剥夺型内核是指系统可以强制中断正在执行的任务,并将控制权交给其他高优先级的任务。比如FreeRTOS就是剥夺型内核,通过时间片轮转来实现任务切换。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值