rt_thread事件集使用问题

发布于 2021-03-16 11:12:40

我设计的方法是:一共三个线程,最高线程是对看门狗进行喂狗操作,其他二个线程定期给做高线程发送事件,最高线程接收以后进行喂狗操作。不初始化事件集和发送以及接收事件集,三个线程正常运行,目前运行事件集出现死机,不断打印rt-thread的错误信息,这个问题是出在哪呢,都是按官方API手册来得。
lALPDgfLQwFMzgrNAsLNAxY_790_706.png
lALPDgfLQwFRs3HNA-LNA14_862_994.png
lALPDgQ9xFyNycjNAyHNBvI_1778_801.png
lALPDh0cOt31qALM580C8Q_753_231.png

网盘链接:链接:链接:https://pan.baidu.com/s/1OFhQJ7047dMSPnSaq3Au-Q
提取码:azip

查看更多

关注者
0
被浏览
369
4 个回答
张世争
张世争 2021-03-16

通过报错原因,可以在 led_thread里 发送的地方打个断点,软件调试下。这种情况,应该是【野指针】或空指针引起的。

另外:
(1)注释掉event发送,看看event是否初始化成功,event是否是全局的结构体(非指针)。
(2)rt_event_init 可以判断返回值,而不是只打印error

yangjie
yangjie 2021-03-16

看日志,打印的第一句就是event_send_flag,在此之前检查 event init 成功了吗。

然后感觉你的把问题变复杂了,建议定时喂狗使用定时器就行。

flashman2002
flashman2002 2021-03-16

喂狗一般都在线程优先级最低的线程中处理。你的用法有些怪异。建议看一下网站中的看门狗的相关教程。

cxhxy12345
cxhxy12345 2021-03-17

看了下你的源代码,感觉问题出在下面这个函数

void uart_send(uint8 *ser){
    while(*ser!='\0'){
    USART_SendData(USART2,*(ser++));        
    while(USART_GetFlagStatus( USART2, USART_FLAG_TC)==RESET);{
        //rt_kprintf("·¢ËͱêÖ¾³É¹¦\r\n");}
    }
}

这里*ser!='0'有bug,你可以按照你的数组最后一个放n
其次你的while(USART_GetFlagStatus( USART2, USART_FLAG_TC)==RESET)可能是一个死循环
导致你的这个线程一致在运行,而无法返回flag5。这样你的狗就不能喂。所以程序在运行一段时间2.5S
后就硬件重启了。
建议你将这个代码改成

void uart_send(uint8 *ser){
    while(*ser!='\0'){
    ser++;
    }
    rt_kprintf("send OK \r\n");
}

试下,如果没有问题,再做串口开发

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览