打印
[技术问答]

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

[复制链接]
1600|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
niuyaliang|  楼主 | 2014-4-21 11:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 niuyaliang 于 2014-4-26 07:49 编辑

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

层主高人啊

使用特权

评论回复
5
骗子的片子| | 2014-4-22 15:24 | 只看该作者
又见繁体字大神

使用特权

评论回复
6
niuyaliang|  楼主 | 2014-4-24 18:56 | 只看该作者
a_ziliu 发表于 2014-4-22 14:28
應該是寫入到某塊記憶體。

*(MenuDataSet+u8j) = TempData;

好像MDK的编译器中把结构体指针写到ROM中去了,因此只能读,不能写

使用特权

评论回复
7
niuyaliang|  楼主 | 2014-4-24 18:57 | 只看该作者
a_ziliu 发表于 2014-4-22 14:28
應該是寫入到某塊記憶體。

*(MenuDataSet+u8j) = TempData;

就是调试到这里,然后进入硬件错误了

使用特权

评论回复
8
jiemnij| | 2014-4-25 08:21 | 只看该作者
本帖最后由 jiemnij 于 2014-4-25 08:34 编辑
uint8_t TempData[] = {"9600"};
uint8_t *MenuDataSet[3] ={
"NO-000",//43
"9600bps",//44
"0000-0000000",        //45
};
uLen = GetLenStr(&MenuDataSet[u8i][0]);//找到指针数组的大小
for(u8j=0;u8j<uLen;u8j++)//复制字符串数组到临时的
{                              
*(MenuDataSet[u8i]+u8j) = TempData[u8j];
}
因为你的
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
9
niuyaliang|  楼主 | 2014-4-26 07:49 | 只看该作者
jiemnij 发表于 2014-4-25 08:21
因为你的
uint8_t *MenuDataSet[3] ={
"NO-000",//43

/************************************
直接以字符串形式存放, 而字符串在你以指针形式指向的时候是存放到const区域的,如果你的const是分配到flash那里
那么后续的往里面赋值自然会出错
**************************/
就是这个原因,谢谢@jiemnij 的耐心指导

使用特权

评论回复
10
从小木丁丁| | 2014-4-26 11:17 | 只看该作者
jiemnij 发表于 2014-4-25 08:21
因为你的
uint8_t *MenuDataSet[3] ={
"NO-000",//43

这样的帖子是大家学习的榜样

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

212

主题

2427

帖子

7

粉丝