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.

[参考译文] SYS/BIOS 6.76.02.02:c28\TaskSupport.c 中的任务堆栈检查确实发生了#39;n 对我来说有意义

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/874995/sys-bios-6-76-02-02-task-stack-check-in-c28-tasksupport-c-is-does-n-make-sense-to-me

Thread 中讨论的其他器件:SYSBIOS

您好!

在 SYS/BIOS 文件"C:\ti\BIOS_6_76_02_02\packages/ti\sysBIOS\family\c28\TaskSupport.c (第113行)中、任务堆栈配置的验证如下:

/*
SP 寄存器在28x 上只有16位。 确保
新堆栈中的最后一个地址*小于0xFFFF
*/
if ((((Ulong) tsk->stack)+(tsk->STACKSIZE)>= MAX_SP_ADDR){
ERROR_RAISE (EB、TaskSupport_E_invalidStack、tsk->stack、0);
返回(空); 

在我的情况下、此检查失败、因为堆栈从地址0xFF00开始、大小为256。 但从我的角度来看、这应该是有效的、因为堆栈从地址0xFF00变为地址0xFFFF、该地址仍然是16位、并且位于控制器的内部 RAM 中。

因此、从我的角度来看、正确的代码应如下所示:

/*
SP 寄存器在28x 上只有16位。 确保
新堆栈中的最后地址*不大于0xFFFF
*/
if ((((Ulong) tsk->stack)+(tsk->STACKSIZE)>(MAX_SP_ADDR + 1U){
ERROR_RAISE (EB、TaskSupport_E_invalidStack、tsk->stack、0);
返回(空); 

此致、

Matthias

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

    H、

    感谢您访问 C2000 e2e 论坛。 您的帖子已分配给 TI 员工、您可以在接下来的24小时内收到回复。  

    此致

    Pramod

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

    Matthias、

    我看到你说什么。  我想向工程师确认、没有其他原因可以说明这是什么原因。

    犹大

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

    Matthias、

    在我们进一步研究这个问题之后,我们认为逻辑是正确的。

    C28x 需要偶数地址堆栈对齐。  因此、堆栈可能的最大地址实际上是0xFFFE。
    这就是为什么要检查逻辑以确保我们小于0xFFFF 的原因。

    犹大

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

    你好,犹大,

    感谢您的回答。 我理解您的解释! 但是,为了避免出现我所面临的情况,我想提出另一个扩大的建议,即改善条件:

    /* SP 寄存器在28x 上只有16位。 确保
    新堆栈中的最后一个地址*小于0xFFFF、并且堆栈从偶数地址开始。
    //
    if ((0U!=(tsk->stack & 0x0001U)
    ||((((Ulong) tsk->stack)+(Ulong) tsk->STACKSIZE)>(((Ulong) MAX_SP_ADDR + 1UL)){
    ERROR_RAISE (EB、TaskSupport_E_invalidStack、tsk->stack、0);
    返回(空); 

    如果您不同意、请至少使用您向我提供的说明更新描述。

    谢谢、此致、

    Matthias

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

    Matthias、

    很抱歉耽误你的回答。  我们计划更新评论以明确说明这一点。

    犹大