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

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

[复制链接]
wolfgang 发布时间:2018-5-3 22:51
本帖最后由 wolfgang2015 于 2018-5-17 22:51 编辑 0 C$ E* o9 v% h: F" o( F
9 f: a. n8 W% K( h0 x
上一篇文章介绍了 使用TrueStudio 搭建FreeRTOS环境、编译代码实现了FreeRTOS的启动,这里回顾一下FreeRTOS启动时的相关配置
主要使用的 FreeRTOS配置文件的相关配置如下图:
  X6 [# U4 o( H! H1 m
19.jpg 8 |9 q: A9 ?" _  a

# s  Z  U% k0 x: u9 \0 C在CubeMX工具中也能实现对 FreeRTOS.h/FreeRTOSConfig.h 文件的配置主要在以下几个配置页面:- I( B' j2 w+ l3 G0 S, m! ~+ |# v
ConfigParameters_1.jpg
1 _' Y+ E- w5 C ConfigParameters_2.jpg
  ^- e& h- y. l$ M Include parameters.jpg 5 Y) f9 L; R  k
4 `# H) Y! x8 W( c7 S

  i) c6 n; D2 s# h+ z. w
利用Nucleo板载资源创建LED、UART,让板载资源在FreeRTOS任务的控制下启动并输出,
按实验要求,需要创建两个任务,一个LED任务作为PIN脚的输出,一个UART任务作为串口输出,示意如下图:
20.jpg
) Z0 Q& X' G: o/ _- ~
根据上一章节的经验,使用 xTaskCreate函数创建两个任务,分别如下:
  1. xTaskCreate((TaskFunction_t) vStartLed2Task, //任务函数
    * n2 {9 A3 v6 f& E7 J( B* \
  2.                         "LED2",                                   //任务名称8 ?  m1 k! B% }' I
  3.                         configMINIMAL_STACK_SIZE,                 //任务栈大小
    6 D# X- y6 m9 U
  4.                         NULL,                                     //任务函数参数6 U# {! F1 c: z& H; [) C2 N9 {6 j
  5.                         Start_TASK_PRIORITY,                      //任务执行等级
    6 L& E* V* |6 k# ]' \
  6.                         (TaskHandle_t *) NULL);  //任务句柄
    7 n# e0 H% `) ^0 P" F8 l
  7. 4 D0 ~( g2 E; J1 X. D) I: ]
  8.         xTaskCreate((TaskFunction_t) vStartLPUart1Task, //任务函数* y/ `/ {! R7 g$ H" ?& o
  9.                         "LPUart1",                                    //任务名称' o  H) T+ g" Z# T
  10.                         200,                                          //任务栈大小
    7 ?) I3 t, s2 f2 L$ Y6 Y6 K
  11.                         NULL,                                         //任务函数参数
    ! |7 v- E3 v, x  Q- W9 m2 z
  12.                         Uart_TASK_PRIORITY,                           //任务执行等级
    ! j( }, N) ~9 |# U' J
  13.                         (TaskHandle_t *) NULL);  //任务句柄$ X$ V1 J0 e$ n/ y
  14. , c1 Y& `/ X! t7 K# R
复制代码
; S9 Y6 c# B9 d$ u
vStartLed2Task任务的主体内容:
  1. void vStartLed2Task(void const * argument) {# j$ U. d" p: D+ a; \2 [% {, v9 E* e
  2.         uint8_t sta = ON;
    ) T% E% N4 ]# w8 Z/ g" s3 v
  3.         uint16_t delay = 500;, `6 T1 D& r4 ]" j+ n/ H: V
  4.         /* USER CODE BEGIN 5 */
    / o1 O  R: r/ H
  5.         /* Infinite loop */
    % C& h* |, A1 Q$ q) a
  6.         for (;;) {+ c* y# {% H6 r6 c" z
  7.                 LED2(sta);0 G' Y& M9 o: n3 D
  8.                 sta = !sta;
    5 x. L( H/ r$ a4 h* p
  9.                 vTaskDelay(delay / portTICK_PERIOD_MS);2 m; g5 l4 B$ @1 M1 b
  10.         }
    6 i5 i! S! q& L6 o, H4 f2 H9 k
  11.         /* USER CODE END 5 */
    ( Y3 I- `, M; _8 P. u- z/ j
  12. }
复制代码

5 t! b- H! w* _. {2 v" l; ]2 _/ Y2 `6 k: I
vStartLPUart1Task 任务的主体内容:9 x4 D( W, k/ Y/ Z2 l
  1. void vStartLPUart1Task(void const * argument) {& o9 ^4 m0 L3 l. ~
  2.     uint16_t delay = 1000;3 v1 T; |" U( ]' ]  T0 M4 D
  3.     for (;;) {$ H% P" h" B; [% F
  4.         printf("Hello World FreeRTOS!!!\n");7 i# N8 B6 I* x4 U. R' \( K1 U$ O
  5.         vTaskDelay(delay / portTICK_PERIOD_MS);
    5 V9 q$ U: }! A6 ?4 j( [
  6.     }) W  Q) b* B2 ?. ]5 h4 L
  7. }
复制代码

. [4 i5 n7 e- l4 k: G0 T, a  y  o% W( f( q+ c5 v& P! O  W6 l& n
这里没啥说的,就是对上一章FreeRTOS的简单扩展,只是在 TrueStudio  环境  Eclipse + GNU CC的编译环境下:
9 c1 Y# a% k# W; q3 G  x要自己实现 Printf 的输出 还得对 工具创建的syscalls.c 代码进行简单改造:
$ Y  @: F- a! @# \  h' A5 X' W把其中的int _write(int32_t file, uint8_t *ptr, int32_t len) 函数改造如下,这样才能使用到Usart驱动中的输出内容。4 y* S0 Q3 f( @# K/ b& f5 T; V
  1. ...................
    ' [" |, ~2 R* e$ h3 y
  2. extern int __io_putchar(int ch) __attribute__((weak));! h. \! g$ f. O6 U( g

  3. - @8 @* @. Z9 e4 r. Y
  4. * J4 q* X$ E+ V* D# k
  5. ......................../ g: M( x6 n4 ?5 x7 A5 \
  6. int _write(int32_t file, uint8_t *ptr, int32_t len) {  s  T! J7 m2 c9 T6 ^
  7.         /* Implement your write code here, this is used by puts and printf for example */& }+ v3 D, F2 s& \: I
  8.         int32_t DataIdx;
    1 {9 D  `( q) i% v$ a! j" m

  9. ( y& r: z* l. Y4 w  w" Y
  10.         for (DataIdx = 0; DataIdx < len; DataIdx++) {' F' _- `, S6 E) B
  11.                 __io_putchar(*ptr++);
    . x/ _9 u! {* a& B0 t; ?1 P
  12.         }% x7 T' a6 d6 I# U
  13.         return len;3 I+ y* t# t+ F6 |* b2 a4 Y
  14. }
    . z! }4 ^& D. I
复制代码

! m3 z5 w) f* o# |3 q* |# `) z8 i3 `8 q4 f* z* {( h
一个LED、一个串口任务搭建好后,在这个任务的基础上略加改造就可实现后边 “信号量应用”、“队列应用”的实验内容,敬请期待:
" I6 ]  p, I/ g+ e" Z
+ m' N# c5 B/ k; {$ R: Y相关文档:
/ f9 d; J8 @8 R) l( `" x; w3 a《低功耗MCU运行FreeRTOS》培课程的准备内容(一)
) X: t( v# j0 h- |+ k' ^! X9 U《低功耗MCU运行FreeRTOS》培课程回顾(二)( Q! c2 m, w5 B: @0 ?
《低功耗MCU运行FreeRTOS》培训课程(三) Atollic环境实验
7 L! b& P3 |; y2 T- P- |: Q. P5 B+ H) t0 k/ ^: C, i" _. a* K
《低功耗MCU运行FreeRTOS》培训课程(五)信号量实现人机交互* h# h2 L) T4 ]1 y( @) e1 A
《低功耗MCU运行FreeRTOS》培训课程(六)消息队列的使用; ?: D( W& W6 s, ]5 t/ _% S! y
' q2 K& N3 t/ r0 t0 T
收藏 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 手机版