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.

[参考译文] RTOS/TM4C1290NCZAD:在 uartecho_DK_TM4C129X_TI_TivaTM4C129XNCZAD 示例工程中配置零延迟中断会导致崩溃

Guru**** 2332080 points
Other Parts Discussed in Thread: SYSBIOS, SEGGER
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/598396/rtos-tm4c1290nczad-configuring-zero-latency-interrupt-in-uartecho_dk_tm4c129x_ti_tivatm4c129xnczad-example-project-causes-a-crash

器件型号:TM4C1290NCZAD
Thread 中讨论的其他器件:SYSBIOSSEGGER

工具/软件:TI-RTOS

您好!

我想通过修改 uartecho_DK_TM4C129X_TI_TivaTM4C129XNCZAD 示例项目来测试零延迟中断、但只要我为 UART0中断启用零延迟功能、它就会立即崩溃。

为了使 UART0中断实现零延迟、我修改了以下两项:

在 DK_TM4C129X.c 中、我将 UART0 int 优先级设置为2 << 5

CONST UARTTiva_HWAttrs uartTivaHWAttrs[DK_TM4C129X_UARTCOUNT]={
{
baseAddr = UART0_BASE、
.intNum = INT_UART0、
.intPriority = 2 << 5、
.FlowControl = UART_FlowControl_NONE、
.ringBufPtr = uartTivaRingBuffer[0]、
.ringBufSize = sizeof (uartTivaRingBuffer[0])
}
}; 

在 uartecho.cfg 中、我添加了:

m3Hwi.disablePriority = 96; 

我应用这些更改后、程序就会在 CCS 控制台中使用以下输出开始崩溃:

此示例不会尝试最大程度地减小代码或数据占用空间
启动 UART 回显示例
系统提供商设置为 SysMin。 停止目标以查看 ROV 中的任何 SysMin 内容。
FSR = 0x0000
HFSR = 0x40000000
DFSR = 0x0000000b
MMAR = 0x140f0530
BFAR = 0x140f0530
AFSR = 0x00000000
正在终止执行...

如果我通过将 UART0 int 的优先级更改为3 << 5将 m3Hwi.disablePriority 更改为64来禁用零延迟、则一切都可以再次正常运行。

我缺少什么? 为了使用零延迟中断、是否需要启用/配置其他任何内容?

下面、我随修改附加了示例项目。

e2e.ti.com/.../uartecho.zip

谢谢、

Peter A.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感受您(未回答的帖子)的痛苦。

    输入"零延迟"(论坛顶部)搜索框-将产生大量接近/相似的问题-可能证明是值得的...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    零延迟中断不能进行调度程序调用(例如 Semaphore_post)。 UART 驱动程序调用 Semaphore_post。

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

    谢谢 Todd

    我们是否可以询问支持文档的名称和位置-这使您的回答得以实现?    据我所知-(至少对于4C123系列)-没有出现此类指导。   (此类文档应该来自 ARM -但它们有很多-并且您已经找到/知道"正在播放"的文档。)

    此外,如果可能需要其他限制或特殊的手,那么,那些被"列入名单"和广为宣传的人是否没有意义,这样(许多其他)海报就不会(一个接一个地)落入这种陷阱?

    再次感谢...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    查看 SYS/BIOS (TI-RTOS 内核) API 参考(也称为 CDOC)。 请查看 /docs/Documentation_Overview_tivac.html 并搜索内核运行时 API。 查看 ti.sysbios.family.arm.m3页面并搜索零。 这是警告
    警告
    零延迟中断不由 SYS/BIOS 中断调度程序处理! 相反、它们是直接矢量化的。 因此、由于 Hwi_disable()没有禁用这些中断处理程序、因此这些中断处理程序在它们可以调用的 SYS/BIOS API 方面受到严重限制、必须仔细考虑线程安全! 有关更多详细信息,请参阅 Hwi_disable()和 Hwi.disablePriority 的说明。

    或者更直接的路由: processors.wiki.ti.com/.../BIOS_for_Stellaris_Devices ,您将看到“因此,零延迟中断处理程序不应调用任何 BIOS API。”
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Todd -再次感谢。

    然而-在公司/我的案例中-我们使用多个 ARM MCU -并且不使用任何"供应商锁定"辅助工具。 (BTW -这是一项"客户要求"的要求-根据一家公司无法随时提供最佳设备的理论!)

    我们采用了多席位付费 IAR 和 Segger 调试/程序工具、并且可能会采用 FreeRTOS、但绝不会有任何"供应商锁定"的人工操作。

    从一个相当近期(即昨天)阅读的精益@ ARM 站点(我相信、即使来自不同供应商的 Cortex M3/M4系列器件的行为也具有很强的通用性)开始。 (出于 ARM 的意图)

    我假设这一限制(可能)是您公司的 RTOS/SYSBIOS 所特有的。 (另一个)访问 ARM 站点-和搜索...可以更好地确认这一点。 再次感谢您...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    SYS/BIOS 根据设计管理矢量表。 与大多数情况一样、这种方法有优缺点。 主要的优点是、从用户角度来看、整个 TI 处理器系列(CortexA、CortexM、MSP、C5x、C6x、 C2000等)。 我们知道、对于某些应用、它们不希望在特定中断上产生任何开销。 对于这些用例、我们建议使用(SYS/BIOS 所调用的)零延迟中断(具有标注的限制)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    对那些可能接受/向"单一供应商"(始终且仅限)表示感谢、并且肯定统一是有意义的。

    感谢您的评论和见解。

    您可能会认为、我的公司等用户(需要从多个来源(即该产品/项目的"选择标准矩阵"下的最佳来源)选择/支持 ARM MCU)将(必然)避免使用任何此类"供应商锁定"方法、因为它们证明"不可转让"。    (并将防止重复使用、并在这种"广泛"(多源代码) MCU 知识库的基础上进一步"构建")  

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

    [引用 user="ToddMullanix"]对于这些用例,我们建议使用(SYS/BIOS 调用的内容)零延迟中断(具有指定的限制)。

    供他人参考的侧注。 其他 RTK/RTOS 工具将调用这些非受管中断。 此处的 TI 命名规则有些奇怪、甚至会产生误导。

    许多 RTK 都实现了涉及中断处理的多级方法

    1. 非托管中断
      1. 正常中断。 不要保存 RTK 环境,所以不能进行 RTK 呼叫,也不能只进行一到两个非常受限的设置(比如设置信标)。 这些器件的开销很低、但由于它们无法与主应用程序通信、因此它们的使用受到了非常严格的限制。
    2. 受管中断
      1. 这是通用中断结构。 它们保存了足够的上下文,允许使用 RTK 呼叫的子集。 通常、该子集包括信标、FIFO、队列等。 它们依靠触发其他线程来完成 RTK 优先级方案中的大部分工作。
    3. 高/中断/快速优先级线程
      1. 可由受管中断触发的特殊高优先级线程。 他们可以访问完整的 RTK 呼叫集。
    4. 正常实时线程

    任何特定的 RTK/RTOS 都可能具有上述变化的某些子集。

    Robert

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

    我同意零延迟有点误导。 我将打开一个增强请求、以便在文档中更清晰地显示。

    感谢您的反馈!

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

    您好!

    非常感谢您的回答。

    我能够将 GPIO P1引脚中断配置为零延迟。 但是、当我使用 TI-RTOS 的 GPIO_init()函数和相关结构配置 P1引脚时、我无法使其正常工作(请参阅下面的代码)。 仅当我使用直接 Tivaware 调用(示例如下)配置 P1引脚时、我才能够将其用作零延迟 int。

    这不起作用:

    GPIO_PinConfig gpioPinConfigs[]={
    /*输入引脚*/
    /* DK_TM4C129X_button_select */
    GPIOTIVA_PP_1 | GPIO_CFG_IN_pu、
    /* DK_TM4C129X_button_up */
    GPIOTIVA_PN_3 | GPIO_CFG_IN_pu | GPIO_CFG_IN_INT_RISING、
    /* DK_TM4C129X_button_down */
    GPIOTIVA_PE_5 | GPIO_CFG_IN_pu | GPIO_CFG_IN_INT_RISING、
    
    
    
    /*输出引脚*/
    /* DK_TM4C129X_LED_G */
    GPIOTIVA_PQ_7 | GPIO_CFG_OUT_STD | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW、
    /* DK_TM4C129X_LED_B */
    GPIOTIVA_PQ_4 | GPIO_CFG_OUT_STD | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW、
    /* DK_TM4C129X_LED_R */
    GPIOTIVA_PN_5 | GPIO_CFG_OUT_STD | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW
    };
    
    GPIO_CallbackFxn gpioCallbackFunctions[]={
    空、// DK_TM4C129X_button_select */
    空、/* DK_TM4C129X_button_up */
    空/* DK_TM4C129X_button_down */
    };
    
    
    const GPIOTIVA_Config GPIOTIVA_config ={
    .pinConfigs =(GPIO_PinConfig *) gpioPinConfigs、
    .callback =(GPIO_CallbackFxn *) gpioCallbackFuncions、
    numberOfPinConfigs = sizeof (gpioPinConfigs)/sizeof (GPIO_PinConfig)、
    numberOfCallbacks = sizeof (gpioCallbackFuncions)/sizeof (GPIO_CallbackFxn)、
    .intPriority = 7 << 5
    };
    
    
    ......
    
    /*初始化外设和引脚*/
    GPIO_init ();
    
    //配置零延迟 int
    Error_Block EB;
    ERROR_INIT (&EB);
    
    Hwi_Params 参数;
    Hwi_Params_init (params);
    params.enableInt = true;
    params.priority = 1 << 5;
    
    Hwi_create (INT_GPIOP1、SelectButtonCb、&params、&EB); 

    这起作用了:

    GPIO_PinConfig gpioPinConfigs[]={
    /*输入引脚*/
    /* DK_TM4C129X_button_select *//GPIOTIVA_PP_1
    | GPIO_CFG_IN_pu、
    /* DK_TM4C129X_button_up */
    GPIOTIVA_PN_3 | GPIO_CFG_IN_pu | GPIO_CFG_IN_INT_RISING、
    /* DK_TM4C129X_button_down */
    GPIOTIVA_PE_5 | GPIO_CFG_IN_pu | GPIO_CFG_IN_INT_RISING、
    
    
    
    /*输出引脚*/
    /* DK_TM4C129X_LED_G */
    GPIOTIVA_PQ_7 | GPIO_CFG_OUT_STD | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW、
    /* DK_TM4C129X_LED_B */
    GPIOTIVA_PQ_4 | GPIO_CFG_OUT_STD | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW、
    /* DK_TM4C129X_LED_R */
    GPIOTIVA_PN_5 | GPIO_CFG_OUT_STD | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW
    };
    
    
    GPIO_CallbackFxn gpioCallbackFunctions[]={
    //NULL、/* DK_TM4C129X_button_select *
    空、/* DK_TM4C129X_button_up */
    空/* DK_TM4C129X_button_down */
    };
    
    /*特定于器件的 GPIO_config 结构*/
    const GPIOTIVA_Config GPIOTiva_config ={
    .pinConfigs =(GPIO_PinConfig *) gpioPinConfigs、
    .callback =(GPIO_CallbackFxn *) gpioCallbackFuncions、
    numberOfPinConfigs = sizeof (gpioPinConfigs)/sizeof (GPIO_PinConfig)、
    numberOfCallbacks = sizeof (gpioCallbackFuncions)/sizeof (GPIO_CallbackFxn)、
    .intPriority = 7<< 5
    };..........
    
    
    
    
    /*初始化外设和引脚*/
    GPIO_init();
    
    
    //选择按钮配置
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOP);
    SysCtlDelay (2);
    GPIOPinTypeGPIOInput (GPIO_PORTP_BASE、GPIO_PIN_1);
    GPIOIntTypeSet (GPIO_PORTP_BASE、GPIO_PIN_1、GPIO_RISE_EDGE);
    GPIOIntEnable (GPIO_PORTP_BASE、GPIO_INT_PIN_1);
    
    
    ERROR_Block EB;
    ERROR_INIT (&EB);
    
    Hwi_Params 参数;
    Hwi_Params_init (params);
    params.enableInt = true;
    params.priority = 1 << 5;
    
    Hwi_create (INT_GPIOP1、SelectButtonCb、&params、&EB); 

    这是通过设计实现的吗? 或者我是否缺少了什么?

    我还注意到、当我在零延迟中断内调用 Hwi_disable()和 Hwi_restore 时、它有时不起作用。 正常中断不会被禁用或恢复。

    在零延迟 INT 的情况下使用这些函数是否有任何限制?

    请在下面查找我的项目以供参考。

    e2e.ti.com/.../uartecho_5F00_zerolatency.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您不能从零延迟中断调用 Hwi_disable/restore。

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

    我之前的帖子中的第一个问题是什么?

    我是否可以使用 GPIO_init()和相关结构来配置输入引脚,然后使用具有足够中断优先级的 Hwi_create()来为该引脚配置零延迟中断?
    或者、我是否必须使用直接 Tivaware 调用来配置将用作零延迟中断源的引脚?