目录
一、freertos中断配置
FreeRTOS
的中断配置中没有处理亚优先级(响应优先级)的情况,所以只能配置成
组4
,
16
个都为抢占优先级
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4(freertos)
1.中断相关宏定义介绍
configPRIO_BITS:
此宏用来设置
MCU
使用几位优先级,
STM32
使用的是
4
位,因此此宏为
4
!
2^4=16,
那么就有
16
个优先级
configKERNEL_INTERRUPT_PRIORITY
:此宏用来设置内核中断优先级
configLIBRARY_LOWEST_INTERRUPT_PRIORITY
:设置最低优先级。
configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY
:来设置FreeRTOS
系统可管理的最大优先级,是高于
x
的优先级不归
FreeRTOS
管
理!
设置系统的优先级。
数字值越大,优先级越低
。最低优先级就是
15
,系统能管理的最高优先级是
5
,也就是说
数值小于
5
的优先级(优先级大于5)
FreeRTOS
不能管理
。
2.中断中调用系统函数
configMAX_SYSCALL_INTERRUPT_PRIORITY
:低于此优先级的中断可以安全的
调用
FreeRTOS
的
API
函数,高于此优先级的中断
FreeRTOS
是不能禁止的,中
断服务函数也不能调用
FreeRTOS
的
API 函数。在上述中我将此值宏定义为5,即数值小于5的优先级不能调用
FreeRTOS
的
API
函数。
图示如下:
![](https://img-blog.csdnimg.cn/24967899b51d48ba9785cac9665af5a8.png)
注:中断中的API函数一般以FROM_ISR结尾
二、相关案例测试
1.开关中断
FreeRTOS
开关中断函数为
portENABLE_INTERRUPTS ()
和portDISABLE_INTERRUPTS()
,这两个函数其实是宏定义,在
portmacro.h
中有定义,如下:
![](https://img-blog.csdnimg.cn/1a75cae2320d4e80853fb636b7a90f83.png)
创建一个任务,任务每个5s打开和关闭一次中断。定时器3的中断服务函数随之每个5s打印输出数据。
相关代码:
void led0_task(void *pvParameters)
{
while(1)
{
printf("关闭中断......\r\n");
portDISABLE_INTERRUPTS();
delay_xms(5000);
printf("打开中断......\r\n");
portENABLE_INTERRUPTS();//此行代码可有可无
LED0 = ~LED0;
vTaskDelay(5000);
}
}
void TIM3_IRQHandler(void)//定时器3的中断服务函数
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)
{
printf("TIM3输出......\r\n");
}
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}