本帖最后由 wolfgang2015 于 2018-5-17 22:51 编辑
上一篇文章介绍了 使用TrueStudio 搭建FreeRTOS环境、编译代码实现了FreeRTOS的启动,这里回顾一下FreeRTOS启动时的相关配置主要使用的 FreeRTOS配置文件的相关配置如下图:
在CubeMX工具中也能实现对 FreeRTOS.h/FreeRTOSConfig.h 文件的配置主要在以下几个配置页面:
利用Nucleo板载资源创建LED、UART,让板载资源在FreeRTOS任务的控制下启动并输出, 按实验要求,需要创建两个任务,一个LED任务作为PIN脚的输出,一个UART任务作为串口输出,示意如下图:
根据上一章节的经验,使用 xTaskCreate函数创建两个任务,分别如下: - xTaskCreate((TaskFunction_t) vStartLed2Task, //任务函数
- "LED2", //任务名称
- configMINIMAL_STACK_SIZE, //任务栈大小
- NULL, //任务函数参数
- Start_TASK_PRIORITY, //任务执行等级
- (TaskHandle_t *) NULL); //任务句柄
- xTaskCreate((TaskFunction_t) vStartLPUart1Task, //任务函数
- "LPUart1", //任务名称
- 200, //任务栈大小
- NULL, //任务函数参数
- Uart_TASK_PRIORITY, //任务执行等级
- (TaskHandle_t *) NULL); //任务句柄
复制代码
vStartLed2Task任务的主体内容: - void vStartLed2Task(void const * argument) {
- uint8_t sta = ON;
- uint16_t delay = 500;
- /* USER CODE BEGIN 5 */
- /* Infinite loop */
- for (;;) {
- LED2(sta);
- sta = !sta;
- vTaskDelay(delay / portTICK_PERIOD_MS);
- }
- /* USER CODE END 5 */
- }
复制代码
vStartLPUart1Task 任务的主体内容:
- void vStartLPUart1Task(void const * argument) {
- uint16_t delay = 1000;
- for (;;) {
- printf("Hello World FreeRTOS!!!\n");
- vTaskDelay(delay / portTICK_PERIOD_MS);
- }
- }
复制代码
这里没啥说的,就是对上一章FreeRTOS的简单扩展,只是在 TrueStudio 环境 Eclipse + GNU CC的编译环境下:
要自己实现 Printf 的输出 还得对 工具创建的syscalls.c 代码进行简单改造:
把其中的int _write(int32_t file, uint8_t *ptr, int32_t len) 函数改造如下,这样才能使用到Usart驱动中的输出内容。
- ...................
- extern int __io_putchar(int ch) __attribute__((weak));
- ........................
- int _write(int32_t file, uint8_t *ptr, int32_t len) {
- /* Implement your write code here, this is used by puts and printf for example */
- int32_t DataIdx;
- for (DataIdx = 0; DataIdx < len; DataIdx++) {
- __io_putchar(*ptr++);
- }
- return len;
- }
复制代码
一个LED、一个串口任务搭建好后,在这个任务的基础上略加改造就可实现后边 “信号量应用”、“队列应用”的实验内容,敬请期待:
相关文档:
《低功耗MCU运行FreeRTOS》培课程的准备内容(一)
《低功耗MCU运行FreeRTOS》培课程回顾(二)
《低功耗MCU运行FreeRTOS》培训课程(三) Atollic环境实验
《低功耗MCU运行FreeRTOS》培训课程(五)信号量实现人机交互
《低功耗MCU运行FreeRTOS》培训课程(六)消息队列的使用
|