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.

[参考译文] CCS/UCD3138128A:当我们进入监控器模式时、是否需要禁用中断?

Guru**** 2495615 points
Other Parts Discussed in Thread: UCD3138

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/719764/ccs-ucd3138128a-is-it-necessary-to-disable-interrupt-when-we-enter-supervisor-mode

器件型号:UCD3138128A
主题中讨论的其他器件:UCD3138

工具/软件:Code Composer Studio

您好!


我们要求可以在 PSU 上电状态下更新 PSU FW。

在这种情况下、当代码在闪存 A 中运行并从 I2C 接收数据、然后将数据从 Wirte 恢复到闪存 B


当我们需要写入闪存时,我们需要进入超级用户模式。 我知道,当我们进入管理员模式时,必须禁用中断。(如下代码所示)

#pragma INTERRUPT (software_interrupt_ZoneA、SWI)

void software_interrupt_ZoneA (uint32 arg1、uint32 arg2、uint32 arg3、uint8 swi_number)

//确保中断被禁用

       asm (" MRS R3    、CPSR ");               //获取 PSR

       asm (" ORR    R3、R3、#0xc0 ");//设置中断禁用

       asm (" MSR    CPSR、R3");                //恢复 PSR

    asm (" LDRB R3、[R14、#-1]");//get swi number into R3 as fourth 操作数

我们是否有机会跳过"设置中断禁用"步骤。


因为我们不希望禁用中断、这会使我们的 D-D 级在保护和动态控制方面面临风险。

那么、上面提到的内容、当我们进入监控器模式时、是否需要禁用中断?

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

    我认为至少有一些中断在进入软件中断时被自动禁用、因此您实际上可能必须启用它们。

    我建议尝试使软件中断速度足够快、以免影响您的故障处理等  请记住、基于比较器的故障处理会立即关闭、无需首先使用固件。

    但是、如果您想尝试:

    我们没有尝试过,但它应该相对安全,有一些限制。  软件中断有其自己的堆栈指针和堆栈区域。  

     

    这些限制是软件中断所执行的操作与代码其余部分所执行的操作之间的可能交互。

     

    最大的潜在问题是返回 ROM 模式的旧样式校验和清除/内存擦除。  EVM 会对所有代码进行编码、只需将程序粘贴到 RAM 的开始位置即可。  这将会烧毁该区域中的任何变量。  因此、使用这些 RAM 变量的任何中断都可能会读取错误的内容、也可能会写入错误的内容。  因此,校验和可能不会被擦除。   

     

    在执行该软件中断之前、您肯定需要禁用中断。  实时开关代码是安全的、因为它们有一个特殊的 RAM 区域来放置程序。

     

    另一个问题是、当数据闪存被擦除或写入时、它将在读取时返回0xffffffff。  这通常不会成为问题,因为我们通常只在启动时读取数据闪存。 当然、如果  您要在数据闪存写入和擦除期间将软件中断更改为读取 BUSY 位、 则需要确保在后台繁忙期间也不会读取数据闪存。

     

    这几乎是我所能想到的一切会导致问题,但还有更多的问题。  正如我所说的、我们并没有尝试过它。  

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

    基本上、我们之前不会尝试在 SVC 模式中启用嵌套中断。如果需要、您仍然可以启用它。 它应该相对安全、但有一些限制。

      1.您需要正确设计 SVC 堆栈,并使其足够大,以便在 SVC 模式下启用嵌套中断。

      2.用于擦除 pflash 的代码需要复制到 RAM、然后再执行。 您的 RAM 空间必须定义良好、以确保您的运行时变量安全。  如果在将代码复制到 RAM 时变量被销毁、那么您的系统当然会死机。

      使用模拟比较器的保护不需要固件。  

     

    如果您的代码没有设计为启用嵌套中断,我们建议您在 SVC 模式下禁用嵌套中断,使软件中断尽可能短以简化固件设计。

     

    由于您的代码架构与我们的代码架构不同、因此您仍然可以决定是否实施。  

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

    正如我已经说过的、在进入软件中断时无需禁用中断。  我们只是这样做是为了避免像我已经描述的那样的复杂情况。  

    但是、我们没有尝试过、因此可能还有其他一些我们没有想到的复杂问题。

    ARM 缺省情况下、一个软件中断自动发生、这就是正常中断在进入一个软件中断时被禁用。  快速中断未被禁用。  

    正如我已经提到的、每个中断都有自己的堆栈指针、因此只要堆栈足够大、就应该是安全的。

    当然、也有必要不使用任何被多个级别写入的变量或外设寄存器-中断或后台循环。  如果不遵循此规则、则存在写入中断的风险、其中一个程序读取一个值、被另一个读取和写入相同值并返回的级别中断、然后第一个程序将覆盖第二个程序写入的内容。  任何中断和处理器都会带来风险。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Ian、
    奇怪的是,在 SVC 模式下启用嵌套中断或客户需要编写自己的汇编代码时,具有#pragma 中断的 CCS 编译器能否处理必要的上下文保存?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Ian:

    我还想知道 Andrew 问题的答案。 谢谢!

    我还有三个问题,如下所示:

    我们可以在系统模式下写入闪存吗? 它是否具有与 监控器模式相同的"权限"?

    (参考以下 UCD3138规格)

    2.系统模式用途的说明 显示系统模式"特权、使用相同的用户模式寄存器"

    那么、我们是否可以让 MCU 始终保持系统模式、而无需切换到用户模式?

     

    3.如果我们始终将 MCU 保持在系统模式,请将问题1和2结合起来。 我们可以在没有开关模式的情况下执行写入闪存操作(不会触发软件中断、也不会进入监控器模式)

    它是正确的推理吗?

     

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

    是的、您可以将器件保持在系统模式、然后无需软件中断即可访问闪存和闪存控制寄存 器我们在引导加载程序中这样做。  我们在电源代码中不这么做的原因是、它是一种针对导致处理器丢失的噪声的轻微额外保护。  如果闪存程序丢失、那么在用户模式下它不太可能损坏闪存程序。  正如我所说的、这可能是一个轻微的好处。

    嵌套中断通常用于描述嵌套类型相同的中断、通常为标准中断。  为此、编译器不提供代码。

    对于运行软件中断并使用快速中断中断中断中断、这并不是真正的嵌套、编译器应为此提供代码。  基本上、快速中断会将其使用的任何通用寄存器入栈、然后在返回前将其弹出。  ARM 7会自动保存处理器状态寄存器、并在返回时恢复。