15.FreeRTOS_资源管理

本文描述的是FreeRTOS如何处理任务与任务之间争夺临界资源,以及任务与中断之间争夺临界资源的方法。

解决主要思路:

  • 对于任务与任务之间,思路为关闭任务调度,这样就可以防止其他任务来抢占临界资源。
  • 对于任务与中断之间,思路为关闭中断,这样可以防止中断打断任务,中断打断中断的情况。因为任务不能打断中断,所以不用关闭任务调度。

暂停/恢复调度器函数

函数声明如下:

/* 暂停调度 */
void vTaskSuspendAll( void )

/* 恢复调度 */
BaseType_t xTaskResumeAll( void )

具体代码使用方法如下:

int g_a;/* 临界资源 */

void fun(){

    /* 暂停调度 */
    void vTaskSuspendAll( void )

    /* 访问临界资源 */
    g_a++;

    /* 恢复调度 */
    BaseType_t xTaskResumeAll( void )
}

屏蔽中断函数

在FreeRTOS中,中断优先级为0~190的中断不调用syscall,191~255的中断调用syscall。屏蔽中断实际上是屏蔽的中断优先级191~255的全部中断。

因为屏蔽中断函数不能够屏蔽优先级为0~190的中断,因此编写优先级为0~190的中断的中断处理函数时,不能够使用临界资源。这是一种约定。

函数声明如下:

/* 任务中屏蔽、使能中断 */
taskENTER_CRITICAL()             /* 屏蔽 */
taskEXIT_CRITICAL()              /* 使能 */

/* 中断中屏蔽、恢复中断 */
taskENTER_CRITICAL_FROM_ISR()    /* 屏蔽,有一个返回值,表示屏蔽前的全部中断状态 */
taskEXIT_CRITICAL_FROM_ISR(x)    /* 恢复,参数为屏蔽的返回值,将全部中断状态恢复原样 */

任务恢复与任务使能的区别:

  • 中断中称为恢复中断,因为在屏蔽中断之前,中断状态可能为开启或禁止,之后应该恢复成原来的状态,而不一定为开启状态。
  • 任务中称为使能中断,因为在屏蔽中断之前,一定为开启状态,屏蔽之后把中断给关了,之后应该再开启中断,因此叫使能。

任务中屏蔽中断代码如下:

/* 任务中屏蔽中断 */
void Task(void* param){

    /* 屏蔽中断 */
    taskENTER_CRITICAL();
    
    /* 访问临界资源代码 */

    /* 使能中断 */
    taskEXIT_CRITICAL(); 
}

中断中屏蔽中断代码如下:

/* 中断中屏蔽中断 */
void xxx_IRQHandler(){
    /* 定义变量,保存中断状态 */
    UBaseType_t uxSavedInterruptStatus;
    
    /* 屏蔽中断 */
    uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR();
    
    /* 访问临界资源 */

    /* 恢复中断 */
    taskEXIT_CRITICAL_FROM_ISR(uxSavedInterruptStatus);   
}

相关推荐

  1. 15.FreeRTOS_资源管理

    2024-07-18 14:30:02       23 阅读
  2. FreeRTOS——中断管理

    2024-07-18 14:30:02       58 阅读
  3. FreeRTOS学习——中断管理

    2024-07-18 14:30:02       51 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-18 14:30:02       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-18 14:30:02       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-18 14:30:02       57 阅读
  4. Python语言-面向对象

    2024-07-18 14:30:02       68 阅读

热门阅读

  1. 牛奶供应(三)

    2024-07-18 14:30:02       16 阅读
  2. 正则表达式

    2024-07-18 14:30:02       21 阅读
  3. AI发展下的伦理挑战,应当如何应对?

    2024-07-18 14:30:02       18 阅读
  4. SDF学习笔记整理

    2024-07-18 14:30:02       23 阅读
  5. 24/07/18数据结构(7.1220)队列实现

    2024-07-18 14:30:02       21 阅读
  6. HOW - SVG 图标组件封装(Lucide React)

    2024-07-18 14:30:02       22 阅读
  7. Linux-快捷键以及vim工具使用

    2024-07-18 14:30:02       19 阅读
  8. Web前端-Web开发CSS基础3-盒模型

    2024-07-18 14:30:02       18 阅读
  9. C++ bind和placeholders

    2024-07-18 14:30:02       20 阅读
  10. 力扣LCR184.设计自助结算系统

    2024-07-18 14:30:02       19 阅读
  11. SpringBoot 实现整合kafka的简单使用

    2024-07-18 14:30:02       21 阅读