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

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

[复制链接]
wolfgang 发布时间:2018-5-3 22:51
本帖最后由 wolfgang2015 于 2018-5-17 22:51 编辑
5 n4 ^$ k  I, l5 `6 V* n
. Q7 [- O1 T! S上一篇文章介绍了 使用TrueStudio 搭建FreeRTOS环境、编译代码实现了FreeRTOS的启动,这里回顾一下FreeRTOS启动时的相关配置
主要使用的 FreeRTOS配置文件的相关配置如下图:

0 ~$ z- g- c. Z& V2 D% b% W2 c 19.jpg 0 z/ Z% D/ }# |' D8 `( |: G* n
; M' n& h* j6 B$ D9 l6 |. ^
在CubeMX工具中也能实现对 FreeRTOS.h/FreeRTOSConfig.h 文件的配置主要在以下几个配置页面:+ _, U3 [: l0 c0 o$ B9 B: h
ConfigParameters_1.jpg   E: j0 x( {) a9 R7 k: {* K. v
ConfigParameters_2.jpg - @: V9 p5 J0 l4 E
Include parameters.jpg
3 W2 P# J0 r! ~0 K% j( \$ N3 J) S0 J; q- B
! F. ?; J7 s) g$ Y% J
利用Nucleo板载资源创建LED、UART,让板载资源在FreeRTOS任务的控制下启动并输出,
按实验要求,需要创建两个任务,一个LED任务作为PIN脚的输出,一个UART任务作为串口输出,示意如下图:
20.jpg
7 S2 O# s2 q: W; ^0 p! W
根据上一章节的经验,使用 xTaskCreate函数创建两个任务,分别如下:
  1. xTaskCreate((TaskFunction_t) vStartLed2Task, //任务函数: U9 z, V+ E2 }8 f$ p
  2.                         "LED2",                                   //任务名称2 C5 I1 P4 y: S4 L& v1 k! {
  3.                         configMINIMAL_STACK_SIZE,                 //任务栈大小, i0 q! v; w' H+ \4 H0 S: P
  4.                         NULL,                                     //任务函数参数
    ! n, ~% U- B" E! c8 h' g/ V) F
  5.                         Start_TASK_PRIORITY,                      //任务执行等级& n+ L$ t9 s$ b- T* m! j1 t' M
  6.                         (TaskHandle_t *) NULL);  //任务句柄
    0 A/ y. T6 E9 f

  7. 6 a8 f7 w9 l. Q
  8.         xTaskCreate((TaskFunction_t) vStartLPUart1Task, //任务函数
    ' ^* A9 P2 m5 _
  9.                         "LPUart1",                                    //任务名称
    * F/ j5 z+ A' O  [2 A  B( ]6 K
  10.                         200,                                          //任务栈大小
    , i5 }, N. C2 G3 K% B" ~6 i
  11.                         NULL,                                         //任务函数参数
    ) w5 B) S1 g8 R+ w& Y
  12.                         Uart_TASK_PRIORITY,                           //任务执行等级
    , O5 P. \. n  v3 K" N0 G8 T+ C/ D
  13.                         (TaskHandle_t *) NULL);  //任务句柄
    $ n; c& O) }1 {7 M+ u

  14. & O' J# N1 v8 J: D3 h6 |
复制代码

  W* P% @$ I5 t4 ~$ s/ k
vStartLed2Task任务的主体内容:
  1. void vStartLed2Task(void const * argument) {  ]1 |$ `: x5 h7 m4 h
  2.         uint8_t sta = ON;
    # {( F0 ^6 `: w. B% Z
  3.         uint16_t delay = 500;, S2 H* z1 w4 `( o% r) k( j8 I/ ]
  4.         /* USER CODE BEGIN 5 */8 z$ n1 k/ Q* }' f
  5.         /* Infinite loop */
    " y( f  V* |) A$ K! K
  6.         for (;;) {
    " Y7 i: G3 [+ H
  7.                 LED2(sta);- v# z, Z8 @! T
  8.                 sta = !sta;
    + i9 S* o1 z; z0 n
  9.                 vTaskDelay(delay / portTICK_PERIOD_MS);% @& t, n4 t, Y4 |; ^) P1 G
  10.         }
    0 X  k8 I& E: S
  11.         /* USER CODE END 5 *// i! F* S$ `: h/ y. q
  12. }
复制代码

+ e5 E' Y. B; P6 d2 H% H  Q
5 A/ A1 m2 }& {/ V# \) o/ c% XvStartLPUart1Task 任务的主体内容:$ P5 s3 ]# D$ M3 F0 T5 U1 ^5 G
  1. void vStartLPUart1Task(void const * argument) {7 i6 K  M+ a2 K2 x% o' w! |
  2.     uint16_t delay = 1000;
    8 d, @6 l- A" k9 [, b6 s
  3.     for (;;) {
    6 ]- E' s- i- G$ u
  4.         printf("Hello World FreeRTOS!!!\n");8 I% n3 S7 u$ R( v! l, ]! w
  5.         vTaskDelay(delay / portTICK_PERIOD_MS);9 C- W* W" S$ g) n
  6.     }
    + p2 z" _# N1 P; ^
  7. }
复制代码

: X8 u3 m- {3 C3 D3 B/ E, w+ ?2 b
8 P% ^. x- k5 }5 o; D* c这里没啥说的,就是对上一章FreeRTOS的简单扩展,只是在 TrueStudio  环境  Eclipse + GNU CC的编译环境下:
' G& o" d5 F" `, a. N+ A/ Q要自己实现 Printf 的输出 还得对 工具创建的syscalls.c 代码进行简单改造: ' U- w; i8 k9 [: }
把其中的int _write(int32_t file, uint8_t *ptr, int32_t len) 函数改造如下,这样才能使用到Usart驱动中的输出内容。/ p/ J2 Q2 I% b, N+ {. L1 ?
  1. ...................3 Y# Q) p9 h% ~' ~; T
  2. extern int __io_putchar(int ch) __attribute__((weak));
    * T+ R. h. c; |! b9 `0 \

  3. ( W; S( V9 y3 V8 A

  4.   m4 R0 g  ]: F; u6 f
  5. ........................
    9 X4 s0 C  ]. P/ k; e
  6. int _write(int32_t file, uint8_t *ptr, int32_t len) {( U* O/ b; F: A/ U
  7.         /* Implement your write code here, this is used by puts and printf for example */
    9 R- A# x" R8 i3 ]
  8.         int32_t DataIdx;
    7 C7 L, U. @8 q# E4 g  c3 f
  9. ( D3 Y, _9 S1 A) [3 i; ?
  10.         for (DataIdx = 0; DataIdx < len; DataIdx++) {8 ?) z+ Q  r5 {5 w
  11.                 __io_putchar(*ptr++);
    + |: H# _% M4 ~$ b+ U' c/ J
  12.         }! C: z$ O8 w% G1 H5 w1 M
  13.         return len;1 B$ S# S! |8 H9 [+ k
  14. }' k9 q( M2 r/ q7 n5 ^. ~
复制代码

2 _8 M3 v( X1 [! b9 }2 E# ]6 ^, F8 B# c1 {9 O
一个LED、一个串口任务搭建好后,在这个任务的基础上略加改造就可实现后边 “信号量应用”、“队列应用”的实验内容,敬请期待:3 d) D5 _/ S  B" A+ s+ x: S' a0 G4 I

% n) i& f, O' {8 z相关文档:
. \0 }8 r0 T$ ~; a4 s3 L9 w9 o《低功耗MCU运行FreeRTOS》培课程的准备内容(一)
/ b1 m3 a3 Z7 w8 b# e, P! u《低功耗MCU运行FreeRTOS》培课程回顾(二)
5 ^; C" S# _* n" l9 I5 y3 g《低功耗MCU运行FreeRTOS》培训课程(三) Atollic环境实验
4 V1 O& w( s- m5 \
  m! {6 J8 S' }6 m《低功耗MCU运行FreeRTOS》培训课程(五)信号量实现人机交互* a/ k' C) S! A6 L
《低功耗MCU运行FreeRTOS》培训课程(六)消息队列的使用  |3 \( G! k3 l6 G) g3 q
& A& H$ _, E/ N2 P. l; u* m, w
收藏 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 手机版