freertos01

调度器:

调度算法:切换任务所采用的策略

任务:
  • 空闲任务 : 单片机永远不会停下来,,当其他任务都停滞的时候,就会执行这个空闲任务
  • 定时器任务 : 软件定时器
  • 用户任务: 用户创建的任务
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递增就没了,,需要找一个新的定时器产生时间