4470|6

222

帖子

2

TA的资源

一粒金砂(高级)

楼主
 

arm平台地址虽然对齐,但值随机 [复制链接]

测试不同平台地址对齐代码
        char buf[20];
        long *p;


        for (int i = 0; i < 20; i++) {
                buf  = i;
        }
        for (int i = 0; i < 10; i++) {
                p = (long*)((char*)(buf + i));
                printf(" %x %x \n",p, *p);
        }


X86平台输出,与预期符合
bff84228 03020100
bff84229 04030201
bff8422a 05040302
bff8422b 06050403
bff8422c 07060504
bff8422d 08070605
bff8422e 09080706
bff8422f 0a090807
bff84230 0b0a0908
bff84231 0c0b0a09


arm平台输出,第一列地都正确,地址是对齐的,但里面的值不符合预期,
*p的值不对,"."符号表示这内容是随机值,其余与预期值相同
beaca9ac 03020100        03020100
beaca9ad 00030201         ..030201
beaca9ae 01000302         ....0302
beaca9af 02010003         ......03
beaca9b0 07060504         07060504
beaca9b1 04070605         ..070605
beaca9b2 05040706         ....0706
beaca9b3 06050407         ......07
beaca9b4 0b0a0908         0b0a0908
beaca9b5 080b0a09        ..0b0a09



最新回复

你的malloc是什么意思,应该是memcpy吧  详情 回复 发表于 2016-11-5 12:12
点赞 关注

回复
举报

732

帖子

2

TA的资源

纯净的硅(中级)

沙发
 
你的问题就有毛病,ARM平台只有现在的新型处理器架构才支持非对齐数据访问,如果你使用的处理器是旧版本的例如ARM v5之前的就不支持非对齐数据访问,你的问题叫做“arm平台地址虽然对齐”,这是什么意思,既然地址对齐那就不能进行非对齐数据访问,如果非要进行非对齐数据访问那得出的肯定是未知的。

点评

我程序出现BUG,从网络读取数据包,数据包不限定长度, 【包头标识符 + 长度 + 数据 + 结尾标识】,符规定末尾以0xeeeeffff结尾 原始验证结尾标识代码是这样写 当整个长度是4的倍数时,*p 正好是0xeeeeffff  详情 回复 发表于 2016-11-4 23:11
 
个人签名亚里士缺德
 

回复

6040

帖子

203

TA的资源

版主

板凳
 
arm你也没说型号,所以这种测试意义不大

点评

在ARM920t S3C2440 ARM926 MX287 两款处理器上做过测试,他两的核心一样,运行结果都一样  详情 回复 发表于 2016-11-4 23:05
 
 
 

回复

222

帖子

2

TA的资源

一粒金砂(高级)

4
 
lcofjp 发表于 2016-11-4 10:12
arm你也没说型号,所以这种测试意义不大

在ARM920t S3C2440
ARM926 MX287
两款处理器上做过测试,他两的核心一样,运行结果都一样
 
 
 

回复

222

帖子

2

TA的资源

一粒金砂(高级)

5
 
汤权 发表于 2016-11-4 09:05
你的问题就有毛病,ARM平台只有现在的新型处理器架构才支持非对齐数据访问,如果你使用的处理器是旧版本的 ...

我程序出现BUG,从网络读取数据包,数据包不限定长度
【包头标识符 + 长度 + 数据 + 结尾标识】,符规定末尾以0xeeeeffff结尾

原始验证结尾标识代码是这样写
  1. char buf[n]
  2. long *p = (long*)(buf + len - 4);
复制代码

当整个长度是4的倍数时,*p 正好是0xeeeeffff,否则异常。

为了兼容非4倍数的数据包,将指针偏移操作改成malloc
  1. long size;
  2. malloc(&size,buf + len - 4, 4);
复制代码

这样能解决我的问题

点评

你的malloc是什么意思,应该是memcpy吧  详情 回复 发表于 2016-11-5 12:12
那就说明这个ARM9的核不支持非对齐数据访问了,没办法啊这个,向STM32这样比ARM9低端的ARM单片机都还支持非对齐数据访问的,可能是ARM9太old了。你还是单个字节比较判断吧,哈哈  详情 回复 发表于 2016-11-5 09:55
 
 
 

回复

732

帖子

2

TA的资源

纯净的硅(中级)

6
 
lzwml 发表于 2016-11-4 23:11
我程序出现BUG,从网络读取数据包,数据包不限定长度,
【包头标识符 + 长度 + 数据 + 结尾标识】,符 ...

那就说明这个ARM9的核不支持非对齐数据访问了,没办法啊这个,向STM32这样比ARM9低端的ARM单片机都还支持非对齐数据访问的,可能是ARM9太old了。你还是单个字节比较判断吧,哈哈
 
个人签名亚里士缺德
 
 

回复

6040

帖子

203

TA的资源

版主

7
 
lzwml 发表于 2016-11-4 23:11
我程序出现BUG,从网络读取数据包,数据包不限定长度,
【包头标识符 + 长度 + 数据 + 结尾标识】,符 ...

你的malloc是什么意思,应该是memcpy吧
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表