FreeRTOS资源管理

在一个多任务系统中存在如下的潜在问题:非原子操作。当一个任务在访问一个资源,且尚未完成一次访问,此时被调度退出运行态,另一个任务/中断进入访问这个资源将会产生一些意想不到的问题。一些典型的例子如:

  1. 访问外设,比如写LCD
    1. 任务A执行写”I love you”到LCD
    2. 在写到”I ”之后,任务A被任务B抢占
    3. 任务B写”do not”到LCD
    4. 切换回任务A继续执行继续之前的上下文操作

LCD输出内容将会是:”I do not love you”

  1. 读、修改、写操作

这个操作是非原子的,因为它会先读、再改、再写,这些指令都是分开的、可被中断的,

  1. 对变量的非原子访问

比如在一个16位机器上,实现一个32位的变量的访问

  1. 函数可重入性

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

被一组taskENTER_CRITICAL()与taskEXIT_CRITICAL()包围的代码区域称为临界段/临界区,调用taskENTER_CRITICAL()会关闭中断,直到taskEXIT_CRITICAL()调用才会将中断打开。所以在使用这个方法时,要尽量保证这一组宏之间的代码处理尽量短。

中断中的使用版本为taskENTER_CRITICAL_FROM_ISR()与taskEXIT_CRITICAL_FROM_ISR(),这是需要传递参数做匹配的一组接口。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

可以通过挂起调度器来实现类似临界段的功能,但是因为只是挂起调度器,此时只能防止其他任务抢占处理器资源,中断依旧是可用的。当我们需要的临界段比较长,此时关闭中断不是一个明智的选择,我们可以挂起调度器,来让这个任务独占处理器的计算资源。使用vTaskSuspendAll()来防止进行上下文切换,使用xTaskResumeAll()来重启调度器。

你可能感兴趣的:(freertos)