FreeRTOS笔记-资源管理

  1. RTOS资源管理(Resource Management)
    1. 临界资源的定义
    2. 暂停调度器
    3. 在任务中屏蔽中断
      1. 在ISR中屏蔽中断

RTOS资源管理(Resource Management)

临界资源的定义

在RTOS中,临界资源代表的是一次只能由一个任务来占用的资源。在前面的学习中,
我们采用了互斥锁来使临界资源仅由单个任务来使用。

要独占式地访问临界资源,有2种方法:

  • 公平竞争:比如使用互斥量,谁先获得互斥量谁就访问临界资源,这部分内容前面讲过。
  • 谁要跟我抢,我就灭掉谁:

    中断要跟我抢?我屏蔽中断

其他任务要跟我抢?我禁止调度器,不运行任务切换

暂停调度器

暂停调度以后,任务之间不再进行调度。但是中断任然会触发。

暂停和恢复调度的API函数如下:

1
2
3
4
5
/*暂停调度器*/
void vTaskSuspendAll( void );

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

其内部原理是将一个全局变量进行++,然后调度会判断这个变量是不是0,0的话才能进行调度。

在任务中屏蔽中断

中断的屏蔽是屏蔽部分优先级比较低的中断,毕竟有一些中断是底层的不能去动他。

中断的优先级中,最高的是复位中断、NMI中断和硬件错误中断三个。这三个是不可以屏蔽的中断。
它们的优先级分别是-3、-2和-1。

在任务中屏蔽中断,示例代码如下:

1
2
3
4
5
6
7
/* 在任务中,当前时刻中断是使能的
* 执行这句代码后,屏蔽中断
*/
taskENTER_CRITICAL();
/* 访问临界资源 */
/* 重新使能中断 */
taskEXIT_CRITICAL();

在32位的单片机的可编程中断中,由8bit的寄存器来存储这些中断。

其中从191(0xBE)到255(0xFF)是不调用syscall来进行的中断。优先级比较低,会被函数屏蔽。

在ISR中屏蔽中断

在ISR中屏蔽中断,需要考量的是ISR恢复现场的功能。

在ISR中屏蔽中断,中断的状态不一定就是开启的,使用ISR后缀的屏蔽,可以通过句柄恢复中断的状态,而不是屏蔽完再使能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void vAnInterruptServiceRoutine( void )
{
/* 用来记录当前中断是否使能 */
UBaseType_t uxSavedInterruptStatus;
/* 在ISR中,当前时刻中断可能是使能的,也可能是禁止的
* 所以要记录当前状态, 后面要恢复为原先的状态
* 执行这句代码后,屏蔽中断
*/
uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR();
/* 访问临界资源 */
/* 恢复中断状态 */
taskEXIT_CRITICAL_FROM_ISR( uxSavedInterruptStatus );
/* 现在,当前ISR可以被更高优先级的中断打断了 */
}

在taskENTER_CRITICA_FROM_ISR()和taskEXIT_CRITICAL_FROM_ISR() 之间:

  • 低优先级的中断被屏蔽了:优先级低于、等于configMAX_SYSCALL_INTERRUPT_PRIORITY
  • 高优先级的中断可以产生:优先级高于configMAX_SYSCALL_INTERRUPT_PRIORITY
  • 但是,这些中断ISR里,不允许使用FreeRTOS的API函数
  • 任务调度依赖于中断、依赖于API函数,所以:这两段代码之间,不会有任务调度产生

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以邮件至 1186703947@qq.com

💰

×

Help us with donation

相册 动态菜单1