推荐书籍:STM32Cube高效开发教程
学习视频来源:B站@Kevin_WWW (这个up对上面书籍进行了讲解)--但到后面收费--可以自己看书学习--或者找freertos的相关开发手册自己学习
freertos官方文件下载地址:FreeRTOS-Kernel-Book/ch04.md at main · FreeRTOS/FreeRTOS-Kernel-Book (github.com)
B站@正点原子官方-----【正点原子】手把手教你学FreeRTOS实时系统
CMSIS-RTOS2 API介绍网址:CMSIS-RTOS2: API Reference (arm-software.github.io)
CUBEMX配置
1. RCC: 高速外部时钟
GPIO:选择led的引脚 设置为外部输出
SYS:选择Serial Wire
时钟树配置:
红色圈圈的参数根据开发板上的晶振设置
2.点开Middleware and Software Packs 选中FREERTOS 在interface中选择CMSIS_V2
freertos configuration界面框
Mutexes;互斥量
Events:事件
FreeRTOS Heap Usage;FreeRTOS堆使用情况
User Constants Tasks and Queues :用户常量
Timers and Semaphores:定时器和信号量
Config Parameters:参数配置
Include parameters:包含参数配置
Advanced settings;高级设置
Task and Queues:任务和队列
Task and Queues
在freertos中用户至少创建一个任务 在启用freertos的时候,cubemx已经默认启用了一个任务
点击Task中任意选项 对任务相关参数进行配置
Entry Function:StartDefaultTask 任务的函数名
生成代码事会遇到下面问题:
-当使用RTOS时,强烈建议使用除Systick之外的HAL时基源。HAL时基源可以从SYS下的选项卡更改。
Timebase Source:时基源
这里采用TIM6 TIM6是通用定时器 用TIM6做时基源不占用资源
之所以出现这种情况 是因为freertos将system clock作为基础时钟 所以需要设置一个定时器作为hal库的基础时钟
文件生成和代码架构
源文件多了freertos.c stm32f4xx_haltimebase_tim.c FreeRTOSConfig文件
其中主要在freertos.c 文件中编写功能用户的程序
stm32f4xx_haltimebase_tim.c设置里了hal的基础时钟 设置TIM6作为hal的基础时钟源 使基础时钟源 的终端周期为1ms TIM6代替了原来的system TIck 定时器在hal中的作用 Rcc TIck定时器由freertos使用。
FreeRTOSConfig:freetros的配置文件 里面的很多的宏定义都是和xubemx中的配置一一对应的
在修改相关配置时 要在cubemx中修改参数 不要再kile中修改
Drivers/STM32F4xx_HALxx_HAL文件和Drivers/CMSIS文件没有改动
Middlewares/FreeRTOS是freeRTOS的源文件 不需要改动
代码分析
osKernelInitialize():cmsis_os2.c文件中的函数 是freertos的源函数 查看CMSIS-RTOS API中的解释----初始化RTOS的内核
MX_FREERTOS_Init():对freertos中所创建对象进行初始化
add mutexes:添加互斥量
add semaphores:添加信号量
start timers, add new ones:开启定时器
add queues:添加队列
creation of defaultTask:创建一个任务
add threads:添加线程
add events:添加事件
osKernelStart():
启动RTOS内核调度程序。
返回指示函数执行状态的状态代码。
IS_IRQ():获取APSR寄存器的值 如果是1 stat = osErrorISR
osErrorISR = -6,
///< Not allowed in ISR context: the function cannot be called from interrupt service routines.
ISR环境中中不允许:不能从中断服务例程调用函数(应该是不能执行 中断服务程序)
如果是0
之前的osKernelInitialize()将 osKernelReady 赋值给了KernelState 判断通过 执行下面程序
SVC_Setup():确保SVC优先级处于重置值
KernelState = osKernelRunning;更改状态以启用IRQ屏蔽检查
vTaskStartScheduler():启动内核调度程序
再执行完vTaskStartScheduler()后,fteerrtos接管了系统的控制权
所以再main.c文件中 在 osKernelStart()后有一句话
我门将永远不会执行到这 也就是说while()语句中的东西将不被执行 所要执行的函数在StartDefaultTask()
及上述所提到的在frrertos..c文件中编写功能程序