【正点原子】手把手教你学FreeRTOS-04

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,反之就不是,就这样完成了任务是否切换的选择

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值