链接------最详细的地方通常是官方文档
(2022年12月20日官方网站中文版上线,歪瑞古德)
- 优先级
- 数值越大优先级越低(与uCOS相反)
- 最大优先级配置最好不超过32(专用算法效率高)
- 中断
- 中断分组最好全部为抢占优先级,容易管理(对于stm32cube也只支持这样)
- 可被系统管理的中断,顾名思义,就是FreeRTOS可以关的掉的中断(如临界段),不被系统管理的中断,系统是没权限关闭的
- 如果在中断中使用了可能会影响系统任务调度的api,中断处理结束添加
portYIELD_FROM_ISR()
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
- 任务创建
- 如果程序运行没跑起来往往是因为任务创建时的栈分配不够
- 优先级翻转
- 指高优先级任务因为等待资源释放导致阻塞,发生任务调度时,低优先级就绪任务先运行的情况
- 互斥信号量
- 解决了优先级翻转现象的二值信号量。高优先级任务等待低优先级任务释放资源时,低优先级任务会暂时继承高优先级任务的优先级(优先级继承),这样优先级翻转现象就不会发生。等资源释放后低优先级任务的优先级会恢复
- 互斥信号量中断函数内不可用
- 任务信号量无须创建即可使用,任务控制块自带的一个专用任务通知的32位变量
ulNotifiedValue,初始计数值为0,执行效率比消息队列实现的信号量要高 - 任务通知相关的信号量,标志组和邮箱都是操作
ulNotifiedValue实现的 - 内存管理
- heap_1: 静态内存管理,申请的内存不允许释放
- heap_2: 比C库更高效的动态内存管理,但不考虑内存碎片,适用于内存块大小固定的情况
- heap_3: 是对编译器提供malloc和free的封装,线程安全,使用的是启动文件配置的堆内存,而不是FreeRTOSConfig.h中宏定义的堆内存
- heap_4: 最常用的一种,比C库高效,支持内存碎片回收
- heap_5: 在heap_4基础上实现,支持不连续的内存空间,比如内部SRAM一块外部SRAM一块,需要使用vPortDefineHeapRegions(xHeapRegions)初始化指定数量、位置和大小
xPortGetFreeHeapSize()函数可以获取FreeRTOS动态内存剩余xPortGetMinimumEverFreeHeapSize()函数可以获取从系统启动到当前状态的最小FreeRTOS动态内存剩余- 线程安全指可以无副作用的多任务调用
- 低功耗tickless模式,对应cortex-m3和m4,直接配置
configUSE_TICKLESS_IDLE为1就好了,其他需要用户实现
FreeRTOS官方FAQ
参考文档
- 《安富莱 stm32v5开发板 FreeRTOS教程》
- FreeRTOS版本:v8.2.3