|
功能: 按键中断里面释放二值信号量, 然后点亮LED灯 问题: 卡在xSemaphoreGiveFromISR 代码: - <font face="微软雅黑" size="3">! _: P+ M6 N" g; ^/ [ v
- void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){7 N0 n% a8 G: @) E- m- H
- uint32_t ulReturn;
* w& d ~4 I* _8 \+ W - BaseType_t pxHigherPriorityTaskWoken;
1 B% K& p8 l2 Y% N - /* 进入临界段,临界段可以嵌套 */2 G& J' D& j2 G- D7 H }. E) W
- ulReturn = taskENTER_CRITICAL_FROM_ISR();
. m9 U+ H4 ^1 z/ J -
. N- R2 A6 R& N. B+ Z! m7 @ - if(GPIO_Pin == KEY1_Pin){6 n: r8 o3 p0 j8 I
-
, `) z0 c( b7 m7 k - BaseType_t pxHigherPriorityTaskWoken;
; |, O+ U4 b. O* `+ ? - xSemaphoreGiveFromISR(BinarySem_Handle,&pxHigherPriorityTaskWoken); //释放二值信号量
- s' ?5 T, h8 O+ w% w - //如果需要的话进行一次任务切换
$ p2 e% S! ^5 N) K/ j9 u+ A - portYIELD_FROM_ISR(pxHigherPriorityTaskWoken);
/ s5 Q/ Q5 x; Z8 { - }
/ U$ d. i+ ?' B, U$ F Q - /* 退出临界段 */
" x! D% a0 j/ E) P8 { - taskEXIT_CRITICAL_FROM_ISR( ulReturn );
4 Z! w! L. e: c2 v8 m - }( o! u W/ ?! C; \' Z7 y/ Z9 F
- ' q. w# i* Z# h+ o& _1 z/ P
- static void LED_Task(void* parameter)
% F P: c3 d* ~( ] - { / r$ |% [& o/ U4 F# ^" u3 k' l( V
- BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为pdPASS */( c1 c3 e; `. {4 U
- uint32_t r_queue; /* 定义一个接收消息的变量 */
1 V0 H( {! N& t* D$ E$ G& j# t) P - * @+ r6 Q; U0 m/ I( z3 j
- while (1)
& C% Q( t2 v0 G+ o: a# k - {
. O1 U+ h1 k$ f2 M1 E4 U - //获取二值信号量 xSemaphore,没获取到则一直等待
" B# S9 ~3 A* d6 ]6 g' E - xReturn = xSemaphoreTake(BinarySem_Handle,/* 二值信号量句柄 */
0 f9 h( K! \8 t. l @- s - portMAX_DELAY); /* 等待时间 */
8 J3 s1 x5 j* `, ~ - if(pdPASS == xReturn)
7 l! Q: C4 N6 Y - {! @' K2 D; B2 Q) V2 T
- ) k' C6 Z) a" i+ w! C+ d
- printf("收到数据");; s/ c3 O/ q7 X( x2 U
- - C' i: I6 k4 W0 ~: r+ s. }6 u
- }# Y# [8 ?1 X, z' \. U* q5 u' e
- % g" E9 a# P0 h; k |$ j$ j7 u7 r
- " Y; I. I% l( q8 {+ x; D2 g) b) J
- HAL_GPIO_WritePin( LED0_GPIO_Port,LED0_Pin,0);
+ v7 u$ g0 L" W$ A! E - vTaskDelay(500); /* 延时500个tick */7 m( {5 T, [) _ S& l* K: }: k- H
- + z2 l, v1 `: I: S5 Z7 B
- HAL_GPIO_WritePin( LED0_GPIO_Port,LED0_Pin,1);; 6 V: A2 i1 u# `6 K; \
- vTaskDelay(500); /* 延时500个tick */7 a/ K% ~4 t |/ U: E
- }
4 Q- t7 D+ V: |. R* S( a% ]9 l - }
" l- _3 I) Y* U! B1 b - 5 y$ x0 w4 L7 m) Z& I3 G
- /* EXTI interrupt init*/
; u& P q$ }3 Q - HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);1 ~/ B2 \; O# v+ }5 M
- HAL_NVIC_EnableIRQ(EXTI0_IRQn);
3 F# i5 N$ `* M - </font>
复制代码解决方案: 按键抢占优先级太高了,导致rtos不能抢占, 所以改低抢占优先级为7就可以 - <font face="微软雅黑" size="3">/* EXTI interrupt init*/7 S& {5 C$ \. M: U
- HAL_NVIC_SetPriority(EXTI0_IRQn, 7, 0);
8 w* b: Q, n R S4 m" q, K - HAL_NVIC_EnableIRQ(EXTI0_IRQn);</font>
复制代码 9 `( j" k( U2 @ o
3 Y( p0 J1 q+ H |