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

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

[复制链接]
caizhiwei 发布时间:2015-3-13 13:56
       根据ARMFlY的STM32F4的例程修改而来,本来想搞搞V820版本的移植的,发现移植之后编译出现一大堆错误,很是郁闷。
7 g6 E' L. R. |) ~4 Q6 X9 n8 o+ s      不过总算是修改成功了,一共有四个任务,包括点灯和串口Printf输出,接下来就可以好好研究了,庖丁解牛之,嘿嘿~$ x1 l0 o' J- k0 \, A4 W9 T
QQ截图20150313134946.jpg
: x1 x7 N5 e; ]附件请稍等~正在整理压缩~  ?9 R% v. W6 ~( ?+ D& i
收藏 3 评论52 发布时间:2015-3-13 13:56

举报

52个回答
caizhiwei 回答时间:2015-4-27 13:05:57
通过任务参数传入需要打印输出的文本:" \3 E7 _" H* q7 ~# R$ X9 p
  1. #include "FreeRTOS.h"5 y: Q, M! Z4 ^7 Q1 k2 e& p: y* }& s
  2. #include "task.h"
    3 t1 b5 T$ ~- v) a0 n9 J" j
  3. #include "queue.h"+ |( w$ Y* C4 Q
  4. #include "croutine.h"
    , ^; I: S1 X$ I" M' R* P, c/ g
  5. #include "bsp.h"& C$ b% `# d7 @* I% E$ ]
  6. # [* G; Z) ?6 |
  7. 1 r- L8 g+ @6 Z3 u7 u; p4 n
  8. /*
    1 K6 `2 B" c" v! y( _
  9. **********************************************************************************************************8 [. r$ H& D( {) O# T9 N/ x9 L. H
  10.                                                                                         函数声明# V1 h- d  H$ M& y
  11. **********************************************************************************************************
    7 Z- B; M( c/ Y6 L+ W1 g3 a
  12. */
    ' g0 d5 s6 j  L/ r
  13. static void AppTaskCreate (void);6 ]& _" U9 U4 [
  14. extern void vSetupTimerTest( void );; ~$ y4 _2 F+ |2 r
  15. - K  V; t2 N/ b, ^0 H' V
  16. /*
    5 }" R. l. F& ^: ^8 }/ u
  17. **********************************************************************************************************
    $ Q1 W# ]9 P" ~" F- R8 @& ?
  18.                                                                                         变量声明
    ( e+ @$ Z; U. I& Z, k
  19. **********************************************************************************************************
    & t" h8 K7 ~  V- i
  20. */
    # B$ _9 t3 O/ o8 ^
  21. xTaskHandle xHandleTask3;
    # a) l! E' b2 A$ S5 S8 b2 ~
  22. int8_t pcWriteBuffer[500];1 s4 D. Z3 k' j) E9 N0 |

  23. * Q& ?2 Z+ g, \. ~$ i7 ?
  24. /*
    3 \9 i% w0 \9 D9 l
  25. *********************************************************************************************************
    : [/ K# V/ a. b2 S9 ^
  26. *        函 数 名: main
    9 c: L) ^9 Z, |8 {# v5 o7 w/ Z
  27. *        功能说明: 标准c程序入口。3 R& A3 Z0 ^+ r# v) e
  28. *        形    参:无& N: A3 I  m1 v+ m0 y/ G8 v
  29. *        返 回 值: 无
    2 u, e2 c% R( l/ r& b
  30. *********************************************************************************************************
    - t. E3 e! H& ~8 [+ g2 O
  31. */0 ]1 P$ L9 W: r( z1 [# M

  32. 2 [( {- c  k# [  {  _! b1 e5 a6 k
  33. static const char *pcTextForTask1 ="Task 1 is running\r\n";
    % H9 J8 c  @( s8 h% X
  34. static const char *pcTextForTask2 ="Task 2 is running\t\n";
    % @6 r5 ], ?. J) [* E7 I
  35. . _$ v- x0 q! e
  36. int main(void)
    8 H' `$ k9 S* ^3 ?$ u; p
  37. {9 Y  T4 h+ g7 w9 ~
  38.     /* 硬件初始化 */
    / B$ `( H3 F: i8 V6 w
  39.     bsp_Init();" K0 H9 F9 v! g, f3 J( `/ A  c% S
  40.          
    3 x+ \2 ?* z4 b2 [$ F/ Q4 E# C
  41.     /* 创建任务 */5 {# B" G7 Z2 r) R
  42.     AppTaskCreate();/ ?8 T* a/ k. q/ f+ M
  43.    
    ! S" H/ _; M9 }& `: R* l* I" }, O9 j
  44.     vSetupTimerTest();
      v3 F: H) n4 F8 X, X
  45.         
    ' h- V( \% F- r& X: F- u2 P
  46.     /* 启动调度,开始执行任务 */. L, R+ B7 m. M4 p" E
  47.     vTaskStartScheduler();0 `: p7 x, T% ~

  48. . N: w1 J, p/ F1 [* g& P
  49.     /*
    9 ~% d! k' M+ g. A
  50.            If all is well we will never reach here as the scheduler will now be
    ! _, z, `( s/ i. J1 T
  51.            running.  If we do reach here then it is likely that there was insufficient
    7 _- m7 A/ ?8 z" k8 [8 f/ ^
  52.            heap available for the idle task to be created. 1 _8 h' i1 Z* ?% i. n
  53.         */! {# o$ q, _, q" p& a
  54.     while (1);. I; d5 F1 t* ~- m# b& S5 R2 n
  55. }
    + s6 u* H6 E+ `

  56. $ O& V8 {! @% B+ J- s8 N5 f0 C
  57. /*
    : M4 [2 A3 O7 [1 n8 }" E
  58. *********************************************************************************************************+ e! W3 P$ I/ ]6 t2 ^, \! l; ^
  59. *        函 数 名: vTask1' T2 s) `1 O, N8 V8 S* m$ f
  60. *        功能说明: LED闪烁                # V! p, g# h5 U( b" I
  61. *        形    参:pvParameters 是在创建该任务时传递的形参
    - t8 d- @' h- U& C2 F8 M( x* y
  62. *        返 回 值: 无$ s5 Y. Q4 p% a- ]
  63. *********************************************************************************************************, I% y: w" D9 N3 r0 Z
  64. */
      ^* ]- p7 q9 X3 S4 ^9 ]8 }
  65. void vTask1( void *pvParameters )# N' y0 b8 R6 H8 N2 ?
  66. {
    ; V8 I! U3 ~- o' D! v1 p; ~; ]
  67.     portTickType xDelay, xNextTime;0 u3 a6 T7 r/ g( f* ^7 q" p* @
  68.     & a6 k/ |9 U- M! U8 ]" Z* K! o  x* R
  69.     //char *pcTaskName = (char*)pvParameters;3 b$ s2 T% C* P( @9 i& A' Z$ A2 h
  70.    
    ! J4 F- E4 z9 w7 `; o
  71.     xNextTime = xTaskGetTickCount () + ( portTickType ) 1000;
    ' y: `6 L$ J! n& W  I) S" K. }
  72.         
    & }: e+ V! R% z& L
  73.     while(1)
    / I3 A4 O1 `8 M
  74.     { * C0 n6 h/ B- R7 b
  75. + b+ |, E4 C" n  e: R/ E
  76.         bsp_LedToggle(LED1);1 m4 k3 I5 o3 W0 n
  77.         //printf("\r\n%s",pcTaskName);. X* p# K) Y; e
  78.         printf("\r\n%s",(char*)(pvParameters));# q# E7 x8 p0 B
  79.         /* 用vTaskDelay实现vTaskDelayUntil() */        , G' ^0 S9 P& A
  80.         xDelay = xNextTime - xTaskGetTickCount ();+ C3 `) z7 W$ u4 j; ^
  81.         xNextTime += ( portTickType ) 1000;1 `6 V; f' U6 j1 Q& W6 Z, @2 @
  82. 4 P- t, }+ ?2 W) `& ]8 K
  83.         if( xDelay <= ( portTickType ) 1000 )' B4 L0 O& g1 V/ C2 ]  M  m+ Y
  84.         {
    & j* V3 Y# b$ k4 n) L1 m
  85.                 vTaskDelay( xDelay );
    ; F. V% Z& B  C* D" c) J
  86.         }/ S9 m- x. y! i, q% `: [) w% @
  87.     }
    0 C' e+ Q" V4 z' |6 F* B
  88. }
    1 s" q5 J, y# Z4 M5 `/ i0 O

  89. : x1 T6 O- c0 ^
  90. /*
    ( U! V$ ~- v* K' w
  91. *********************************************************************************************************
    ; b/ Z8 L0 `9 s0 u5 C6 E
  92. *        函 数 名: vTask2
    ; J7 s7 N7 J) z6 I& u; g- v
  93. *        功能说明: LED闪烁                . P2 K" A& q2 j6 m
  94. *        形    参:pvParameters 是在创建该任务时传递的形参
    9 s+ z$ X7 o, O0 I( R& v2 i9 Y- u
  95. *        返 回 值: 无- \7 x& l# z7 g3 D- Z! Y/ M/ E
  96. *********************************************************************************************************( j$ O+ w+ |2 Q  @8 A5 x. n+ J/ l' s
  97. */6 ?; i/ i3 m6 R
  98. void vTask2( void *pvParameters )
    6 X8 h7 q9 c" z
  99. {3 x" m7 q/ W. ^5 D- O
  100. . M8 }4 I" M* L: B
  101.     portTickType xLastWakeTime;
    + R1 x+ l: S) q
  102.     const portTickType xFrequency = 100;3 }( |1 x0 Q% e+ a. }
  103. 9 W. @# F# C( ?% j' Y' e, k
  104.     // Initialise the xLastWakeTime variable with the current time.' G) A. k& m. n" u( j2 ~' y
  105.      xLastWakeTime = xTaskGetTickCount();: O% O# r( c" [7 [, [3 G
  106. + A; v4 ]- @( f0 p, U* c
  107.     while(1)
    7 Q" W# M2 A$ d5 ]0 c/ J) E5 V2 A
  108.     {
    / H; P1 j7 |# i' |$ x
  109.         # i; g. G6 L0 L6 f9 P% o
  110.         bsp_LedToggle(LED2);  // Wait for the next cycle.  
    4 C' E' X/ W- a/ w9 ]
  111.         vTaskDelayUntil( &xLastWakeTime, xFrequency );
    : s) }& j$ v4 A) y7 Q* Q$ D  e+ p
  112.     }. k# l9 W; V6 ~- f9 V, R6 {$ X+ F
  113. }
    / q$ Q8 S) ~, E- A
  114. 0 k( P5 [# q5 b3 @8 q) s
  115. /*/ ~$ l7 Z2 Z/ Y! H
  116. *********************************************************************************************************9 m. w; n( x) z
  117. *        函 数 名: vTask31 y$ M% G3 o  o- a$ M: S2 ^+ i0 L
  118. *        功能说明: LED闪烁                7 m9 k; f) n& M) Y( X7 J, O: u1 l
  119. *        形    参:pvParameters 是在创建该任务时传递的形参+ E+ j1 D9 f% B1 ?
  120. *        返 回 值: 无
    ' D' F0 V$ _/ z6 z& y' l1 b
  121. *********************************************************************************************************1 u% R$ o7 b8 {& k5 t. @( i
  122. */
    7 T% N5 T& ~6 o- L1 y8 }. B
  123. void vTask3( void *pvParameters )
    : \2 `1 j* b7 G6 g" n8 A% D" N
  124. {
    # U- j; E- `) |. P* o
  125.     while(1): @4 a% R- q( z% L
  126.     {
    3 [) n2 z% W, _3 l) j
  127.           /* 挂起自己,可以写NULL或者xHandleTask3句柄,都可以的 */
    ; G8 W" }. X) S+ C  [
  128.           vTaskSuspend( NULL );
    $ b: y  d7 p* H# h9 t, L7 E
  129.           bsp_LedToggle(LED3);
    , q, e+ C3 X* n
  130.     }5 ?7 t2 v2 n! i: U) v& }: h
  131. }
    9 j& l, a  m! j2 B# |# H# H

  132. ( F- Y8 S) v9 @9 L5 J
  133. /*4 n8 z1 R( c& ]; v* }
  134. *********************************************************************************************************
      Q' d4 C7 e& ]
  135. *        函 数 名: vTask4
    ! u+ e! z4 y/ i1 x( p
  136. *        功能说明: LED闪烁               
    9 r% V. {  X" ]2 H8 l. E; X7 I! y
  137. *        形    参:pvParameters 是在创建该任务时传递的形参. u0 p0 i+ b$ z+ r* T& R# k* m
  138. *        返 回 值: 无
    ; Y9 l3 o) T+ V
  139. ********************************************************************************************************** b. U6 P' b0 P2 ?# h' Q+ _
  140. */  S3 B$ w0 U0 n% H* P3 n+ W% G
  141. void vTask4( void *pvParameters )
    $ R4 f2 z1 @2 H  a, F. ?0 w
  142. {5 I( k. {: }0 T' ~- c
  143.         portTickType xLastWakeTime;  o$ M7 e* L( q8 y
  144.     const portTickType xFrequency = 1000;
    8 O4 z3 Q  v0 H9 m

  145. , u  h& a9 O# m$ ]# R
  146.          // Initialise the xLastWakeTime variable with the current time.
    2 `2 E! g3 y# P  @0 l+ l. }
  147.      xLastWakeTime = xTaskGetTickCount();
    & L6 L2 y5 Q' J5 K: g5 x& J

  148. : r! U- [. n1 O( l: o+ i
  149.     while(1)+ g9 Y5 ~9 t0 [
  150.     {
    * Q: M0 T0 d+ S" ]) t) p, A$ d
  151.         vTaskResume(xHandleTask3);
    4 t5 S3 l9 J9 v( ?) C' |- q
  152.         vTaskList((char *)&pcWriteBuffer);3 J3 h5 t% B! F& [& A" ?* Q
  153.         printf("%s\r\n", pcWriteBuffer);
    9 A. G  f. ?2 I6 F
  154. 9 i3 b# t2 u, B6 Y
  155.         vTaskGetRunTimeStats(( char *)&pcWriteBuffer);( S& X+ A0 T1 m( c4 M" s4 ^. t
  156.         printf("%s\r\n", pcWriteBuffer);+ t8 E: [7 i* j4 F7 i$ B, c
  157.         vTaskDelayUntil( &xLastWakeTime, xFrequency );
    4 E1 B, a  U+ l( A" u  ]  M9 K2 y
  158.     }7 k  }. j6 q7 n% j& `% t$ `8 o+ m
  159. }% R/ f) {% \( X+ q! q
  160. / W6 ?5 j3 O# l: c: r6 J

  161. 1 T6 `+ |& F5 [3 D: C8 r0 M! y
  162. /*
    2 n5 i3 Z$ }! I7 p) [! ~) Q; e
  163. *********************************************************************************************************& G( {+ W$ ]% G/ m
  164. *        函 数 名: AppTaskCreate6 ]) H" ^3 e4 x; c6 `
  165. *        功能说明: 创建应用任务* q( c2 A$ N. n+ J7 @' j& |- b5 n
  166. *        形    参:无" F0 F& t2 O4 c
  167. *        返 回 值: 无+ J. ]8 `! b# y$ s
  168. *********************************************************************************************************9 _3 ^+ E% L" }& K+ b/ @
  169. */& L- G: S! w' i) j
  170. static void AppTaskCreate (void)9 B+ d  k% \" ]& O3 C5 V0 Z0 o5 q$ A
  171. {  {1 p, ?4 |5 h+ g& g$ E" W' W+ l
  172.         /* Create one task. */  x- X6 B3 X1 t- I4 {% B- k- ^
  173.     xTaskCreate(    vTask1,     /* Pointer to the function that implements the task.              */: Q. [$ Q5 K5 M  ?
  174.                     "Task 1",   /* Text name for the task.  This is to facilitate debugging only. */
    5 g4 a' T( R& S* e9 M
  175.                     500,        /* Stack depth in words.                                          */) Y5 I3 j$ q2 ?! |" G9 j6 m
  176.                     (void*)pcTextForTask1,       /*通过任务参数传入需要打印输出的文本. */! V* s' i$ C# }2 A
  177.                     1,          /* This task will run at priority 1.                              */
    4 o) e9 l# j! g
  178.                     NULL );     /* We are not using the task handle.                              */
    . o) f" C  ]* h

  179. 2 L8 k, C# u1 D9 m* [3 q3 h
  180.     /* Create one task. */
    0 Y; e4 y* T4 B7 p9 x/ j
  181.     xTaskCreate(    vTask2,     /* Pointer to the function that implements the task. */" ~2 O# m6 }7 x5 W9 m: x
  182.                     "Task 2",   /* Text name for the task.  This is to facilitate debugging only. */
    * B0 O/ f* o# O* g. ^
  183.                     500,        /* Stack depth in words.                                          */
    9 y5 |4 I, c) u/ ~! I. G9 H) r8 v
  184.                     NULL,       /* We are not using the task parameter.                           */
    , B1 E$ E5 i$ S& C, y
  185.                     2,          /* This task will run at priority 2.                              */8 H2 a( l5 Y4 N8 F5 `0 Q
  186.                     NULL );     /* We are not using the task handle.                              */
    1 z" L* H" e  h( [) C6 q, D6 o
  187.         
    6 L! ?9 c' c& @! P) J2 I/ I) g; y
  188.          /* Create one task. */
    # V" ~& J9 d6 f  T! A2 z% H$ \4 L
  189.     xTaskCreate(    vTask3,     /* Pointer to the function that implements the task. */' z/ }* s$ \0 b
  190.                     "Task 3",   /* Text name for the task.  This is to facilitate debugging only. *// l. Q# L  ]- I! [) n
  191.                     500,        /* Stack depth in words.                                          */
    4 o3 l7 M3 X0 ^9 Q$ @
  192.                     NULL,       /* We are not using the task parameter.                           */* j  N+ l0 o$ n7 _  c
  193.                     3,          /* This task will run at priority 2.                              */
    , c& Q/ c9 X1 d( l4 r9 Y* v
  194.                     &xHandleTask3 );   
    : H0 P1 i' k8 [/ Y- B" O) }5 i# s
  195.         
    5 U1 V7 z- v- S4 O2 r( d
  196.         /* Create one task. */
    3 e  j* Z7 ~+ o+ ~8 ^# ^
  197.     xTaskCreate(    vTask4,     /* Pointer to the function that implements the task. */. q+ z  V& I* i0 ~6 I' c
  198.                     "Task 4",   /* Text name for the task.  This is to facilitate debugging only. */
    8 i+ T6 F) n+ m8 h3 e( l
  199.                     500,        /* Stack depth in words.                                          */% j7 h. ]. N* M
  200.                     NULL,       /* We are not using the task parameter.                           */
      |$ K# ^8 @5 D; l' C! s
  201.                     4,          /* This task will run at priority 2.                              */7 [+ s! A, z" t: W
  202.                     NULL );     /* We are not using the task handle.                              */                                
    6 i( Z% m; n* K% I+ P9 V* }
  203. }$ e2 r5 e. C  S* a1 W/ W  Z& f9 L
复制代码
caizhiwei 回答时间:2015-4-29 16:58:45
  1. /*
    0 @1 c. g" X, D& a
  2. *********************************************************************************************************- p6 N  w! S  C
  3. *        函 数 名: vTask3& u! `9 G: ]/ E& Z# i6 o
  4. *        功能说明: 接收队列信息               
    9 T3 e9 u% {9 i+ ^2 Q1 }) `  C% z
  5. *        形    参:pvParameters 是在创建该任务时传递的形参4 L5 t: M4 K6 `: y; V. C. ?; E4 H6 J
  6. *        返 回 值: 无
    2 X* \( R5 m; s
  7. *********************************************************************************************************
    " C$ M4 |" ?0 L" g# Q
  8. */
    7 l/ \$ z6 ?) t7 k3 O  X
  9. void vTask3( void *pvParameters )% _- m; L5 z% W9 p0 e4 t
  10. {
    , F! p  v. \& e' J, |' x
  11.    uint8_t Count[5];) N: W9 j& ]" s+ L) N2 E. p: C
  12.     while(1), o$ g% P* T. p( F& k
  13.     {
    3 N) ^/ K4 Q. f1 w
  14.                                 
    $ u9 M( s, U  G9 r  K
  15.         /* 从队列中获取内容 */     
    6 n: d6 F2 S% ~$ n+ l
  16.         xQueueReceive( xQueue, &Count[0], portMAX_DELAY); //任务中断并等待队列中可用空间的最大时间
    : d, A9 V3 |5 {
  17.         xQueueReceive( xQueue, &Count[1], portMAX_DELAY);
    6 x" j% S# p$ [7 _2 j
  18.         xQueueReceive( xQueue, &Count[2], portMAX_DELAY);
    8 `+ j; f/ O$ [! ~% N; {" M0 C8 G
  19.         xQueueReceive( xQueue, &Count[3], portMAX_DELAY);2 T  `* Y% l7 V0 ]5 i
  20.         xQueueReceive( xQueue, &Count[4], portMAX_DELAY);
    % ]6 _7 d) p$ D4 m4 R
  21.         
    + z  R& p0 _+ g
  22.         printf("Count0 =  %d\r\n", Count[0]);" b1 l4 p+ f4 W9 H6 }
  23.         printf("Count1 =  %d\r\n", Count[1]);
    6 \- `' X' V0 I: H, e( d; @8 \
  24.         printf("Count2 =  %d\r\n", Count[2]);$ V- S" F6 K! _
  25.         printf("Count3 =  %d\r\n", Count[3]);
    ! ?2 g+ h' x; W+ b7 X2 m
  26.         printf("Count4 =  %d\r\n", Count[4]);
    * D( b8 F  S; W9 ~9 q- @& T" n: t$ `
  27.     }2 ]8 q+ Z! x5 V9 m4 I
  28. }: e" |9 c  S% P2 O$ N% Y

  29. $ D( G) B8 `" y, d* R% R% L
  30. /*3 B$ y: @, I9 m8 D8 x4 \2 x, J; ^
  31. *********************************************************************************************************
    ; P6 N; h  ], B+ H$ H  }4 Q5 }
  32. *        函 数 名: vTask4
    ' Q7 a% i. Z: [8 [* @! H
  33. *        功能说明: 向队列中填充内容        5 E5 ?  ]' ?" m* t; Z
  34. *        形    参:pvParameters 是在创建该任务时传递的形参  b. W$ W/ f8 i7 Q& R1 k
  35. *        返 回 值: 无
    ( D: s4 G! N2 `. c# m: h& H" Y
  36. *********************************************************************************************************  f; [- H/ ^: v
  37. */* \. ]0 R# b: B/ v+ g
  38. void vTask4( void *pvParameters ), g9 \8 [- `' x* {2 S3 J
  39. {* x3 H. n, o1 _+ v- T
  40.     portTickType xLastWakeTime;1 X: e: a2 A6 R
  41.     const portTickType xFrequency = 1000;3 [! ^' t- ?/ }: G
  42.     uint8_t ucVar[5] = {0};
    8 \/ K6 B6 T$ f6 `3 d

  43. . K, t% \- e5 B8 T. L
  44.          // Initialise the xLastWakeTime variable with the current time.
    / }' x3 Y* H, v
  45.      xLastWakeTime = xTaskGetTickCount();
    # ^: N5 E: ^  p3 I
  46. : K7 x. o" Q; }  J' L- x$ c6 l
  47.     while(1)5 b" R; ~: w' b& _0 x  j
  48.     {
    3 M( R  B( t' v& ?
  49.                 ucVar[0]++;1 b' \2 i  ^: n
  50.                 ucVar[1]++;1 I- D: B$ K. ^
  51.                 ucVar[2]++;
    8 e5 q" L5 }- R
  52.                 ucVar[3]++;
    * K$ S+ j$ n( U: Q
  53.                 ucVar[4]++;/ A9 d/ T5 j) e
  54.                 / `# O: s& X) F" p4 {* f; j6 B
  55.                 if( xQueue ) //!=NULL 如果队列创建成功% L# |7 R5 R. N& j
  56.                 {5 y, H" ^/ T9 @+ G0 s) K4 m8 [: h' U
  57. 1 ?4 K2 {2 D" l  g; J$ \5 O+ l9 ?
  58.                         //当队列满时,则等待 xTicksToWait个滴答周期后再传递, A) g8 A# H0 H; a5 w2 X
  59.                         xQueueSend( xQueue, ( void * ) &ucVar[0], ( portTickType ) 10 );. \$ U8 T( r7 e: F/ J8 W6 p& L
  60.                         xQueueSend( xQueue, ( void * ) &ucVar[1], ( portTickType ) 10 );
    6 p$ X, c9 k1 Y( m; q4 v
  61.                         xQueueSend( xQueue, ( void * ) &ucVar[2], ( portTickType ) 10 );
    ) P& h* y' _6 P$ u4 D$ R; ], R
  62.                         xQueueSend( xQueue, ( void * ) &ucVar[3], ( portTickType ) 10 );' L3 u5 f, i% w6 D( @) O9 O1 {3 Y
  63.                         xQueueSend( xQueue, ( void * ) &ucVar[4], ( portTickType ) 10 );
    & Q. `* O; f! Y2 l1 L# O
  64.                 }
    1 w' A6 L: e" J& N5 D; ?8 u- R
  65.         vTaskDelayUntil( &xLastWakeTime, xFrequency );
    ! Y; N5 r% D, r  l. h* V) ~
  66.     }, W$ e  q8 N7 c; f' ^
  67. }
    9 _7 Z, ~8 f- f- Y+ Y3 \/ ?
复制代码
caizhiwei 回答时间:2015-5-4 09:39:45
  1. /*0 {4 w+ E: e5 ]5 ^& t3 k6 S
  2. *********************************************************************************************************
      c- ]& f2 K" s3 w4 O; N
  3. *        函 数 名: vTask3
    9 _( G6 o$ Z3 q! ?0 p% J
  4. *        功能说明: 接收队列信息               
    , u, m% \6 u1 |+ ]& e
  5. *        形    参:pvParameters 是在创建该任务时传递的形参
    2 ~  p, j2 y) V; j/ l& R
  6. *        返 回 值: 无" @  R  Y# T* m0 s3 n5 p
  7. *********************************************************************************************************
    2 I( _# {4 a7 f$ P% J$ w/ ]3 I
  8. */
    0 I* g1 h; `" ?
  9. void vTask3( void *pvParameters )5 R' k# X7 t' Y, R- ~$ l
  10. {; P6 j9 Y: p* \% X; \5 O
  11.     portTickType xLastWakeTime;
    + h/ y  k5 {/ X
  12.     const portTickType xFrequency = 1000;% T" j# I; }0 _# C' I2 K
  13. 4 T5 F' R% V7 [2 v
  14.     // Initialise the xLastWakeTime variable with the current time.
    7 I' S; u. C" o) e
  15.     xLastWakeTime = xTaskGetTickCount();
    % d% k2 L2 H+ O9 M" F+ W  K
  16. ! [6 Z2 u$ \+ f4 M  `
  17.     while(1)9 M' c' a6 y" J2 a
  18.     {                               
    + J, S& n* u& j4 Z
  19.       /* 一个任务想要合法地访问资源,其必须先成功地得到(Take) 该资源对应的令牌
    " t+ C& _9 I. l% t( H& A
  20.       (成为令牌持有者)。当令牌持有者完成资源使用,其必须马上归还(Give) 令牌。
    . ?' `1 _5 L9 @8 _$ A
  21.       只有归还了令牌,其它任务才可能成功持有,也才可能安全地访问该共享资源。*/
    ; W5 J# a9 x8 g2 O) S% ^8 h
  22.       xSemaphoreTake( xSemaphore, portMAX_DELAY);  d/ p! z1 D& e( _5 [- [( s
  23.       printf("Task 3 is running\r\n");
    % M6 V$ I9 c0 k
  24.       xSemaphoreGive( xSemaphore );6 D' I; V' R1 i% Z
  25.       vTaskDelayUntil( &xLastWakeTime, xFrequency );0 y, a& P4 X0 ~7 A; v' f
  26.     }# Q, z) `3 ]; p, L" W7 I) T0 H/ t
  27. }
    3 f" f% m9 m) Z
  28. 2 `; L& `5 u  ?" a5 |
  29. /*
    . |/ {1 O+ y3 S0 d5 P# x
  30. *********************************************************************************************************2 N, y2 L& W, i/ a, b/ S9 P
  31. *        函 数 名: vTask4; T$ b3 ^4 l& o, q4 w
  32. *        功能说明: 向队列中填充内容       
    $ g" h5 R2 j5 z+ P  C
  33. *        形    参:pvParameters 是在创建该任务时传递的形参% r" {; M8 }% |4 ~3 O
  34. *        返 回 值: 无
    5 i0 i( _5 P, p) M4 [9 h  h
  35. *********************************************************************************************************; T- Q" C; i$ K5 M5 }4 k3 ]
  36. */
    1 O9 q8 M4 R8 l
  37. void vTask4( void *pvParameters )
    1 v6 i, O! P8 E" d7 g" }9 u% J0 {
  38. {( r! R3 u) C. ^. j' J' a0 r$ U+ a& h) }
  39.     portTickType xLastWakeTime;
    " ?) v4 p3 G" k9 }; {3 r& y* N
  40.     const portTickType xFrequency = 1000;
    3 M9 B8 d  k$ n7 a5 ]  O

  41. ) H& b# J/ K  r! W4 v" a( o  p
  42.     // Initialise the xLastWakeTime variable with the current time.9 e6 N. B1 G( h( S0 {1 |
  43.     xLastWakeTime = xTaskGetTickCount();
    " R# m) ^, _# X. R
  44. ' k' z2 j* N0 w% i) m$ ^) |. t
  45.     while(1)
    4 N, s+ S4 \3 a
  46.     {
    7 j) P7 e" I" b/ u% y5 s( d
  47.       /* 用于互斥的信号量必须归还。用于同步的信号量通常是完成同步之后便丢弃,不再归还。*/
    ; Q1 |) x6 q5 N
  48.       xSemaphoreTake( xSemaphore, portMAX_DELAY);" p- g) x1 B1 i3 ~; W" a" u6 g
  49.       printf("Task 4 is running\r\n");# w! D# V5 i$ X0 _6 b$ O% o9 F
  50.       xSemaphoreGive( xSemaphore );
    7 M# j# ~; l8 B, S/ O
  51.       vTaskDelayUntil( &xLastWakeTime, xFrequency );
    9 q2 e/ |/ c( |6 I
  52.     }
    " X5 G4 ^" l" o: ]" _
  53. }
    . _$ A1 _9 k' Y
复制代码
caizhiwei 回答时间:2015-3-13 14:07:18
来了来了~
8 t8 P4 F  D: h( x- D) \' Y说明:编译器IAR730,最新版~
caizhiwei 回答时间:2015-3-13 14:07:36
stm32f2_FreeRTOSv800实验_打印任务调试信息_工程OK.zip
; o& H2 U) ~" ~; d正在上传(100%)...
, y0 Y! z; i' X2 \* A( s- h: w; J 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 手机版