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/TM4C1294NCPDT:ISR 处理程序问题-堆栈超出边界

Guru**** 2440240 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/616543/rtos-tm4c1294ncpdt-isr-handler-issue---stack-out-of-boundary

器件型号:TM4C1294NCPDT
Thread 中讨论的其他器件:SYSBIOS

工具/软件:TI-RTOS

您好!

我的应用程序上正在运行多个任务、它们使用邮箱和事件进行进程间通信。

我还有  一个用于 GPIO 中断的 ISR 处理程序、然后是另一个任务。

我正在 ISR 处理程序中发布事件、并在另一个任务上发布相同的事件挂起。 如果我的应用程序只有 ISR、然后是任务、那么只要发生 GPIO 中断、它就可以正常工作。

在另一种情况下、将随应用程序一起添加相同的 ISR 和任务。 除了 ISR 之外、我的应用中还有10个任务正在运行、它们也在使用事件和邮箱通信。 在这种情况下、所有操作都正常、直到 GPIO 中断发生。 ISR 和任务在发出中断后执行、并通过抛出栈错误立即从执行中退出。 即 堆栈超出边界。 此堆栈错误属于 ISR 之后的任务。 我增加了堆栈大小、但没有解决任何问题、问题仍然存在。

原因可能是什么。

注意:我已检查了更改任务优先级以及将所有任务保持在同一优先级。

此致

巴拉

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否使用 ROV 来查看任务和 Hwi 堆栈的堆栈峰值? 以下是查找堆栈溢出的一些调试提示: training.ti.com/debugging-common-application-issues-ti-rtos

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

    我使用断点和观察变量来缩小问题范围。 HWI 上下文中的 Semphore_post 问题。

    当我使用两个任务时、即一个用于 HWI、另一个是正常任务、只要 GPIO 为高电平、我就在 HWI 处理程序中发布信标、而其他任务在 while 循环中运行并等待在 HWI 处理程序中发布的信标挂起。 在这种情况下、我在 HWI 上下文中发布信标没有任何问题。

    当我添加另外10个任务以及这个任务时、信标发布返回错误、表示堆栈超出边界。 我已将系统堆栈增加到8KB、但仍然无法正常工作。

    这里的主要区别在于 Semaphore_post ()函数调用内部、
    文件路径:C:\ti_tirtos_tivac_2_16_01_14\products\BIOS_6_45_02_31\packages/ti\SysBIOS\KNL\Semaphore.c

    /*锁定任务调度程序*/
    tskKey = Task_disable();

    tskKey = 1 (true)工作条件、两个任务正在运行。
    添加更多任务时、tskKey = 0 (false)不工作条件。

    由于此值、Task_restore (tskKey);函数失败并返回堆栈错误。

    我尝试用 Swi_post ()替换 Semaphore_post ()、然后每当中断发生时函数就切换到 SWI 任务、所有其他任务也运行良好。 在这里、我使用了默认系统堆栈、即512字节。

    因此、强烈认为这一问题不是因为堆栈内存不足。

    您能向我推荐这个问题的解决方案吗?

    此致
    巴拉
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是我针对这两种情形的代码。

    /* ISR 处理程序*/
    void DigitalInputISRHandler()


    (*(volatile uint32_t *) clearFlagaddr)= bit_shift;
    GPIO_TOGGLE (Board_LED0);

    /*信标发布以处理数字输入状态*/
    Semaphore_post (DigitalInputProcessing);



    void DigitalInputProcessingFunc()

    while (1)

    Semaphore_pend (DigitalInputProcessing、BIOS_WAIT_Forever);
    GPIO_TOGGLE (Board_LED1);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是如何创建 ISR 的? 通过 Hwi_create (或 Hwi_con构)? 您能否在创建 ISR 的位置发布代码?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Todd、

    我正在使用 XDC GUI 工具创建 HWI。 在 GUI 中创建后、我将在 project.cfg 文件中获取以下代码。

    /*========================= 应用程序特定实例========================= *
    var halHwi0Params = new halHwi.Params ();
    halHwi0Params.instance.name ="DigitalInputISRHandler";
    program.global.DigitalInputISRHandler = halHwi.create (空、"&DigitalInputISRHandlerFunc"、halHwi0Params);

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

    我不确定正在发生什么情况。 再次阅读该主题后、我注意到您没有明确表示您增加了任务堆栈大小。 您能否确认使用了多少任务堆栈空间? 您可以在 ROV->Task->Details 视图中看到这一点。

    Todd

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Todd、
    我已将系统堆栈增加到8096字节并进行检查、因为 HWI ISR 处理程序使用系统堆栈。 默认情况下为512字节。 其余所有其他任务都使用默认堆栈大小512字节。

    此致
    巴拉
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否在任何地方禁用任务?

    1.能否附上 ROV->Tasks->Detailed 的图片,并确保包含整个视图。
    2.能否附上 ROV->Tasks->Module 的图片,并确保包含整个视图。
    3.您能否附上您看到的堆栈错误的图片?

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

    您好 Todd、

    请查看以下所需商品图片。

    堆栈错误

    任务详细视图

    任务模块视图

    此致

    巴拉

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

    您好、Bala、

    第一个问题似乎是尝试创建重复的 ISR。

    在 ROV->Hwi->Basic 中查看中断67是什么以及您尝试再次创建中断67的原因。

    Todd

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

    您好 Todd、

    我不会将此 HWI 用于我的项目及其默认分配。 如果在我的项目中没有为 GPIO 中断定义 HWI、我将不会收到此警告。 如果我将任何 GPIO 端口定义为 HWI 的中断源、那么我将收到相同的警告。 因此、这次我尝试更改中断源端口 H、矢量编号为48、而不是67。 然后、我也会收到相同的警告。 我已附加快照供您参考。

    此致

    巴拉

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

    所有图像看起来都是相同的。 我希望这是一个 e2e 论坛问题。 我发现您无法发布相同的文件名、即使在发布时图像不同。 是否可以放入 ROV->Hwi->Detailed snapshot? 或者、如果您有 CCS 7.2或更高版本、请打开 Tools->Runtime Object View->Hwi->Detailed 并将输出保存到文件中并附加该文件。

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

    您好 Todd、

    请找到以下 ROV->HWI 详细视图的快照。 此快照在出现堆栈错误后。 即 GPIO 中断之后。

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

    巴拉

    这是 ROV->Task->Detailed View。 是否可以附加 ROV->Hwi->Detailed?

    Todd

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

    抱歉 Todd、上传错误。 这次是正确的。

    此致

    巴拉

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这不是很好。 矢量表看起来会混乱。 我没有 Sem_i2c_handle 是一个 Hwi 函数。 有什么想法呢? 当您在 main 中时、您能否查看此视图? 如果情况良好、可能需要在应用中设置一些断点以确定何时发生这种损坏。

    Todd
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Todd、
    我在其中一个任务中使用此 i2c_handle 函数、但我没有专门指定为 Hwi 函数。 当我调用 i2c 相关函数时、它会自动出现。

    另一个观察结果是堆栈错误。

    当我在我的应用中使用少于4个事件/信号量时、没有堆栈错误。 如果我使用的内容超过此值、我将获取堆栈错误、我在该主题前面提到过该错误。

    使用信标/事件/邮箱的数量是否有任何限制?
    如果我们需要使用更多的资源、那么需要在 TI RTOS 中调整哪些参数?

    此致
    巴拉
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    没有限制。 当你在 main()的开头停止时,ROV->Hwi->详细信息看起来是什么样子的? 调用 BIOS_start 函程序之前会怎么样? 在您呼叫任何驾驶员未接通呼叫之前和之后会怎么样? 我希望您的某个位置有一个错误的指针、并且您正在破坏内存。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Todd、

    很抱歉插入这里、但我想问您如何判断矢量表已损坏? 是因为 intNum / Priority / group / subPriority 全部为零吗?

    我有一种类似的情况(从主程序开始)、其中一个中断-其函数名仅显示为'_asm_'、所有的中断都保留零、其地址仅包含零。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Stan、

    重要提示是、Sem_i2c_handle 是多个实例的 Hwi 函数。 这看起来太自私了。 所有的零也不是一个好的符号。 注意:某些版本的 ROV (实际上是 XDCtools)在构建之前不能很好地处理已构建的对象。 例如、如果你有一个 Semaphore_Structt 或 Hwi_Structt 全局变量、ROV 可能在它被构建前不能正确显示它。 根据结构的位置、它甚至可能不会显示。 创建的对象不存在此问题。 下面是有关创建对象与构造对象的讨论: processors.wiki.ti.com/.../TI-RTOS_Object_Creation_Comparison

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

    我没有找到这一问题的确切根本原因。 但我删除了 HWI 处理程序并在 GUI 工具中再次创建、现在可以正常工作。 我只是想知道现在的情况是如何运行的?

    此致
    巴拉