完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
rt 5.2.2 版本,添加以太网功能后,仿真器烧录可以启动,但是手动上电启动失败,调试信息如下,
object->type = type | RT_Object_Class_Static; 这行代码执行卡死,这行上面的调试信息可以出来,这行下面的调试信息不出来,这行前面添加调试信息卡死位置不变。 发现卡死时,系统tick中断只进了一次, void SysTick_Handler(void) { /* enter interrupt */ rt_interrupt_enter(); rt_tick_increase(); /* leave interrupt */ rt_interrupt_leave(); #if 0 static uint16_t cnt; if(++cnt > 5000) { cnt = 0; rt_kprintf("\n+\n"); } #endif } 大神指导一下。 /* leave critical */ rt_spin_unlock_irqrestore(&(information->spinlock), level); #endif /* RT_DEBUGING_ASSERT */ rt_kprintf("%s %s L%d\n", __FILE__, __FUNCTION__, __LINE__); rt_kprintf("object:%p type:0x%x\n", object, type); rt_kprintf("%s %s L%d\n", __FILE__, __FUNCTION__, __LINE__); /* initialize object's parameters */ /* set object type to static */ object->type = type | RT_Object_Class_Static; rt_kprintf("%s %s L%d\n", __FILE__, __FUNCTION__, __LINE__); ../../../../src/scheduler_up.c rt_system_scheduler_start... do components initialization. initialize rti_board_end :0 done initialize rt_work_sys_workqueue_init ../../../../components/drivers/ipc/workqueue.c rt_work_sys_workqueue_init L474 ../../../../components/drivers/ipc/workqueue.c rt_workqueue_create L221 ../../../../components/drivers/ipc/workqueue.c rt_workqueue_create L224 ../../../../components/drivers/ipc/workqueue.c rt_workqueue_create L227 ../../../../components/drivers/ipc/workqueue.c rt_workqueue_create L230 ../../../../components/drivers/ipc/workqueue.c rt_workqueue_create L232 ../../../../src/ipc.c rt_sem_init L381 ../../../../src/ipc.c rt_sem_init L385 ../../../../src/ipc.c rt_sem_init L388 ../../../../src/ipc.c rt_sem_init L391 ../../../../src/object.c rt_object_init L364 ../../../../src/object.c rt_object_init L376 ../../../../src/object.c rt_object_init L380 ../../../../src/object.c rt_object_init L397 ../../../../src/object.c rt_object_init L404 object:0x20011444 type:0x2 ../../../../src/object.c rt_object_init L408 仿真器烧录后正常信息如下: thread pri status sp stack size max used left tick error tcb addr usage ---------- --- ------- ---------- ---------- ------ ---------- ------- ---------- ----- tshell 20 running 0x00000080 0x00001000 12% 0x00000009 OK 0x20004b68 N/A tidle0 31 ready 0x00000068 0x00000100 40% 0x0000001d OK 0x20000ddc N/A timer 4 suspend 0x00000078 0x00000200 23% 0x00000009 EINTRPT 0x2000064c N/A main 10 suspend 0x00000068 0x00000800 23% 0x0000000d EINTRPT 0x20001c28 N/A device type ref count ---------- -------------------- ---------- sdb Block Device 1 sda Block Device 1 norflash0 Block Device 0 spi10 SPI Device 0 spi1 SPI Bus 0 pin Pin Device 0 uart4 Character Device 0 uart3 Character Device 0 uart0 Character Device 2 |
|
相关推荐
1个回答
|
|
|
根据问题描述,使用GD32F527芯片,RT-Thread版本5.2.2,添加以太网功能后,通过仿真器烧录程序可以正常启动,但手动上电启动时卡死在`object->type = type | RT_Object_Class_Static;`这行代码。同时,系统tick中断只进入了一次。 首先,我们需要分析这个现象的可能原因: 1. **时钟初始化问题**:手动上电时,时钟可能没有正确初始化,导致系统运行速度异常。 2. **内存初始化问题**:手动上电时,内存(如SRAM)可能未完全准备好,导致数据访问错误。 3. **中断配置问题**:手动上电后,中断系统可能未正确配置,导致无法响应中断(如SysTick中断)。 4. **电源管理或复位问题**:手动上电的电源稳定性和复位电路可能影响启动。 5. **以太网驱动初始化问题**:添加以太网后,可能在初始化过程中有依赖关系或时序问题,导致手动上电时出现异常。 从调试信息看,卡死在对象初始化代码处,这通常是RT-Thread内核初始化阶段。具体位置在设置对象类型的地方,可能是在创建静态对象时。同时,SysTick中断只进入一次,说明系统时钟中断在第一次触发后,后续没有再次触发,可能是由于系统卡死导致中断无法继续,或者中断被禁用。 **可能的原因分析:** - **时钟问题**:手动上电时,系统时钟(如HXTAL)可能未稳定,导致后续操作(包括以太网PHY初始化)失败。而仿真器下载时,由于之前已经有过上电,时钟可能已经稳定。 - **堆栈溢出**:手动上电时,堆栈可能设置不当,导致在初始化过程中栈溢出,破坏了关键数据。 - **中断优先级问题**:SysTick中断可能被其他中断阻塞,或者中断优先级配置有误。 - **硬件初始化顺序**:以太网模块的初始化可能依赖于某些外设(如时钟、GPIO)的初始化,而这些在手动上电时没有正确完成。 **解决思路:** 1. **检查时钟配置**:确保在系统启动时,时钟树配置正确,特别是外部高速晶振(HXTAL)的启动时间是否足够,可以通过增加时钟稳定延时来解决。 2. **检查复位原因**:在启动时读取复位标志,确定手动上电时的复位原因(如电源复位、外部复位等),并针对性地处理。 3. **检查以太网PHY的复位**:以太网PHY芯片可能需要一个复位信号,并且复位后需要等待一段时间。在代码中,确保PHY复位引脚的操作和延时足够。 4. **调整初始化顺序**:将一些关键外设的初始化提前,或者将以太网初始化放到系统完全启动之后(例如,在`main`线程中初始化)。 5. **调试手段**:在卡死前增加更多的调试输出,或者使用LED闪烁来指示程序执行到哪个阶段,从而定位卡死的位置。 6. **检查内存区域**:确认堆和栈的大小设置是否合理,特别是在添加以太网后,系统资源消耗增加,可能需要调整栈大小。 **具体步骤:** ### 1. 增加时钟稳定延时 在系统时钟配置之后,增加一段延时,确保外部晶振稳定。例如,在`system_gd32f5xx.c`中的`system_clock_config`函数中,在使能外部晶振后,增加一个循环等待外部晶振就绪,并适当增加延时。 ```c /* enable HXTAL */ RCU_CTL |= RCU_CTL_HXTALEN; /* wait until HXTAL is stable or not */ while ((RCU_CTL & RCU_CTL_HXTALSTB) == 0) { } // 增加额外的延时 for (volatile int i = 0; i < 10000; i++); ``` ### 2. 检查以太网PHY复位 以太网PHY芯片通常有一个复位引脚,需要在初始化前进行复位操作,并保持一段时间的低电平,然后释放。在释放后,需要等待一段时间(例如100ms)让PHY芯片完成内部初始化。 在以太网驱动初始化代码中,确保复位操作正确且延时足够。例如: ```c /* PHY reset */ rt_pin_write(ETH_PHY_RST_PIN, PIN_LOW); rt_thread_mdelay(100); rt_pin_write(ETH_PHY_RST_PIN, PIN_HIGH); rt_thread_mdelay(100); // 等待PHY芯片启动 ``` ### 3. 调整初始化顺序 尝试将以太网初始化放在系统完全启动之后,例如在`main`线程中初始化,而不是在启动阶段(如在`rtthread_startup`的`components_init`中)。这样可以避免在系统初始化关键阶段出现阻塞。 ### 4. 检查堆栈大小 在`rtconfig.h`中,增加主栈大小(`HEAP`)和线程栈大小(特别是`main`线程栈)。添加以太网后,可能增加了栈的使用量。 ### 5. 使用调试工具 - 在卡死的位置前添加更多的日志输出,定位具体卡死的位置。 - 使用JTAG/SWD调试器在手动上电后连接,查看寄存器和堆栈信息,分析卡死的原因。 ### 6. 检查中断配置 在系统初始化时,确保中断优先级配置正确。SysTick中断优先级应该设置为最低,以避免被其他中断阻塞。在RT-Thread中,SysTick中断优先级在`rt_hw_board_init`中配置。 ### 7. 电源和复位电路检查 检查硬件设计,确保手动上电时电源稳定,复位信号正常。可以尝试在复位引脚上增加外部上拉电阻,或者增加电源稳定延时。 **代码修改示例:** 针对时钟初始化延时,可以在`system_clock_config`中增加延时。同时,在以太网驱动中增加PHY复位的延时。 另外,在RT-Thread的启动代码中,可以在`rtthread_startup`函数的不同阶段添加日志,观察启动过程。 ```c int rtthread_startup(void) { rt_hw_interrupt_disable(); /* board level initialization * NOTE: please initialize heap inside board initialization. */ rt_hw_board_init(); rt_kprintf("Board init done.n"); /* show RT-Thread version */ rt_show_version(); rt_kprintf("RT-Thread version shown.n"); /* timer system initialization */ rt_system_timer_init(); rt_kprintf("Timer init done.n"); /* scheduler system initialization */ rt_system_scheduler_init(); rt_kprintf("Scheduler init done.n"); /* create init_thread */ rt_application_init(); rt_kprintf("Application init done.n"); /* timer thread initialization */ rt_system_timer_thread_init(); rt_kprintf("Timer thread init done.n"); /* idle thread initialization */ rt_thread_idle_init(); rt_kprintf("Idle thread init done.n"); /* start scheduler */ rt_system_scheduler_start(); rt_kprintf("Scheduler started.n"); /* never reach here */ return 0; } ``` 通过以上日志,可以定位到在哪一步初始化后卡死。 **总结:** 手动上电启动失败而仿真器烧录后启动成功,通常与硬件初始化时序、电源稳定性、复位电路有关。重点检查时钟初始化、以太网PHY复位、堆栈大小以及初始化顺序。通过添加调试日志和适当增加延时,逐步定位问题。 针对GD32F527在添加以太网功能后,仿真器烧录可启动但手动上电卡死的问题,结合系统卡在 根本原因分析
解决方案及步骤1. 确保时钟稳定后再初始化以太网在 2. 完善以太网PHY复位与检测在PHY复位代码中增加硬件复位和状态检测: 3. 调整中断优先级在 4. 检查内存与堆栈配置
5. 关键排查手段
验证结果完成上述修改后:
通过以上步骤,可解决手动上电卡死问题,确保以太网功能稳定运行。 |
|
|
|
|
只有小组成员才能发言,加入小组>>
184个成员聚集在这个小组
加入小组rtstudio是否可像keil加载ini解决虚拟串口与mcu串口通讯?
1211 浏览 0 评论
【Vision Board创客营连载体验】基于RA8D1-Vision Board的自动路径规划小车
1775 浏览 1 评论
【Vision Board创客营连载体验】基于Vision Board的垃圾分类
2156 浏览 0 评论
【Vision Board创客营连载体验】使用 Vision Board 做一个 UVC Camera
1777 浏览 0 评论
【Vision Board创客营连载体验】TinyMaix进行手写数字识别
2004 浏览 0 评论
1461浏览 5评论
在RT-Thread Studio中新建的stm32f407-atk-explorer工程运行qemu失败,是什么原因引起的?
1764浏览 3评论
为什么rt_device_read()只能读取到两个字节数据?
358浏览 3评论
连得上热点,但是ping baidu.com出现timeout,请问跟什么有关?
418浏览 3评论
412浏览 2评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 10:02 , Processed in 0.719535 second(s), Total 77, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
752
