HAL 库的freertos
1 实时
2 任务->线程
3 移植
CMSIS_V2 V1版本
NVIC配置全部是抢占优先级 第四组 抢占级别有 0-15
编码规则,
变量名 :类型前缀,
c - char
S - int16_t
L - int32_t
U - unsigned
Uc - uint8_t
Us - uint16_t
指针变量 需要再变量前加一个P
非标准的类型变量名 X
ux是Ubasetype_t 类型的前缀
函数名:有返回值类型和文件所在组成
xTaskCreate() 这个就是返回类型为BaseType_t 在文件名 task.h定义
vQueueDelete() 返回值类型为void 在文件queue.h定义
pcTimerGetName() 返回值为 char * 在timer.h定义
CMSIS RTOS相关文件定义的函数前缀为 os 不包过返回值类型和所在文件的前缀
例如cmsis_os2.h中得函数osThreadNew().
FreeRTOS的配置和功能裁剪 主要是通过文件 FreeRTOSConfig.h和FreeRTOS.h中得一些宏定义实现的。
Cubemx中得FreeRTOS的 config parameters 配置
MPU/FPU 内存保护单元 和 浮点数单元功能
任务管理:调度器
任务状态:
就绪状态 任务被创建后就进入了就绪状态,就绪任务的优先级高于当前运行任务的优先
级,它就会进入运行状态,如果低于当前任务优先级 他依然是就绪状态
运行状态 正在运行任务状态,如果处于运行态的高优先级任务一直在运行时就会导致低
优先级的就绪态不能够运行,需要使用vTaskSuspend 进入挂起态或者进入阻塞态。
阻塞状态 让任务暂时跳出占用cpu的使用权,处于一种等待状态。通过延时函数
vTaskDelay() 或者 vTaskDelayUntil()进入阻塞状态 ,等待时间达到后,任务进入就绪状态,在下一次的任务调度中进行运行。第二个就是通过进程之间通讯的时间请求函数,例如请求信号量的函数xSemaphoreTake() 运行这个函数后,任务会进入阻塞状态等待信号量和其他函数的延迟。
挂起状态 挂起状态的任务就是不进行调度的任务,需要其他任务进行调用函数,
vTaskResume()进入就绪状态
抢占式和合作式
任务的优先级:总优先级个数是由 FreeRTOSConfig.h中宏congfigMAX_PRIORITIES来定义默认56 数字越小优先级越低
空闲任务:osKernelStart()启动FreeRTOS的任务调度器时 会自动创建一个空闲任务 ldle task 空闲任务的优先级别为 0
主要配置参数:
congfigUSE_TICK_HOOK 是否使用空闲函数的钩子函数 配置1 则可以利用空闲任务的钩子函数,系统空闲时做一些处理
congfigIDLE_SHOULD_YIELD 空闲任务是否对同优先级的任务主动让出cpu控制权
congfigUSE_TICKLESS_IDLE 是否在空闲任务时关闭基础时钟,若配置1 可实现系统低功耗
任务调度方法
抢占式调度方法
上下文切换是通过汇编语言写的 在上面这个函数里面实现了任务调度
任务管理工具函数 :
获取任务句柄的三个函数
获取或者改变任务优先级:
获取
改变
获取任务信息
获取任务名称
任务栈空间 偏小越容易溢出
任务的状态
任务数量
返回所有任务的列表信息 内存消耗比较大
获得所有任务的状态
运行时间 运行时会禁止中断
返回调度器的状态
taskENTER_CRITICAL() 和 taskEXIT_CRITICAL( ) 实现开关中断
这些中断屏蔽函数只能屏蔽 freertos 的中断,不能够屏蔽 硬件中断 ,
硬件触发和软件触发的某些中断是 不可以调用 freertos的api函数,因为这些中断不是freertos的一个任务
进程间通信与消息队列:queue消息队列
队列 queue : 一个缓冲区 在进程间传递少量的数据 被称为 消息队列
信号量 semaphore : 分为而知信号量和技术信号量 二值信号量适用于进程间同步 计数
信号量一般用于共享资源的管理
互斥量 Mutex : 互斥量和递归互斥量 ----- 互斥量具有优先级继承机制,减少优先级翻转
事件组 Event Group : 事件组可以用于多个时间触发一个和多个任务运行 实现事件的 广播 还可以实现多个任务的同步运行
流缓冲区和消息缓冲区 : v10 版本功能,用于优化进程间通信机制 应用于只有一个 写入者和读取者 适用于多核 cpu 的内核之间传输数据
队列的特点和基本操作
这个函数可以读取数据 读完数据后 就会删除队列
这个函数可以读取数据 读完数据后 不会删除这个队列
在中断服务程序 isr 中操作队列的话就需要 运行这种带有 fromisr 的函数
将队列中得数据全部复位为空
删除一个队列 和一个队列信号量
获取一个队列的名称
为队列设置一个编号
获取队列的编号
获取队列的剩余空间个数
获取队列中等待被读取的消息个数
一个查空一个插满
将消息写入队列的后方
信号量
互斥量
相关的函数:
事件组 :
信号量
事件组: