FREERTOS笔记(二) 中断及常用任务api
文章目录
一、freertos中断
关于中断freertos还是较为复杂的,主要还和m3/m4内核有关,这里主要讲关键一些的(用户有必要了解的),过于底层的就跳过。
//FreeRTOSConfig.h
/* The highest interrupt priority that can be used by any interrupt service
routine that makes calls to interrupt safe FreeRTOS API functions. DO NOT CALL
INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER
PRIORITY THAN THIS! (higher priorities are lower numeric values. */
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5
首先我们默认分组为组4,HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
即中断我们的抢占优先级为0~15,不适用子优先级
设在上面我们定义的只为x,也就是FREERTOS能管理优先级在 x ~ 15 之间的的优先级,这里我们设置为5
也就是说FREERTOS不能管理优先级在0~4的中断,freertos打断不了0-4的中断
同时需要注意的有两点:
1.我们在0-4的中断里不能调用freertos的api了
2.我们可以在5-15的中断中调用以FromISR结尾的api,并且可以中断嵌套
/*********分割线********************************************/
验证:
首先设置串口接收中断优先级8,在5-15内,由freertos管理,串口接收中断内容为发送什么返回什么
某任务1s输出一次任务代码
while(1)
{
printf("iiii=%d\n",iiii);
iiii++;
vTaskDelay(1000);
if(iiii==10) {portDISABLE_INTERRUPTS(); HAL_Delay(5000);}
}
我们在程序运行到10s时关闭所有5-15中断,此时串口接收中断关闭,注意一定要用hal库的延时,如果用任务切换延
时系统会默认开启中断,这样我们会在5s内串口接收中断关闭,发送数据也不会返回,5s时间一过,程序运行到
vTaskDelay时又会开启中断,发送数据又会有返回值了
二、freertos获取任务信息api调用
UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask );//获取当前任务优先级,传入参数为任务句柄
void vTaskPrioritySet( TaskHandle_t xTask,UBaseType_t uxNewPriority );//任务参数看名字就知道了,后面如非必要就不讲了
UBaseType_t uxTaskGetNumberOfTasks( void );//获取任务个数
taskYIELD(); //任务切换,是个宏定义
taskENTER_CRITICAL(); //进入临界区,宏定义,一般用于不能被打断的任务的时候,比如软件i2c啥的
taskEXIT_CRITICAL(); //退出临界区
taskENTER_CRITICAL_FROM_ISR(); //用于中断中
taskEXIT_CRITICAL_FROM_ISR(); //用于中断中
vTaskStartScheduler(); //开启任务调度
vTaskEndScheduler(); //关闭任务调度!!!stm32用不了的!!!
三、freertos延时函数
1 vTaskDelay(ms);
相对延时函数,说延时多少就延时多少,不会随着你其它代码运算量改变而自适应运算周期
2 vTaskDelayUntil(ms);
绝对延时函数,延时时间是会自动改变的,会把你的其它代码运算时间算进去,用于绝对周期延时,例如PID100hz控制
四、其它freertos常用api
pdMS_TO_TICKS() //把ms转换成节拍数