Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
出现硬件错误:hard fault on thread: menu ???
发布于 2012-03-01 09:34:15 浏览:5993
订阅该版
不使用USB-OTG,菜单是正常的。 当做device时,连接USB线,电脑能检测出BULK设备,菜单正常 当做HOST时,插入U盘,也能够检测到并打开U盘。就出现如下错误提示: ```psr: 0x21000000 pc: 0x000035cc lr: 0x000035d5 r12: 0x007ffff0 r03: 0x00000008 r02: 0x00000004 r01: 0x00000004 r00: 0x40024000 hard fault on thread: menu thread pri status sp stack size max used left tick error -------- ---- ------- ---------- ---------- ---------- ---------- --- menu 0x12 ready 0x000000e0 0x00000200 0x000000e0 0x00000001 000 key 0x10 suspend 0x00000058 0x00000200 0x00000058 0x00000014 000 usb 0x1e ready 0x00000178 0x00000200 0x00000178 0x0000000a 000 tcpip 0x0c suspend 0x000000ac 0x00000400 0x00000108 0x00000014 000 tidle 0x1f ready 0x00000040 0x00000100 0x00000050 0x00000005 000 tshell 0x14 suspend 0x00000070 0x00000800 0x00000070 0x0000000a 000 etx 0x0f suspend 0x0000007c 0x00000200 0x0000008c 0x00000010 000 erx 0x0f suspend 0x0000007c 0x00000200 0x0000007c 0x00000010 000``` 其中里面出错的地方相关程序如下: ```void lcd_print_Nx16(uint8_t start_row, uint8_t start_col, uint8_t *str, uint8_t reserve) { uint16_t i; uint8_t row_now = start_row; uint8_t col_now = start_col; uint32_t pos = 0; while(*str != ' ') { if (*str < 0x80) //ascii { ASCII8x16.Index = *str; pos = (ASCII8x16.Index - 0x20)*ASCII8x16_SIZE; for (i = 0; i < 16; i++) ASCII8x16.Msk* = ascii8x16_font[pos+i]; lcd_dis_ascii_8x16(row_now, col_now, ASCII8x16.Msk, reserve); col_now += 8; } else //汉字 { //GB2312区位码占两个字节,取其区位号 HZ12x16.Index[0] = *str - 0xa0; str++; HZ12x16.Index[1] = *str - 0xa0; pos = (94*(HZ12x16.Index[0] - 1) + (HZ12x16.Index[1] - 1))*HZ12_SIZE; //得到该汉字保存地址位置 // W25XX_Read(GB_12_Addr, (uint8_t *)GB_12.Msk, HZ12_SIZE); for (i = 0; i < 24; i++) HZ12x16.Msk* = hzk12_font[pos+i]; lcd_dis_hz_12x16(row_now, col_now, HZ12x16.Msk, reserve); col_now += 12; pos += 24; } str++; } } //菜单显示更新函数 void UpdataDisplayMenuPanel(void) { uint8_t i, DisplayLenCount; MenuItemStruct *p = RT_NULL; p = (MenuItemStruct *)rt_malloc(sizeof(MenuItemStruct)); lcd_clear_all(); p = MenuPanel[Menu_State.CurrentPanel].MenuPanelItem + Menu_State.Description; //当前面板说明项 menu_item_print(0+MenuItemDisplayStartRow, MenuItemDisplayStartCol, p->MenuTxt,0); p = MenuPanel[Menu_State.CurrentPanel].MenuPanelItem + Menu_State.ItemStartDisplay; //本级菜单在屏第一行显示的条目 DisplayLenCount = MenuPanel[Menu_State.CurrentPanel].MenuItemCount - Menu_State.ItemStartDisplay + 1;//判断本级菜单是否到底 if (DisplayLenCount > ScreenHLine) { DisplayLenCount = ScreenHLine; } for (i = 1; i < DisplayLenCount; i++) //从第1行开始,第0行固定显示面板说明Description { if (i == Menu_State.FocusLine) { //光标所在行菜单项显示,可以自定义反白显示等 UpdataDisplayMenuFocus(i, p->MenuTxt); } else { menu_item_print(i+MenuItemDisplayStartRow, MenuItemDisplayStartCol, p->MenuTxt, 0); } // p++; p = MenuPanel[Menu_State.CurrentPanel].MenuPanelItem + Menu_State.ItemStartDisplay + i; } rt_free(p); }``` pc指针指向 函数lcd_print_Nx16 里面的 str++ lr指向的是 函数UpdataDisplayMenuPanel 里面的 UpdataDisplayMenuFocus(i, p->MenuTxt); 线程“menu”是动态线程 可能是内存溢出了吧?调试的时候,观察str的值在出错时是0xC001FB98。内存使用的是SDRAM 0x60000000 --- 0x607FFFFF 如果是内在溢出,不明白如何修改。会不会和USB程序有关,USB程序主要是用的LM3S9D92的例程改的。还加了一个USB0中断服务程序:如下 ```IMPORT rt_hw_usb_otg_handler DCD rt_hw_usb_otg_handler ; USB0 void rt_hw_usb_otg_handler(void) { extern void USB0OTGModeIntHandler(void); /* enter interrupt */ rt_interrupt_enter(); /* luminary ethernet interface */ USB0OTGModeIntHandler(); /* leave interrupt */ rt_interrupt_leave(); }``` 懂的大侠帮我分析下。谢谢
查看更多
8
个回答
默认排序
按发布时间排序
bernard
2012-03-01
这家伙很懒,什么也没写!
既然是str,那么就多加些打印输出。因为它是函数参数,从函数入口就开始进行输出log,应该能够很快就定位了。
xiao苦
2012-03-01
这家伙很懒,什么也没写!
时间不错,加长时间,或者稍微提高下优先级试试看
sunchao151
2012-03-01
这家伙很懒,什么也没写!
//菜单显示更新函数 ``` void UpdataDisplayMenuPanel(void) { uint8_t i, DisplayLenCount; MenuItemStruct *p = RT_NULL; p = (MenuItemStruct *)rt_malloc(sizeof(MenuItemStruct)); lcd_clear_all(); p = MenuPanel[Menu_State.CurrentPanel].MenuPanelItem + Menu_State.Description; //当前面板说明项 menu_item_print(0+MenuItemDisplayStartRow, MenuItemDisplayStartCol, p->MenuTxt,0); p = MenuPanel[Menu_State.CurrentPanel].MenuPanelItem + Menu_State.ItemStartDisplay; //本级菜单在屏第一行显示的条目 DisplayLenCount = MenuPanel[Menu_State.CurrentPanel].MenuItemCount - Menu_State.ItemStartDisplay + 1;//判断本级菜单是否到底 if (DisplayLenCount > ScreenHLine) { DisplayLenCount = ScreenHLine; } for (i = 1; i < DisplayLenCount; i++) //从第1行开始,第0行固定显示面板说明Description { if (i == Menu_State.FocusLine) { //光标所在行菜单项显示,可以自定义反白显示等 DEBUG_PRINT("The Current Menu is : "); DEBUG_PRINT((char *)p->MenuTxt); DEBUG_PRINT(" "); UpdataDisplayMenuFocus(i, p->MenuTxt); } else { //光标所在行菜单项显示,可以自定义反白显示等 DEBUG_PRINT("The Current Menu is : "); DEBUG_PRINT((char *)p->MenuTxt); DEBUG_PRINT(" "); menu_item_print(i+MenuItemDisplayStartRow, MenuItemDisplayStartCol, p->MenuTxt, 0); } // p++; p = MenuPanel[Menu_State.CurrentPanel].MenuPanelItem + Menu_State.ItemStartDisplay + i; } rt_free(p); } 再现错误 Host Mode. MSCCallback ulEvent=1 The Current Menu is : ??.???§???í The Current Menu is : psr: 0x21000000 pc: 0x0000ae40 lr: 0x0000ae79 r12: 0x007ffff0 r03: 0x60003b1c r02: 0xc00181e2 r01: 0x00000080 r00: 0x20002a10 hard fault on thread: menu thread pri status sp stack size max used left tick error -------- ---- ------- ---------- ---------- ---------- ---------- --- menu 0x12 ready 0x00000080 0x00000200 0x000000b0 0x00000002 000 key 0x10 suspend 0x00000058 0x00000200 0x00000058 0x00000014 000 usb 0x1e ready 0x00000178 0x00000200 0x00000178 0x0000000a 000 tcpip 0x0c suspend 0x000000ac 0x00000400 0x00000108 0x00000014 000 tidle 0x1f ready 0x00000050 0x00000100 0x00000050 0x00000016 000 tshell 0x14 suspend 0x00000070 0x00000800 0x00000078 0x0000000a 000 etx 0x0f suspend 0x0000007c 0x00000200 0x0000008c 0x00000010 000 erx 0x0f suspend 0x0000007c 0x00000200 0x0000007c 0x00000010 000 ``` 问题发生在 ``` if (i == Menu_State.FocusLine) { //光标所在行菜单项显示,可以自定义反白显示等 DEBUG_PRINT("The Current Menu is : "); DEBUG_PRINT((char *)p->MenuTxt); (这行就出现问题了。) DEBUG_PRINT(" "); UpdataDisplayMenuFocus(i, p->MenuTxt); } ``` 不解
bernard
2012-03-01
这家伙很懒,什么也没写!
lz下次加code标识符,这样代码比较清晰。 这类代码,自己加log或断点进行分析就好了,这些代码都是你的,别人能给出多少分析呢?!
aozima
2012-03-01
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
``` MenuItemStruct *p = RT_NULL; p = (MenuItemStruct *)rt_malloc(sizeof(MenuItemStruct)); lcd_clear_all(); p = MenuPanel[Menu_State.CurrentPanel].MenuPanelItem + Menu_State.Description; ``` 1. p申请了空间但没做检查,可能没申请成功。。 2. 不必要检查了,因为后面直接改了p,成不成功没意义了。但如果申请成功,这块内存就泄露了。
bernard
2012-03-01
这家伙很懒,什么也没写!
>``` > MenuItemStruct *p = RT_NULL; > > p = (MenuItemStruct *)rt_malloc(sizeof(MenuItemStruct)); > > lcd_clear_all(); > p = MenuPanel[Menu_State.CurrentPanel].MenuPanelItem + Menu_State.Description; >``` > > >1. p申请了空间但没做检查,可能没申请成功。。 >2. 不必要检查了,因为后面直接改了p,成不成功没意义了。但如果申请成功,这块内存就泄露了。 --- 而且后面更改指针后还去做free,这种代码不死才有问题呢。
sunchao151
2012-03-01
这家伙很懒,什么也没写!
原来程序是在51上跑的,现在想使用RTT,所以直接移过来的。原来程序是如下 ``` //菜单显示更新函数 void UpdataDisplayMenuPanel(void) { uint8_t i, DisplayLenCount; MenuItemStruct *p ; lcd_clear_all(); p = MenuPanel[Menu_State.CurrentPanel].MenuPanelItem + Menu_State.Description; //当前面板说明项 menu_item_print(0+MenuItemDisplayStartRow, MenuItemDisplayStartCol, p->MenuTxt,0); p = MenuPanel[Menu_State.CurrentPanel].MenuPanelItem + Menu_State.ItemStartDisplay; //本级菜单在屏第一行显示的条目 DisplayLenCount = MenuPanel[Menu_State.CurrentPanel].MenuItemCount - Menu_State.ItemStartDisplay + 1;//判断本级菜单是否到底 if (DisplayLenCount > ScreenHLine) { DisplayLenCount = ScreenHLine; } for (i = 1; i < DisplayLenCount; i++) //从第1行开始,第0行固定显示面板说明Description { if (i == Menu_State.FocusLine) { UpdataDisplayMenuFocus(i, p->MenuTxt); } else { menu_item_print(i+MenuItemDisplayStartRow, MenuItemDisplayStartCol, p->MenuTxt, 0); } p++; } } ``` 加了检查: ``` if (p == RT_NULL) { rt_kprintf("out of memory "); } ``` 而且在出错前进入此函数时,分配内在是成功的。 现在在程序出错前里面加了几句打印rt_kprintf,反而PC指针出错时指向了rt_kprintf
撰写答案
登录
注册新账号
关注者
0
被浏览
6k
关于作者
sunchao151
这家伙很懒,什么也没写!
提问
5
回答
4
被采纳
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 2024开发者大会议程正式发布!
2
【24嵌入式设计大赛】基于RT-Thread星火一号的智慧家居系统
3
RT-Thread EtherKit开源以太网硬件正式发布
4
如何在master上的BSP中添加配置yml文件
5
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
热门标签
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
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
a1012112796
20
个答案
3
次被采纳
张世争
11
个答案
3
次被采纳
踩姑娘的小蘑菇
7
个答案
3
次被采纳
rv666
9
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
RTT_逍遥
1
篇文章
6
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部