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.

[参考译文] 回复:TM4C1290NCPDT:分配中断子组优先级

Guru**** 2524480 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/876838/re-tm4c1290ncpdt-assigning-interrupt-sub-group-priorties

答复: https://e2e.ti.com/support/microcontrollers/other/f/908/t/874371

[引用 user="Bob Crosby"]数据表第171页的表格显示了组优先级和子优先级之间的权衡:

然而、Tivaware 状态组3-7与组0-2具有相同的效果、似乎与表3-9相反。 该表很有意义,但 IntPriorityGroupSet()使参数与表3-9完全相反。 谁先到了?  

//
//
//! 设置中断控制器的优先级分组。
//!
//! \param ui32Bits 指定可抢占优先级的位数。
//!
//! 此函数指定可抢占优先级和
//! 中断优先级规范中的子优先级。 //!的范围
分组值取决于硬件实现;开
//! Tiva C 和 E 系列三位可用于硬件
//! 中断优先级、因此优先级分组值为3
//! 到7具有相同的效果。
//!
//! \b 示例:为中断控制器设置优先级分组。
//!
//! 逐字记录
//! //
//! //将中断控制器的优先级分组设置为3位。
//! //
//! IntPriorityGroupingSet (2);
//!
//! \n 逐字记录 

 

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

    [引用 USER="GL"]但是 Tivaware 状态组3-7与组0-2具有相同的效果[/引用]

    您是否参考了以下评论?

    [引用 USER="GL"]硬件中断优先级划分有三个位,因此优先级分组值3到7具有相同的效果[/引用]  

    第二条语句不讨论组号,而是传递给函数 IntPriorityGroupinSet()的值。 该值决定了多少优先级位被用于可抢占组。 由于只实现了三个位、因此指定大于三的值仍然只提供三个位来确定可抢占组。   

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

    [引用 user="Bob Crosby"]第二条语句不讨论组号,而是传递给函数 IntPriorityGroupinSet()的值。

    因此、数据表表表中的组编号0x0 - 0x4与 Tivaware 函数调用不匹配、以便混淆所有人? 由于这些组与较新的 TM4C 表不匹配、因此旧的分组顺序可能会从 StellarisWare 迁移中保留。   

    [引用 user="Bob Crosby"]大于三位仍只能提供三位来确定可抢占组。

    然而、当我尝试为具有23个中断的8个子优先级组设置 IntPriorityGroupingSet(2)时、它会导致奇数故障。 但是、对于子优先级组0x0、0x20、0x40、0x60、0x80、 0xE0。 如果0-2组具有相同的效果、则会导致中断问题、但会导致中断问题。  

    [引用 user="Bob Crosby"]硬件中断优先级划分有三个位,因此优先级分组值3到7具有相同的效果

    如果不能将这些组拆分为子优先级并使我们感到困惑、为什么表中存在3-7;当 Tivaware 函数说明声明其他情况时、整个表是有效的。 奇怪的分组4起作用、分组2似乎根本不起作用。 此外、Tivaware 示例应用配置了优先级分组4、为什么不配置0或2。

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

    奇怪的 interrupt.c PRIGROUP_4_4为0x300为组优先级字段(bxxx)选择3个位。 表3-9字段位(0x0 - 0x4)= 8优先级组1子优先级。 也许,IntPrioritryGroupingSet (2)为什么选择0x500 (bxx.y) PRIGROUP 2_6或4个具有2个子优先级的组。 如表3-9所示、常数名称似乎没有完全拆分、这是 TM4C 的预期值。

    //
    //
    //这是优先级分组编码与
    //抢占优先级位数之间的映射。
    ////
    *****************
    静态常量 uint32_t g_pui32Priority []=
    {
    NVIC_APINT_PRIGROUP_0_8、NVIC_APINT_PRIGROUP_1_7、NVIC_APINT_PRIGROUP_2_6、
    NVIC_APINT_PRIGROUP_3_5、NVIC_APINT_PRIGROUP_4_4、NVIC_APINT_PRIGROUP_5_3、
    NVIC_APINT_PRIGROUP_6_2、NVIC_APINT_PRIGROUP_7_1
    }; 

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

    您将"位字段"与组编号混淆。 它们并不相同。  

    [引用 USER="GL"]但是当我尝试为具有23个中断的8个子优先级组设置 IntPriorityGroupingSet(2)时,它会导致奇数故障。[/引用]

    IntPriorityGroupingSet(2)为可抢占组分配两个位(形成四个可抢占组),并为子优先级保留一个位(为每个组分配两个子优先级)。 如果您认为它会为您提供8个子优先级组、这可能是您遇到奇怪故障的原因。

    [引用 USER="GL]IntPriorityGorupingSet (4)对于子优先级组0x0、0x20、0x40、0x60、0x80、 0xE0。 如果0-2组具有相同的效果、则会导致中断问题、但会导致中断问题。  [/报价]

    IntPriorityGroupingSet(4)将所有3个位分配给可抢占组。 它与 IntPriorityGroupingSet(3)完全相同。 下面是另一种形式的表格、以帮助更明确地说明:

    IntPriorityGroupingSet(0) 没有用于可预存储组的位,8个子优先级组

    IntPriorityGroupingSet(1) 一位用于可预存储组,两个可抢占组,每个组有4个子优先级组

    IntPriorityGroupingSet(2) 两位用于可预存储组,四个可抢占组,每个组有两个子优先级组

    IntPriorityGroupingSet(3) 用于可预存储组的三个位,八个可抢占组,无子优先级组

    IntPriorityGroupingSet(4) 用于可预存储组的三个位,八个可抢占组,无子优先级组

    IntPriorityGroupingSet(5) 用于可预存储组的三位,八个可抢占组,无子优先级组

    IntPriorityGroupingSet(6) 用于可预存储组的三位,八个可抢占组,无子优先级组

    IntPriorityGroupingSet(7) 用于可预存储组的三位,八个可抢占组,无子优先级组

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

    [报价 USER="GL"]表3-9显示的常量名称似乎不完全是拆分的、这是 TM4C 的预期名称。[/QUERT]

    这些定义用于创建 IntPriorityGroupingSet()函数使用的常量表。 名称的含义是组优先级相对于子优先级的位数。 产生混淆的原因是表是为可能的最大位8创建的、但 TM4C 仅实现了3。  

    TivaWare 驱动程序函数 IntPriorityGroupingSet()旨在简化设置可抢占组和子优先级组的数量。  NVIC_APINT_PRIGROUP_x_y 常量用于函数的内部使用、不用作函数的参数。

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

    [引用 user="Bob Crosby">IntPriorityGroupingSet (4)将所有3个位分配给可抢占组。 它与 IntPriorityGroupingSet(3)完全相同。 下面是另一种形式的表格、有助于更清楚地说明:

    因此、数据表的表3-9并未说明第1行最后2列中优先级组和子优先级必须如何存在的事实。

    我将表3-9的第1行读取为0x0 - 0x4、所有这些都会在每个组中产生8个组优先级1个子优先级。 因此、0x0-0x4会根据第1行最后2列产生相同的分组。 仅由一个选择0x0 - 0x4生成表结果是不正确的。 这样做会使所有其他配置无效、并使表的信息量小于信息量、使读者更加困惑。  

    但是优先级组字段的第1列(0x5、0x6、0x7)将产生最后2列中显示的特定分组子顺序。 Tivaware 设置 PRIGROUP 位域[10:8] APINT 寄存器、如下表3-9所示、相对于第一列。 表3-9介绍了 APINT 位[10:8]、而不是用于配置 APINT 寄存器位的 Tivaware 竞争对手。 APINT 的常量在表3-9中显示的相同[10:8]位中有0x000 - 0x004、0x500、0x600、0x700。   

    [引用 user="Bob Crosby"] IntPriorityGroupingSet(2) 用于可预存储组的两位,四个可抢占组,每个组有两个子优先级组  

    这种方式在表3-9中击打了一个孔、大多数人很容易就会忘记从现在开始几个月。

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

    [引用 user="Bob Crosby"]出现这种混乱的原因是表是为最大可能位数8创建的、但 TM4C 仅实现了3。  [/报价]

    那么、表3-9不适用于 TM4C1294 MCU 和其他一些 MCU?

    在以后的数据表版本中是否更正了表3-9、因为具有短期内存损失的读取器可能会忘记6个月后该线程的存在?

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

    忘记新的 Acrobat Reader 已将便签添加到解锁的 PDF 中。 因此、在数据表中添加了新的表3-9组定义作为错误注释。

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

    表3-9是正确的,但第一列是 APINT 寄存器的位字段,而不是传递给 IntPriorityGroupingSet()函数的参数。  

    IntPriorityGroupingSet (7)将导致0被编程到 PRIGROUP 位字段的三个位中、并产生8个组、每个组具有一个子优先级组。

    IntPriorityGroupingSet (6)将导致1被编程到 PRIGROUP 位域的三个位中、并产生8个组、每个组具有一个子优先级组。

    IntPriorityGroupingSet (5)将导致2被编程到 PRIGROUP 位域的三个位中、并产生8个组、每个组具有一个子优先级组。

    IntPriorityGroupingSet (4)将导致3个编程到 PRIGROUP 位域的三个位中、并将产生8个组、每个组具有一个子优先级组。

    IntPriorityGroupingSet (3)将使4被编程到 PRIGROUP 位域的三个位中、并产生8个组、每个组具有一个子优先级组。

    IntPriorityGroupingSet (2)将使5被编程到 PRIGROUP 位域的三个位中、并产生四个组、每个组有两个子优先级组。

    IntPriorityGroupingSet (1)将使6被编程到 PRIGROUP 位域的三个位中、并产生两个组、每个组具有4个子优先级组。

    IntPriorityGroupingSet (0)将导致7被编程到 PRIGROUP 位域的三个位中、并将导致一个包含8个子优先级组的组。

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

    [引用 user="Bob Crosby"]表3-9是正确的,但第一列是 APINT 寄存器的位字段,而不是传递给 IntPriorityGroupingSet()函数的参数。

    再次检查、因为它显示 了地址偏移、并且是位[10:8]的十六进制/二进制代码

    应用程序中断和复位控制(APINT)

    基地址0xE000。E000
    偏移量:0xD0C
    键入 RW、复位0xFA05.0000

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

    没错。 复位后、您有8个组、每个组具有一个子优先级组。

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

    表3-9始终存在明显的可能性、并且 NVIC 的作用更像您在上表列表中所概述的那样。 也许可以编辑上面的0x0来指示1个子优先级。 在每个 组的子优先级中编号最小的中断优先级高于编号较高的中断。 这就是23个中断如何使 NVIC 尾链工作良好的原因、请牢记这一点。

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

    [引用 user="Bob Crosby"]复位后,您有8个组,每个组都有一个子优先级组。

    在前面提到过、已决定测试相同23个中断8组的分组0x0。 接下来发生的是所有中断之间的奇次序相位调整。 0x3-0x4似乎是8组1子优先级、是每个组内的中断编号值。