Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
一个不知是什么问题导致的系统溃了!
发布于 2012-12-25 15:31:18 浏览:4406
订阅该版
正常运行的时候,动态线程的状态情况如图注意那个地址。。图一的地址是出现问题后的地址。 系统崩溃前: 动态线 phytid 指针 0x68000D8C 系统崩溃后: 动态线 phytid 指针 0x68000D8C phytid指针指向地址没改变, 只是phytid指针结构体数据乱了 但是在这个 0x68000C42 地址中找到了 phytid 结构体数据, 初步判断数据是正确的. 结论: phytid 结构体数据从 0x68000D8C 被搬移到 0x68000C42 全局变量 rt_thread_t phytid;原地址应该是0x68000d8c ![11.jpg](/uploads/3459_4e698b452659260e53f071aa43bc5afd.jpg) 系统崩溃后,动态线程的状态情况如图 ![2-命名工程.png](/uploads/5191_9848c0fc7118f82a9baf5e046cfdb0f8.png) 但是之后我看了一下MEMROY里面的数据。我发现我动态线程的状态数据保存到了另一个地址里面跟原来的地址不一样如图三。 ![3-选择模板.png](/uploads/5191_dfd114e10225b873782d51cd9ab0946d.png) 。状态都还是 还跟原来是一样的比如原来是在0x68000d8c如图1,线程状态保存到了0x68000c42如图2,但是我的动态线程指针还是指向0x68000d8c所以系统崩溃了 崩溃 ![4-主界面.png](/uploads/5191_b889c0f9aea41120f85a29db52674307.png) 这个是长时间运行之后才出现的问题。。已经运行了一天半了。。不是一时半会就出现的问题。。 系统就是一直从网络上面接收shoutcast电台的数据。。电台是我自己建的。。就是局域网内 工程是 ealtouch-stm32f4-master应该是9月3号那个版本 RTT版本为1.10自己下载的 MDK是4。23的 JLINK驱动4.36l SRAM配置以下IS61WV102416BLL 主芯片stm32f407 网络芯片DP83848 MP3解码芯片VS1003 ``` void ext_sram_init(void) { FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure; FSMC_NORSRAMTimingInitTypeDef Timing_read,Timing_write; FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &Timing_read; FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &Timing_write; FSMC_NORSRAMStructInit(&FSMC_NORSRAMInitStructure); /*--------------------- read timings configuration ---------------------*/ Timing_read.FSMC_AddressSetupTime = 2; /* [3:0] F2/F4 1~15 HCLK */ Timing_read.FSMC_AddressHoldTime = 0; /* [7:4] keep 0x00 in SRAM mode */ Timing_read.FSMC_DataSetupTime = 3; /* [15:8] F2/F4 0~255 HCLK */ /* [19:16] Time between NEx high to NEx low (BUSTURN HCLK) */ Timing_read.FSMC_BusTurnAroundDuration = 1; Timing_read.FSMC_CLKDivision = 0; /* [24:20] keep 0x00 in SRAM mode */ Timing_read.FSMC_DataLatency = 0; /* [27:25] keep 0x00 in SRAM mode */ Timing_read.FSMC_AccessMode = FSMC_AccessMode_A; /*--------------------- write timings configuration ---------------------*/ Timing_write.FSMC_AddressSetupTime = 2; /* [3:0] F2/F4 1~15 HCLK */ Timing_write.FSMC_AddressHoldTime = 0; /* [7:4] keep 0x00 in SRAM mode */ Timing_write.FSMC_DataSetupTime = 3; /* [15:8] F2/F4 0~255 HCLK */ /* [19:16] Time between NEx high to NEx low (BUSTURN HCLK) */ Timing_write.FSMC_BusTurnAroundDuration = 1; Timing_write.FSMC_CLKDivision = 0; /* [24:20] keep 0x00 in SRAM mode */ Timing_write.FSMC_DataLatency = 0; /* [27:25] keep 0x00 in SRAM mode */ Timing_write.FSMC_AccessMode = FSMC_AccessMode_A; /* FSMC 访问模式 */ /* Reset NOR/SRAM Init structure parameters values */ // FSMC_NORSRAMInitStruct->FSMC_Bank = FSMC_Bank1_NORSRAM1; // FSMC_NORSRAMInitStruct->FSMC_DataAddressMux = FSMC_DataAddressMux_Enable; // FSMC_NORSRAMInitStruct->FSMC_MemoryType = FSMC_MemoryType_SRAM; // FSMC_NORSRAMInitStruct->FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b; // FSMC_NORSRAMInitStruct->FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; // FSMC_NORSRAMInitStruct->FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable; // FSMC_NORSRAMInitStruct->FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; // FSMC_NORSRAMInitStruct->FSMC_WrapMode = FSMC_WrapMode_Disable; // FSMC_NORSRAMInitStruct->FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; // FSMC_NORSRAMInitStruct->FSMC_WriteOperation = FSMC_WriteOperation_Enable; // FSMC_NORSRAMInitStruct->FSMC_WaitSignal = FSMC_WaitSignal_Enable; // FSMC_NORSRAMInitStruct->FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; // FSMC_NORSRAMInitStruct->FSMC_WriteBurst = FSMC_WriteBurst_Disable; /*-------------------------- SRAM configuration --------------------------*/ FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM; FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable; FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable; FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable; FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; /*------------------------------ SRAM init ------------------------------*/ FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM3; FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); FSMC_NORSRAMCmd(FSMC_NORSRAMInitStructure.FSMC_Bank, ENABLE); } { phytid = rt_thread_create("phy", phy_monitor_thread_entry, RT_NULL, 512, RT_THREAD_PRIORITY_MAX - 2, 2); if (phytid != RT_NULL) rt_thread_startup(phytid); } /* PHY: LAN8720 */ static uint8_t phy_speed = 0; #define PHY_LINK_MASK (1<<0) #define PHY_100M_MASK (1<<1) #define PHY_DUPLEX_MASK (1<<2) static void phy_monitor_thread_entry(void *parameter) { uint8_t phy_addr = 0xFF; uint8_t phy_speed_new = 0; uint16_t status; uint16_t SR; /* phy search */ { rt_uint32_t i; rt_uint16_t temp; for(i=0; i<=0x1F; i++) { temp = ETH_ReadPHYRegister(i, 0x02); if( temp != 0xFFFF ) { phy_addr = i; break; } } } /* phy search */ if(phy_addr == 0xFF) { STM32_ETH_PRINTF("phy not probe! "); return; } else { STM32_ETH_PRINTF("found a phy, address:0x%02X ", phy_addr); } /* RESET PHY */ STM32_ETH_PRINTF("RESET PHY! "); ETH_WritePHYRegister(phy_addr, PHY_BCR, PHY_Reset); rt_thread_delay(RT_TICK_PER_SECOND * 2); ETH_WritePHYRegister(phy_addr, PHY_BCR, PHY_AutoNegotiation); while(1) { status = ETH_ReadPHYRegister(phy_addr, PHY_BSR); STM32_ETH_PRINTF("LAN8720 status:0x%04X ", status); phy_speed_new = 0; if(status & (PHY_AutoNego_Complete | PHY_Linked_Status)) { SR = ETH_ReadPHYRegister(phy_addr, 31); STM32_ETH_PRINTF("LAN8720 REG 31:0x%04X ", SR); SR = (SR >> 2) & 0x07; /* LAN8720, REG31[4:2], Speed Indication. */ phy_speed_new = PHY_LINK_MASK; if((SR & 0x03) == 2) { phy_speed_new |= PHY_100M_MASK; } if(SR & 0x04) { phy_speed_new |= PHY_DUPLEX_MASK; } } /* linkchange */ if(phy_speed_new != phy_speed) { if(phy_speed_new & PHY_LINK_MASK) { STM32_ETH_PRINTF("link up "); if(phy_speed_new & PHY_100M_MASK) { STM32_ETH_PRINTF("100Mbps"); stm32_eth_device.ETH_Speed = ETH_Speed_100M; } else { stm32_eth_device.ETH_Speed = ETH_Speed_10M; STM32_ETH_PRINTF("10Mbps"); } if(phy_speed_new & PHY_DUPLEX_MASK) { STM32_ETH_PRINTF(" full-duplex "); stm32_eth_device.ETH_Mode = ETH_Mode_FullDuplex; } else { STM32_ETH_PRINTF(" half-duplex "); stm32_eth_device.ETH_Mode = ETH_Mode_HalfDuplex; } rt_stm32_eth_init((rt_device_t)&stm32_eth_device); /* send link up. */ eth_device_linkchange(&stm32_eth_device.parent, RT_TRUE); } /* link up. */ else { STM32_ETH_PRINTF("link down "); /* send link down. */ eth_device_linkchange(&stm32_eth_device.parent, RT_FALSE); } /* link down. */ phy_speed = phy_speed_new; } /* linkchange */ rt_thread_delay(RT_TICK_PER_SECOND); } /* while(1) */ } ``` ![22.jpg](https://oss-club.rt-thread.org/uploads/3459_7d211c12bca0d9eba131b7dc782bbf4b.jpg) ![33.jpg](https://oss-club.rt-thread.org/uploads/3459_79ac68eaa2339095e07de000788407f2.jpg) ![44.jpg](https://oss-club.rt-thread.org/uploads/3459_4cb93836ce8fe24e9058cbdec5383774.jpg)
查看更多
7
个回答
默认排序
按发布时间排序
aozima
2012-12-25
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
``` finsh>>int * p finsh>>p = 0x68000d8c finsh>>*p ``` map文件里面标示 phytid 到底在哪个位置?
aozima
2012-12-25
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
>SDRAM配置以下IS61WV102416BLL --- 哪来的SDRAM?
prife
2012-12-25
这家伙很懒,什么也没写!
``` { phytid = rt_thread_create("phy", phy_monitor_thread_entry, RT_NULL, 512, RT_THREAD_PRIORITY_MAX - 2, 2); if (phytid != RT_NULL) rt_thread_startup(phytid); } ``` phytid这个变量的值只在这里引用了么? 如果phytid变量只在这里引用了,其他地方都没引用,那么现在的情况来看就是说phytid的值在修改了。那么原因多半是内存越界错误,即内存越界导致pyhtid的值被覆盖掉了。
lloongo
2012-12-25
这家伙很懒,什么也没写!
>``` > >{ >phytid = rt_thread_create("phy", > phy_monitor_thread_entry, > RT_NULL, > 512, > RT_THREAD_PRIORITY_MAX - 2, > 2); >if (phytid != RT_NULL) > rt_thread_startup(phytid); >} > >``` > > > >phytid这个变量的值只在这里引用了么? --- phytid 0x20000048 Data 4 stm32f4xx_eth.o(.data) 是这变量只是在这里引用一次。在系统开始运行初始化网卡设置的时候。这个线程是检测网口热拨插的.
lloongo
2012-12-25
这家伙很懒,什么也没写!
>``` > >finsh>>int * p >finsh>>p = 0x68000d8c >finsh>>*p > >``` > > > >map文件里面标示 phytid 到底在哪个位置? --- phytid 0x20000048 Data 4 stm32f4xx_eth.o(.data) 这个只是在初始化网口的时候使用一次。建立一个检测网口拨插情况的线程结构指针,因为系统已经崩溃。已无法使用 FINSH
aozima
2012-12-25
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
>phytid 0x20000048 Data 4 stm32f4xx_eth.o(.data) --- 1. 对0x20000048下写断点 2. 在memory窗口输入0x20000048 查看。 不过你已说过确认没有写穿,那就只能祈祷了。
撰写答案
登录
注册新账号
关注者
0
被浏览
4.4k
关于作者
lloongo
这家伙很懒,什么也没写!
提问
11
回答
43
被采纳
0
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
rt-thread 小内存算法源码分析
2
env中添加lvgl软件包后,keil编译包--c99错误
3
【NXP-MCXA153】 定时器驱动移植
4
GD32F450 看门狗驱动适配
5
【NXP-MCXA153】看门狗驱动移植
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
freemodbus
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
keil_MDK
msh
ulog
C++_cpp
MicroPython
本月问答贡献
踩姑娘的小蘑菇
7
个答案
2
次被采纳
a1012112796
18
个答案
1
次被采纳
红枫
5
个答案
1
次被采纳
Ryan_CW
5
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
本月文章贡献
YZRD
3
篇文章
6
次点赞
catcatbing
3
篇文章
6
次点赞
lizimu
2
篇文章
11
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部