目录
- 十、资源管理
- 10.1 基本概念
- 10.2 关任务调度器
- 10.3 关中断
- 10.4 实例
十、资源管理
该部分在上份代码基础上修改得来,代码下载链接:
https://wwzr.lanzout.com/iqBYJ1lauxof
密码:9adb
该代码尽量做到最简,不添加多余的、不规范的代码。
内容主要包括:
- 互斥的本质
- 关中断
- 关任务调度器
最终实现效果:
- 创建任务1、任务2,任务1中暂停中断/调度器,死循环3s,后恢复中断/调度器。
10.1 基本概念
资源管理主要是说管理共享资源
资源管理涉及到任务之间对共享资源的互斥****访问
用 队列、信号量/互斥量、事件组、任务通知 都可以实现互斥操作。
他们实现互斥的本质,其实就是 关中断 或 关任务调度器。这个在其函数内部都可以找到,最终都会调用这两个函数中的一个:关任务调度器vTaskSuspendAll();
关中断taskENTER_CRITICAL();
互斥****的核心思想:谁跟我抢,就先禁止谁。(任务抢资源,就关任务调度器。中断抢资源,就关中断)
10.2 关任务调度器
在FreeRTOS中,可以使用 vTaskSuspendAll
和 xTaskResumeAll
函数来暂停和恢复调度器。这对于禁止任务切换非常有用,可以确保在关键部分的代码中不会发生任务切换。
// 暂停调度器
vTaskSuspendAll();
// 关键代码段,此时任务切换被禁止
// 恢复调度器
xTaskResumeAll();
10.3 关中断
在FreeRTOS中,可以使用 taskENTER_CRITICAL
和 taskEXIT_CRITICAL
宏来屏蔽和恢复中断。适用于需要禁止中断的关键代码段。在中断被屏蔽时,所有中断都会被禁止,包括时钟中断和其他外部中断。任务调度器的运行依赖于时钟中断(SysTick),所以任务调度器也自然失效了
// 屏蔽中断
taskENTER_CRITICAL();
// 关键代码段,此时中断被禁止
// 恢复中断
taskEXIT_CRITICAL();