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:位段-原子还是读取-修改-写入?

Guru**** 2422790 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/614752/tm4c123gh6pm-bit-banding---atomic-or-read-modify-write

器件型号:TM4C123GH6PM

我对位段是否是原子段感到困惑。 关于这些论坛似乎有一些相互矛盾的信息,有些文章说它是原子的,另一些则说不是原子的。

例如、该线程表示位段是原子型的:

e2e.ti.com/.../1307944

但是该线程表示位段执行读-修改-写操作:

e2e.ti.com/.../161532

我需要实现一个"位数组"。 通常情况下、这非常简单、但在这种情况下、可以从主代码和中断中读取和写入位数组、因此会受到损坏: 如果写入位的代码在读取后但在同一字中写入不同位的其他代码写入之前中断、则在早期代码恢复时、对该不同位的更改将丢失。

根据 e2e 上其他地方的文章、位段被认为是原子型的、在这种情况下、位段可用于解决这一腐败问题。 但根据该线程中的帖子,位段执行读-修改-写操作,这表示它可能会损坏-- 除非整个读-修改-写操作是不间断的、或者存在其他 CPU 机制、在中断时、该操作被取消并重新启动(与在某些 CPU 平台中取消和重新启动耗时的 DIV 操作相同、以减少中断延迟)。

因此、了解位段是否是原子段非常重要。 如果多个线程或中断处理程序通过位段访问同一个字中的不同位、是否会发生这种损坏?

当然,我对解决这一问题的其他建议感兴趣。

谢谢

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

    [引用 user="12ve12pm "]

    我对位段是否是原子段感到困惑。 关于这些论坛似乎有一些相互矛盾的信息,有些文章说它是原子的,另一些则说不是原子的。

    例如、该线程表示位段是原子型的:

    e2e.ti.com/.../1307944

    但是该线程表示位段执行读-修改-写操作:

    e2e.ti.com/.../161532

    [/报价]

    这不是矛盾。 位带是 RMW 指令所必需 的(实现位可寻址存储器的简短描述、这将爆炸芯片的大小、并且意味着位带不能与外部存储器或外设一起使用)。 这并不意味着它不能是原子的。 许多处理器具有原子 RMW 指令(8096系列具有许多此类指令)。

    [引用 user="12ve12pm]]通常这非常简单、但在这种情况下、可以从主代码和中断读取和写入位数组、因此容易损坏: 如果写入位的代码在读取后但在同一字中写入不同位的其他代码写入之前中断、则在恢复之前的代码时、对该不同位的更改将丢失。

    即使没有位段是原子性的、也不是一个难以解决的问题。 如果需要对整数数数组进行原子访问(即必须一次更改多个值)、您该怎么办?

    Robert

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

     《ARMRegisteredCortexRegistered‑M4处理器技术参考手册  》的“关于位带区”部分指出,对位带区的写操作是原子读-修改-写操作。

    我假设 ARM 文档是权威信息来源。  

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

    [引用用户="Robert Adsett"]

    12时12分
    通常情况下、这非常简单、但在这种情况下、可以从主代码和中断中读取和写入位数组、因此会受到损坏: 如果写入位的代码在读取后但在同一字中写入不同位的其他代码写入之前中断、则在早期代码恢复时、对该不同位的更改将丢失。

    [/报价]

    这些选项:

    1. 使用原子操作。
    2. 无锁算法。 最难实现、最容易混乱、但性能最佳。
    3. 特定于平台的同步原语。
    4. 软件同步基元。
    5. 大锤方法:暂停所有中断。

    我更喜欢使用原子操作、因此这个问题。 感谢您解释读-修改-写操作与位带操作的原子性没有冲突。

    如果所有其他操作都失败、我可以暂停中断、但我需要尽可能避免这种情况。

    至于特定于平台的同步基元,TM4C 具有"负载互斥"/"存储互斥"--我一直在寻找 TivaWare 的可移植实现(宏、函数等)。 下一步是检查编译器文档中的内在函数、但我们必须支持 GCC 和 TI 编译器。