免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: yjz98
打印 上一主题 下一主题

数据类型 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-03-24 11:06 |只看该作者
你可以对照datasheet再确认一下,即使你用readw/writew访问的是两字节对齐的寄存器,但是寄存器地址实际仍然是按照4字节边界定义的,跟具体芯片实现有关

还有一点就是你写入和读出的地址不同,你确认里面的数据是完全一致的吗?

论坛徽章:
0
12 [报告]
发表于 2009-03-24 11:50 |只看该作者
原帖由 yidou 于 2009-3-24 01:00 发表
兄弟,你边界地址没对齐阿。
你应该是32位机,对不?
#define HPIA_LW                        (hpi_vbase+0x04)
#define HPIA_HW                        (hpi_vbase+0x06)
#define HPIA_LR               ...


我用的arm9,就是你提到的32位机了。对边界地址的概念我不清楚,可是我一次读写的是外设16位的寄存器,我的地址只有这样映射啊。改成4字节的边界地址是不是意味着我要吧偏移值全部设置成4 的倍数,那样的话,这些地址都不能正确指向我的外设寄存器了。
我的地址是编码的,地址线的A4-A1接的dsp的hpi口的4跟控制线,根据给出不同的地址来控制不同的寄存器和进行不同的操作。HPIA_LWHE HPIA_LR这两个地址实际上要操作的空间是一样的,只是一个是读,一个是写,因为A4这跟地址线接的是外设的读写使能引脚。


[你可以对照datasheet再确认一下,即使你用readw/writew访问的是两字节对齐的寄存器,但是寄存器地址实际仍然是按照4字节边界定义的,跟具体芯片实现有关
还有一点就是你写入和读出的地址不同,你确认里面的数据是完全一致的吗?]

即使你用readw/writew访问的是两字节对齐的寄存器,但是寄存器地址实际仍然是按照4字节边界定义的?那如果是你说的那样的话,应怎么修改呢?写入和读出的地址不同,那是因为地址偏移的高位是接的外设的读写使能,就是说这以为不同位其它几位相同的话就表示一个是对这个寄存器写,一个是对它读。里边的数据应该是一致的,只是我在写的时候,写进去的值就发生了错误,所以读的时候就算读没问题,读到的也是一个错误的值,错误是写的时候造成的。

论坛徽章:
0
13 [报告]
发表于 2009-03-24 12:52 |只看该作者
你ARM的地址线可以设置为4对齐, 这样就可以对齐了, 就是 arm 上的 A0,A1 不接,

论坛徽章:
0
14 [报告]
发表于 2009-03-24 13:42 |只看该作者
你把R/W控制引脚跟地址引脚复用了,不一定能满足ARM的读写时序的,你把它们分开然后用相同地址读写试试看。。。

论坛徽章:
0
15 [报告]
发表于 2009-03-24 13:52 |只看该作者

回复 #1 yjz98 的帖子

恩以前做过HPI8的读写
先要写HPIC寄存器,设置好控制寄存器,比如是否有地址自加1等操作
每次操作前,先写HPIA寄存器,然后去读
具体看看HPI的操作顺序吧,应该问题不大的

而且在ARM总线控制寄存器设置好外设的宽度类型等,编译器和总线控制器可以自动转换字节序读写,比如外设8bit,读一个字会发出两个读操作,然后合并后返回

论坛徽章:
0
16 [报告]
发表于 2009-03-24 14:46 |只看该作者
原帖由 garyv 于 2009-3-24 08:37 发表
楼上说的应该是正确的,确实没有字边界对齐,你在读写的时候被强制字对齐了,所以能读出一半正确数据。


哪里把它强制字对齐了啊?

论坛徽章:
5
17 [报告]
发表于 2009-03-24 14:59 |只看该作者
原帖由 yjz98 于 2009/3/24 14:46 发表


哪里把它强制字对齐了啊?


readw是强制转换

论坛徽章:
0
18 [报告]
发表于 2009-03-24 15:27 |只看该作者

回复 #17 yidou 的帖子

我用jtag往地址寄存器里写入地址数据,然后在linux下用readw读,读出来的值跟写进去的值是一样的,这样的话不管readw怎么转换的,还是说明它是可以实现我要达到的目的的。只是我在linux下用writew往地址寄存器里写入地址数据,不管是在linux下读,还是用jtag读,都不能读出正确的值来,这表示是writew在写入的时候写错了!

论坛徽章:
0
19 [报告]
发表于 2009-03-25 08:17 |只看该作者
字节没有对齐,强制转换的时候,里面存储的字节会改变

论坛徽章:
0
20 [报告]
发表于 2009-03-25 08:54 |只看该作者
原帖由 star316 于 2009-3-25 08:17 发表
字节没有对齐,强制转换的时候,里面存储的字节会改变


可是我的电路板都做好了,像楼上以为朋友提到的那样A0,A1都不接的做法不好实现了。我只是没有接A0,就是你们所说的半子对齐,因为我一次只操作dsp里的寄存器的16位,如果可以在程序里做些处理达到半字对齐的效果就好了。我看了各位的回帖后到网上了解了一下边界对齐,发现有软件实现上有两种方法:
1.在程序里加入#pragma package(2),
2.在定义指针的时候在定义前加 __packed宏, 比如 __packed  short int *name.
可是当我用第一种方法的时候,对结果没有改善。 用第二种方法的时候,用arm-linux-gcc 编译就报错了。

你们还有什么处理的方法吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP