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

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

[复制链接]
caizhiwei 发布时间:2015-3-13 13:56
       根据ARMFlY的STM32F4的例程修改而来,本来想搞搞V820版本的移植的,发现移植之后编译出现一大堆错误,很是郁闷。
$ {) ]; P  [4 ?; @* y% i      不过总算是修改成功了,一共有四个任务,包括点灯和串口Printf输出,接下来就可以好好研究了,庖丁解牛之,嘿嘿~% u3 ?4 E: W/ m% [5 v. p0 S4 L
QQ截图20150313134946.jpg ' [: L9 n$ N) g$ S. p/ U) n3 [
附件请稍等~正在整理压缩~
; C  X- X4 ]& y2 W+ h5 O' p  O0 }5 c
赞 收藏 3 评论52 发布时间:2015-3-13 13:56

举报

52个回答
caizhiwei 回答时间:2015-4-27 13:05:57
通过任务参数传入需要打印输出的文本:* |  u9 i6 f$ k: S8 B- _0 ^
  1. #include "FreeRTOS.h"# c$ q2 c2 v( G# [
  2. #include "task.h"
    ) P9 W3 N5 `/ [( W: g4 z9 B4 d5 Y
  3. #include "queue.h"4 e  C# H# _/ d" F  }& I' k; [
  4. #include "croutine.h"" r; H4 ]: b) V/ b* P1 |
  5. #include "bsp.h"
    * [3 i3 v- p/ t4 a, T

  6. / P; J* W2 g( ]3 m2 E6 H% w

  7. : ]: a" X0 ?7 R- {; s: M, p
  8. /*: e, _8 J# z( R: E: D
  9. **********************************************************************************************************
    ( C6 L1 R0 x, F
  10.                                                                                         函数声明
    5 B, t- s6 e, G- ~" w( x
  11. **********************************************************************************************************
    . f! B" R, n* k' t
  12. */
    / F1 w/ |5 {5 k
  13. static void AppTaskCreate (void);
    4 ~  G9 L% V3 {: f8 |7 P
  14. extern void vSetupTimerTest( void );
    5 j' O& S8 @0 E" j$ G

  15. & ~+ N2 w4 T; X  k6 X
  16. /*  w7 W! ?! l! Q& w
  17. **********************************************************************************************************" O2 w/ c5 C. M/ q
  18.                                                                                         变量声明& f1 H( a! r+ y& M
  19. **********************************************************************************************************
    & A0 @5 @6 n% ^+ i; m9 s
  20. */
    . E1 [  f4 d# Y, {: C# H) p
  21. xTaskHandle xHandleTask3;
    $ b0 `( H% X' R# a
  22. int8_t pcWriteBuffer[500];% a4 b2 n: q* [: T% H
  23. . A! R( y6 W8 E/ t7 u4 t2 a
  24. /*
    . T6 m/ r) X+ R7 [! H  x- [7 i
  25. *********************************************************************************************************8 Y) u# O2 V  T* l. O
  26. *        函 数 名: main2 W( @, |; |8 J" E
  27. *        功能说明: 标准c程序入口。2 G. O0 x9 a3 i* M
  28. *        形    参:无
    : M. j9 L6 P6 P: i
  29. *        返 回 值: 无
    ' G  g% a7 _4 F- P/ o, p0 h. @! S
  30. *********************************************************************************************************
    % \( y0 A% v! x% ]2 ?: z6 P- O
  31. */
    # A& I4 T. k! v  y/ t3 M  v4 u

  32. : z5 n9 m0 g7 ~/ \) _' \6 d
  33. static const char *pcTextForTask1 ="Task 1 is running\r\n";
    3 F; o  S, g' H' f: x8 P
  34. static const char *pcTextForTask2 ="Task 2 is running\t\n"; : ^4 Q! {4 J  d# W. K# q
  35. 1 W( M1 R* I1 r
  36. int main(void)! T) `+ d$ R, l7 @4 N# ^
  37. {+ S1 I6 o* x3 T/ b  y
  38.     /* 硬件初始化 */
    + u* ~5 K. g  p  U0 d6 v
  39.     bsp_Init();, g# f. g! ?3 Q, u+ V
  40.          
    4 H0 s7 Q$ K* v8 e5 f
  41.     /* 创建任务 */
    " m  y0 j# J7 R& \; g" f5 Y
  42.     AppTaskCreate();1 d' F, H  Y/ `% [0 d% [# ?4 s
  43.     # \4 k# o1 N8 [# _( _% }3 _2 c
  44.     vSetupTimerTest();
    0 _5 W! K" J, @, j6 a* ?8 Z
  45.         
    5 b9 u( j% O) n. I8 b8 V! l6 p+ g1 J
  46.     /* 启动调度,开始执行任务 */
    # d* A# @8 o+ N; X8 G' w. l. g
  47.     vTaskStartScheduler();
    8 R3 u, j' w! l8 u  X
  48. , H" \: |9 N% `2 q8 O
  49.     /*
    ) b8 U' u4 q- l+ F% R0 J
  50.            If all is well we will never reach here as the scheduler will now be0 D  d7 d! }+ j( F: Z, K
  51.            running.  If we do reach here then it is likely that there was insufficient
    . r( e+ y$ H) g! ]
  52.            heap available for the idle task to be created. $ z9 v1 d$ u9 O( T  n8 k
  53.         */
    $ V/ l6 W, S8 c
  54.     while (1);
    + s8 L8 {* o: D* X0 W
  55. }
    9 y5 v3 {1 A2 [9 |0 F! H
  56. ( h% L1 _1 d0 p5 y. B4 n0 S1 j
  57. /*& @0 m7 a) C, E# t; T
  58. *********************************************************************************************************
    ) {' C  m: c. h0 d  Y0 T
  59. *        函 数 名: vTask1
    7 I. |6 X  [) Z+ L
  60. *        功能说明: LED闪烁                7 `& U7 I! r7 J
  61. *        形    参:pvParameters 是在创建该任务时传递的形参
    9 ]8 `! R5 ]5 R( ?
  62. *        返 回 值: 无
    ' N% T- ^+ J/ A' O+ G
  63. *********************************************************************************************************0 A6 y3 Q' B) S8 P/ N
  64. */+ U2 ~0 k5 ?3 y8 f6 |. W
  65. void vTask1( void *pvParameters )% f$ X0 E8 n9 ^! f
  66. {
    * {$ u" ^' n* @! T' o  O
  67.     portTickType xDelay, xNextTime;
    1 e8 k, J6 c  h' `' b* ^: m3 n
  68.    
    . n, B2 T- V; e3 i3 \
  69.     //char *pcTaskName = (char*)pvParameters;
    4 X6 |8 R8 ^: p$ G6 b
  70.     & W  O- S  }$ g" p1 C+ x
  71.     xNextTime = xTaskGetTickCount () + ( portTickType ) 1000;
    ; ~& Y! \# z2 V) l8 \" R' i% l
  72.         8 ?" ~9 v! w* K& a, f
  73.     while(1)
    6 O" `7 `) z# i, L
  74.     {
    ; Z( U/ Y4 Z0 O; z2 K5 x% `/ J

  75. + {# l& |3 m( w0 B" X# ~. m
  76.         bsp_LedToggle(LED1);0 A- o  Q) u7 F
  77.         //printf("\r\n%s",pcTaskName);' C7 v6 Q' n$ Q) Q% j
  78.         printf("\r\n%s",(char*)(pvParameters));# x" T8 A7 O4 T) f) o3 `$ s
  79.         /* 用vTaskDelay实现vTaskDelayUntil() */        
    1 a3 n. Q: Z+ m) F" D, u/ o
  80.         xDelay = xNextTime - xTaskGetTickCount ();" m& G5 ~7 S+ [" c; L
  81.         xNextTime += ( portTickType ) 1000;
    / L3 H* K" L! A7 B

  82. : d: j" [  r8 Y( b2 g  V' T
  83.         if( xDelay <= ( portTickType ) 1000 )$ j  H+ |4 Z. p1 @) _  S
  84.         {
    ' [3 d4 B+ _* L, c, v$ W' E
  85.                 vTaskDelay( xDelay );
    5 d( T9 O9 E* s) L8 ^7 o& J
  86.         }( m2 }6 r- d+ F+ d4 @; a) v- p
  87.     }9 _8 P1 E( s, l% m8 M4 ]' F/ a7 D
  88. }
    - `" Q4 c) i" i/ e8 g$ s

  89. 9 f0 k2 `: d8 k9 T6 U" P
  90. /*
    ' w0 H9 I- ]. y' V0 U; [
  91. *********************************************************************************************************
    , C8 k  O3 c" @% r/ U2 T5 B- l& m3 C
  92. *        函 数 名: vTask29 W/ n+ u' |, o/ P% N4 k' c: a
  93. *        功能说明: LED闪烁               
    * p2 A, g2 h7 X4 D: ]* p' U* g+ A5 r
  94. *        形    参:pvParameters 是在创建该任务时传递的形参. ?+ ]0 X0 q* n/ s
  95. *        返 回 值: 无
    9 V0 c2 e0 z; M7 @3 F, s. P
  96. *********************************************************************************************************0 ]6 T7 h5 d3 N' @
  97. */8 y2 W& v8 `/ i3 _. v5 E
  98. void vTask2( void *pvParameters )! R" I; f: Q! P. _( u2 g
  99. {: R2 \0 V6 R5 J8 a7 `! X# W
  100. 9 O7 I" s* f% g0 f( i4 i5 H
  101.     portTickType xLastWakeTime;
    6 E7 i1 c+ I& [1 Q4 R, K8 b0 i$ ~0 K
  102.     const portTickType xFrequency = 100;" n0 D: B" @) K) c
  103. 6 {' f3 I1 o2 K) ^
  104.     // Initialise the xLastWakeTime variable with the current time.8 k9 {) C& M, s  c4 a
  105.      xLastWakeTime = xTaskGetTickCount();
    , n9 P, A1 H8 q; |' x- M& _

  106. 3 N6 L5 L/ K9 t7 _+ Z$ V+ P8 G# Y
  107.     while(1)
    : C# S# U- Z( b
  108.     {7 A' W9 ~2 Y8 F+ s% w# q% m9 c
  109.         ( w0 Y, x5 H$ G
  110.         bsp_LedToggle(LED2);  // Wait for the next cycle.  
    * z7 [- A$ c' J% f# ?: {
  111.         vTaskDelayUntil( &xLastWakeTime, xFrequency );, y; L! e* V$ q  O7 r
  112.     }
    ( s! Q3 M8 k/ g: a  |
  113. }
    1 O0 s5 f- {5 ?; \$ N7 {

  114. " _9 E& d# ^) i0 C3 Y; ^8 L$ `6 v" D" |
  115. /*
    ' g- o$ I8 i% h. T4 m
  116. *********************************************************************************************************& ]: C# V/ `' P8 a+ @
  117. *        函 数 名: vTask3
    5 S* K0 _) {$ \0 V5 w3 b
  118. *        功能说明: LED闪烁               
    0 R/ B$ ^. n' |6 I- U$ ~* r  t
  119. *        形    参:pvParameters 是在创建该任务时传递的形参
    & P- |  S9 n; o
  120. *        返 回 值: 无
    5 _  L1 |% N2 O7 j( d9 F) o9 T
  121. *********************************************************************************************************
    ! X7 @7 Q3 C6 k6 k
  122. */+ l0 ~' w( Y1 Y8 V
  123. void vTask3( void *pvParameters )5 }' O( r- {8 Y
  124. {
    8 X, @$ z! s5 {0 i3 v8 S3 L. F: T
  125.     while(1)
    4 Z4 U8 z/ c; k/ h' W# I* |
  126.     {' \9 M4 T6 s3 C! B! H
  127.           /* 挂起自己,可以写NULL或者xHandleTask3句柄,都可以的 */, t5 e+ T$ Q( X
  128.           vTaskSuspend( NULL );
    5 y) I/ V$ l/ A+ K2 `( Y5 q/ V
  129.           bsp_LedToggle(LED3);1 [  K0 N& k" `- u9 k4 U8 J
  130.     }
    . e$ `% R8 h! C6 _9 X
  131. }
    . Y5 x" t2 _" v2 [3 @7 f$ v

  132. : b% i- A; L& i- ]+ p4 W
  133. /*+ }1 k# O* z# K
  134. *********************************************************************************************************
    4 M6 z) G9 b% m) Q' {! T
  135. *        函 数 名: vTask4' f  o) D0 f7 q. b
  136. *        功能说明: LED闪烁                8 i/ s' ?( w) r
  137. *        形    参:pvParameters 是在创建该任务时传递的形参
      \( z$ E2 p! }& _1 a
  138. *        返 回 值: 无
    9 B+ _7 C9 o6 f2 m
  139. *********************************************************************************************************
    4 c4 n1 I: S- z! c' o- w3 K
  140. */6 h; C, h8 u3 }5 A/ I' q
  141. void vTask4( void *pvParameters )
    : C8 f6 A: x3 A
  142. {8 i  e' a  C5 g1 [
  143.         portTickType xLastWakeTime;: Q5 L6 |. J- N. u- P* C
  144.     const portTickType xFrequency = 1000;
    ) }6 y0 n& W3 [5 @  @, {* _. Z

  145. " [) o$ I% m, d
  146.          // Initialise the xLastWakeTime variable with the current time.; C/ a" m& j7 O7 c
  147.      xLastWakeTime = xTaskGetTickCount();
    4 L- x6 l( J) H" X* l% N1 a: a
  148. ; q( s' V: P, e* l5 ^2 U. K
  149.     while(1)6 o0 h6 L2 f9 [+ J$ B6 l; @. k: V6 k
  150.     {
    - m& H$ q! P( g% ^0 T
  151.         vTaskResume(xHandleTask3);! B) J4 f* \4 C7 e
  152.         vTaskList((char *)&pcWriteBuffer);
    ; D  S8 N8 A6 \8 q% p: \( o4 V
  153.         printf("%s\r\n", pcWriteBuffer);3 a$ z' s* ]2 W" P6 I7 m" w
  154. 2 G6 ?; C  x( V" Y7 B# p
  155.         vTaskGetRunTimeStats(( char *)&pcWriteBuffer);% s' h# [8 w9 X" L/ S' w7 h
  156.         printf("%s\r\n", pcWriteBuffer);
    9 c7 _/ z! U* C0 }( v
  157.         vTaskDelayUntil( &xLastWakeTime, xFrequency );5 A1 \" q- i% p. w; [8 u& k
  158.     }; M5 Z! k. R- ~- H2 j: m
  159. }: |1 _" g9 Z. u2 }9 v" j2 R+ z9 L; `5 y2 C( p
  160.   z2 h* N2 G0 ^0 d+ J" j4 ]4 x

  161. ) e: |( |+ g1 k, ?( ~+ ?
  162. /*
    3 O2 E: M- o- t7 B" j
  163. *********************************************************************************************************
    ; r0 Y8 e3 |: \. S
  164. *        函 数 名: AppTaskCreate
    . g/ x7 p( z& ?
  165. *        功能说明: 创建应用任务! n7 n# B$ k3 J3 b6 L
  166. *        形    参:无) w( h1 \* _7 U! R( S9 C# ?
  167. *        返 回 值: 无
    ' t9 `+ }- Y& x7 [0 n4 ?
  168. *********************************************************************************************************
    + ~: ~+ ~2 S, s7 f# o* H
  169. */& E* F& c: O( G5 e' E
  170. static void AppTaskCreate (void)
    4 l7 |3 B- R; Z: F! `9 m
  171. {
    & T% }4 X7 q; ?6 M/ B
  172.         /* Create one task. */# a# W; v, m( R2 o! q* [
  173.     xTaskCreate(    vTask1,     /* Pointer to the function that implements the task.              */
    3 p) J1 R& B' [% K
  174.                     "Task 1",   /* Text name for the task.  This is to facilitate debugging only. */$ P# J; l+ q+ P8 ^
  175.                     500,        /* Stack depth in words.                                          */" U) a6 p, O0 a# F' x7 c. u+ m* u( [
  176.                     (void*)pcTextForTask1,       /*通过任务参数传入需要打印输出的文本. */0 ?5 t1 E+ m1 `
  177.                     1,          /* This task will run at priority 1.                              */
    : {: x+ t1 v$ T+ t! f) k
  178.                     NULL );     /* We are not using the task handle.                              */
    ; s9 ]0 U0 y1 [3 @2 Y* Q2 v2 C
  179. 2 R* i) R, n/ d% l
  180.     /* Create one task. */
    0 z+ l: @5 h5 w
  181.     xTaskCreate(    vTask2,     /* Pointer to the function that implements the task. */; p: H5 @+ X- r6 W' H5 j1 P6 o
  182.                     "Task 2",   /* Text name for the task.  This is to facilitate debugging only. */
    & K5 k; o1 {. S3 k" t
  183.                     500,        /* Stack depth in words.                                          */
    ; N5 m% R* n, o" h6 r5 X6 s) T* S
  184.                     NULL,       /* We are not using the task parameter.                           */
    5 T4 [; Q; \' ]& w0 C. }. x
  185.                     2,          /* This task will run at priority 2.                              */
    4 N* h$ U9 P3 H! ~+ [; C
  186.                     NULL );     /* We are not using the task handle.                              */) J0 X) W3 s4 I2 C, u6 K
  187.         
    ) b5 o' ]7 v' r2 y3 f$ o% ~
  188.          /* Create one task. */1 O. B  T9 P0 r2 X$ x
  189.     xTaskCreate(    vTask3,     /* Pointer to the function that implements the task. */& _) \! r0 s, E- y7 d8 x" O  |
  190.                     "Task 3",   /* Text name for the task.  This is to facilitate debugging only. */* F, J4 L% T. O! @, h) \# ]
  191.                     500,        /* Stack depth in words.                                          */
    1 F8 [! h+ h& n9 o7 P
  192.                     NULL,       /* We are not using the task parameter.                           */
    8 x% ?: M* o8 |
  193.                     3,          /* This task will run at priority 2.                              */' ?, c' [! ^2 ~2 }8 ]0 d4 {: K6 i
  194.                     &xHandleTask3 );   
    # u' P* ~3 x& x
  195.         + \4 {  W) I- {
  196.         /* Create one task. */+ Z# i! l, g, P
  197.     xTaskCreate(    vTask4,     /* Pointer to the function that implements the task. */" o# ~; a( o; H7 Y$ j, }$ \
  198.                     "Task 4",   /* Text name for the task.  This is to facilitate debugging only. */- M6 E& p& b& r& {5 G
  199.                     500,        /* Stack depth in words.                                          */6 x! u' e" T" }6 ^/ M/ F
  200.                     NULL,       /* We are not using the task parameter.                           */# |* N  j% F: ~; U! a$ p2 y
  201.                     4,          /* This task will run at priority 2.                              */+ m8 N. K5 A* E9 e# P
  202.                     NULL );     /* We are not using the task handle.                              */                                
    9 j7 ~5 s" b' s
  203. }4 c( a# r, z3 N
复制代码
caizhiwei 回答时间:2015-4-29 16:58:45
  1. /*
    8 Q- Y- v3 k6 j/ G) Z/ h
  2. *********************************************************************************************************
    8 P! u4 ]- e8 s, ?8 Y
  3. *        函 数 名: vTask3/ k8 A! J1 _  N" r: D
  4. *        功能说明: 接收队列信息               
    " U3 V( G4 {+ e3 I9 R
  5. *        形    参:pvParameters 是在创建该任务时传递的形参
    3 o9 ]" [7 _* A( A  N
  6. *        返 回 值: 无( l4 p. K  Q5 b3 ^- w/ Q' N6 S
  7. *********************************************************************************************************
    9 A' U& I4 [! I6 r  z& p' h1 A
  8. */
    " m) \/ b' s' I3 q, Z9 J
  9. void vTask3( void *pvParameters )/ U' p4 t( ]: S$ i# N! O4 Y
  10. {
    * B, ?% q- B( X% i1 M2 Y& S
  11.    uint8_t Count[5];! b* T" j% i! `
  12.     while(1), v+ _, Q0 l# i0 t6 P
  13.     {0 R, m1 l, J' s2 U
  14.                                 
    ! b5 o$ M1 H- p7 z& J
  15.         /* 从队列中获取内容 */     - g- `% M3 c! u' D. S: M! m* _
  16.         xQueueReceive( xQueue, &Count[0], portMAX_DELAY); //任务中断并等待队列中可用空间的最大时间, V) a* Y$ Y- K! h" P: t
  17.         xQueueReceive( xQueue, &Count[1], portMAX_DELAY);
    3 k' ]7 O/ p8 w6 D0 j
  18.         xQueueReceive( xQueue, &Count[2], portMAX_DELAY);! E# ]* ]3 u1 q. `3 E8 w$ f2 J
  19.         xQueueReceive( xQueue, &Count[3], portMAX_DELAY);
    8 g9 s$ I- t2 r$ f! w& w
  20.         xQueueReceive( xQueue, &Count[4], portMAX_DELAY);/ @- }/ Z# U- p& [% W- k6 y+ a
  21.         1 b( h9 Q2 t1 a, x+ c! ]5 C
  22.         printf("Count0 =  %d\r\n", Count[0]);' u7 s+ e- I; o! J/ D, T
  23.         printf("Count1 =  %d\r\n", Count[1]);
    $ j# @' C  k) u7 f* x& y, W% ]! Y
  24.         printf("Count2 =  %d\r\n", Count[2]);5 ]1 S# Y) a3 n# o, p2 ^( t
  25.         printf("Count3 =  %d\r\n", Count[3]);
    9 g4 ]' \6 O; a0 c5 ?0 M2 f
  26.         printf("Count4 =  %d\r\n", Count[4]);
    6 k8 j: n; l9 d  C
  27.     }; w/ H4 S% W! k. N# @: S# p
  28. }% Z% D% I0 M% V) e! q

  29. 6 s" P$ l0 k' i+ }$ f
  30. /*/ E. L1 V6 G8 V+ Z1 ^  j) i( _( O5 x
  31. *********************************************************************************************************: P" A8 a' s1 d; x
  32. *        函 数 名: vTask4
    7 F1 v. F& @0 G
  33. *        功能说明: 向队列中填充内容        7 _2 [$ V; ~$ X
  34. *        形    参:pvParameters 是在创建该任务时传递的形参# i7 J2 F6 K* Q/ v1 Y/ H/ Z
  35. *        返 回 值: 无; ^" x  ~5 j2 D8 q
  36. *********************************************************************************************************
    ' Y% k; `8 C* C+ c4 d$ d) \5 Q
  37. */) G5 n, |0 u# N+ L
  38. void vTask4( void *pvParameters )5 E& H0 K4 ^  n3 d! @
  39. {+ r0 T! b3 G" s# V/ y; P
  40.     portTickType xLastWakeTime;
    2 y) q$ P! d8 B* T. ]5 f& @
  41.     const portTickType xFrequency = 1000;( V8 w: z4 I. n8 A+ ]
  42.     uint8_t ucVar[5] = {0};
    5 p0 O7 ^- ^) a- w. a

  43. / h* Z; q- e4 L
  44.          // Initialise the xLastWakeTime variable with the current time.
    * o+ b' `! C8 \: I$ y
  45.      xLastWakeTime = xTaskGetTickCount();
    , d9 ]& T1 d: `: \6 }  f
  46. 0 [6 ]7 k: i1 `: R, a4 Z
  47.     while(1)& G1 O" I2 f1 W9 `$ W, `
  48.     {# t8 I6 U8 E# g; T; n1 z7 |, [
  49.                 ucVar[0]++;. H0 T  J, u/ K8 b5 v; `1 l: d
  50.                 ucVar[1]++;
    ' \$ c' E3 H; C3 }$ N2 F
  51.                 ucVar[2]++;
    * ]4 t& @: E; O4 b  p: a! q+ \
  52.                 ucVar[3]++;1 H3 I0 D- }( [! r" b
  53.                 ucVar[4]++;
    5 Y* d4 Q- c0 Y7 m2 v
  54.                
    9 {1 J9 {  Y! n; X9 c6 `
  55.                 if( xQueue ) //!=NULL 如果队列创建成功
    9 `9 D8 |$ O9 M- J4 b0 k
  56.                 {2 Y! Z7 u  a5 {4 [! S' b

  57. ! Z- o3 \, P* A) d9 s5 U6 e/ Q
  58.                         //当队列满时,则等待 xTicksToWait个滴答周期后再传递
    # U+ y' x1 s5 j2 \: i' Y( m
  59.                         xQueueSend( xQueue, ( void * ) &ucVar[0], ( portTickType ) 10 );% U0 f, H! ^/ z2 a% |; d& \
  60.                         xQueueSend( xQueue, ( void * ) &ucVar[1], ( portTickType ) 10 );: P9 T* `/ q3 s% {; S) {* Q" Z
  61.                         xQueueSend( xQueue, ( void * ) &ucVar[2], ( portTickType ) 10 );
    1 e/ @4 E* \# m
  62.                         xQueueSend( xQueue, ( void * ) &ucVar[3], ( portTickType ) 10 );
    6 h3 k$ W( r1 Q. B$ S
  63.                         xQueueSend( xQueue, ( void * ) &ucVar[4], ( portTickType ) 10 );
    * Z' n$ L; G& Q  |# r) Y# T, O
  64.                 }# c& g; k/ J; _% P
  65.         vTaskDelayUntil( &xLastWakeTime, xFrequency );
    . j  ^! h6 T/ V2 t& t; h
  66.     }
    ; R: i! l3 k3 R
  67. }
    ; Q! T6 ^7 d  W
复制代码
caizhiwei 回答时间:2015-5-4 09:39:45
  1. /*; N0 F; @" S9 h% ~. P+ `
  2. *********************************************************************************************************! _* r( H4 ?/ b& z$ s$ w
  3. *        函 数 名: vTask3; n+ ^6 C2 \4 l, t8 }9 A) v
  4. *        功能说明: 接收队列信息                ; Z) X6 X4 Z" U& G, \
  5. *        形    参:pvParameters 是在创建该任务时传递的形参; q/ O2 r2 c0 b1 b* @
  6. *        返 回 值: 无
    4 R) j) v* T1 j
  7. *********************************************************************************************************
    1 L) h2 X( C1 r0 K: B" Y9 |# y
  8. */
    + ~7 o+ ?/ g, d
  9. void vTask3( void *pvParameters )
    # a$ j2 N0 ?$ q
  10. {
    : s6 T& N% s, @( }3 @
  11.     portTickType xLastWakeTime;
    6 a) j% u- z  z5 r% |
  12.     const portTickType xFrequency = 1000;
    * u7 b: a9 ~3 e0 `

  13. " U! y  j  y& [0 u
  14.     // Initialise the xLastWakeTime variable with the current time.
    2 m, Q& E5 a) h$ v
  15.     xLastWakeTime = xTaskGetTickCount();
    7 B7 d/ u: b# t. f4 n7 c- I3 y+ Y

  16. $ k) P8 N9 ~/ E" v
  17.     while(1)
    9 L: @/ G, m, P
  18.     {                               
    1 }8 z0 ^4 ~4 X8 M
  19.       /* 一个任务想要合法地访问资源,其必须先成功地得到(Take) 该资源对应的令牌
    : I5 o/ k0 b% Z! e
  20.       (成为令牌持有者)。当令牌持有者完成资源使用,其必须马上归还(Give) 令牌。
    0 \6 T% V4 l& Q$ F
  21.       只有归还了令牌,其它任务才可能成功持有,也才可能安全地访问该共享资源。*/
    ; X! g9 J$ p- p, V& @1 [
  22.       xSemaphoreTake( xSemaphore, portMAX_DELAY);
    $ g. l: [' i* W) s
  23.       printf("Task 3 is running\r\n");1 i. n" [! S1 P
  24.       xSemaphoreGive( xSemaphore );) p$ L5 f# }% |7 `* \5 ~
  25.       vTaskDelayUntil( &xLastWakeTime, xFrequency );9 A: X0 c  a2 _9 c
  26.     }
    * m/ p! r5 U9 G$ A- i9 H
  27. }
    1 V( I0 i1 c  o3 `( c4 b" z
  28. * ~* z$ E: M8 m# d( U
  29. /*9 E8 ~7 _" h5 E0 t
  30. *********************************************************************************************************. z# s/ g1 a9 R; ]- V/ A4 C
  31. *        函 数 名: vTask4' z. L) f& y3 Q" Y- E
  32. *        功能说明: 向队列中填充内容        " k, X" _; A* Y4 ]1 ?
  33. *        形    参:pvParameters 是在创建该任务时传递的形参
    % o, z) T- B4 C* h1 A9 _; H! `. z+ c
  34. *        返 回 值: 无
    8 W3 ?/ P' e: s1 \8 w. S1 D
  35. *********************************************************************************************************
    6 R; X8 H, Z( Z* [2 q1 e; F2 s
  36. */
    5 i+ m% Z; _2 l, e8 {
  37. void vTask4( void *pvParameters )0 _3 g6 B1 ~, T' h# k
  38. {
    : S! |0 z6 O" }
  39.     portTickType xLastWakeTime;9 l! e9 J+ {, T" |; b3 p2 Y$ j' ~- j
  40.     const portTickType xFrequency = 1000;
    ! R5 s( Q! h* u1 H& @

  41. 5 l# \' |# I! G6 G1 p  Y: P7 f7 d
  42.     // Initialise the xLastWakeTime variable with the current time.& r) L; x6 m) Q( P1 v
  43.     xLastWakeTime = xTaskGetTickCount();
    & V. Q; S9 ^6 G( w

  44. 2 f( l$ _" e; ^: |. X0 Q' [( H
  45.     while(1)
    , g- [/ }8 d2 ~3 ~3 E- ], Y1 ]
  46.     {! W+ y4 V8 [3 ]% }$ E* r( t! {
  47.       /* 用于互斥的信号量必须归还。用于同步的信号量通常是完成同步之后便丢弃,不再归还。*/
    3 a  Z- h' j% D0 A! t
  48.       xSemaphoreTake( xSemaphore, portMAX_DELAY);
    + R4 L) `' G  T2 D
  49.       printf("Task 4 is running\r\n");' S9 B' d8 H* x4 X; a6 d
  50.       xSemaphoreGive( xSemaphore );
    ' g) `5 R- I, E) [: r
  51.       vTaskDelayUntil( &xLastWakeTime, xFrequency );) x: P: s* q" X; ~7 s+ _! _6 n6 f: p, Q
  52.     }
    ) h8 Y7 M, T/ S. q. Q. V
  53. }" j, N, C# M' Q/ {" v
复制代码
caizhiwei 回答时间:2015-3-13 14:07:18
来了来了~
% q4 a9 k3 H9 I2 C' b: K说明:编译器IAR730,最新版~
caizhiwei 回答时间:2015-3-13 14:07:36
stm32f2_FreeRTOSv800实验_打印任务调试信息_工程OK.zip8 g1 x: m' J- `& |
正在上传(100%)...
/ u3 G* j- ?/ S% p2 n/ { 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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版