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

stm32 cubemx freertos 中断二值信号量卡死问题

[复制链接]
STMCU小助手 发布时间:2021-7-16 16:35

功能: 按键中断里面释放二值信号量,  然后点亮LED灯

问题: 卡在xSemaphoreGiveFromISR

代码:

  1. <font face="微软雅黑" size="3">! _: P+ M6 N" g; ^/ [  v
  2. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){7 N0 n% a8 G: @) E- m- H
  3.           uint32_t ulReturn;
    * w& d  ~4 I* _8 \+ W
  4.                 BaseType_t pxHigherPriorityTaskWoken;
    1 B% K& p8 l2 Y% N
  5.           /* 进入临界段,临界段可以嵌套 */2 G& J' D& j2 G- D7 H  }. E) W
  6.   ulReturn = taskENTER_CRITICAL_FROM_ISR();
    . m9 U+ H4 ^1 z/ J
  7.        
    . N- R2 A6 R& N. B+ Z! m7 @
  8.         if(GPIO_Pin == KEY1_Pin){6 n: r8 o3 p0 j8 I

  9. , `) z0 c( b7 m7 k
  10.                 BaseType_t pxHigherPriorityTaskWoken;
    ; |, O+ U4 b. O* `+ ?
  11.           xSemaphoreGiveFromISR(BinarySem_Handle,&pxHigherPriorityTaskWoken);        //释放二值信号量
    - s' ?5 T, h8 O+ w% w
  12.                 //如果需要的话进行一次任务切换
    $ p2 e% S! ^5 N) K/ j9 u+ A
  13.                 portYIELD_FROM_ISR(pxHigherPriorityTaskWoken);
    / s5 Q/ Q5 x; Z8 {
  14.         }
    / U$ d. i+ ?' B, U$ F  Q
  15.           /* 退出临界段 */
    " x! D% a0 j/ E) P8 {
  16.   taskEXIT_CRITICAL_FROM_ISR( ulReturn );
    4 Z! w! L. e: c2 v8 m
  17. }( o! u  W/ ?! C; \' Z7 y/ Z9 F
  18. ' q. w# i* Z# h+ o& _1 z/ P
  19. static void LED_Task(void* parameter)
    % F  P: c3 d* ~( ]
  20. {        / r$ |% [& o/ U4 F# ^" u3 k' l( V
  21.         BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为pdPASS */( c1 c3 e; `. {4 U
  22.   uint32_t r_queue;        /* 定义一个接收消息的变量 */
    1 V0 H( {! N& t* D$ E$ G& j# t) P
  23. * @+ r6 Q; U0 m/ I( z3 j
  24.   while (1)
    & C% Q( t2 v0 G+ o: a# k
  25.   {
    . O1 U+ h1 k$ f2 M1 E4 U
  26.     //获取二值信号量 xSemaphore,没获取到则一直等待
    " B# S9 ~3 A* d6 ]6 g' E
  27.                 xReturn = xSemaphoreTake(BinarySem_Handle,/* 二值信号量句柄 */
    0 f9 h( K! \8 t. l  @- s
  28.                               portMAX_DELAY); /* 等待时间 */
    8 J3 s1 x5 j* `, ~
  29.     if(pdPASS == xReturn)
    7 l! Q: C4 N6 Y
  30.     {! @' K2 D; B2 Q) V2 T
  31. ) k' C6 Z) a" i+ w! C+ d
  32.       printf("收到数据");; s/ c3 O/ q7 X( x2 U
  33. - C' i: I6 k4 W0 ~: r+ s. }6 u
  34.     }# Y# [8 ?1 X, z' \. U* q5 u' e
  35.                 % g" E9 a# P0 h; k  |$ j$ j7 u7 r
  36.                 " Y; I. I% l( q8 {+ x; D2 g) b) J
  37.                 HAL_GPIO_WritePin( LED0_GPIO_Port,LED0_Pin,0);
    + v7 u$ g0 L" W$ A! E
  38.     vTaskDelay(500);   /* 延时500个tick */7 m( {5 T, [) _  S& l* K: }: k- H
  39.     + z2 l, v1 `: I: S5 Z7 B
  40.     HAL_GPIO_WritePin( LED0_GPIO_Port,LED0_Pin,1);;     6 V: A2 i1 u# `6 K; \
  41.     vTaskDelay(500);   /* 延时500个tick */7 a/ K% ~4 t  |/ U: E
  42.   }
    4 Q- t7 D+ V: |. R* S( a% ]9 l
  43. }
    " l- _3 I) Y* U! B1 b
  44. 5 y$ x0 w4 L7 m) Z& I3 G
  45.   /* EXTI interrupt init*/
    ; u& P  q$ }3 Q
  46.   HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);1 ~/ B2 \; O# v+ }5 M
  47.   HAL_NVIC_EnableIRQ(EXTI0_IRQn);
    3 F# i5 N$ `* M
  48. </font>
复制代码

解决方案:  按键抢占优先级太高了,导致rtos不能抢占, 所以改低抢占优先级为7就可以

  1. <font face="微软雅黑" size="3">/* EXTI interrupt init*/7 S& {5 C$ \. M: U
  2.   HAL_NVIC_SetPriority(EXTI0_IRQn, 7, 0);
    8 w* b: Q, n  R  S4 m" q, K
  3.   HAL_NVIC_EnableIRQ(EXTI0_IRQn);</font>
复制代码
9 `( j" k( U2 @  o

3 Y( p0 J1 q+ H
赞 收藏 评论0 发布时间:2021-7-16 16:35

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版