OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2540|回复: 5

rtthread线程跑死导致程序强制看门狗重启的问题,在idle线程里喂狗也没用。

[复制链接]

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2775
金钱
2775
注册时间
2015-6-1
在线时间
394 小时
发表于 2019-9-26 13:37:54 | 显示全部楼层 |阅读模式
1金钱
情况如下:
1、使用rtthread操作系统、STM32L475芯片
2、系统原始自带一个idle线程,优先级是最高的,另外我后设了一个AAA线程,优先级比其它线程都高。AAA线程里和IDLE线程里都只有喂狗。
3、开BBB线程,优先级低。只有接收串口数据这一个功能,不对数据进行处理。
4、当无串口数据时,程序可正常运行。  当有串口数据时,程序有一定概率会跑死,然后看门狗也不再喂狗了,程序重启
5、当数据溢出时,rtthread会给出代码崩溃提示,但我现在的代码并没有崩溃,好像只是单纯地跑进了死循环,然后看门狗重启。问题是我的看门狗所在线程有足够高的优先级,足够它打断BBB线程和WHILE(1)来喂一次狗。所以我现在很好奇,到底程序是跑死在了哪里才能让看门狗无法喂狗呢?我应该如何去找这个位置呢?

最佳答案

查看完整内容[请看2#楼]

我测出来原因了:没有数据溢出;是主频太低了,现在用的4M 时钟是MSI。好像是卡死在串口中断里。将主频改为8M后就再也不出问题了。 我觉得现在有两种可能 1、4M主频跑9600波特率会出问题,进中断后就不出来了。但是我看过手册,4M跑9600是无误码的。就算有误码应该也不至于卡死吧,连线程都跑不了了。 2、4M主频处理不过来串口这么多的数据。但是这个可能性我又觉得不成立,因为不管发大量数据还是少量数据,快发还是慢发,目 ...
自在随心
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2775
金钱
2775
注册时间
2015-6-1
在线时间
394 小时
 楼主| 发表于 2019-9-26 13:37:55 | 显示全部楼层

我测出来原因了:没有数据溢出;是主频太低了,现在用的4M 时钟是MSI。好像是卡死在串口中断里。将主频改为8M后就再也不出问题了。
我觉得现在有两种可能
1、4M主频跑9600波特率会出问题,进中断后就不出来了。但是我看过手册,4M跑9600是无误码的。就算有误码应该也不至于卡死吧,连线程都跑不了了。
2、4M主频处理不过来串口这么多的数据。但是这个可能性我又觉得不成立,因为不管发大量数据还是少量数据,快发还是慢发,目前都出过问题。
自在随心
回复

使用道具 举报

11

主题

1044

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3722
金钱
3722
注册时间
2011-5-23
在线时间
2013 小时
发表于 2019-9-26 14:39:06 | 显示全部楼层
show you code
RT-Thread RTOS 音频,WIFI,蓝牙
回复

使用道具 举报

11

主题

1044

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3722
金钱
3722
注册时间
2011-5-23
在线时间
2013 小时
发表于 2019-9-26 18:15:03 | 显示全部楼层
这么低主频,此时tick多少?需要降低。

用仿真器具体查一下吧。
RT-Thread RTOS 音频,WIFI,蓝牙
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2775
金钱
2775
注册时间
2015-6-1
在线时间
394 小时
 楼主| 发表于 2019-9-27 08:29:20 | 显示全部楼层
aozima 发表于 2019-9-26 18:15
这么低主频,此时tick多少?需要降低。

用仿真器具体查一下吧。

主频太低会影响system_tick是吗?咋影响的呢?
rtthread的rtconfig.h里是这么定义的,这个原始例程里应该是一秒钟100个tick,嫌它太长,定了个1000
/* Tick per Second */
#define RT_TICK_PER_SECOND        1000

仿真好像是用不了,因为它并不是代码崩溃,崩溃的话一暂停调试,它会自动跳到正在跑的位置,就是崩的位置。但是我这个每次位置都不一样,都是在UART的中断处理中,我用的rtthread自带的串口函数,所以它中断的代码都是自带的 irq.c里,我看不懂它具体在干啥。比如这里
void rt_interrupt_enter(void)
{
    rt_base_t level;

    RT_DEBUG_LOG(RT_DEBUG_IRQ, ("irq coming..., irq nest:%d\n",
                                rt_interrupt_nest));

    level = rt_hw_interrupt_disable();
    rt_interrupt_nest ++;
    RT_OBJECT_HOOK_CALL(rt_interrupt_enter_hook,());
    rt_hw_interrupt_enable(level);
}
RTM_EXPORT(rt_interrupt_enter);
自在随心
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2775
金钱
2775
注册时间
2015-6-1
在线时间
394 小时
 楼主| 发表于 2019-9-27 08:35:30 | 显示全部楼层
aozima 发表于 2019-9-26 18:15
这么低主频,此时tick多少?需要降低。

用仿真器具体查一下吧。

4800波特率+4M主频是没问题的。
9600波特率+8M主频是没问题的。
9600波特率+4M主频会有概率卡死。
9600波特率+2M主频,串口2什么都传不了,但串口1的打印竟然是好使的,但只是单片机能向电脑串口写数据,电脑串口不能向单片机写数据。很好奇rtthread对串口1都做了啥特殊处理,它的这部分代码太多了,整理不明白。
自在随心
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 18:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表