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.

[参考译文] TMS320F2.8069万:原子操作

Guru**** 2589245 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/659574/tms320f28069-atomic-operations

部件号:TMS320F2.8069万

我有一个可以由主代码和中断代码填充的ringbuffer。 (中断也可以由其他导入的中断中断中断中断中断)。   正确的中断处理非常重要!

要解决这个问题,我需要 对我的ringbuffer进行原子操作。

 index=buffer.next =(buffer.next +1)% 16;

所以我可以在我的ringbuffer中保留一个要填充的位置(索引)。

执行此操作的最佳方式是什么?

谢谢!

 EVS

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


    这是可能的吗?

    _ASM (" SETC INTM")
    index=buffer.next =(buffer.next +1)% 16;
    _ASM (" CLRC INTM")

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

    你好 ,EVs

    有时我们会按照您的建议使用DINT/EINT进行短原子操作。 DINT和EINT是"_ASM ("SETC INTM")"和"_ASM ("CLRC INTM")"的宏定义。

    在这种情况下,您不会丢失中断,但如果设置了中断标志而存在“DINT”,则中断会延迟。 延迟取决于DINT内部操作的持续时间... EINT。 在您的情况下,它只需几个周期。 不可怕

    另外,我建议您将“%16”操作更改为“&15”操作(按位AND)。 它们在您的情况下具有相同的效果,但"&"运算符会更快。

    (我已签入我的项目-%16与&15一样转换为ASM)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    但我也对TI针对此类情况的建议感兴趣;)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Disona,

    感谢您对该主题的深入了解。
    TI缺乏响应令人不安。 当您设计嵌入式控制器时,您可以通过这种方式来实现。 因此,这应该是一个简单的问题。 那么为什么信息这么少呢?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,EVs:

    很抱歉回复延迟。 是的,您可以按照Disona和您建议的方式使用DINT/ INT进行短原子操作。

    在这种情况下,中断将处于暂挂状态,一旦启用,中断将会传播。 对于小型操作,您不应错过中断,但如果在平均时间内生成另一个中断,则可能会错过。 希望这有所帮助。

    您也可以查看以下链接:
    e2e.ti.com/.../2.1489万


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

    Vasudha,

     感谢您的反应。 请告诉我是否正确。

     设置 _ASM(" SETC INTM")时。

     每个新中断和暂挂中断都存储在 中断标志寄存器(Interrupt Flag Register, IFR)中
    只有相同号码的每秒中断都会丢失。 但是,当禁用的持续时间是几个周期时,这不是问题。

    谢谢!

    EVS

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

    您好,EVs:

    是的,如果设置了INTM,则将来来自同一线路或组(对于外围设备中断)的同一通道的中断可能会被忽略。 对于像您一样的短期运营来说,这不应该是问题。

    正如您正确提到的,每个新的和待处理的中断都存储在IFR中。 如果同时启用了IER和INTM,则CPU会批准中断,清除IFR以用于将来的中断,并进一步为其提供服务。

    如果设置了INTM,CPU无法确认中断,因此IFR将保持锁定,并将设置PIEACK。 因此,CPU将来可能会错过同样类型的中断。

    清除INTM后,CPU将确认待处理中断,IFR将被清除。 通过清除PIEACK在ISR中确认中断。 只有这样,进一步的中断才能传播到CPU。

    有关  详细信息,请参阅C28x CPU指南和设备TRM。

    谢谢

    Vasudha