FreeRTOS的中断配置是一个很重要的内容,需要根据所使用的MCU来具体配置
重点:不同的MCU所在FreeRTOS的配置是不一样的,当你使用了其他芯片,配置就有所不同了,不要固定思维。 ---- 你需要理解你所使用的MCU的中断资源
M3-内部的有些中断具有固定的优先级
编程习惯---在数字前面加数据类型,
比如寄存器32位,我们对它进行赋值,按理说是0X700,忽略了前面的很多0没写,我们需要这样写(uint32_t)0X700,这样更好,更规范
下面举例是:ST库函数的宏定义,他们只要使用十六进制的值的时候,都会加入数据类型
理解这个图:FreeRTOS可以管理一些中断,也可以不管理一些中断,而哪些被管理的,才能使用FreeRTOS提供的函数(必须带有FromISR),而哪些没被管理的中断,不能使用FreeRTOS提供的函数
至于FreeRTOS管理的范围是可以设置的,默认是5-15被管理 0-4不被管理 ,宏定义进行配置即可
不被被打断:关闭中断、关闭任务调度器
其实任务调度依赖的就是最低优先级的中断:如Pensv
使用注意点:支持嵌套,因此需要成对出现,执行时间短,中间的执行代码不能时间太长
一个中断需要使用这个临界段保护的功能前提是:此中断是FreeRTOS管理的中断
/* 临界段保护模板使用 */
//支持嵌套,因此需要成对存在
#if 0
taskENTER_CRITICAL();
/*执行语句代码---注意点:语句不能太复杂,消耗的时间不能太多*/
taskEXIT_CRITICAL();
uint32_t save_state;
save_state = taskENTER_CRITICAL_FROM_ISR();
/*执行语句代码*/
taskEXIT_CRITICAL_FROM_ISR(save_state);
#endif
#define taskEXIT_CRITICAL_FROM_ISR( x portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) --这个函数有点奇怪,它是存在形参的,而他的形参是ENTER的返回值---使用的方法是一个模板(不需要知道为什么,只需要知道怎么用即可)
返回值其实就是为了记录,然后方便我们恢复之前的代码而已(源码分析)
挂起任务调度器的原理是:不执行pensv中断进行任务切换
源码分析:就是对uxSchedulerSuspended进行加一,而恢复就是减一,所以支持嵌套。
uxSchedulerSuspended的初始值为pdFALSE。UBaseType_t uxSchedulerSuspended = ( UBaseType_t ) pdFALSE; #define pdFALSE ( ( BaseType_t ) 0 ) pdFALSE的值为0.
为什么我们改变uxSchedulerSuspended的值就能实现挂起呢?
通过此函数完成任务切换,如果不等于就开启任务切换
该函数的意思就是:uxSchedulerSuspended等于pdFALSE的话就执行if里面的语句xSwitchRequired = pdTRUE;说明会改变xSwitchRequired的值
如果不等于的话,就直接return了,因此只要uxSchedulerSuspended变化了,则xSwitchRequired的值保持初始值pdFALSE,反之就不是,就这样完成了任务是否切换的选择
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)