|
发表于 2008-12-26 20:29:21
|
显示全部楼层
这个问题要从处理器设计角度来考虑
首先, 要弄明白几个概念, 不是教科书上的, 我自己定义的, 可能会不太精准.
1. 处理器的最小寻址单位, 一个地址对应的ram单元或者是寄存器地址最小bit数, 比如说8, 16, 32...
2. 处理器的最大寻址单位, 一个地址对应的ram单元或者寄存器地址的最大bit数, 比如说8,16,32,64...
大多数处理器的最小寻址单位是8, 最大寻址单位是处理器alu的位宽,
比如说8为的51, 最小寻址单位是8, 最大寻址单位也是8.
arm, 最小寻址单位是8, 最大寻址单位是32.
TI c6000, 最小寻址单位是8, 最大寻址单位是32(某些片子是64).
tiger sharac, 最小寻址单位是32, 最大寻址单位是64.
编址是根据最小寻址单位来编的, 比如说arm 4gb的空间, 是4g*8bits 的空间.
tiger sharac, 是4g*32bits的空间.
但是多数16位, 32位, 64位以及更高级的处理器也支持字节寻址. 也就是他们的最小寻址单元还是8位,
比如在64位tic6000 dsp处理器上,安排了
lb, sb, 读写8位
lh, sh, 读写16位
lw, sw, 读写32位
ld, sd, 读写32位.
同时,从存储器上, 以SDRAM 为例, 也有最小寻址单元和最大寻址单元之分, 比如说32位的SDRAM 也支持一次写入8位, 16位, 32 位.
这时候怎么接呢?. 通常用BE0-BE3来选中一个32位单元的不容字节.
处理器内部也就不把低两位(32位系统), 或低三位(64位系统)的地址线引出来, 而是直接译码变成 BEx.
设计起来非常灵活, 像TI的dsp, 还可以直接接8位的flash, 此时就是把a3-a21, 接到flash的a0-a19. 把A3当A0用.
也许这里, 还有地址对齐问题.
其实也可以一次说明白.
还是以TI64位的系统为例, 支持8位, 16位, 32位, 64位寻址.
64位时, BE0 - be7都有效. 处理器发出的地址是8的倍数.
32位时, be0 - be3, 或者是be4-be7有效, 处理器内发出的地址是4的倍数.
16位时, be0 - be1, be2-be3, be4-be5, be6-be7有效, 处理器发出的地址是2的倍数.
或许你要问,为什么16位时不能是be1-be2? 有效, 32位时不能是be1-be4有效, 这完全是为了简化存储器效率和处理器的设计难度.
x86处理器是允许这样的.
但是be1-be2这样的地址, 处理器要发出两个存储器周期,
be1-be4这样的地址, 处理器要发出三个存储器周期, 这样一来, 使用这种不对齐指令的执行时间就会编长.
在不支持这种不对齐的处理器中有的会产生异常, 有的处理器根本就不管,直接把你地址的低位扔掉.
我曾经遇到这样的错误, 在msp430中处理网络协议包, 开始的时候是正确的, 后来我添加了一个变量就错了,
后来一查, 原来我放数据的buffer, 开始的时候是16位地址对齐的,添加一个变量后就不对齐了.
[br]<p align=right><font color=red>+5 RD币</font></p> |
|