浅谈:freeRTOS
1、内存管理
freeRTOS提供5种内存管理方式,heap_1-heap_5,通常采用heap_4,其特点是相邻空闲碎片可合并,且效率较高;
2、任务管理
任务调度依据优先级实现,处理器优先处理优先级高的任务,若优先级相同,采用分时处理原则,每个时间片通常为1Tick/1ms;
优先级取值范围为0~(configMAX_PRIORITIES – 1),其中configMAX_PRIORITIES在配置文件中设置,通常不超过32,
数值越高优先级越高,这一点恰好和中断相反,每个优先级都会维护一个优先级队列,以此来调度处理器;
3、任务同步
freeRTOS任务同步主要通过semaphore和mutex实现,其中mutex通过优先级继承可防止优先级反转;
任务通信主要通过队列实现,另外事件组也可用于任务同步与通信,configUSE_16_BIT_TICKS=1表示每个事件组包含16位,
其中高8位保留,通常用于系统时间戳,第8位可用于表示事件;configUSE_16_BIT_TICKS=0表示每个事件组包含32位,其余
不变;另外,事件组可同时保留多个,用于不同任务之间的隔离与维护方便;
4、中断管理
中断分为响应式和抢断式,通常4位,16个级别进行划分,划分由NVIC实现,通常只包含响应式中断足矣,数值越小优先级越高;
中断服务例程(ISR)需要尽可能简短,尽量做一些数据获取/转移、位操作之类的,具体的数据处理与响应交由具体任务实现即可;
注意ISR中不能调用xTaskDelay()这种可被阻塞的函数,因为ISR没有可用的上下文被阻塞起来,所以freeRTOS对这类函数通常设置了两套API,其中一套用于任务调用,另外一套在尾部加FromISR,如xQueueSendFromISR(),用于ISR,可防止ISR被阻塞;
任务可被阻塞的函数通常设计队列处理、信号量、事件组、任务通知、软件定时器等相关函数。