打印
[C语言]

KeilArm中32位指针的使用问题

[复制链接]
1470|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ee168|  楼主 | 2018-8-22 08:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
KeilArm中运行以下程序出错

unsigned char CharDat[32];
unsigned char *p8dat;
unsigned int *p32dat;

p8dat = CharDat;
p32dat = (unsigned int *)p8dat;
ISPDAT = *p32dat; // ISPDAT为特殊32位寄存器,运行此句发生复位

后来没有办法,改成如下通过,有什么其他简单,效率高的写法吗?
u32tmp = (unsigned int)(*p8dat)<<24;
p8dat++;
u32tmp += (unsigned int)(*p8dat)<<16;
p8dat++;
u32tmp += (unsigned int)(*p8dat)<<8;
p8dat++;
u32tmp += (unsigned int)(*p8dat)<<0;
p8dat++;
ISPDAT = u32tmp;

相关帖子

沙发
一路向北lm| | 2018-8-22 11:16 | 只看该作者
哪里报错?

使用特权

评论回复
板凳
ee168|  楼主 | 2018-8-22 11:20 | 只看该作者
p8dat = CharDat;
p32dat = (unsigned int *)p8dat;
ISPDAT = *p32dat; // ISPDAT为特殊32位寄存器,单步跟踪,运行此句发生复位

使用特权

评论回复
地板
Ketose| | 2018-8-22 17:20 | 只看该作者
应该是对齐的原因吧。
改成下面的试试:
__align(4) unsigned char *p8dat;

使用特权

评论回复
5
ee168|  楼主 | 2018-8-22 17:54 | 只看该作者
谢谢楼上的意见,但是修改后还是出错.不过极有可能是楼上说的这种原因,

使用特权

评论回复
6
john_lee| | 2018-8-22 19:08 | 只看该作者
u32tmp = (unsigned int)(*p8dat)<<24;
p8dat++;
u32tmp += (unsigned int)(*p8dat)<<16;
p8dat++;
u32tmp += (unsigned int)(*p8dat)<<8;
p8dat++;
u32tmp += (unsigned int)(*p8dat)<<0;
p8dat++;
ISPDAT = u32tmp;

从这段可以看出,你的数据是big endian(不懂自己查)的,而你使用的 ARM 是 little endian 的,出问题是必然的。

使用特权

评论回复
7
ayb_ice| | 2018-8-23 08:33 | 只看该作者
一是存在对齐问题,二是存在大小端问题
如果非4字节对齐会导致异常,大小端导致数据不正常

使用特权

评论回复
8
linqing171| | 2018-8-26 21:31 | 只看该作者
unsigned char CharDat[32];   ====》 如果map文件里这个变量在奇数地址
unsigned char *p8dat;          ====》 则把这行前面加上 __packed 前缀来修饰指针。

使用特权

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

本版积分规则

114

主题

200

帖子

2

粉丝