1、内存管理
C中的堆栈:
FreeRTOS的内存管理接口函数:
pvPortMalloc、vPortFree分别对应于C中的malloc和free函数
2、任务管理
1.任务状态
运行(Runing)、非运行(Not_Running)
非运行:阻塞状态(Blocked)、暂停状态(Suspended)、就绪状态(Ready)
- 阻塞状态(Blocked):
处于等待状态,等待两种类型事件
- 时间相关事件:等待一段时间或者等到某个绝对时间
- 同步事件:由其他任务或者中断程序产生
- 暂停状态(Suspended):
1、任务进入暂停状态,只能通过vTaskSuspend函数
void vTaskSuspend(TaskHandle_t, vTaskToSuspend);
vTaskToSuspend表示要暂停的任务,为NULL时表示暂停自己
2、退出暂停状态,只能由别人操作
别的任务调用:vTaskResume
中断程序调用:xTaskResumeFromISR
- 就绪状态(Ready):
任务已准备好,随时可以执行
2.Delay函数
- vTaskDelay:至少等待指定个数的Tick Interrupt才能变为就绪状态
- vTaskDelayUntil:等待到指定的绝对时刻,才能变为就绪态
3.空闲任务以及钩子函数
- 空闲任务(IDLE)
作用:
- 释放被删除的任务的内存
- 使得任务调度器必须能够找到一个可以运行的任务
特点:优先级为0、要么处于就绪态,要么处于运行状态
注意:如果使用vTaskDelete()来删除任务,那么你就要确保空闲任务有机会 执行,否则就无法释放被删除任务的内存
- 空闲任务钩子函数(Idle Task Hook Functions)
作用:
- 执行一些低优先级的、后台的、需要连续执行的函数
- 测量系统的空闲时间
- 让系统进入省电模式
4.调度算法
就绪态的任务,可以被调度器挑选出来来回切换运行状态,调度器永远都是挑选最高优先级的就绪态任务并让它进入运行状态
调度算法即如何确定哪个就绪态的任务可以切换为运行状态
3、同步、互斥、通信
实现同步互斥的内核方法:任务通知、队列、事件组、信号量、互斥量
共同点:操作方法类似,获取/释放、阻塞/唤醒、超时
1.队列
- 队列传输数据:
- 拷贝:将变量、数据的值复制进队列中
- 引用:将变量、数据的地址复制进队列中
无需分配buffer来保存数据,队列中有buffer
队列空间由FreeRTOS内核分配
对于有内存保护功能的系统,如果队列使用引用方法,也就是使用地址,必须 确保双方任务对这个地址都有访问权限。使用拷贝方法时,则无此限制:内核有足 够的权限,把数据复制进队列、再把数据复制出队列。
队列的读写对任务个数没有限制,当多个任务在等待读/写队列的数据,哪个任务先进入就绪状态?
- 优先级最高的任务
- 优先级相同,等待时间最久的任务进入就绪状态
4、中断管理
1、ISR(interrupt service rountine):中断服务程序
特点:
- 不能进入阻塞状态,需要尽快执行
- 在内核中被调用,执行过程中用户的任务无法执行,ISR优先级高于任务
- 在ISR中调用API,不进行任务切换,而是返回是否任务切换的标志(效率高、程序更可控、可移植性)
2、