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.

[参考译文] TM4C1294KCPDT:ARM Cortex M4v7子优先级位加密

Guru**** 2618835 points

Other Parts Discussed in Thread: LM3S8971

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/787047/tm4c1294kcpdt-arm-cortex-m4v7-sub-priority-bit-feilds

器件型号:TM4C1294KCPDT
主题中讨论的其他器件:LM3S8971

  TI 实施 TM4C1294 NVIC 优先级/子优先级组的方式似乎缺少 ARM Cortex M4v7程序员指南的优先级位字段。  

       具体而言、数据表中缺少配置为3位拆分的 REG58 (APINT)中每个组优先级(0-7)的子优先级字段。 ARM Cortex M4v7 NVIC 支持 每个中断具有多达256个优先级。  TI 数据表中缺少 ARM 编程人员指南所示的每个主要分组(0-7)中断源的子优先级位字段(半字节)。 数据表表表3-9的第1行(0x0-0x4)不正确、建议在3位拆分中只能存在1个子优先 级、因为这会违反 ARM Cortex M4v7 (成熟的) NVIC 架构。

为清楚起见、 我在   Tivaware (HW_NVIC.h) NVIC_APINT 定义旁边添加了分组位拆分(注) M4v7 NVIC 能够解码。   似乎0x00000200 [2:0]的中断子优先级中断字段3位拆分的 Tivaware 未 设置子 优先 级、 8个中断 优先级位 (0x0-0x7)、例如 优先级分组0x00-0xE0。 ARM M4v7内核 NVIC 支持 主优先级分组和  0-7分组0x0-0xE0内的中断优先级。     IntPrioritySet()没有配置该   功能,它只将“子优先级”中断位字段设置为仅用作主分组,而该功能在 M4v7 NVIC 架构中无法正常工作。  正如 ARM Cortex 文档所建议的那样、TI 似乎有人错误地确定了 NVIC 的工作方式。

我们需要8 个优先级组 0x0-0xE0 (5:3拆分)、 每个分组内至少有8个子优先级(0-7)。 似乎 Tivaware IntPrioritySet()将 NVIC 限制为 1个具有8个子优先级的组,这与表3-9相冲突。 似乎我们无法进行呼叫,但再次访问 IntPriorityGroupingSet (2或4)  时,每个 组将我们限制为仅一个组,而不是表3-9所示的8个单独的组。     

相应  地、由于发出更高优先级的中断分组、它们错误地加快了与该组中更高优先级的中断链相对较低优先级的尾链。  

//
//
//为 NVIC_APINT 寄存器中的位字段定义以下内容。
////
*****************
#define NVIC_APINT_VECTKEY_M 0xFFFFFF0000 //寄存器密钥
#define NVIC_APINT_VECTKEY 0x05FA0000 //向量键
#define NVIC_APINT_ENDANESS 0x00008000 //数据字节
#define NVIC_APINT_PRIGROUP_M 0x00000700 // INT 优先级分组 PRI[位] SubPrI[位]
#define NVIC_APINT_PRIGROUP_7_1 0x00000000 //优先级组7.1拆分、ARM [7:1][0]
#define NVIC_APINT_PRIGROUP_6_2 0x00000100 //优先级组6.2拆分、ARM [7:2][1:0][1:0][1:0]#define NVIC_APINT_PRIGROUP_6_2 0x00000100//优先

级组0xINT_PRINT_INT_PRINP_组6.2][PRINT_INT_PRINT_INT_INT_INPLEV0003.4][PRINT_PRINT_PRINT_INT_INT_INT_INP_LEVINP_4:INT_INT_INT_ ARM [7:4][3:0]
#define NVIC_APINT_PRIGROUP_3_5 0x00000400 //优先级组3.5拆分,ARM [7:5][4:0]
#define NVIC_APINT_PRIGROUP_2_6 0x00000500 //优先级组2.6拆分,ARM [7:6][PRIC_APINT_PRIGROUP_2_7 0x0007_1.7]
[PRIGINT_PRIGINP_组0x000007:PRINT_1.7/PRIGROUP_1.7] [6:0]
#define NVIC_APINT_PRIGROUP_0_8 0x00000700 //优先级组0.8拆分,ARM [0] [7:0]
#define NVIC_APINT_SYSRESETREQ 0x00000004 //系统复位请求
#define NVIC_APINT_VECT_CLR_ACT 0x00000002 //清除活动 NMI /故障
#define NVIC_APINT_VECT_RESET 0x00000001 //系统复位

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    ARM 文档描述了 TM4C 器件的 NVIC 中没有的特性。 TM4C 器件上的 NVIC 仅使用高三位来确定数据表和 TivaWare 外设驱动程序库用户指南中所述的八个优先级中的一个。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我认为 中断子优先级分组难题有一种解决方法。

    似乎是错误;APINT REG58通知 NVIC    INT 优先级(0-113)的8位字段中指示的受限拆分顺序、如  所示的 ARM B3.3.9。 TM4C 数据表将  每个字节中的低位显示为保留位、但应包含 REG58 定义的子优先级半字节。  IntPrioritySet() 仅为  每个组0-7配置高3位。  从不将字节拆分的低半字节位[2:0]中的中断优先级(0-7)设置为被起诉 的 REG58。

    即使 TM4C129 NVIC 实现将组优先级限制为仅3位 、它仍然必须为 字节高位指示的8个组设置中断子优先级(0-7)。    INTA、INTB、INTC、INTD 的低半字节 未被设置为 B3.4.4所示。 8个分组 由3个高位表示、并由 REG58指示的拆分表示、 也在每个中断字节(REG24 - REG52)的低半字节[2:0]中。  IntPrioritySet()有效地配置 组 (0x0-0xE0),并且无法在  Tivaware  3:5 split 中设置任何子优先级中断级别(0-7)。 相反 、表3-9会让您认为 NVIC 只按   位 权重来排序中断子优先级。  这根本不起作用、而尾链则通过抢占感知层次结构顺序来对抗。

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

    TM4C129 NVIC 仍然必须遵守 ARM 编程人员指南。 否则、请披露与对 NVIC 所做更改(与 ARM M4v7文档冲突)相关的所有信息! 表3-9未正确披露任何此类信息、而是似乎误解了 NVIC 在中断优先级顺序的位字段分离中的工作方式。

    TI 无法更改 NVIC 处理 ARM Cortex 文档中有关主题的分组内中断子优先级顺序的方式。 TM4C1294数据表表3-9似乎错误地传达了 NVIC 中断优先级分组应如何按照 ARM Cortex M4v7编程人员指南的定义进行定义。 否认您会遇到一个巨大的鱼问题,值得为 Tivaware IntPrioritySet()函数提供更好的答案和似乎的修复。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Bob:

     我是在你张贴和相互交叉时打字的。

    [引用 user="Bob Crosby"] ARM 文档介绍的是 TM4C 器件的 NVIC 中不包含的功能

    在 ARM Cortex M4v7指南中、没有 NVIC 分组顺序 (AIRCR)被指定 为特定功能、 REG58试图欺骗。 除了 REG58、只指定中断优先级寄存器中每个字节的低半字节的拆分。 不能说供应商可以从 ARM 在其芯片中指定布局的方式更改位字段。 中断优先级寄存器被指定为属于 ARM 中断架构、而不是供应商。 供应商向 AHB 添加的 TM4C1294外设似乎只能使用/访问 ARM 内核芯片中的寄存器。

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

    [引用 user="Bob Crosby"] TM4C 器件上的 NVIC 仅使用高三位来确定数据表和 TivaWare 外设驱动程序库用户指南中所述的八个优先级中的一个。

    这似乎永远不会为 每个外设设置 NVIC 中断子优先级、在该过程中、它只会设置 组(0-7)优先 级高半字节。 NVIC 尾部改变不能 正确地将  较低优先级组的挂起排序为较高优先级组外设中断 会导致 AHB 仲裁周期中断、 这可能会像醉汉水手一样。  肯定不是一个由一些疯狂科学家感知的配置来规避由 ARM 设计的 NVIC 中断优先级处理。

    同样、通过 M4v7 NVIC 设计、每个中断具有256个优先级、224是最高的二进制值、3位 REG58   通过中断优先级字段的上半字节限制8个分组。 然而 、从不为 每个字节字段分配任何中断优先级位[2:0]的低半字节。  显然、数据表编写器或某人已经误解了中断优先级字段位[2:0]仍然必须编程为 ARM cortex 程序员指南所示。  与 NVIC 设计相反、TI 似乎无法保留中断优先级字段位空间、或者它不能按预期工作。

    下面 是 NVIC 5:3的中断优先级分组、如 ARM Cortex M4v7编程人员指南所述。  似乎 Tivaware 应该如何为 TM4C1294设置主组和子中断优先级顺序、但不配置低半字节。   当尾链跨越同一优先级组的上下文时、INT 位权重不适用于1个子优先级中断(表3-9)。  因此、它必须是与 Tivaware 配置相关的问题、因为我们都知道 ARM M4v7 NVIC 芯片是完美无瑕的。

    0x00 - 0x07 | 0x20 - 0x27 | 0x04 - 0x47 | 0x60 - 0x67 | 0x80 - 0x87 | 0xA0 - 0xA7 | 0xC0 - 0xC7 | 0xE0 - 0xE7

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

    BP101、

    TI 未更改 ARM NVIC。 ARM 对其进行了更改。 TM4C 器件是在推出最新的 M4 NVIC 之前设计的。 您看到的 ARM 文档不正确。 请参阅 :http://infocenter.arm.com/help/topic/com.arm.doc.dui0553b/DUI0553.pdf 第4.2.7节。

    如果展开寄存器窗口的 NVIC 部分并将0xFF 写入 NVIC_PRIN 寄存器的其中一个字节、您将看到它读回0xE0。 只有优先级寄存器的三个最高有效位在这个 NVIC 中被执行。 这与我们在数据表中记录的内容以及 TivaWare 驱动程序中支持的内容相同。  

    如果您需要额外的优先级或使用子优先级、则需要从其他供应商处获得 M4。

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

    [引用 user="Bob Crosby"]您正在查看错误的 ARM 文档

    尊敬的 Bob:

    我认为这不是真的、因为 CCS 编译器 具有 M4v7 (版本7) CPU、 为 (TM4C1294)编译所有项目。   EVM LaunchPad 上提供的物联网项目示例还显示了 M4v7内核。 如果 NVIC 在 TM4C1294中是不同版本、则示例 项目 应具有 M4v7   以外的其他一些 ARM 版本号。  然而、每个示例项目都指示 ARM M4v7 是内核、这是我已指示此/其他线程的 ARM 文档页面。

    问题似乎是 Tivaware [3:5]拆分的低位不能为 RAZ、[7:5]拆分实际上不 存在 M4v7 ARM Cortex。 表3-9 第1行  针对 M4v7内核的异常排序不正确、 例外编号 子优先级仅 通过1个组正常工作、而不 是通过 疯狂 的想法对 RAZ 低半字节进行8次操作。 如果   我们 使用 Raz 子库位[4:0]、则 ARM 似乎将细节排除在外。尾链不会通过多个主组正确抢占。  对于如此多的外设中断、TM4C1294是否 有多个具有(0-7) 子优先级异常处理的主组(0-7)?

    第1行表3-9显示 无子优先级位、与1个子优先级相矛盾。 NVIC 似乎不会对  具有 多组优先 级且异常编号为1个子优先级的 APB 仲裁产生正确的同步应用中断处理。  可能 主要问题 多个主要组0x00-0xE0 和1子优先 级具有 来自较高优先级组的无序异步抢占、优先级较低组中的原始尾链优先、对 MSP 的一阶调用。 这似乎是  由多个主要组和 [3:5] 中的 RAZ 低阶半字节[4:0] splits 而不是[7:5]导致的、而后者在具有 ARM Cortex M4v7的 TM4C1294中甚至不存在。

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

    尊敬的 Bob:

    请注意、我一直说[3:5]  Tivaware 2.1.1.71 (HW_NVIC.h)没有更新以指示 M4v7二进制分割点。 这进一步混淆了整个问题、 定义了注释 冲突 TM4C1294数据表表3-9。 您发布的 ARM 文档链接具有 更多关于组优先级抢占位 字段拆分的信息、第4-18页。 我不会对 TI 选择仅允许高3位表3-9表示异议、但  对于 TM4C1294 126个中断 和 NVIC 来说、二进制拆分的低半字节对于 通过 MSP 排序正确地为应用指令解码断言同步抢占是谨慎的。 也许 ARM 不知道 如何截断  二进制拆分的低子优先级位会导致 APB 仲裁混乱 、因为多个供应商外设  正通过120MHz SYSCLK 节拍抢占同步 CPU 时间?

    当   未通过位(黄色框)定义任何子优先级时、似乎 NVIC 未正确排序主组尾链优先级的 MSP 回放[7:5]。   似乎只有一个主要组可用于1个子优先级以维持 MSP 顺序、并且不会在过程中错误地加速 NVIC 的抢占。 如果这是指令解码突发或提前读取的伪影、 那么在 多主组 场景中、这种情况不太正常。    注意:将上述 POST 更改为[3:5]拆分以保持一致的 Raz [4:0]子优先级位 Tivaware 示例项目。  

      

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果表4-18 (注释红色)为真、那么为什么上面表3-9中有1个子优先级? 这似乎是一个错误叙述、在23个外设例外情况下无法正常运行 M4v7。 这个问题似乎涉及到 M4v7 NVIC 在未定义子优先级位 splits [4:0]域的情况下对后续外设异常的处理、特别是对于 GPTM、PWM0、ADC0。

    外设似乎具有围绕子优先级异常排序和 APB 仲裁时序保持合理同步的120MHz SYSCLK 和/或 CPU 指令解码的 NVIC 延迟问题。 对于 M4v7 NVIC、500ms 间隔内看似20-120Hz 的 CCP 边沿计数中断不应成为问题。 然而、当 CCP 边沿计数并启用 GPTM OneShot 时、它会失败并可能随机地对 MCU 进行故障、GPTM OneShot 在优先级排序的异常上下文之间共享一个变量。 老师总是告诉我们在消防练习中通过门道使用单个文件。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    让我尝试解释一下 NVIC。

    ARM 创建了一个 NVIC、支持可配置的位数(最多8个)来确定优先级和子优先级。 在 TI 针对 TM4C 器件的实施方案中、我们实施了具有3位优先级的 NVIC、即位7至位5。 位4到0一直读取为0。 这将为您提供8个不同的优先级。 NVIC_APINT 寄存器可以将这8个级别配置为8个优先级、每个级别都有一个子级别。 (这可能会让您感到困惑。 一个子级别表示在该优先级组内、所有中断都处于同一级别。 就像没有子优先级一样。) 其他三个选项为4:2、 四个优先级组和两个子优先级组;2:4、两个优先级组和四个子优先级组;或1:8、所有中断处于同一优先级、但8个不同的子优先级组。

    当多个中断被挂起时、优先级较低的组编号中的中断将首先发生。 它们将优先于具有更高优先级组号的中断服务例程。 如果同一优先级组中有两个挂起的中断、则将首先获取来自较低子优先级组编号的请求。 即使其子优先级数较低、中断请求也不会优先于同一优先级组中的中断例程。  当两个中断请求位于同一子优先级组中时、具有最低异常编号的请求将首先被接收。

    那么、这意味着什么。 在默认配置(8:1)中、优先级较低的中断可以抢占优先级较高的中断的中断服务例程。 具有相同优先级的中断按异常编号的顺序执行、最低编号为最高优先级。 可以通过查看 TivaWare 中的 hw_ints.h 文件来找到异常编号。  对于这个部件,GPIOA 是数字16,GPIOB 是数字17,GPIOC 是数字18,GPIOD 是数字19…… 。 默认情况下、所有值都处于优先级0。 如果来自 GPIOA 和 GPIOB 的中断同时出现、则会首先处理来自 GPIOA 的中断、因为它的数量较少。 该中断例程将结束并尾(不返回主代码)进入 GPIOB 的中断例程。

    现在、假设我们要使 GPIOB 成为一个优先级更高的中断、它可以取代 GPIOA 中断例程。 然后调用:

    IntPrioritySet (INT_GPIOA、1U <<5U);
    

    这将把 GPIOA 中断设置为优先级1、将 GPIOB 中断保持在优先级0。 请注意、我们必须执行"<< 5"、因为为优先级实现的三个位是位7:6。  当然、您可以使用定义来使"1U << 5U"更具可读性、例如:

    #define INT_PRIORY_LEVEL1 (1U<<5U)
    

    现在、假设我希望在 GPIOA 之前为 GPIOC 提供服务、但不要抢占它。 但是、我仍然希望 GPIOB 优先于任一个。 这是我使用子优先级的地方。 我使用了#define 来提高可读性、但请注意、GPIOA 设置为3级、GPIOC 设置为2级、GPIOB 保留为0级。 由于最低有效位用于子优先级、因此2级和3级现在处于同一优先级、但子优先级不同:

    #define INT_PRI1_SUB0 ((1U<<6U)|(0U<<5U)
    )#define INT_PRI1_SUB1 ((1U<<6U)|(1U<<5U))
    
    // 2位优先级、1位子优先级4:2
    IntPriorityGroupingSet (2U);
    IntPrioritySet (INT_GPIOA、INT_PRI1_SUB1);
    IntPrioritySet (INT_GPIOC、INT_PRI1_SUB0);
    

     我希望这将其清除。

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

    尊敬的 Bob:

    [引用 user="Bob Crosby"> NVIC_APINT 寄存器可将这8个级别配置为8个优先级、每个级别具有单个子级别。 (这可能会让您感到困惑。 一个子级别表示在该优先级组内、所有中断都处于同一级别[/QUERPLET]

    这并不是很令人困惑、只是看起来不 像描述 的那样工作、当较快的中断优先级 以某种方式加速 NVIC 时、具有较慢中断的较低优先级组的速度会加快20-2200Hz。 中断上下文之间用于确定具有   1个子优先级的同一优先级组中的边沿(计数/时间)的预设时间会混乱、 异常编号不 会调节与应用程序同步的嵌套速度。 这个分组方法与 Stellaris 中的 M3 NVIC 使用的方法相同、但具有更多优先级组。 但是、有问题的定时器和中断上下文异常存在于同一低优先级0x40。 只有 PWM0、ADC0和 1序列发生   器等较快的外设在优先级高于0x20的1处存在。

    为了增加带有中断的系统中的优先级控制、NVIC 支持优先级分组。 这会将每个中断优先级寄存器条目分为两个字段:

    •定义组优先级的高字段

    •定义组内子优先级的低字段。

    只有组优先级决定了中断异常的抢占。 当处理器正在执行一个中断异常处理程序时、另一个组优先级与正在处理的中断相同的中断不会取代该处理程序、  

    "事实证明、这是不真实的、因为边缘计数器异常被禁用、并且在 合并上下文中的 TBILR 加载值在500ms 后重新启用之前仍然允许重新进入、具有 GPTM03 OneShot 的 GPTM0B 也首次同步。"

    如果多个挂起的中断具有相同的组优先级、那么子优先级域决定它们的处理顺序。 如果多个挂起的中断具有相同的组优先级和子优先级、则首先处理 IRQ 编号最小的中断。

    每个定时器模式 加速的问题可能与 NVIC 优先级处理无关。  同样、即使 GPTM 和 SysTick 的边沿时间也 不能保持相当一致 的处理程序执行、因为没有发生任何新的情况。  

    [引用 user="Bob Crosby"]由于最低有效位用于子优先级,因此级别2和级别3现在处于相同的优先级,但子优先级不同:

    然而  、7:5拆分(bxxx.none)中没有任何子优先级位、只有8个优先级组 和 1个子优先 级是 优先级拆分组中的中断异常编号、表3-9。  因此、您说的2U 分组1个额外的子优先级位、但 应用 程序具有近26个中断和 拆分(bxx.y)、例如0x80/0xE0 将不适用于  其他7个优先级组、有更多例外。 同样不难想象 TM4C1294 M4v7在有 126个中断时会拉低半字节[4:0]吗? 这种情况是如何发生的、或者我在下面描述的内容可能与 NVIC 无关?  我 不相信我们可以在   RE58中的几个位拆分之间切换 并保持8个优先级组、很遗憾、在这个问题中、您的2U 拆分点有点模糊。

    针对边沿时间捕获故障发布了新问题:

     

     

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

    BTW:您的4:0两个优先级 INT_PRI_SUB0 = 0x80且 INT_PRI_SUB1 = 0xE0。 也是7:5拆分  8个主要组的一部分。 126个中断的两个优先级1子位确实是 SAD。  同样、26个中断8组7:5 SPLIT 是拓扑中断异常排序。 这不是一 个示例应用、它是一个真实的器件、 边缘计数/时间似乎无法保持。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以看到、除了简单的2U 子优先级外、还有许多其他优先级。 此外、为了进一步解决16-32个子优先级的争议、NVIC 处理结果将优于1个子优先级(bxxx.none)。 我的投票是16票,甚至更好32票,为什么每一个例外都能主张256个优先级?

    TM4C1294 M4v7似乎愚蠢地将 AIRCR PRIGROUP 字段限制为3位、这是通过工厂添加嵌入式代码实现的。 链上较高的人不知道简单的3位拆分会导致 NVIC 嵌套和尾链有限的1个子库处理问题。 这种情况5使 GPTM 全部竞争 CPU 时间片、并保持 NVIC 嵌套和 MSP 堆栈顺序与这些处理程序中应用代码的 AHB 仲裁同步。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    反向跟踪表明、Stellaris LM3S8971 M3 Cortex NVIC 具有与 Tiva M4v7 Cortex NVIC 非常相同的优先级分组。 同样非常奇怪的是、中断子优先级字段位[7:5]的限制完全相同、尽管 TM4C1294的外设数量是原来的3倍。

    产生怀疑优先级顺序的欺骗是边沿计数始终生成精确匹配计数结果(GPTM_TNR)、而不管 CCP 输入的频率如何。 否则、由于较高优先级组发出中断的频率变化、边沿计数中断的加速度会加快。 因此、AHB 频率噪声在内部或外部似乎是计数加速和噪声源的问题、入侵的输入引脚保持不透明。