sunchao151 发表于 2012-2-29 17:38:58

出现硬件错误:hard fault on thread: menu ???

不使用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
threadpristatus      sp   stack size max used   left tickerror
-------- ---- ------- ---------- ---------- ---------- ---------- ---
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_trow_now = start_row;
        uint8_tcol_now = start_col;
        uint32_t pos = 0;

        while(*str != '\0')
        {
                if (*str < 0x80)                //ascii
                {
                        ASCII8x16.Index = *str;
                        pos = (ASCII8x16.Index - 0x20)*ASCII8x16_SIZE;
                        for (i = 0; i < 16; i++)
                                ASCII8x16.Msk = ascii8x16_font;
                        lcd_dis_ascii_8x16(row_now, col_now, ASCII8x16.Msk, reserve);
                        col_now += 8;                                          
                }
                else                                          //汉字
                {
                        //GB2312区位码占两个字节,取其区位号
                        HZ12x16.Index = *str - 0xa0;
                        str++;            
                        HZ12x16.Index = *str - 0xa0;                  
                        pos = (94*(HZ12x16.Index - 1) + (HZ12x16.Index - 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;
                        lcd_dis_hz_12x16(row_now, col_now, HZ12x16.Msk, reserve);
                        col_now += 12;
                        pos += 24;
                }
                str++;
        }
}   

不知道为什么总是缩进不成,所以截图如下
http://cache.amobbs.com/bbs_upload782111/files_52/ourdev_723136GBWR3L.jpg
函数 lcd_print_Nx16 (原文件名:212121.jpg)


//菜单显示更新函数
void UpdataDisplayMenuPanel(void)
{
        uint8_t i, DisplayLenCount;
       
        MenuItemStruct *p = RT_NULL;

        p = (MenuItemStruct *)rt_malloc(sizeof(MenuItemStruct));

        lcd_clear_all();
        p = MenuPanel.MenuPanelItem + Menu_State.Description;                                               //当前面板说明项
        menu_item_print(0+MenuItemDisplayStartRow, MenuItemDisplayStartCol, p->MenuTxt,0);
        p = MenuPanel.MenuPanelItem + Menu_State.ItemStartDisplay;                                      //本级菜单在屏第一行显示的条目
        DisplayLenCount = MenuPanel.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.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();
}

懂的大侠帮我分析下。谢谢

tiancaigao7 发表于 2012-2-29 19:27:58

楼上,请教一下,你在RTT上实现过USB虚拟U盘的功能吗?我是用官网提供的大容量存储的例子和RTT网络收音机里面的相关例子都遇到了问题,就是裸奔的情况下没有问题,但是一旦编程一个线程移植进入RTT后,PC端会有U盘的提示,但是双击会提示插入磁盘,并不能正常访问SD卡。我的SD卡驱动用的也是RTT里面提供的sdcard,硬件是SDIO。如果你做过类似的应用,希望能帮忙指导一下可能是哪里出了问题?

sunchao151 发表于 2012-2-29 20:38:25

回复【1楼】tiancaigao7天才杨威利
-----------------------------------------------------------------------

我现在还没有实现U盘呢,只是回调函数里面反映检测到device,并且打开,但这样就出现上述说的问题了
虚拟U盘还得挂载文件系统,这部分还没结果呢,呵呵。
我现在想把4M的spi flash分成两U盘和一部分做字节读写的功能。

解决掉上述问题,估计做成功虚拟U盘还得继续努力,还得请教大家呢,共同进步吧。方便加我QQ吗,我刚接触RTT,
对RTT不是熟悉,以后可以讨论吧。QQ:277193773

sunchao151 发表于 2012-3-1 10:44:14

来人啊,自己顶下
页: [1]
查看完整版本: 出现硬件错误:hard fault on thread: menu ???