RT-Thread论坛
直播中

王兰

13年用户 1636经验值
擅长:基础元器件
私信 关注
[问答]

使用rt_thread_mdelay函数后出现hardfault的原因?

问题:在一个线程中共有前后2部分使用rt_thread_mdelay()进行延时等待,前面部分延时是正常的,后面部分进入rt_thread_mdelay()函数后立马打印hardfault错误,定位了一下错误点是到rt_thread_mdelay()中的_timer_start()函数中卡死。

// 线程中第一部分使用的延时,没有错误
hw_ethernet_write(send_buf, sizeof(send_buf));
while(recv_ack_flag != 1 )
{
    rt_thread_delay(1000);
    rt_kprintf("wait !! \r\n");
}
// 线程中第二部分使用的延时,进入while循环立马报错
hw_ethernet_write(send_buf, sizeof(send_buf));
while(recv_ack_flag != 1 )
{
    rt_thread_mdelay(1000);
    rt_kprintf("wait 2 !! \r\n");
}
QQ截图20240716164601.png
有趣的点是:当我减小send_buf大小值的时候,线程中第二部分延时也不报错,试了send_buf数组大小为700的时候不报错,当send_buf大小为1000的时候就开始报上述错误。
hw_ethernet_write函数是通过lwip协议栈中的socket进行通信,实际使用send函数进行封装。

回帖(1)

肖耳朵

2024-7-16 17:39:20
根据您提供的信息,我将尝试分析可能导致hardfault的原因。请注意,这只是一个分析,实际问题可能需要更详细的调试信息。

1. 首先,检查您的硬件和固件是否与RT-Thread兼容。确保您的开发板和固件版本支持RT-Thread。

2. 确保您的代码没有内存泄漏或栈溢出。这可能导致hardfault。您可以使用RT-Thread的内存检测功能来检查内存使用情况。

3. 检查您的代码中是否有死锁。死锁可能导致线程无法继续执行,从而导致hardfault。检查您的代码,确保没有循环等待或资源竞争。

4. 检查您的代码中是否有递归调用。递归调用可能导致栈溢出,从而导致hardfault。

5. 检查您的代码中是否有未初始化的变量或指针。这可能导致访问无效的内存地址,从而导致hardfault。

6. 检查您的代码中是否有错误的中断处理。错误的中断处理可能导致硬故障。

7. 检查您的代码中是否有错误的时钟配置。错误的时钟配置可能导致定时器异常,从而导致hardfault。

8. 检查您的代码中是否有错误的系统调用。错误的系统调用可能导致内核错误,从而导致hardfault。

9. 检查您的代码中是否有错误的硬件操作。错误的硬件操作可能导致硬件异常,从而导致hardfault。

10. 如果以上检查都没有问题,您可以尝试使用RT-Thread的调试工具(如RT-Thread Studio)来获取更详细的错误信息,以便更好地定位问题。

总之,要解决这个问题,您需要仔细检查您的代码和硬件设置,确保没有错误或不兼容的地方。希望这些建议能帮助您找到问题的原因。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分