
调度器:
调度算法:切换任务所采用的策略
任务:
- 空闲任务 : 单片机永远不会停下来,,当其他任务都停滞的时候,就会执行这个空闲任务
- 定时器任务 : 软件定时器
- 用户任务: 用户创建的任务
cortex内核中的中断:
- SVC中断 : 启动首个任务中断
- pendSV中断 : 后续任务切换中断
- SysTick中断 : 时间片,,或者系统节拍中断
堆内存:
C语言中用 malloc()分配堆内存(比如数组个数不确定,不能指定分配内存的大小,需要动态分配),,用free()释放堆内存,,,但是这个方法,,不可重入,内存碎片化,速度慢并且执行时间不确定,,所以 freertos没有使用这两个方法,,而是自己写了一套管理堆内存管理。,有heap1~heap5,,一般用heap4
内核对象
freertos 中内核对象,,队列,,事件组,信号量等,,这些内核对象都是在堆内存中动态创建和回收的,,都是存放在堆内存中的
工具链
- keil5的工具链叫 RVDS
- cubeIDE 工具链叫 GCC
freerstos配置文件freeRtosConfig.h
这里面的配置,将stm32和freeRtos整合到一起:
-
configCpu_clock_HZ : 内核运行频率 ===》 将stm32时钟频率和 freeRtos的时钟频率统一
-
configTick_Type_width_in_bits : 设置
TickType_t类型的位宽,, 这个对象是freeRtos中用来存时间的类型,,用来存储系统节拍的数据类型,,, 32位大概是49天一次,,配置小了会导致时间戳回绕频率变大,, 回绕发生频繁 -
configkend_interrupt_priority : 设置SysTick 和 pendSV中断的优先级。。。 8位二进制表示优先级,,只用了高4位,,配置位
15 << 4 -
configmax_syscall_interrupt_priority : 调用freeRtos API的优先级,,, 4位二进制,一共0~15个数,,,,限制大于某个中断优先级,,就不让调用freeRtos的API,,只有在某个中断优先级后才能调用
对于一些高优先级的中断来说,他不想受到任何形式的干扰,,,划分界限,,不让freeRtos的API调用
-
configUSE_TIME_Slicing : 是否使用时间片,,,
1表示启用时间片,,就是同优先级的任务轮流分时执行
0表示关闭时间片,,就是同优先级的任务一旦拿到cpu,,除非他主动让出,,否则会一直独占
-
configCHECK_FOR_STACK_OVERFLOW配置位0
整合freeRtos中断函数到stm32
cortex m3中断有 SVC, SysTick ,PendSV...这三个中断都需要换成freeRtos写的中断才行,,vPostSVCHandler...xPortPendSVCHandler,xPortSysTickHandler,将中断安装到中断向量表中,,都替换成freeRtos的中断,,,因为hal库中的时钟是 SysTick中断产生的,被替换之后,,时间的cnt递增就没了,,需要找一个新的定时器产生时间