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

FreeRTOS在STM32F2平台的移植(后续有更新)  

[复制链接]
caizhiwei 发布时间:2015-3-13 13:56
       根据ARMFlY的STM32F4的例程修改而来,本来想搞搞V820版本的移植的,发现移植之后编译出现一大堆错误,很是郁闷。
  }! @9 [. a) u- Y4 O1 C- c      不过总算是修改成功了,一共有四个任务,包括点灯和串口Printf输出,接下来就可以好好研究了,庖丁解牛之,嘿嘿~
# {3 {' y. B5 \+ z) S( [; n QQ截图20150313134946.jpg
( ]  x  {+ Z$ D/ l" O5 b附件请稍等~正在整理压缩~
* V4 L( k/ Z8 A; p7 r4 r' t& a/ w
收藏 3 评论52 发布时间:2015-3-13 13:56

举报

52个回答
caizhiwei 回答时间:2015-4-27 13:05:57
通过任务参数传入需要打印输出的文本:
4 X* l4 i" i6 w' G. q
  1. #include "FreeRTOS.h"
    " w! O! F; j/ N8 X  r/ c" g- h1 k- ]# u
  2. #include "task.h"
    8 k; X, x. {! W/ q: c* @
  3. #include "queue.h") z; i) F% v7 g" F
  4. #include "croutine.h"1 l1 z& T& c6 k- g* A9 e5 w; e
  5. #include "bsp.h"
    7 s/ I2 J) b8 F. l9 h; Q
  6. 9 ~# a& P% `7 y# {; o& p. E

  7. 8 D) Q' _& n& r. _, |
  8. /*8 a  T4 p8 |! S' ?6 q+ P& Z2 h: v1 J
  9. **********************************************************************************************************
      R1 L  [, w+ q$ E- r
  10.                                                                                         函数声明
    8 y! x- k' _4 ]5 V# R3 Y; J
  11. **********************************************************************************************************
    , r) E$ t! ~- ~% o. ?% g  Y# c
  12. */
    4 @- `2 j7 h/ ~) J. ?7 `, I9 K
  13. static void AppTaskCreate (void);. r3 v9 N9 r4 s3 {. s  S. J! W
  14. extern void vSetupTimerTest( void );/ A5 I1 E6 V- P! i# f5 w
  15. 2 }# l( ^2 E% L
  16. /** R& Z9 q  [$ H
  17. **********************************************************************************************************% c! U3 t& B7 T9 p6 a% I4 V
  18.                                                                                         变量声明
    4 r# Q7 Q4 Q1 e
  19. **********************************************************************************************************
    " A. u7 M% v* X/ l9 m6 b, P+ U
  20. */' {, Y3 x  O' z% \- V& y0 |- }
  21. xTaskHandle xHandleTask3;3 h  T) l* x0 F: j5 m
  22. int8_t pcWriteBuffer[500];: D3 P3 s* d, ~

  23. 7 g8 ^' S* q0 A- V) s( f6 F
  24. /*- m. B- a6 d: C; E1 i  x
  25. *********************************************************************************************************
    1 `' i7 n* F! c
  26. *        函 数 名: main- G' y8 e. y4 p4 m- w
  27. *        功能说明: 标准c程序入口。
    ' O  E0 z+ z: K' |" A- r1 m
  28. *        形    参:无& L/ y8 u* J% D' x$ j4 }0 ~3 X
  29. *        返 回 值: 无
    & ~! q1 M6 F, j  ?
  30. *********************************************************************************************************1 J' Y- w( w, y- [% u2 ]9 s9 N
  31. */
    + s0 V' O2 C0 ]. g2 u/ f3 T
  32. ; R1 S. C7 U+ h1 v
  33. static const char *pcTextForTask1 ="Task 1 is running\r\n"; - w8 E+ V( b7 x1 Z+ B% l
  34. static const char *pcTextForTask2 ="Task 2 is running\t\n"; ( Q& k% W' i/ O) s/ t
  35. & |) J! X9 i& ], J8 ?# l2 i
  36. int main(void)
    ! e- N0 y3 ]/ \/ b8 P
  37. {) r0 e' ?0 V" s+ |: x4 `5 [& @
  38.     /* 硬件初始化 */
    $ t% Y, V9 v: {1 S+ o' p7 v$ w* I
  39.     bsp_Init();
    7 D4 G5 r* }! P7 W4 D! g) F+ m
  40.          
      k, s) H" i. z5 I
  41.     /* 创建任务 */5 t0 G% T, @6 O' R
  42.     AppTaskCreate();
    6 \; T+ S$ [, ]
  43.     . w5 e+ W$ x. V0 v
  44.     vSetupTimerTest();) ~6 d! H+ I0 {2 x" O  w! p- e) L
  45.         # F- g" y$ F# x
  46.     /* 启动调度,开始执行任务 */; i" i2 R$ ~7 F* u
  47.     vTaskStartScheduler();
      g* a, O0 }5 H! W

  48. $ N' X7 L9 Q& S# E6 z7 J4 C$ o5 b
  49.     /*
    , E* Y* k, c  g1 Y1 q  X- j- z6 _
  50.            If all is well we will never reach here as the scheduler will now be" O8 p9 J, |) l' j5 A% B- U
  51.            running.  If we do reach here then it is likely that there was insufficient+ g# U* ?/ l- v; j& w
  52.            heap available for the idle task to be created. 5 p; i$ o( U/ I; z: a& x6 O( s! j1 B
  53.         */
    $ ^' k' w0 Q, G; Z- X8 F
  54.     while (1);6 n/ K- u1 U. K2 x4 x
  55. }
    5 d% m4 c" |! @4 I5 M& E5 \1 v% ]

  56. + V' k/ c" A, \. E0 J0 i' U
  57. /*
    6 B; g* ]0 X6 R4 \
  58. *********************************************************************************************************
    ; s( C4 E: E$ w) q; [$ P* H
  59. *        函 数 名: vTask1: {' V6 e4 Q) w% h$ z: a. T1 q2 R  L
  60. *        功能说明: LED闪烁                3 G) N- b4 Z% L, M6 a. s& P% l
  61. *        形    参:pvParameters 是在创建该任务时传递的形参& z" Y# j- \) A* a) |) U% _9 f
  62. *        返 回 值: 无
    4 L# v5 L% r- y7 S% w3 k
  63. *********************************************************************************************************
    8 D& A8 G' u9 D* x: [' I
  64. */
    / z9 z6 j3 _% W
  65. void vTask1( void *pvParameters )
    $ r' \* u$ [4 Z" v, @2 r
  66. {
      C  c6 F6 `1 d5 F
  67.     portTickType xDelay, xNextTime;: S' P1 j: o3 |. e  @$ R
  68.    
    - b+ K6 `1 z/ j' `9 Z
  69.     //char *pcTaskName = (char*)pvParameters;
    + v" z8 W1 h1 U7 y8 D
  70.     - c& [; X% @8 b
  71.     xNextTime = xTaskGetTickCount () + ( portTickType ) 1000;6 U6 Y2 Y* G3 M
  72.         
    , v  K* I; k* Z; u" N$ J; t
  73.     while(1)$ Y5 z/ b0 h3 [/ d& k- m" s
  74.     { , X) T7 M: ?3 Z" \1 w
  75. 7 O$ u+ c  n- l, v9 o
  76.         bsp_LedToggle(LED1);
    " S; h; F% h8 B3 a" v
  77.         //printf("\r\n%s",pcTaskName);
    7 _. A' n: B3 h/ \2 Y- Z
  78.         printf("\r\n%s",(char*)(pvParameters));6 r7 h( l9 C- x/ Y0 T* n7 m
  79.         /* 用vTaskDelay实现vTaskDelayUntil() */        
    4 _1 I0 X( e# q0 {
  80.         xDelay = xNextTime - xTaskGetTickCount ();% ^$ _* C# l8 k$ C
  81.         xNextTime += ( portTickType ) 1000;
    $ E8 [/ T5 t& V+ L7 V! n
  82. & o2 A% V2 V( b+ {
  83.         if( xDelay <= ( portTickType ) 1000 )
    % t' F: K! S2 K5 P# T/ E. X5 K
  84.         {
    0 l3 Y  @( z1 W: C! c9 Y
  85.                 vTaskDelay( xDelay );9 e* m" q. ~! C% d& r
  86.         }  o  {* X8 m* @1 S/ X4 U* s
  87.     }
    % D6 u8 h3 v, T3 x- J
  88. }7 R+ ^0 H! B, R# `- B3 q/ {6 g

  89. : Q( A9 Z; V0 n8 H  B$ V
  90. /*' @! |! K, ^. i" `' Y
  91. *********************************************************************************************************, L, y$ v/ h- g: N  o" f
  92. *        函 数 名: vTask2
    # c. I2 n# S1 G7 U" P+ L
  93. *        功能说明: LED闪烁                5 ~) @0 M* }# V5 Z- ^; n/ j" `* z
  94. *        形    参:pvParameters 是在创建该任务时传递的形参
    - N7 N  J6 w6 `, P* [
  95. *        返 回 值: 无
    9 p( y9 ]; j0 m3 @5 N
  96. *********************************************************************************************************+ [4 e# o! k$ x3 |
  97. */
    8 f5 \! M/ v# Q1 _. A
  98. void vTask2( void *pvParameters )
    ! q3 v5 k7 u# b! w& j$ C$ E
  99. {% v8 N2 K3 `3 T& H0 B! Y
  100. % J$ v' p6 }1 A9 [6 h% c
  101.     portTickType xLastWakeTime;3 W. I' z; N& ~" h
  102.     const portTickType xFrequency = 100;+ t, Z! K9 h8 U3 M; c8 v7 p* N
  103. , A$ T1 G# F) n  m
  104.     // Initialise the xLastWakeTime variable with the current time.( s4 |, I1 I# ?' D- A  {, Y3 J8 X
  105.      xLastWakeTime = xTaskGetTickCount();0 q. a9 H3 H. |

  106. 1 o$ D4 @  P& E& s6 e0 `* x) W0 n
  107.     while(1)( S: g) J  n0 W
  108.     {9 ?* A9 U" J: k
  109.         
    3 p& s, G  w- b+ |# F3 k' n) r0 c
  110.         bsp_LedToggle(LED2);  // Wait for the next cycle.  
    + `3 X+ T  C% a0 Q. e6 U; Z8 D" ^
  111.         vTaskDelayUntil( &xLastWakeTime, xFrequency );. f$ k6 w) I2 r( d1 b7 {
  112.     }
    - T8 s) _2 D9 M9 k/ A
  113. }; Y7 c* X1 ?4 S; @- J' D6 x6 G0 }) {
  114. , O: j7 S* }2 b' t& l
  115. /*
    ) D$ @9 r5 m& A. Q
  116. *********************************************************************************************************
    ! \7 L9 |2 g+ U# X3 [' `5 x. t
  117. *        函 数 名: vTask3, K' V" R5 [3 c$ w1 h# W7 |% J0 v
  118. *        功能说明: LED闪烁               
    : g8 S+ {* P' {9 ~( {, [
  119. *        形    参:pvParameters 是在创建该任务时传递的形参1 w! M( ~9 l$ {$ q
  120. *        返 回 值: 无' }: E$ m; O+ j4 Q; ~9 N
  121. *********************************************************************************************************, [! z2 `( C% F9 E2 A& V
  122. */0 |0 n4 F7 y' \1 Y  v
  123. void vTask3( void *pvParameters )6 a0 A3 y/ |. N. U
  124. {! P9 V2 E- ~7 _" t  l- H- S3 a
  125.     while(1)
    ! V( @' d2 ~: U7 r* k; G9 W
  126.     {' t) v$ K# E0 F# E1 ]
  127.           /* 挂起自己,可以写NULL或者xHandleTask3句柄,都可以的 */
    ) x6 E% V8 t! {# L/ `$ [6 x
  128.           vTaskSuspend( NULL );
    1 C4 W, C# N) l. u
  129.           bsp_LedToggle(LED3);
    : ^$ B: |9 ]5 P0 A/ G5 i
  130.     }4 u  @! Q% X. k1 ~
  131. }; U& M% {  O) k' {4 p
  132. + b3 R2 b" w4 E: j* A7 d
  133. /*6 q! t" J; p8 }9 H2 j% H. H
  134. *********************************************************************************************************! o0 N* b+ r) v& t! x
  135. *        函 数 名: vTask4
    3 ^! U) X4 a- A8 N
  136. *        功能说明: LED闪烁                : `* h1 H+ D6 M, u
  137. *        形    参:pvParameters 是在创建该任务时传递的形参
    / K+ ]+ I3 ]$ K: C& Q  j
  138. *        返 回 值: 无5 ^; v  w) }( T3 h/ A
  139. *********************************************************************************************************
    0 X8 W6 Y* ~+ d
  140. */" ?0 L- F+ T- K% P
  141. void vTask4( void *pvParameters )
    8 N# x4 p7 Q3 |
  142. {
    ' Q, Q/ j" g4 I$ V- Z4 P9 h7 j
  143.         portTickType xLastWakeTime;) A, `( v- D# b, T$ p/ f
  144.     const portTickType xFrequency = 1000;1 W9 v3 M! U# |
  145. $ H% T4 m8 A# z4 k- R# Q) F; ~4 h
  146.          // Initialise the xLastWakeTime variable with the current time.
    / {) L3 A( J" a' h2 K
  147.      xLastWakeTime = xTaskGetTickCount();; f" H, ?! {, C. S5 u; U

  148. 9 {3 o  U6 \2 g8 r
  149.     while(1)9 K# {7 ^% i9 D. S2 u
  150.     {6 p" b) M! q$ s
  151.         vTaskResume(xHandleTask3);
      ~" x2 r4 J' E  K0 C  O
  152.         vTaskList((char *)&pcWriteBuffer);
      H. s& l1 F4 }  h( s
  153.         printf("%s\r\n", pcWriteBuffer);
    2 J5 @% f9 |4 Z+ Q6 N
  154. ; \# q* {' j6 Q  \
  155.         vTaskGetRunTimeStats(( char *)&pcWriteBuffer);% e- e8 I/ [- @( q/ ]/ P
  156.         printf("%s\r\n", pcWriteBuffer);! }! o) _) }8 A1 s
  157.         vTaskDelayUntil( &xLastWakeTime, xFrequency );- }( ~) ?; c2 X4 i# m! u. V
  158.     }
    ( b4 k  A! K+ t
  159. }
    5 c4 @; p% U% ^$ t* H$ t+ h
  160. ' T/ j8 r* h/ i4 {6 Q, Z. U3 F

  161. 2 g% S( K8 Z' A$ F
  162. /*
    " r0 g4 d1 @' V7 T' q- a& ^- m, T# B3 y7 t
  163. *********************************************************************************************************4 X8 s) B! j* R
  164. *        函 数 名: AppTaskCreate$ P; E4 L' r! a! O2 `& w" ?
  165. *        功能说明: 创建应用任务
    ( g, n  J+ f! s5 q
  166. *        形    参:无% n8 ~1 y) l3 A5 z
  167. *        返 回 值: 无6 H" F4 c2 E4 y( u# D
  168. *********************************************************************************************************
    $ p. Q2 @  `# [2 [9 W6 b4 h. P% _
  169. */" E* u8 M# u4 G) W2 y
  170. static void AppTaskCreate (void)
    6 o7 Y% p8 X/ C; n! e. \
  171. {
    ' S5 s  t/ d; ^9 J2 m6 P, w
  172.         /* Create one task. */
    : X- B* U" _5 \) H8 y" _
  173.     xTaskCreate(    vTask1,     /* Pointer to the function that implements the task.              */
    ( H9 d, Z$ ~: G. J( N
  174.                     "Task 1",   /* Text name for the task.  This is to facilitate debugging only. */9 T0 W6 `" v! U2 f/ ^2 p
  175.                     500,        /* Stack depth in words.                                          */
      q( V' ^# V3 ^0 }: m
  176.                     (void*)pcTextForTask1,       /*通过任务参数传入需要打印输出的文本. */; E! n* X+ A# B- \
  177.                     1,          /* This task will run at priority 1.                              */
    + j* J2 x' m: p8 L) F! w
  178.                     NULL );     /* We are not using the task handle.                              */- C# t. h  z9 ]6 B: N
  179. ! ~- M: s% Q5 J" ?" i4 p
  180.     /* Create one task. */
    & [9 ~4 X, o  m9 L9 x1 N* h
  181.     xTaskCreate(    vTask2,     /* Pointer to the function that implements the task. */
    4 i$ d) |$ i9 b4 f
  182.                     "Task 2",   /* Text name for the task.  This is to facilitate debugging only. */6 ]  g9 r2 j7 }
  183.                     500,        /* Stack depth in words.                                          */$ J, b2 X9 C7 _. p# X, ]4 B
  184.                     NULL,       /* We are not using the task parameter.                           */9 _' T! U" T- u, M" g& r
  185.                     2,          /* This task will run at priority 2.                              */% k$ G9 W2 G: s/ t- |- i7 j
  186.                     NULL );     /* We are not using the task handle.                              */6 N0 e8 J# N  T0 }# L9 {
  187.         
      u& o( I# J) q# r* J5 |
  188.          /* Create one task. */. L+ l1 |+ D, ]1 j
  189.     xTaskCreate(    vTask3,     /* Pointer to the function that implements the task. */) i$ [7 p: @+ p/ h+ l, S9 V
  190.                     "Task 3",   /* Text name for the task.  This is to facilitate debugging only. */- f/ P2 x: t" ~& h
  191.                     500,        /* Stack depth in words.                                          */; P! U2 G/ K; d( }
  192.                     NULL,       /* We are not using the task parameter.                           */
    * ?9 e, C) E+ Z2 @% }2 @
  193.                     3,          /* This task will run at priority 2.                              */. O* [' E6 g' t5 e) W
  194.                     &xHandleTask3 );    * P( M+ y. @; Y* {6 X# R
  195.         
    ( X" F1 e3 h/ Y# A$ T* Z1 ^& U
  196.         /* Create one task. */
    0 F; G& Y2 h) P1 D3 A3 g
  197.     xTaskCreate(    vTask4,     /* Pointer to the function that implements the task. */
    & z) F$ B- I# @/ ]: X
  198.                     "Task 4",   /* Text name for the task.  This is to facilitate debugging only. */. b* J1 N$ U' U% V( E2 I* F
  199.                     500,        /* Stack depth in words.                                          */
    0 P) ~, ]+ }" E3 A$ T* `
  200.                     NULL,       /* We are not using the task parameter.                           */; ?/ `2 K: @  V2 v8 A
  201.                     4,          /* This task will run at priority 2.                              *// V  \, i1 L8 f
  202.                     NULL );     /* We are not using the task handle.                              */                                
    0 x  T: V' k. j; i/ N7 g) G
  203. }" \6 ~( P( A- ?1 d* _' m" p
复制代码
caizhiwei 回答时间:2015-4-29 16:58:45
  1. /*
    1 S9 Z2 \' q( {+ M1 Z" L
  2. *********************************************************************************************************
    * ?, Q! _& j! X6 K+ [8 W2 ?/ J0 v
  3. *        函 数 名: vTask34 k  b. m# @( B3 B& b4 {
  4. *        功能说明: 接收队列信息               
    4 P6 Q5 y" r7 |( U# e% F
  5. *        形    参:pvParameters 是在创建该任务时传递的形参- V- ~2 ?4 e! s. z- R9 T& x
  6. *        返 回 值: 无
    * j0 H, e1 c( s0 {1 ]% s
  7. *********************************************************************************************************$ R  _0 ]& w& a: _
  8. */
    3 u- `2 G; C  Z, s
  9. void vTask3( void *pvParameters )
    ) f! r" E7 [& J! p: Y5 z# B" J5 }
  10. {
    9 p" T& P- k8 a
  11.    uint8_t Count[5];5 p# I1 L0 e3 n
  12.     while(1)/ b8 N) W, Q1 J! ?
  13.     {7 W# S. o2 x/ y. {, R
  14.                                 
    9 y' c0 u' P7 y5 p1 W
  15.         /* 从队列中获取内容 */     
    3 K; `7 ]0 ]; `" l
  16.         xQueueReceive( xQueue, &Count[0], portMAX_DELAY); //任务中断并等待队列中可用空间的最大时间3 [/ Y: g2 y- K, t1 y
  17.         xQueueReceive( xQueue, &Count[1], portMAX_DELAY);
    ) q3 e, }  t+ |/ P% G
  18.         xQueueReceive( xQueue, &Count[2], portMAX_DELAY);, M! z( k& H6 Y7 ?2 B$ ?6 ~1 {
  19.         xQueueReceive( xQueue, &Count[3], portMAX_DELAY);  I" f4 H2 F  I4 V) U8 K/ k9 `1 ~
  20.         xQueueReceive( xQueue, &Count[4], portMAX_DELAY);
    % o" c* v( |: c- S
  21.         / ]; |+ F; n+ u5 n2 h. u) }
  22.         printf("Count0 =  %d\r\n", Count[0]);. {( b3 s1 T+ T  \( Q
  23.         printf("Count1 =  %d\r\n", Count[1]);1 @" t1 z  `( A7 u* `. @% ]0 n
  24.         printf("Count2 =  %d\r\n", Count[2]);
    * H: _6 z: l. F4 E1 _- B
  25.         printf("Count3 =  %d\r\n", Count[3]);) q5 E8 b, m. F0 c- Z! t5 g
  26.         printf("Count4 =  %d\r\n", Count[4]);) ~0 G0 `( b' b7 }) m/ a
  27.     }
    5 D. ~5 g: H9 a% Z. @# }5 o
  28. }; \7 T  Z% F1 I! W

  29. 9 x( {  z- k& X
  30. /*
    1 W$ |6 M7 K( K* B; Y( }. D6 e
  31. *********************************************************************************************************$ \! m' D3 n9 E. |0 u/ D  t
  32. *        函 数 名: vTask41 Z: `" S3 ?2 l$ H
  33. *        功能说明: 向队列中填充内容        
    : m, I# S6 U' M$ s! k( ]
  34. *        形    参:pvParameters 是在创建该任务时传递的形参
    & C+ m6 M6 x, Z$ ^; m) t" U0 k
  35. *        返 回 值: 无4 H' G( b- y+ y  b0 ]( ^
  36. *********************************************************************************************************
    " H* t  [5 q$ u$ s
  37. */& O' a2 X5 {  {. Z1 V0 m
  38. void vTask4( void *pvParameters )  {6 o3 ~! h8 F* d( i" P: n7 Q
  39. {
    ' M2 [* s" D) f9 N7 z. ?$ y8 w6 h/ ]5 A2 l. V
  40.     portTickType xLastWakeTime;3 `% ?0 g: X& M) ?9 R
  41.     const portTickType xFrequency = 1000;. J# u( m  V  |  X4 ]" I8 T' ?6 B
  42.     uint8_t ucVar[5] = {0};
    6 b9 O* C6 j7 D+ q2 v
  43. / J& E8 q" ?$ r. `7 x: k/ \; b
  44.          // Initialise the xLastWakeTime variable with the current time.7 @% J1 B0 |. T% Q% k0 l8 x. l
  45.      xLastWakeTime = xTaskGetTickCount();( r9 {& K' }/ R3 [# K

  46. 8 T0 E+ p: h  {" O- s/ K! p
  47.     while(1)
    ) ?5 v: I% g: d
  48.     {4 P% \" G- l& t& |
  49.                 ucVar[0]++;  N! p3 W, [4 a3 S% [
  50.                 ucVar[1]++;7 d1 Z- T, y7 {0 F: G
  51.                 ucVar[2]++;
    + ~% [' @) Q' M
  52.                 ucVar[3]++;. E) X! N4 x& Z" v* }7 F; k
  53.                 ucVar[4]++;: U- {" O2 ~& B7 X( f9 A
  54.                
    % G) R: H; j& Y8 ^& y
  55.                 if( xQueue ) //!=NULL 如果队列创建成功
      K, R3 \: x' `2 t3 k) e1 |/ D
  56.                 {
    - l8 S& \1 f1 o% [2 A

  57. ' t5 Z# x; J$ e7 [0 s
  58.                         //当队列满时,则等待 xTicksToWait个滴答周期后再传递
    2 x  u/ |+ e' o5 d/ l$ ?
  59.                         xQueueSend( xQueue, ( void * ) &ucVar[0], ( portTickType ) 10 );
    5 ~' t% u% L' g  t4 Z
  60.                         xQueueSend( xQueue, ( void * ) &ucVar[1], ( portTickType ) 10 );( E! ]& S, U! F5 D
  61.                         xQueueSend( xQueue, ( void * ) &ucVar[2], ( portTickType ) 10 );4 l* `1 R% @( k. b
  62.                         xQueueSend( xQueue, ( void * ) &ucVar[3], ( portTickType ) 10 );
    ! z/ _  r* j5 e  @
  63.                         xQueueSend( xQueue, ( void * ) &ucVar[4], ( portTickType ) 10 );8 ^" |  b# G; f8 C% w
  64.                 }# ]( D& G7 a/ F: Z* J# B2 a, m
  65.         vTaskDelayUntil( &xLastWakeTime, xFrequency );
    3 e$ Z+ s. e3 Q- a% D' G  z
  66.     }
    ' S* K- H3 ~+ d5 g8 Y8 y. A1 Q) n
  67. }
    / H' l3 m- |1 _/ Y8 Q% n* e
复制代码
caizhiwei 回答时间:2015-5-4 09:39:45
  1. /*0 R5 W3 ]) o7 k* o9 a' J
  2. *********************************************************************************************************4 T8 X5 D5 J! X! u9 _( o
  3. *        函 数 名: vTask3. L/ P4 ^" Y, p: S& O& B* _/ c2 V
  4. *        功能说明: 接收队列信息               
    4 j4 {( ^- q3 u
  5. *        形    参:pvParameters 是在创建该任务时传递的形参
    , X  {( Y; c2 R8 _
  6. *        返 回 值: 无
      Q$ |8 d# @2 ^' e! Q& n6 l! b
  7. *********************************************************************************************************/ B7 G+ ]9 Y& p+ k9 S4 m+ f7 o) S
  8. */% _3 ~" P5 h% T4 }5 n. D
  9. void vTask3( void *pvParameters )- a$ `4 Z: c- W. }8 s9 D% \9 ?) g
  10. {+ F5 p  g2 _/ a6 p4 P- A8 L
  11.     portTickType xLastWakeTime;
    2 O7 z' B- }& D8 m3 k! E
  12.     const portTickType xFrequency = 1000;# ?- S( E- H0 I
  13. 8 a7 Y3 k: [2 V8 L( V- z+ d
  14.     // Initialise the xLastWakeTime variable with the current time.3 h6 @3 F% E, y
  15.     xLastWakeTime = xTaskGetTickCount();. B, b- R; I5 B/ M% f; t- `/ g0 h
  16. & C- j" x" X9 U6 Y/ X9 W
  17.     while(1)2 f! e. d! U* e# x& z( \* j/ u/ Y. E
  18.     {                               
    5 V5 g+ ~7 O5 N+ U- `6 t
  19.       /* 一个任务想要合法地访问资源,其必须先成功地得到(Take) 该资源对应的令牌2 B5 V, a& J2 U6 x' s$ o, w5 F& _
  20.       (成为令牌持有者)。当令牌持有者完成资源使用,其必须马上归还(Give) 令牌。
    7 ?. S' S/ B' _6 s, H- x. `) l
  21.       只有归还了令牌,其它任务才可能成功持有,也才可能安全地访问该共享资源。*/* e! t% N/ Y) J- C& ^" {6 }
  22.       xSemaphoreTake( xSemaphore, portMAX_DELAY);
    " T! M) H! |+ o: d
  23.       printf("Task 3 is running\r\n");
    $ w! v5 J7 g$ t, ~
  24.       xSemaphoreGive( xSemaphore );
    , i1 ?$ e7 m& x; m! S5 C( N3 H
  25.       vTaskDelayUntil( &xLastWakeTime, xFrequency );/ F8 S) ]6 j. w# g; ^
  26.     }1 E! s5 o+ m0 X! w5 N
  27. }
    , u! @5 k' Y5 F3 U8 N9 y, Q, W

  28. 7 s3 c# J4 Y6 [' X2 y9 n5 V
  29. /*9 u8 _8 T, {" K1 D! t
  30. *********************************************************************************************************
    " p# a% h) d# O/ v# X0 D  d
  31. *        函 数 名: vTask4
    , m8 I. }: M! Y
  32. *        功能说明: 向队列中填充内容        * d( i2 Z: h* E& c. }9 q( P: }
  33. *        形    参:pvParameters 是在创建该任务时传递的形参
      g+ J  }+ I2 d3 A- T. W
  34. *        返 回 值: 无
    8 z9 Q/ V9 p/ M- i7 i# `
  35. *********************************************************************************************************
    ' W  s/ ?. |; g) d4 _; F4 P2 ^5 f
  36. */7 j% F& w$ V. ?) R5 u
  37. void vTask4( void *pvParameters )2 N, K- s9 }3 @. D1 t+ z3 {2 R
  38. {+ L4 O; Z1 @  R. o' ~6 }3 i6 r
  39.     portTickType xLastWakeTime;
    ! a1 N0 A  d3 c6 `: v) @9 e0 n  ?
  40.     const portTickType xFrequency = 1000;0 p) L6 y* V# O$ J

  41. " u. O% o5 l1 h9 w# |/ i
  42.     // Initialise the xLastWakeTime variable with the current time.& m2 _9 ]" I# O+ e; `/ n) ]" \. E
  43.     xLastWakeTime = xTaskGetTickCount();" e! t/ Z# c$ `& I) z& x6 \" y

  44. 1 ?  m; Z+ S/ k) u& m) A8 x) D: Q
  45.     while(1): p( i% u) k. D/ l
  46.     {1 P3 g% C- W; E1 a8 x4 z
  47.       /* 用于互斥的信号量必须归还。用于同步的信号量通常是完成同步之后便丢弃,不再归还。*/
    1 ^/ o' J* G8 D( D! L
  48.       xSemaphoreTake( xSemaphore, portMAX_DELAY);
    7 Z; L1 g0 I7 }& i4 o8 W* B+ o! T2 A
  49.       printf("Task 4 is running\r\n");
    4 d# B: x( d$ f6 r6 s+ V, p" U
  50.       xSemaphoreGive( xSemaphore );
    7 t% ~2 x+ [) Z$ }0 u+ G, |, _9 i
  51.       vTaskDelayUntil( &xLastWakeTime, xFrequency );( Y& ^9 Y& D& @7 R1 ^, {& F6 D, a3 r
  52.     }1 K( @! ?; h7 E6 h: o
  53. }
    2 F$ o! G  M7 K7 b: e7 i
复制代码
caizhiwei 回答时间:2015-3-13 14:07:18
来了来了~' m8 r" U2 M2 {8 D0 ~. B) y
说明:编译器IAR730,最新版~
caizhiwei 回答时间:2015-3-13 14:07:36
stm32f2_FreeRTOSv800实验_打印任务调试信息_工程OK.zip+ |/ J( |, `$ [
正在上传(100%)...
2 R2 x8 `8 a9 E2 `3 a stm32f2_FreeRTOSv800实验_打印任务调试信息_工程OK.zip (5.61 MB, 下载次数: 201)
caizhiwei 回答时间:2015-3-13 14:19:24
附点学习资料,嘿嘿 FreeRTOS编程指南.zip (222.42 KB, 下载次数: 152)
foxglove 回答时间:2015-3-13 14:55:43
FreeRTOS入门手册_中文.zip
stary666 回答时间:2015-3-13 15:20:30
好东西。。。。。。。。。。。。。
chaplin1999-262 回答时间:2015-3-13 15:32:05
这个不错!
大浪10010 回答时间:2015-3-13 20:12:06
多谢分享,,,
kqh1120 回答时间:2015-3-13 21:14:51
谢谢分享 14.gif
咫尺天涯-鱼 回答时间:2015-3-13 21:27:28
谢谢分享              
拼命三郎 回答时间:2015-3-13 22:20:47
xxxxxxxxxx.jpg
拼命三郎 回答时间:2015-3-13 22:21:15
stm32.jpg
_ilikerome_ 回答时间:2015-3-14 08:49:23
好东西,谢谢,收藏了。
wamcncn 回答时间:2015-3-14 09:50:40
谢谢分享,继续
dear祝子 回答时间:2015-3-14 11:14:35
非常期待
1234下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版