[技术问答] MUC140中给指针数组赋值导致硬件错误,寻找原因【已找到】

[复制链接]
2091|9
 楼主| niuyaliang 发表于 2014-4-21 11:39 | 显示全部楼层 |阅读模式
本帖最后由 niuyaliang 于 2014-4-26 07:49 编辑

代码如下面所示、
TempData[u8j]为定义的一个数组
  1. uint8_t TempData[] = {"9600"};
MenuDataSet为指针数组
  1. uint8_t *MenuDataSet[3] ={
  2. "NO-000",//43
  3. "9600bps",//44
  4. "0000-0000000",        //45
  5. };
  1.    uLen = GetLenStr(&MenuDataSet[u8i][0]);//找到指针数组的大小
  2.                         for(u8j=0;u8j<uLen;u8j++)//复制字符串数组到临时的数组
  3.                         {
  4.                                 *(MenuDataSet[u8i]+u8j) = TempData[u8j];
  5.                         }
运行时进入硬件错误
  1. HardFault_Handler\
  2.                 PROC
  3.                 EXPORT  HardFault_Handler         [WEAK]
  4.     IF SEMIHOSTED
  5.                 LDR    R0, [R13, #24]        ; Get previous PC
  6.                 LDRH   R1, [R0]              ; Get instruction
  7.                 LDR    R2, =0xBEAB           ; The sepcial BKPT instruction
  8.                 CMP    R1, R2                ; Test if the instruction at previous PC is BKPT
  9.                 BNE    HardFault_Handler_Ret ; Not BKPT
  10.         
  11.                 ADDS   R0, #4                ; Skip BKPT and next line
  12.                 STR    R0, [R13, #24]        ; Save previous PC
  13.         
  14.                 BX     LR
  15. HardFault_Handler_Ret
  16.     ENDIF
  17.                 B   


从小木丁丁 发表于 2014-4-21 15:04 来自手机 | 显示全部楼层
手机看不到代码,郁闷
a_ziliu 发表于 2014-4-22 14:28 | 显示全部楼层
應該是寫入到某塊記憶體。

*(MenuDataSet[u8i]+u8j) = TempData[u8j];

單步調式看看

骗子的片子 发表于 2014-4-22 15:24 来自手机 | 显示全部楼层
a_ziliu 发表于 2014-4-22 14:28
應該是寫入到某塊記憶體。

*(MenuDataSet+u8j) = TempData;

层主高人啊
骗子的片子 发表于 2014-4-22 15:24 来自手机 | 显示全部楼层
又见繁体字大神
 楼主| niuyaliang 发表于 2014-4-24 18:56 | 显示全部楼层
a_ziliu 发表于 2014-4-22 14:28
應該是寫入到某塊記憶體。

*(MenuDataSet+u8j) = TempData;

好像MDK的编译器中把结构体指针写到ROM中去了,因此只能读,不能写
 楼主| niuyaliang 发表于 2014-4-24 18:57 | 显示全部楼层
a_ziliu 发表于 2014-4-22 14:28
應該是寫入到某塊記憶體。

*(MenuDataSet+u8j) = TempData;

就是调试到这里,然后进入硬件错误了
jiemnij 发表于 2014-4-25 08:21 | 显示全部楼层
本帖最后由 jiemnij 于 2014-4-25 08:34 编辑
  1. uint8_t TempData[] = {"9600"};
  2. uint8_t *MenuDataSet[3] ={
  3. "NO-000",//43
  4. "9600bps",//44
  5. "0000-0000000",        //45
  6. };
  7. uLen = GetLenStr(&MenuDataSet[u8i][0]);//找到指针数组的大小
  8. for(u8j=0;u8j<uLen;u8j++)//复制字符串数组到临时的
  9. {                              
  10. *(MenuDataSet[u8i]+u8j) = TempData[u8j];
  11. }
因为你的
uint8_t *MenuDataSet[3] ={
"NO-000",//43
"9600bps",//44
"0000-0000000",        //45
}
直接以字符串形式存放, 而字符串在你以指针形式指向的时候是存放到const区域的,如果你的const是分配到flash那里
那么后续的往里面赋值自然会出错
要想实现你的目的,可以改写一下代码
uint8_t str_43[]="NO-000";//43
uint8_t str_44[]="9600bps";//44
uint8_t str_45[]="0000-0000000";//45

uint8_t *MenuDataSet[3] ={
str_43, str_44, str_45};

///---------------------------------------------
for(u8j=0;u8j<uLen;u8j++)//复制字符串数组到临时的
{                              
*(MenuDataSet[u8i]+u8j) = TempData[u8j];
}
另外你这里写着是复制字符串数组到临时数组
但是你的代码是,从临时数组里面拷贝到你原来定义的字符串..所以写法就不对..前后对调一下才对
如果正真要实现的是复制字符串到临时数组那么,,上面的定义代码不需要修改
只要如下修改..(有数组类型, 指针这种符号.还是少用为妙)
for(u8j=0;u8j<uLen;u8j++)//复制字符串数组到临时的
{                              
TempData[u8j] = MenuDataSet[u8i][u8j];
}

评分

参与人数 1威望 +4 收起 理由
niuyaliang + 4

查看全部评分

 楼主| niuyaliang 发表于 2014-4-26 07:49 | 显示全部楼层
jiemnij 发表于 2014-4-25 08:21
因为你的
uint8_t *MenuDataSet[3] ={
"NO-000",//43

/************************************
直接以字符串形式存放, 而字符串在你以指针形式指向的时候是存放到const区域的,如果你的const是分配到flash那里
那么后续的往里面赋值自然会出错
**************************/
就是这个原因,谢谢@jiemnij 的耐心指导
从小木丁丁 发表于 2014-4-26 11:17 | 显示全部楼层
jiemnij 发表于 2014-4-25 08:21
因为你的
uint8_t *MenuDataSet[3] ={
"NO-000",//43

这样的帖子是大家学习的榜样
您需要登录后才可以回帖 登录 | 注册

本版积分规则

212

主题

2427

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部