完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
由书“嵌入式实时操作系统ucosiii”129页小结得知,中断服务程序应该简短,通过信号量或者消息传递给任务,让任务完成具体操作。故把原子哥串口接收中断修改。
使用任务内嵌信号量。 修改之前用把外部中断那一小节更改,使用正常,如下; void EXti2_IRQHandler(void) { OS_ERR err; OSIntEnter(); //进入中断 delay_ms(10);//消抖 if(KEY2==0) //按键KEY2 { OSTaskSemPost(&Led0TaskTCB,OS_OPT_POST_NONE,&err); if(err==OS_ERR_NONE) { printf("释放信号量"); } } EXTI_ClearITPendingBit(EXTI_Line2); //清除中断 OSIntExit(); //退出中断 } 随后将串口中断修改如下,发现用串口助手发送消息,系统就卡死,任务中调用if(err==OS_ERR_NONE)。这个语句不执行。 void USART1_IRQHandler(void) //串口1中断服务程序 { OS_ERR err; OSIntEnter(); if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾) { OSTaskSemPost(&Led0TaskTCB,OS_OPT_POST_NONE,&err); if(err==OS_ERR_NONE) { printf("释放信号量"); } } USART_ClearITPendingBit(USART1,USART_IT_CTS); OSIntExit(); } 请问哪里出问题了? |
|
相关推荐
8个回答
|
|
|
已找到原因。更改如下,led0task任务用于处理数据;
extern OS_TCB Led0TaskTCB; extern u8 Res; void USART1_IRQHandler(void) //串口1中断服务程序 { OS_ERR err; OSIntEnter(); if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾) { Res =USART_ReceiveData(USART1); //读取接收到的数据 OSTaskSemPost(&Led0TaskTCB,OS_OPT_POST_NONE,&err); if(err==OS_ERR_NONE) { printf("释放信号量"); } } USART_ClearITPendingBit(USART1,USART_IT_CTS); OSIntExit(); } |
|
|
|
|
|
USART_ClearITPendingBit(USART1,USART_IT_CTS);我把这个函数第二个参数四个选项每个都试一下,还是卡死
|
|
|
|
|
|
不要在中断里打印 你这个不卡才怪
|
|
|
|
|
|
不是的。原因已找到
|
|
|
|
|
|
楼主,你的led0task任务没有改呀,我只看到了你在中断中增加
Res =USART_ReceiveData(USART1); //读取接收到的数据 这句话。是这里的问题? |
|
|
|
|
|
是的 加上这句话 就没问题了
|
|
|
|
|
|
我也遇到了,进串口中断必须读串口数据,否则会卡死在中断里
|
|
|
|
|
|
串口接收中断
|
|
|
|
|
只有小组成员才能发言,加入小组>>
1018 浏览 1 评论
1849 浏览 0 评论
1830 浏览 1 评论
3254 浏览 5 评论
3581 浏览 9 评论
1020浏览 1评论
1849浏览 1评论
如何知道嵌入式电子控制单元 (ECU) 中的RAM使用情况?
1359浏览 1评论
1851浏览 0评论
1177浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 20:57 , Processed in 0.803782 second(s), Total 88, Slave 68 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1358