一、FreeRTOS简介
FreeRTOS 是一个可裁剪、可剥夺型的多任务内核,而且没有任务数限制。FreeRTOS 提供了实时操作系统所需的所有功能,包括资源管理、同步、任务通信等。
FreeRTOS 是用 C 和汇编来写的,其中绝大部分都是用 C 语言编写的,只有极少数的与处理器密切相关的部分代码才是用汇编写的,FreeRTOS 结构简洁,可读性很强!最主要的是非常适合初次接触嵌入式实时操作系统学生、嵌入式系统开发人员和爱好者学习。
最新版本 V9.0.0(2016年),尽管现在 FreeRTOS 的版本已经更新到 V10.4.1 了,但是我们还是选择 V9.0.0,因为内核很稳定,并且 上资料很多,因为 V10.0.0 版本之后是亚马逊收购了FreeRTOS之后才出来的版本,主要添加了一些云端组件,一般采用 V9.0.0 版本足以。
- FreeRTOS官 :http://www.freertos.org/
- 代码托管 站:https://sourceforge.net/projects/freertos/files/FreeRTOS/
二、新建工程
1. 打开 STM32CubeMX 软件,点击“新建工程”
3. 配置时钟
RCC 设置,选择 HSE(外部高速时钟) 为 Crystal/Ceramic Resonator(晶振/陶瓷谐振器)
4. 配置调试模式
非常重要的一步,否则会造成第一次烧录程序后续无法识别调试器
SYS 设置,选择 Debug 为 Serial Wire
在基于STM32 HAL的项目中,一般需要维护的 “时基” 主要有2个:
- HAL的时基,SYS Timebase Source
- OS的时基(仅在使用OS的情况下才考虑)
而这些 “时基” 该去如何维护,主要分为两种情况考虑:
-
裸机运行:
可以通过 (滴答定时器)或 ()定时器 的方式来维护 ,也就是HAL库中的 ,这是HAL库中维护的一个全局变量。在裸机运行的情况下,我们一般选择默认的 (滴答定时器) 方式即可,也就是直接放在 中断服务函数中来维护。 -
带OS运行:
前面提到的 是STM32的HAL库中的新增部分,主要用于实现 以及作为各种 timeout 的时钟基准。在使用了OS(操作系统)之后,OS的运行也需要一个时钟基准(简称“时基”),来对任务和时间等进行管理。而OS的这个 时基 一般也都是通过 (滴答定时器) 来维护的,这时就需要考虑 “HAL的时基” 和 “OS的时基” 是否要共用 (滴答定时器) 了。
如果共用SysTick,当我们在CubeMX中选择启用FreeRTOS之后,在生成代码时,CubeMX一定会 如下提示:
- Semaphore Name: 信 量名称
- Allocation: 分配方式: 动态内存创建
- Conrol Block Name: 控制块名称
4.2.2 创建计数信 量Counting Semaphore
要想使用计数信 量必须在 中把 选择 来使能。
- Semaphore Name: 信 量名称
- Count: 计数信 量的最大值
- Allocation: 分配方式: 动态内存创建
- Conrol Block Name: 控制块名称
4.3 创建任务Task
我们创建两个任务,一个信 量接收任务,一个信 量发送任务。
- Task Name: 任务名称
- Priority: 优先级,在 FreeRTOS 中,数值越大优先级越高,0 代表最低优先级
- Stack Size (Words): 堆栈大小,单位为字,在32位处理器(STM32),一个字等于4字节,如果传入512那么任务大小为512*4字节
- Entry Function: 入口函数
- Code Generation Option: 代码生成选项
- Parameter: 任务入口函数形参,不用的时候配置为0或NULL即可
- Allocation: 分配方式: 动态内存创建
- Buffer Name: 缓冲区名称
- Conrol Block Name: 控制块名称
五、KEY
5.1 参数配置
在 中选择 设置。
六、UART串口打印
查看 STM32CubeMX学习笔记(6)——USART串口使用
七、生成代码
输入项目名和项目路径
八、相关API说明
8.1 osSemaphoreCreate
用于创建一个二值信 量,并返回一个ID。
函数 osSemaphoreId osSemaphoreCreate (const osSemaphoreDef_t *semaphore_def, int32_t count) 参数 semaphore_def: 引用由osSemaphoreDef定义的信 量 count: 信 量数量
返回值 成功返回信 量ID,失败返回0 8.2 osSemaphoreDelete
用于删除一个信 量,包括二值信 量,计数信 量,互斥量和递归互斥量。如果有任务阻塞在该信 量上,那么不要删除该信 量。
函数 osStatus osSemaphoreDelete (osSemaphoreId semaphore_id) 参数 semaphore_id: 信 量ID 返回值 错误码 8.3 osSemaphoreRelease
用于释放信 量的宏。释放的信 量对象必须是已经被创建的,可以用于二值信 量、计数信 量、互斥量的释放,但不能释放由函数 xSemaphoreCreateRecursiveMutex() 创建的递归互斥量。可用在中断服务程序中。
函数 osStatus osSemaphoreRelease (osSemaphoreId semaphore_id) 参数 semaphore_id: 信 量ID 返回值 错误码 8.4 osSemaphoreWait
用于获取信 量,不带中断保护。获取的信 量对象可以是二值信 量、计数信 量和互斥量,但是递归互斥量并不能使用这个 API 函数获取。可用在中断服务程序中。
函数 int32_t osSemaphoreWait (osSemaphoreId semaphore_id, uint32_t millisec) 参数 semaphore_id: 信 量ID millisec:等待信 量可用的最大超时时间,单位为 tick(即系统节拍周期)。如果宏 INCLUDE_vTaskSuspend 定义为 1 且形参 xTicksToWait 设置为 portMAX_DELAY ,则任务将一直阻塞在该信 量上(即没有超时时间)
返回值 错误码 九、二值信 量
9.1 运作机制
创建信 量时,系统会为创建的信 量对象分配内存,并把可用信 量初始化为用户自定义的个数, 二值信 量的最大可用信 量个数为 1。二值信 量获取,任何任务都可以从创建的二值信 量资源中获取一个二值信 量,获取成功则返回正确,否则任务会根据用户指定的阻塞超时时间来等待其它任务/中断释放信 量。在等待这段时间,系统将任务变成阻塞态,任务将被挂到该信 量的阻塞等待列表中。
假如某个时间中断/任务释放了信 量,那么,由于获取无效信 量而进入阻塞态的任务将获得信 量并且恢复为就绪态状态。
9.2 阻塞式
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!