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

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

[复制链接]
wolfgang 发布时间:2018-5-3 22:51
本帖最后由 wolfgang2015 于 2018-5-17 22:51 编辑
. F& Y3 E/ T9 d0 S
6 [! w& t! `5 `# E' Z# I6 e上一篇文章介绍了 使用TrueStudio 搭建FreeRTOS环境、编译代码实现了FreeRTOS的启动,这里回顾一下FreeRTOS启动时的相关配置
主要使用的 FreeRTOS配置文件的相关配置如下图:
0 |+ Z2 H9 B: K. G& }
19.jpg ' Q) d( s1 Q& R' C. K$ K4 L4 n

+ R6 C; o3 M- f! f在CubeMX工具中也能实现对 FreeRTOS.h/FreeRTOSConfig.h 文件的配置主要在以下几个配置页面:1 t, X* ~) T7 t, `! ~
ConfigParameters_1.jpg * l/ Y, y3 E0 \9 \# q, n# J
ConfigParameters_2.jpg 9 x9 `6 D6 p7 D% L' N
Include parameters.jpg
+ |* u4 j1 ]) k) O) \5 S7 s" t/ y6 s4 G9 t; [" x" a

8 v- l/ h- x3 p6 j6 f
利用Nucleo板载资源创建LED、UART,让板载资源在FreeRTOS任务的控制下启动并输出,
按实验要求,需要创建两个任务,一个LED任务作为PIN脚的输出,一个UART任务作为串口输出,示意如下图:
20.jpg
* |: i% z" |* q& V) y- Z
根据上一章节的经验,使用 xTaskCreate函数创建两个任务,分别如下:
  1. xTaskCreate((TaskFunction_t) vStartLed2Task, //任务函数
    7 d/ p8 W, F" z4 @' T* k
  2.                         "LED2",                                   //任务名称6 [9 A8 V8 l9 w+ p8 f5 P
  3.                         configMINIMAL_STACK_SIZE,                 //任务栈大小
    7 y* l3 w. L6 f3 l
  4.                         NULL,                                     //任务函数参数% z$ W/ ?: L' j% t, H
  5.                         Start_TASK_PRIORITY,                      //任务执行等级
    2 g2 C3 E  J' F0 z- D% E
  6.                         (TaskHandle_t *) NULL);  //任务句柄2 O# h( y% t/ {: I+ C  @/ k  y! `

  7. ' V& T# H4 c5 F3 ~8 H) n
  8.         xTaskCreate((TaskFunction_t) vStartLPUart1Task, //任务函数9 S/ x* D. z0 u
  9.                         "LPUart1",                                    //任务名称" Y& v1 X$ v4 ]7 |( L) t% `* c1 l0 C
  10.                         200,                                          //任务栈大小
    " }6 z3 d# x2 o) f% T
  11.                         NULL,                                         //任务函数参数$ d- I2 A' k) v* x
  12.                         Uart_TASK_PRIORITY,                           //任务执行等级
    ) j4 H( J  |$ H  i& l4 m' E
  13.                         (TaskHandle_t *) NULL);  //任务句柄
    0 z8 k- n6 d5 f" e% x: C
  14. 8 R. N. V/ Q. w' n0 G2 k  V
复制代码

: Y& _& n) @. V- a0 y4 \3 l
vStartLed2Task任务的主体内容:
  1. void vStartLed2Task(void const * argument) {' C0 |6 f1 b  l9 e$ @
  2.         uint8_t sta = ON;
    & N. O3 y9 m9 m2 P6 B
  3.         uint16_t delay = 500;" i8 l$ h* s3 l; Y8 I% K# N' `
  4.         /* USER CODE BEGIN 5 */
    - Z/ a! I  x6 p& a! m4 n  }" |
  5.         /* Infinite loop */( E- |; ^2 u' ^/ E# |7 Q
  6.         for (;;) {' N' `0 F; H! x+ V) e  h7 e
  7.                 LED2(sta);
    2 E2 t* Z% H0 E) |
  8.                 sta = !sta;5 p! I; o5 e  W% Q3 M
  9.                 vTaskDelay(delay / portTICK_PERIOD_MS);
    7 J. x/ |! I% j% b6 T, q
  10.         }5 s0 ~' `- d; t; i6 P
  11.         /* USER CODE END 5 */
    / k, a4 H5 g' N  Y5 @% s
  12. }
复制代码
! j; }1 n! c3 Z( G

* w0 F( `! Z% w" V) [# t* `6 E3 |3 U- OvStartLPUart1Task 任务的主体内容:
" V# ]+ X( A( Z) Y" k- p* g
  1. void vStartLPUart1Task(void const * argument) {
    $ }' \; Z2 T/ y: ]  X
  2.     uint16_t delay = 1000;
    " D8 E  \( a9 V& I2 q8 B* l& n
  3.     for (;;) {
    $ |2 T* ~; W, e  F
  4.         printf("Hello World FreeRTOS!!!\n");
    ( w. n" W, o* B& Q. \! g
  5.         vTaskDelay(delay / portTICK_PERIOD_MS);
    6 m/ R% Z  f6 I7 I; J
  6.     }, [3 w8 d" J; L0 u% L5 C; B' z4 u
  7. }
复制代码
$ [2 i! m7 u+ u

0 S3 t# Q) S3 Q. w8 {6 g1 U5 ^这里没啥说的,就是对上一章FreeRTOS的简单扩展,只是在 TrueStudio  环境  Eclipse + GNU CC的编译环境下:
( f7 }  `% H2 w$ I要自己实现 Printf 的输出 还得对 工具创建的syscalls.c 代码进行简单改造:   J4 c9 `8 K5 j' m7 p
把其中的int _write(int32_t file, uint8_t *ptr, int32_t len) 函数改造如下,这样才能使用到Usart驱动中的输出内容。
7 }$ ~* ?$ m" T9 i
  1. ...................* m1 P, p/ A! u4 H9 n4 R0 g
  2. extern int __io_putchar(int ch) __attribute__((weak));
    ( {1 Y. D3 K8 L9 P, f0 b" L/ m+ r  M

  3. 6 L# O6 P) L! q+ F

  4. ! M5 O" v$ n& M9 _0 r$ ?$ W
  5. ........................( x6 P3 V, e' ~
  6. int _write(int32_t file, uint8_t *ptr, int32_t len) {; ]$ m7 A8 o- g
  7.         /* Implement your write code here, this is used by puts and printf for example */
    / c6 |) k- t) [" v
  8.         int32_t DataIdx;' A0 ^  ^' h) {

  9. 1 x' h( B; C- B) ]# ?2 a. c
  10.         for (DataIdx = 0; DataIdx < len; DataIdx++) {; Z; y5 x3 q$ c. r
  11.                 __io_putchar(*ptr++);
    + ]+ q& A$ y* `+ {9 E
  12.         }, J3 n2 V0 P* v. R* P* D
  13.         return len;5 V6 t% U: O( r8 m0 ]
  14. }9 i' R9 g+ F. o; r7 C
复制代码

: I2 b8 g- E, ~2 G. ~9 d" I( Z& E+ M. z7 r5 B" P/ n8 Z, }; f
一个LED、一个串口任务搭建好后,在这个任务的基础上略加改造就可实现后边 “信号量应用”、“队列应用”的实验内容,敬请期待:9 V: F0 P8 }. R  K! _! n& P" [) B
, I1 `9 a& I, a, [. c! n
相关文档:
6 u: Y7 G0 i/ z+ I/ {《低功耗MCU运行FreeRTOS》培课程的准备内容(一)! o5 e3 p- Y  W8 o$ T$ ~/ z6 Q# P
《低功耗MCU运行FreeRTOS》培课程回顾(二)
3 i4 O0 Y1 U( u: K) d, i- j6 t《低功耗MCU运行FreeRTOS》培训课程(三) Atollic环境实验
- s2 d; u( f+ p% ^( g* e
, T& `3 \& F# B" d. S/ E《低功耗MCU运行FreeRTOS》培训课程(五)信号量实现人机交互% A2 h3 o/ [6 c$ |* |1 p( g. H
《低功耗MCU运行FreeRTOS》培训课程(六)消息队列的使用) r6 s! t; R) V3 R) C. `0 [7 H
. \" a3 ?' Z) R/ 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 手机版