【FreeRTOS】06 临界段的保护——关中断和关调度

本节来讲一讲FreeRTOS如何保护临界段,先讲临界段的概念,再讲保护临界段的方法。

1)临界段的概念

简单来讲,临界段是一段执行时不允许被中断(或其他任务)打断的代码;如果被打断,就有可能运行出错。

举个例子:

假设我们有一个任务Task1需要向队列FIFO中写入数据,中断服务函数TaskISR1也需要向队列FIFO中写入数据;我们知道,FIFO的写或者读需要依次执行:写入/读出数据、更新读/写指针。

如果Task1在向FIFO中写入数据时,执行完写入数据,但还没有更新写指针,此时中断来了,TaskISR1开始运行,它也需要向FIFO中写入,而由于Task1运行时还没有更新写指针,则TaskISR写入的数据会把Task1刚刚写入的数据覆盖,然后更新写指针;这就出现了一次丢失数据的错误。

当然错误还不只如此,中断服务程序TaskISR1运行完毕后,回到Task1继续运行,它会接着被打断的位置向后执行,更新写指针;这样就相当于没有写入数据,但又更新了一次写指针。

像这个例子中的FIFO写入数据、读出数据的代码段,就是临界段;它的读写数据和更新读写指针,两个操作之间不能被打断,否则就会可能出错。

用户代码中用于任务和中断间通信的变量、不可重入函数,操作系统的某些底层代码,都有可能是临界段。如果不保护好临界段,代码就会出现各种难以排查、难以复现的bug。

最简单的保护临界段的方法,就是关闭中断,以及关闭任务调度。也就是暂时禁止中断和其他任务执行,等到临界段执行完毕后再恢复。具体使用时&

  • 12
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值