你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

《低功耗MCU运行FreeRTOS》培训课程(四) 创建任务

[复制链接]
wolfgang2015 发布时间:2018-5-3 22:51
本帖最后由 wolfgang2015 于 2018-5-17 22:51 编辑

上一篇文章介绍了 使用TrueStudio 搭建FreeRTOS环境、编译代码实现了FreeRTOS的启动,这里回顾一下FreeRTOS启动时的相关配置
主要使用的 FreeRTOS配置文件的相关配置如下图:

19.jpg

在CubeMX工具中也能实现对 FreeRTOS.h/FreeRTOSConfig.h 文件的配置主要在以下几个配置页面:
ConfigParameters_1.jpg
ConfigParameters_2.jpg
Include parameters.jpg


利用Nucleo板载资源创建LED、UART,让板载资源在FreeRTOS任务的控制下启动并输出,
按实验要求,需要创建两个任务,一个LED任务作为PIN脚的输出,一个UART任务作为串口输出,示意如下图:
20.jpg

根据上一章节的经验,使用 xTaskCreate函数创建两个任务,分别如下:
  1. xTaskCreate((TaskFunction_t) vStartLed2Task, //任务函数
  2.                         "LED2",                                   //任务名称
  3.                         configMINIMAL_STACK_SIZE,                 //任务栈大小
  4.                         NULL,                                     //任务函数参数
  5.                         Start_TASK_PRIORITY,                      //任务执行等级
  6.                         (TaskHandle_t *) NULL);  //任务句柄

  7.         xTaskCreate((TaskFunction_t) vStartLPUart1Task, //任务函数
  8.                         "LPUart1",                                    //任务名称
  9.                         200,                                          //任务栈大小
  10.                         NULL,                                         //任务函数参数
  11.                         Uart_TASK_PRIORITY,                           //任务执行等级
  12.                         (TaskHandle_t *) NULL);  //任务句柄

复制代码

vStartLed2Task任务的主体内容:
  1. void vStartLed2Task(void const * argument) {
  2.         uint8_t sta = ON;
  3.         uint16_t delay = 500;
  4.         /* USER CODE BEGIN 5 */
  5.         /* Infinite loop */
  6.         for (;;) {
  7.                 LED2(sta);
  8.                 sta = !sta;
  9.                 vTaskDelay(delay / portTICK_PERIOD_MS);
  10.         }
  11.         /* USER CODE END 5 */
  12. }
复制代码


vStartLPUart1Task 任务的主体内容:
  1. void vStartLPUart1Task(void const * argument) {
  2.     uint16_t delay = 1000;
  3.     for (;;) {
  4.         printf("Hello World FreeRTOS!!!\n");
  5.         vTaskDelay(delay / portTICK_PERIOD_MS);
  6.     }
  7. }
复制代码


这里没啥说的,就是对上一章FreeRTOS的简单扩展,只是在 TrueStudio  环境  Eclipse + GNU CC的编译环境下:
要自己实现 Printf 的输出 还得对 工具创建的syscalls.c 代码进行简单改造:
把其中的int _write(int32_t file, uint8_t *ptr, int32_t len) 函数改造如下,这样才能使用到Usart驱动中的输出内容。
  1. ...................
  2. extern int __io_putchar(int ch) __attribute__((weak));


  3. ........................
  4. int _write(int32_t file, uint8_t *ptr, int32_t len) {
  5.         /* Implement your write code here, this is used by puts and printf for example */
  6.         int32_t DataIdx;

  7.         for (DataIdx = 0; DataIdx < len; DataIdx++) {
  8.                 __io_putchar(*ptr++);
  9.         }
  10.         return len;
  11. }
复制代码


一个LED、一个串口任务搭建好后,在这个任务的基础上略加改造就可实现后边 “信号量应用”、“队列应用”的实验内容,敬请期待:

相关文档:
《低功耗MCU运行FreeRTOS》培课程的准备内容(一)
《低功耗MCU运行FreeRTOS》培课程回顾(二)
《低功耗MCU运行FreeRTOS》培训课程(三) Atollic环境实验

《低功耗MCU运行FreeRTOS》培训课程(五)信号量实现人机交互
《低功耗MCU运行FreeRTOS》培训课程(六)消息队列的使用

收藏 1 评论2 发布时间:2018-5-3 22:51

举报

2个回答
creep 回答时间:2018-5-4 09:33:58
感谢狼哥分享!
和你挤公交 回答时间:2018-5-4 11:18:40
学习学习

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版