This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C123GH6PM:位段。 为什么别名字4分开而不是连续??

Guru**** 2328790 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/589019/tm4c123gh6pm-bit-banding-why-are-alias-words-4-apart-instead-of-sequential

器件型号:TM4C123GH6PM

我正在学习位段,并正在取得良好的进展。 但是,我有点困惑,为什么位带区中的每个字位的位带别名字间隔为4,

例如、 取 SRAM 位带区0x2000.0000中的第一个字,它的每个位都有相应的位带别名字:

 

位带区                  别名等效

0x20000000位[0]                0x22000000位[0]

0x20000000位[1]                0x22000004位[0]        (前面4个字)

0x20000000位[2]                0x22000008位[0]        (前面还有4个字、等等)

…μ A …μ A

0x20000000位[31]              0x2200007C 位[0]

 

为什么位带别名区中的每个字都需要相隔4个字。 我主要是好奇心。

 

为什么不能这样:

位带区                  别名等效

0x20000000位[0]                0x22000000位[0]

0x20000000位[1]                0x22000001位[0]

0x20000000位[2]                0x22000002位[0]       (等等)

它只是硬件设计中的一个东西,我们真的不需要关心,还是有一些逻辑原因我看不到。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我相信它是4个字节、而不是4个字。 在 ARM 架构中、1个字是4个字节、因此4字节间距是有道理的。 我还没有使用位段、我同意一些数据表对此功能有点困惑。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Keith SCott]是硬件设计中的一个问题,我们真的不需要关心,还是有一些逻辑原因我看不到[/引用]  《ARMRegisteredCortexRegistered‑M4处理器技术参考手册》关于位段部分 说:

    [引用]位段使位段区域中的每个单独位都可以使用单个 LDR 指令从字对齐地址直接访问。[/引用]也就是说、位段别名的设计意图是间隔4以使用字对齐地址。

       Cortex-M4器件通用用户指南的地址对齐部分 介绍了使用对齐地址的好处:

    [引用]未对齐的访问通常比对齐的访问慢。 此外、某些存储器区域可能不支持未对齐访问。 因此、ARM 建议程序员确保访问对齐。[/quot]

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢大家。

    切斯特、
    我将查看这些链接以供进一步阅读。
    好的、无论出于何种技术原因、让我们假设硬件优势会导致速度等 这将安抚我目前的好奇心。

    Brian、
    我也试图弄清这一点(4个字节或4个字)。 但是、我假定存储器映射由32位字组成。 毕竟、这是一个32位处理器。
    在我的开头示例中、有位带别名地址0x22000000 (代表位[0])和0x22000004 (代表位[1])、我将它们分开了4个字。

    是否有人可以确认或更正该假设。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 USER="Keith SCott"]在我的开头示例中,有位带别名地址0x22000000 (代表位[0])和0x22000004 (代表位[1]),我把它们分开了4个字。

    是否有人确认或更正该假设。 ARMv7-M 地址空间可按字节寻址。 因此、地址 0x22000000和 0x22000004相隔四个字节或一个32位字。

    请参阅  ARMv7-M 架构参考手册中的 A3.1地址空间部分

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Keith、
    ARM 架构只能按字节寻址、而不能按位寻址。 如果 ARM 架构是位可寻址的、那么您根本不需要使用别名地址进行位拆裂。 您可以将值写入位地址。 通过将每个位映射到32位地址、使用别名地址、可以极大地简化硬件地址解码。 低2地址位将被忽略。 硬件解码器只需查看其余的偏移地址位即可了解要访问的位位置。 例如、如果只想对位2进行写入、则别名地址为0x22000008。 如果忽略最后2个地址位、0x8变为0x2、这意味着访问位2。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    再次感谢切斯特和查尔斯。

    现在我知道地址空间是可按字节寻址的、这一切都是非常有意义的。 很抱歉,我目前缺乏知识,我经常阅读有关这种微观的文献,但我现在仍在相对而言的开始。 比 AVR 数据表 LOL 更值得学习。

    Keith、
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我下载了该手册并查看了您提到的部分。 为了便于他人参考和理解、本手册中的解释如下:

    ARMv7-M 架构使用一个2 (为32)个8位字节的单个平面地址空间。
    字节地址被视为 无符号数、从0到2 (到电源32)- 1运行。

    该地址空间被视为由2个(到电源30) 32位字组成、每个字的地址都是字对齐的、这意味 着该地址可被4分频。
    字对齐地址为的字由地址为 A、A+1、A+2和 A+3的四个字节组成。
    地址空间也可被视为由2 (到电源31)个16位半字组成、每个半字的地址都是半字对齐的、这意味着该地址可被2分频。
    半字对齐地址为 A 的半字由地址为 A 和 A+1的两个字节组成。

    现在一切都有道理。 我不会猜测一个32位微控制器使用了一个字节可分割的地址空间。 因此、实际上每个32位字地址空间是4的间隔;0、4、8、12、 ETC (字对齐的字节)。

    Keith、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Keith、

    [引用 USER="Keith SCott)]因此,有效地说,每个32位字地址空间相隔4个;0、4、8、12、 etc (字对齐的字节)。

     只是对"(字对齐的字节)"进行了小幅校正、各个字节仍然是字节(8位)对齐的。 例如、您可以使用 STRB 指令写入字节地址(即0x1001或0x1002)。  字节地址不是字对齐的。 但是、您应该说构成一个字的4个字节是字对齐的、那么您是正确的。  

     Cortex-M 架构也支持非对齐访问、这意味着您可以对不是字对齐的地址执行 STR (32位写操作)。 CPU 只是将一个未对齐的访问划分为多个对齐的访问。 但是、位带区中的未对齐访问将产生不可预测的行为。 如果您愿意、请忽略最后一段、因为它与您的原始问题没有直接关系。 :-)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 USER="Charles Tsaaaa"> ARM 架构只能按字节寻址、而不能按位寻址。 如果 ARM 架构是位可寻址的、那么您根本不需要使用别名地址进行位拆裂。
    另一个小校正-此功能称为位段、而不是位拆裂。

    位拆裂是完全不同的、在没有硬件支持或加速的情况下完成、至少通常是这样。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Charles、

    是的,我指的是你第一段的后一段。

    我刚才已经考虑了为什么32位微控制器具有字节可寻址的存储器空间。 ASCII 字符、串行传输以及毫无疑问的其他许多字符将使用字节、因此、如果您只能对32位字进行寻址、那么存储器在字空间中存储字节将会浪费资源、 或者、在32位字中屏蔽4个字节需要大量代码。

    这只是一个猜测。

    Keith
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的打字、我指的是位段、而不是位拆裂。 :-)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这里很少有人不关心(甚至)"一点"。。。