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

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

[复制链接]
wolfgang 发布时间:2018-5-3 22:51
本帖最后由 wolfgang2015 于 2018-5-17 22:51 编辑 : {9 L* i0 A( J, m2 G/ z
; W" U" }2 c( n# Y. ~2 p& Z/ {# F
上一篇文章介绍了 使用TrueStudio 搭建FreeRTOS环境、编译代码实现了FreeRTOS的启动,这里回顾一下FreeRTOS启动时的相关配置
主要使用的 FreeRTOS配置文件的相关配置如下图:
* m5 ], m, e2 i8 W; s' t
19.jpg
5 L* ^' S2 i! P* V% \1 ]+ Z5 O; }) f8 U7 p6 o
在CubeMX工具中也能实现对 FreeRTOS.h/FreeRTOSConfig.h 文件的配置主要在以下几个配置页面:& |7 N/ q6 {6 h: G
ConfigParameters_1.jpg ) f4 T. Q7 h8 R( V" Y/ s1 U
ConfigParameters_2.jpg ! |+ L& v( m, D
Include parameters.jpg
3 o3 T6 K" z. k& X; }) l) q8 _0 ]* n2 b8 u1 Y- A/ V/ ^4 n/ g

& G1 ?8 ?  X' P4 U+ O
利用Nucleo板载资源创建LED、UART,让板载资源在FreeRTOS任务的控制下启动并输出,
按实验要求,需要创建两个任务,一个LED任务作为PIN脚的输出,一个UART任务作为串口输出,示意如下图:
20.jpg
! _. d- K! e) `4 M
根据上一章节的经验,使用 xTaskCreate函数创建两个任务,分别如下:
  1. xTaskCreate((TaskFunction_t) vStartLed2Task, //任务函数% O- b9 _  |# A8 B0 l* n
  2.                         "LED2",                                   //任务名称8 F6 e* J" [8 h
  3.                         configMINIMAL_STACK_SIZE,                 //任务栈大小
    , r" V2 M' Y4 k+ K# S/ {
  4.                         NULL,                                     //任务函数参数  E2 m4 G0 z0 A, B
  5.                         Start_TASK_PRIORITY,                      //任务执行等级7 f; }( O5 y- d2 M$ L' t* q- X  R  N
  6.                         (TaskHandle_t *) NULL);  //任务句柄7 X2 h4 v: y% }7 ~8 i9 L
  7. 0 f' o1 b0 w  e: D
  8.         xTaskCreate((TaskFunction_t) vStartLPUart1Task, //任务函数7 G! w6 D3 j1 r7 p+ s& u, U% r
  9.                         "LPUart1",                                    //任务名称
    1 a; x2 h- f( Z& R
  10.                         200,                                          //任务栈大小+ x2 P  A9 Z5 Y4 |
  11.                         NULL,                                         //任务函数参数. ?# _. ]. s' m& H; r
  12.                         Uart_TASK_PRIORITY,                           //任务执行等级  @% d9 m: _9 i$ C) h
  13.                         (TaskHandle_t *) NULL);  //任务句柄
    1 Q0 ^7 i( e. f# M0 i

  14. 3 Z0 @$ T; R2 n% V+ v
复制代码
  D1 ?  P" q5 Z4 x- {0 j4 D4 \
vStartLed2Task任务的主体内容:
  1. void vStartLed2Task(void const * argument) {
    ( W. ^, d  h3 y/ J. g2 t
  2.         uint8_t sta = ON;) ^9 M" r- n* L
  3.         uint16_t delay = 500;
      X! Q7 g) {: J5 Z- z- c/ c
  4.         /* USER CODE BEGIN 5 */
    * q. B9 F1 g8 p. L
  5.         /* Infinite loop */0 K+ ]& G0 ^( a* M5 S6 a1 V: J
  6.         for (;;) {
    9 N( e& @  _, y& c/ Y# b
  7.                 LED2(sta);
    / U2 Z7 M5 k: h& x# E
  8.                 sta = !sta;
    4 i% R# W$ ?( K$ K9 k$ _  N
  9.                 vTaskDelay(delay / portTICK_PERIOD_MS);
    6 v3 q; g8 q7 h  J. Q7 s
  10.         }
    . S- i4 ^# C5 q
  11.         /* USER CODE END 5 */$ K" e- F# Z7 b* P
  12. }
复制代码
% ~+ a1 B7 n, d* h' j
. x) `4 X! z+ ^. ?3 Y; _; c+ F
vStartLPUart1Task 任务的主体内容:
8 Q2 v8 ?, Y* W$ F4 P+ f5 `0 d
  1. void vStartLPUart1Task(void const * argument) {% ]6 y5 ^0 g. X) ~+ r
  2.     uint16_t delay = 1000;
    # f8 |. D' R  m0 W8 \0 k
  3.     for (;;) {
      R: ]. p5 d8 j- v* f) f+ S
  4.         printf("Hello World FreeRTOS!!!\n");
    ) P5 l3 ]. X: U$ o
  5.         vTaskDelay(delay / portTICK_PERIOD_MS);
    6 Q/ A* R/ g- q$ i% O' R9 h
  6.     }0 a" W) S9 k3 \* @
  7. }
复制代码

( Y) q$ U0 k: ]4 S' V! M
7 j5 A( o% I! G3 R9 `6 M$ }: v这里没啥说的,就是对上一章FreeRTOS的简单扩展,只是在 TrueStudio  环境  Eclipse + GNU CC的编译环境下:
% r' M3 A, G7 T5 d) d1 d* K6 [1 d2 ?要自己实现 Printf 的输出 还得对 工具创建的syscalls.c 代码进行简单改造: . t" f# l$ d* w
把其中的int _write(int32_t file, uint8_t *ptr, int32_t len) 函数改造如下,这样才能使用到Usart驱动中的输出内容。
8 D$ Z# Y9 s8 f% |0 ?4 m& R
  1. ...................
    4 Q8 k6 F6 J% M- l) }
  2. extern int __io_putchar(int ch) __attribute__((weak));
    & @% T! K1 R, @8 w" \/ y) o9 }

  3.   x; t0 R% J5 x
  4. * \7 A1 l+ E" W9 z
  5. ........................: d- ]3 W( V, q' |: {# e' E) b
  6. int _write(int32_t file, uint8_t *ptr, int32_t len) {
    ) I" k3 U9 B- ?: J, b* V; o
  7.         /* Implement your write code here, this is used by puts and printf for example */
    / o; \( z; P: j
  8.         int32_t DataIdx;2 _, m2 e0 `. ?) d& `% A6 @

  9. / ?: g0 F5 H1 t
  10.         for (DataIdx = 0; DataIdx < len; DataIdx++) {5 O  d& w3 c( Y. t/ S5 R) m/ T
  11.                 __io_putchar(*ptr++);  t+ V( @5 b0 n# K' W
  12.         }
    % d6 g, t2 z( G5 n
  13.         return len;
      N/ z+ s/ d$ X! A, r! S0 {) S0 F
  14. }+ _6 T2 u. F& N8 e
复制代码
5 @/ K8 f1 Y0 Z9 Y
( p! T) Z8 Z3 H7 T# w- Y- L
一个LED、一个串口任务搭建好后,在这个任务的基础上略加改造就可实现后边 “信号量应用”、“队列应用”的实验内容,敬请期待:
  s; R5 N: l) Y+ W
$ `; w0 }$ _, L6 Q: ^5 x% ]相关文档:" Q( Y1 Z- b3 u: a" O. Y
《低功耗MCU运行FreeRTOS》培课程的准备内容(一)
8 g4 @3 e& y6 E( Q《低功耗MCU运行FreeRTOS》培课程回顾(二)4 H$ Q: ?( u) p* L! g
《低功耗MCU运行FreeRTOS》培训课程(三) Atollic环境实验: ^8 H& L; U9 Q( w( J

8 p6 f0 }, \+ R. d  }% d《低功耗MCU运行FreeRTOS》培训课程(五)信号量实现人机交互
, A3 D& ~4 Q1 I* Y. y9 f- Z8 m% \. s+ O《低功耗MCU运行FreeRTOS》培训课程(六)消息队列的使用
" m( C" o* `2 x/ C" `- d- t/ ^4 ^0 n# B
收藏 1 评论2 发布时间:2018-5-3 22:51

举报

2个回答
creep 回答时间:2018-5-4 09:33:58
感谢狼哥分享!
卖身学Linux 回答时间:2018-5-4 11:18:40
学习学习

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版