搜索
bottom↓
回复: 3

rt-thread hard fault 总是指向同一个地方,但不知道错在哪

[复制链接]

出0入8汤圆

发表于 2012-2-28 08:47:34 | 显示全部楼层 |阅读模式
rt_err_t CopyToDecoderBuf(u8 *pData)
{
        static u8 i;
//        RT_ASSERT(pWriteEncodeData->Ready == 0);//decoder没有缓冲区了
        rt_mutex_take(EncodeDataBuffermutex,RT_WAITING_FOREVER);
        if(pWriteEncodeData->Ready != 0 )           //老是有hard falut 指向这里
        {       
                rt_mutex_release(EncodeDataBuffermutex);
                rt_kprintf("缓冲区没有空的\r\n");
               
                return RT_ERROR;
        }
        for(i=0;i<20;i++)pWriteEncodeData->Data=*pData++;
        pWriteEncodeData->Ready=1;
        pWriteEncodeData=pWriteEncodeData->next;
       
        rt_mutex_release(EncodeDataBuffermutex);
       
//        rt_kprintf("Got a new voice data\r\n");
       
        return RT_EOK;
}
------------------------------------------------------------------

   205: rt_err_t CopyToDecoderBuf(u8 *pData)
0x08017668 BD10      POP      {r4,pc}
0x0801766A 4A5C      LDR      r2,[pc,#368]  ; @0x080177DC
0x0801766C 23BB      MOVS     r3,#0xBB
0x0801766E 329D      ADDS     r2,r2,#0x9D
0x08017670 A16E      ADR      r1,{pc}+4  ; @0x0801782C
0x08017672 A05E      ADR      r0,{pc}+2  ; @0x080177EC
0x08017674 F7EBFCEB  BL.W     rt_kprintf (0x0800304E)
0x08017678 E7FE      B        0x08017678
   206: {
   207:         static u8 i;
   208: //      RT_ASSERT(pWriteEncodeData->Ready == 0);//decoder没有缓冲区了
0x0801767A B570      PUSH     {r4-r6,lr}
   209:         rt_mutex_take(EncodeDataBuffermutex,RT_WAITING_FOREVER);
0x0801767C 4C69      LDR      r4,[pc,#420]  ; @0x08017824
0x0801767E 4605      MOV      r5,r0
0x08017680 F04F31FF  MOV      r1,#0xFFFFFFFF
0x08017684 69A0      LDR      r0,[r4,#0x18]
0x08017686 F7EAFAEA  BL.W     rt_mutex_take (0x08001C5E)
   210:         if(pWriteEncodeData->Ready != 0 )         //老是有hard falut 指向这里 在汇编中指向读取Ready的值
   211:         {        
0x0801768A 6960      LDR      r0,[r4,#0x14]
0x0801768C 7801      LDRB     r1,[r0,#0x00]
0x0801768E B139      CBZ      r1,0x080176A0
   212:                 rt_mutex_release(EncodeDataBuffermutex);
0x08017690 69A0      LDR      r0,[r4,#0x18]
0x08017692 F7EAFBAC  BL.W     rt_mutex_release (0x08001DEE)
   213:                 rt_kprintf("缓冲区没有空的\r\n");
   214:                  
0x08017696 A086      ADR      r0,{pc}+2  ; @0x080178B0
0x08017698 F7EBFCD9  BL.W     rt_kprintf (0x0800304E)
   215:                 return RT_ERROR;
   216:         }
   217:         for(i=0;i<20;i++)pWriteEncodeData->Data=*pData++;
   218:         pWriteEncodeData->Ready=1;
   219:         pWriteEncodeData=pWriteEncodeData->next;
   220:         
   221:         rt_mutex_release(EncodeDataBuffermutex);
   222:         
   223: //      rt_kprintf("Got a new voice data\r\n");
   224:         
   225:         return RT_EOK;
0x0801769C 2001      MOVS     r0,#0x01
   226: }

rtt 给出的信息
psr: 0x41000000
pc: 0x0801768c
lr: 0x08001dcf
r12: 0x00000000
r03: 0xffffffff
r02: 0x6c00966c
r01: 0x00000000
r00: 0xa00ab8e0
hard fault on thread: USART1R

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入8汤圆

 楼主| 发表于 2012-2-28 08:54:07 | 显示全部楼层
我在读出数据时也是使用了互斥量,按理说应该不会出现读写冲突的。

有时一直不出现hard fault

出0入0汤圆

发表于 2012-2-28 21:21:12 | 显示全部楼层
0x0801768A 6960      LDR      r0,[r4,#0x14]
0x0801768C 7801      LDRB     r1,[r0,#0x00]

空指针检查不是检查0,而是写NULL,虽然一般是0。

这两条指令检查 R4, R0

R4就是 pWriteEncodeData

出0入8汤圆

 楼主| 发表于 2012-3-5 14:31:36 | 显示全部楼层
回复【2楼】aozima  
-----------------------------------------------------------------------

"空指针检查不是检查0,而是写NULL,虽然一般是0 ",我没有检查指针啊,系统检查检查吗
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 01:49

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表