RTOS资源管理(Resource Management)
临界资源的定义
在RTOS中,临界资源代表的是一次只能由一个任务来占用的资源。在前面的学习中,
我们采用了互斥锁来使临界资源仅由单个任务来使用。
要独占式地访问临界资源,有2种方法:
- 公平竞争:比如使用互斥量,谁先获得互斥量谁就访问临界资源,这部分内容前面讲过。
- 谁要跟我抢,我就灭掉谁:
中断要跟我抢?我屏蔽中断
其他任务要跟我抢?我禁止调度器,不运行任务切换
暂停调度器
暂停调度以后,任务之间不再进行调度。但是中断任然会触发。
暂停和恢复调度的API函数如下:
1 | /*暂停调度器*/ |
其内部原理是将一个全局变量进行++,然后调度会判断这个变量是不是0,0的话才能进行调度。
在任务中屏蔽中断
中断的屏蔽是屏蔽部分优先级比较低的中断,毕竟有一些中断是底层的不能去动他。
中断的优先级中,最高的是复位中断、NMI中断和硬件错误中断三个。这三个是不可以屏蔽的中断。
它们的优先级分别是-3、-2和-1。
在任务中屏蔽中断,示例代码如下:
1 | /* 在任务中,当前时刻中断是使能的 |
在32位的单片机的可编程中断中,由8bit的寄存器来存储这些中断。
其中从191(0xBE)到255(0xFF)是不调用syscall来进行的中断。优先级比较低,会被函数屏蔽。
在ISR中屏蔽中断
在ISR中屏蔽中断,需要考量的是ISR恢复现场的功能。
在ISR中屏蔽中断,中断的状态不一定就是开启的,使用ISR后缀的屏蔽,可以通过句柄恢复中断的状态,而不是屏蔽完再使能。
1 | void vAnInterruptServiceRoutine( void ) |
在taskENTER_CRITICA_FROM_ISR()和taskEXIT_CRITICAL_FROM_ISR() 之间:
- 低优先级的中断被屏蔽了:优先级低于、等于configMAX_SYSCALL_INTERRUPT_PRIORITY
- 高优先级的中断可以产生:优先级高于configMAX_SYSCALL_INTERRUPT_PRIORITY
- 但是,这些中断ISR里,不允许使用FreeRTOS的API函数
- 任务调度依赖于中断、依赖于API函数,所以:这两段代码之间,不会有任务调度产生
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以邮件至 1186703947@qq.com