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.

[参考译文] TMS570LC4357:中断管理的内存限制与回读

Guru**** 2468610 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/672650/tms570lc4357-memory-barriers-vs-read-backs-for-interrupt-management

器件型号:TMS570LC4357

我们已经阅读 了 http://www.ti.com/lit/an/spna218/spna218.pdf 以及"4.5.1节"它(幻象中断)是如何发生的?" 有文本

" 在这种情况下、由于 VBUS 写入操作的时序不精确、中断服务例程(ISR)可以在 CPU nIRQ 或 nFIQ 中断请求信号变为非活动状态之前返回。 (笑声) 当一个读取操作清除了外设中断挂起标志时、读取指令将在至少3个 VBUS 周期后返回、并且当中断服务例程退出时、CPU nIRQ 或 nFIQ 中断请求信号已经为低电平。 在这种情况下不会发生幻象中断。"

我的解释是、只要我们想要提出、清除或屏蔽精确的中断、我们就保证、如果我们在写入给定寄存器后从该寄存器读回、就会发生这种情况。 但我不确定内存障碍是否可以实现相同的功能、因为给定的应用手册根本不会讨论它们。 例如、下面是我们在 VIM 中启用中断所使用的简化代码:

// vimREG 为易失
性 void VimEnableInterrupt (uint32_t 通道){
vimREG->REQMASKSET[通道/32]=(uint32_t) 1U <<(通道% 32);
(void) vimREG->REQMASKSET[通道/32];
} 

请注意最后的回读、以保证对 vimREG 的写入将在该函数执行结束时生效。

这个代码是否会完成同样的操作来保证到函数执行结束时对 vimREG 的写入将生效?

// vimREG 为易失
性 void VimEnableInterrupt (uint32_t 通道){
vimREG->REQMASKSET[通道/ 32]=(uint32_t) 1U <<(通道% 32);
__ASM____volatile__("DSB sy"::::"存储器");
} 

我有一个关于提出软件中断的类似问题。 目前、我们有以下用于产生软件中断的代码:
#define portSYS_SSIR1_REG (*(volatile portUInt32Type *) 0xFFFFFFB0UL)
#define portSYS_SSIR1_SSKEY (0x7500UL)

portSYS_SSIR1_REG = portSYS_SSIR1_SSKEY;
__asm volatile
(
" DSB \n"
"ISB"
:::"内存");

 它在写入后不会从端口 SYS_SSIR1_REG 读回、但包含 DSB。 假设中断没有被屏蔽、我们是否需要添加一个来自 PORTSYS_SSIR1_REG 的回读来保证在 ISB 被执行后立即产生一个中断、或者在假定的情况下、ISB 和被产生的中断之间是否会有一些延迟? 或者我们是否需要完全执行其他操作?

上面的两个代码示例是指特定的模块、但是保证写入已影响到活动中断的序列是否会根据我们要写入的模块而改变? 例如、在 VIM、DMA 模块和 GIO 模块中启用或禁用或清除中断。  

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

    很抱歉、我们没有提前回复。 我花了一些时间来研究您的问题、这样我就可以确定答案、这就是为什么出现延迟的原因、我想与您联系、这样您就知道您的帖子不会被忽略。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Sarah、

    我再次对迟迟不能返回给你表示歉意。 我必须在 ARM 架构参考手册中进行一些研究、以便充分了解存储器隔离指令的操作。

    在我的研究之后、我发现您的问题的简短答案是否定的、不能使用存储器隔离来执行与读回寄存器相同的任务。 这样做的原因是、存储器隔离强制执行读取/写入操作的顺序。 然而、寄存器存储器是器件类型、这意味着虽然写入的时序有一些变化、但是相对于 IRQ 和 FIQ 标志清零的排序既不是读取操作也不是写入操作(这更像是状态机状态变化)。

    换言之、当一个中断被置为 CPU 并且 IRQ 或 FIQ 中断信号被置为有效时、它们在外设中断信号被清除后的2-4个 VBUS 周期内被清除、或者、为了被清除、写入完成后的2-4个周期内被清除。 由于存储器边界只是控制读取和写入的顺序、而不是时序、因此它实际上不会产生与写入后执行读取相同的效果。 读取写入位置将导致 CPU 被保持关闭、从而防止任何进一步执行直到写入完成、而不管下一条指令是读取、写入还是其他指令。 这有效地大大减少了 ISR 在 IRQ 和 FIQ 中断被清除前返回的可能性。