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

RTOS超低功耗平台应用---信号量应用

[复制链接]
BinWin 发布时间:2018-4-14 23:11
接上篇:RTOS超低功耗平台应用---FreeRTOS启动&任务创建: n  l8 d: Q; v9 z9 d" D
/ n7 |; W4 a+ n1 r1 }# D1 p
/ u" E$ \( D: W1 N6 l  u7 k( N& a
( k8 g  ~7 [1 W/ g
     首先了解一下信号量,一般信号量主要实现两个功能:
4 a& S- _; d+ _( K/ w" j6 ^     1,两个任务之间或者中断函数跟任务之间的同步功能
8 F+ n' p9 X8 i$ M1 ?7 v     2,多个共享资源的管理
7 s8 }! C# J) C2 c- u) q$ v) g, f    FreeRTOS针对这两种功能分别提供了二值信号量和计数信号量,其中二值信号量可以理解成计数,即初始化为仅有一个资源可以使用。
3 z! _$ V7 D6 p* t" `    实验是创建一个线程,该线程通过ISR发出的信号量打印按钮按下计数,包含一个LED闪烁任务。
2 {  D5 R' w2 a1 r9 t6 x7 `
  1. /**
    . C, D& O8 N$ }  Z1 m1 Q; q
  2. * @brief  Start a Task.
    / _; V1 s- J7 X/ ^5 [' E$ T
  3. * @param  argument: Not used
      w: {& J: c2 U4 R
  4. * @retval None0 M" ?1 K6 b* V% E/ B. R
  5. */1 V/ f4 z6 f0 p( Z% S: y8 Y
  6. static void vAppStartTask( void *pvParameters )5 Z! _% j4 g3 D  \: @' k
  7. {
    / T6 Y/ J+ G8 C9 l' m
  8.         (void) pvParameters;! y7 G' {4 ~- g3 t2 B' P
  9.         
    - [9 K1 g+ s# I  ?% l9 n- c
  10.         for(;;)
    0 d" M# ?' u4 `9 i
  11.         {  y6 Z1 l1 T! ]7 N2 D
  12.                 BSP_LED_Toggle(LED2);
    8 e5 w) k: b$ f5 y
  13.                
    2 \+ N6 R5 |5 C9 G7 P
  14.                 vTaskDelay(200);- D4 V6 r& U; L3 u9 d, L
  15.         }
    6 h4 [: R: [! V  N+ h4 ?% l
  16. }" u2 `% S+ q. h9 ?
  17.   ?# y1 ]4 p7 \1 c8 k
  18. /**3 i8 W* G8 k, m
  19. * @brief  Button Task.* |8 y0 V" ~! f0 m5 D
  20. * @param  argument: Not used
    3 Y: E. @9 n* r! m3 |1 S
  21. * @retval None
    " C2 j9 x) |8 C/ l" z; H) T
  22. */" b! ?1 {+ x" O. P9 P1 N
  23. static void prvAppButtonTask( void *pvParameters )
    & M! r( U& q" l
  24. {6 V( w% K6 `* z% b7 ?! ~: V0 W
  25.         configASSERT( xTestSemaphore ); /* The assert function determines whether the semaphore is valid. */
      L4 P' Y7 q" }) }+ g5 y4 ]
  26.         8 K$ R& k# f; E
  27.         /* This is the task used as an example of how to synchronise a task with1 j5 ^/ V, [7 D  ^; O
  28.         an interrupt.  Each time the button interrupt gives the semaphore, this task* O) H- }1 Y6 T3 J1 k4 e
  29.         will unblock, increment its execution counter, then return to block
    * Y7 I4 e/ z* u
  30.         again. */
      M9 V; ?2 P; }/ ~: n+ m+ [" [
  31.         # @1 |/ I' X5 ], o3 w/ C* {8 Q* R
  32.         /* Take the semaphore before started to ensure it is in the correct
    " C5 Z+ b7 ^3 U7 i
  33.         state. */5 w& P- J4 V9 F- d6 o0 I! V
  34.         xSemaphoreTake( xTestSemaphore, mainDONT_BLOCK );& R$ W, K; ]% y' p+ ~
  35.         
    ( J# |" o3 @6 H
  36.         for( ;; )
    ! h8 R2 O& F3 U+ {% _$ q6 [. m
  37.         {0 m# G' [, y* f6 J/ E" f8 i- T$ z
  38.                 xSemaphoreTake( xTestSemaphore, portMAX_DELAY );0 F7 W' V0 u7 s
  39.                 ulButtonPressCounts++;; U) f- e3 @4 _% Y$ R2 t
  40.                 printf("Button Press Counts:%d\r\n",ulButtonPressCounts);
    ) X  w! |# E2 v& d6 f
  41.         }
    . z- k, g$ m. l' g
  42. }
    " x$ M- j4 T1 i- j8 V2 y# j: \

  43. * r- E5 W  X3 ^% t7 D+ d
  44. /**
    $ X: {/ V6 m- U1 r
  45. * @brief EXTI line detection callback.) V# B# \6 q6 r& p' J# r$ P  D" B
  46. * @param GPIO_Pin: Specifies the pins connected EXTI line
    " W. S" [& [# f
  47. * @retval None
    ! v# J1 r  Z, P" z* J  y- w
  48. */4 U6 [7 E0 q- y( ?3 f! x
  49. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)/ o( j  N" Q# Y! ~/ T, _( n
  50. {& C, k  Q. |0 S2 N- c1 d
  51.         if(GPIO_Pin == KEY_BUTTON_PIN)) {0 x5 h& w" d0 v
  52.         {
    1 w6 g/ Q* m* z
  53.                 if (uwIncrementState == 0)
    : d6 ]  `. G) O( G, a
  54.                 {. J; c( y0 L/ d& e8 \
  55.                         /* Change the Push button state */
    % h* j! `& n& T* `) L9 b1 J! R# h
  56.                         uwIncrementState = 1;
    1 c8 B2 k0 q& l
  57.                 }
    ; P4 U0 p7 @4 I1 x' k8 E7 ]
  58.                 else
    2 c3 q0 |9 |/ T4 Z  D) S+ {
  59.                 {
    * W% J( {' ~7 t$ t. @
  60.                         /* Change the Push button state */
    . w1 p$ }7 i1 @: M) Q/ Y
  61.                         uwIncrementState = 0;' O( m0 l& G! O! \
  62.                 }
    7 c+ Q; l8 {. E+ Y- D( L3 t
  63.         }  3 _$ L! N; b, _# f+ k% s2 g4 U
  64. }; A8 f  V/ Q% p
复制代码
    主函数中使用xSemaphoreCreateBinary() 创建信号量,
  1. xTestSemaphore = xSemaphoreCreateBinary();
复制代码
    按键检测任务中使用xSemaphoreTake()函数来获取信号量。按键检测使用外部中断,信号量使用完毕后的释放也是在终端服务函数中,如下
& @/ H& M5 o$ T
  1. xSemaphoreTake( xTestSemaphore, mainDONT_BLOCK );  //获取信号,传入创建的信号量句柄xTestSemaphore
复制代码
  1. /**( ?+ o3 B0 q. H2 ?5 A" Y) T
  2. * @brief  EXTI15_10 IRQ
    * U. g) ^) }! @
  3. * @param  None
    0 Y: y6 [7 ~6 L
  4. * @retval None9 N! V: X% e/ E+ }% ^0 j
  5. */
    6 ?8 J0 x( G$ W/ q+ G
  6. void EXTI15_10_IRQHandler(void)
    . v+ B2 |) D4 ]* U# h# b8 }: p
  7. {/ g5 u# J6 n; J% w
  8.         
    , s5 c* {; ?. O. N, Y
  9.         static BaseType_t xHigherPriorityTaskWoken;                      - O( I5 {; C* M( |0 Y7 u6 @
  10.         
    ) a; f2 l. d. ?2 y' e
  11.         /* Inerrupt message handling */# g* T! v5 _# Q5 _9 S7 ~% J  w
  12.         HAL_GPIO_EXTI_IRQHandler(KEY_BUTTON_PIN);               
    - G& I* F; l; O; ]) r
  13.         
    " j7 a6 ^1 [4 \: q* s1 Y& G$ D
  14.         /* The handler releases a semaphore.& [' G$ f9 o2 W
  15.         xHigherPriorityTaskWoken has been initialised to zero. */( }! a& J3 N9 _$ O* w2 |# K7 `
  16.         
    " T# x/ x0 ?% ?3 ^) j& X
  17.         if (utime_tick >= 200)
    8 R& y% g/ \  C
  18.         {
    " d2 k0 R# C: \8 }
  19.                 /* The second parameter of the send sync signal is used to save
    # C; t* G, ]! l7 A; n. F, H
  20.                 whether a high-priority task is ready.*/
    # }! Y8 h& @; R6 W; F; \; N
  21.                 xSemaphoreGiveFromISR( xTestSemaphore, &xHigherPriorityTaskWoken );        0 X+ h, J  u, T0 `
  22.                 utime_tick = 0;
      {+ E! \8 Q! Y) L" l/ `8 q+ v. N: R
  23.         }
复制代码

6 g+ N) b5 S0 ?8 `% \( F$ O
: q7 M3 _( a- d       程序运行后会执行LED闪烁任务按键计数任务,当获取到信号量后计数值加1,同时释放信号量共下次资源可用。运行效果如下       C(HBH$]QP{3[)V]GZJ6EWHF.png
: z% n+ V' L# k& o0 ^8 u! F8 M: S. r* ~, q" z
收藏 评论0 发布时间:2018-4-14 23:11

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版