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:Hwi 堆栈会破坏我的堆栈

Guru**** 2540720 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/571322/rtos-hwi-stack-corrupts-my-stack

工具/软件:TI-RTOS





当我在 main ()中创建了以下类对象时,
我发出了运行时错误、当我对其进行调试时、我看到对象被破坏
Hwi ISR 堆栈。 我在中观察到这两个情况
内存视图、并通过将硬件断点放置到堆栈顶。为了进行双校验、我在类中放置了一个虚拟数组(stackProtectBuffer)、
我看到阵列也出现了问题。 虚拟阵列解决了我的运行时问题
问题。

类 SmConfigCls:公共 ActiveCls{
 
   公共:
 
       InterCoreCls InterCoreObj;
       SystemManagerCls systemManagerObj;
       SensorCls SensorsObj;
       特派团计算机特派团计算机目标;
       维护性维护性维护性对象
       BitCls bitObj;
       ViewCls viewObj;
       char stackProtectBuffer[1024];
 
 
 
 
   专用:
       void initRelations();
 
   公共:
       SmConfigCls():
               InterCoreObj (CoreEnu_systemManager)、
                       ActiveCls (4)
       {
           memset (stackProtectBuffer、0、sizeof (stackProtectBuffer));
           initRelations();
       }
 
       void* Run();
};



int main (int cmdCount、char*命令[]){
 
   SmConfigCls SM;
 
   BIOS_start();/*不返回*/
   返回(0);




我认为内核中可能有一个错误。 请查看以下各行
在系列/c64p/Hwi.c 中

   Hwi_module->isrStack = Hwi_getIsrStackAddress()-8;

   HWI_MODULE->taskSP =(Char *)-1;//*上执行的信号
                                       /* ISR 堆栈*/

这里是同一个文件中的 Hwi_getIsrStackAddress 函数。

char * Hwi_getIsrStackAddress()

   _extern __far__ char _stack[8];
   _extern __far__ uint8 __TI_STACK_SIZE;
   uint32 isrStack;

   isrStack =(uint32)_stack;
   isrStack +=(uint32)&_TI_STACK_SIZE;
   isrStack = 0x1;

   isrStack &=~0x7;  /*与长字对齐*/

   返回((Char *) isrStack);



根据我的理解、Hwi 堆栈被放置在 Program.stack 上、我认为上述代码中可能存在错误?

我的设备是6678、BIOS 版本是6.46.0.23。 C6000编译器版本为8.1.1、但我也尝试了7.4.11。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否尝试增大堆栈的大小。 您可以使用的内容比您所意识到的要多。

    Todd
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我的意思是将 hwi 堆栈放置在 portam.stack 开始的位置正上方(不是编程.stack+ stack_size)。
    是的、我使其足够大(64 MB)、这远远小于我的应用程序需要。
    我也对这一表达感到好奇
    isrStack =(uint32)_stack;
    isrStack +=(uint32)&_TI_STACK_SIZE;
    isrStack = 0x1;

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

    一旦你调用 BIOS_start()函数、main()中的任何局部变量都会根据你观察到的内容被隐式地"释放"- main()正在 Hwi 堆栈上运行(或者更正确的是、在随后被 Hwi 接管的 C 堆栈上运行)。  调用 BIOS_start()后,不能使用 main()中的 C++本地 var。  您应该将其转换为全局范围。

    [引用 user="napysothere">我也对该表达式很好奇
    isrStack =(uint32)_stack;
    isrStack +=(uint32)&_TI_STACK_SIZE;
    isrStack -= 0x1;[/quot]

    这个代码正在寻找 Hwi 堆栈上最顶部字节的地址(向下增长)。

    此致、

    - Rob

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢 Rob。 这一回答也澄清了我的其他回答不好的人:
    e2e.ti.com/.../567988
    e2e.ti.com/.../569901

    所有问题都是因为这个问题。

    我希望您在深入了解详细调试之前已经看过这些线程。 再次感谢。

    您是否要更改此行为、或者我是否应该使用全局创建解决方案?
    顺便说一下、由于我很喜欢不使用全局变量、因此我在 main 内创建了 SmConfigObj 静态变量、
    这个也起了作用。 你确认了吗? main()中的静态对象就其性质和而言类似于全局变量
    使用.data 段、但不使用 Program.stack?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    所有问题都是由于这个问题造成的。

    我希望您在深入了解详细调试之前已经看过这些线程。 再次感谢。[/引述]

    不用客气、我很高兴。

    我们采用轮岗支持系统、这是我的一周、因此在您发布其他主题帖时、我没有关注论坛问题。  但其中一 个成员确实提到在调用 BIOS_start()时会擦除 main()中的非静态局部变量。

    您是要更改此行为,还是应该使用全局创建工作?

    没有计划更改此 C 堆栈重复使用行为。

    [引用 user="napysothere">顺便说一下、由于我很喜欢不使用全局变量、因此我在 main 内创建了 SmConfigObj 静态变量、
    这个也起了作用。 你确认了吗? main()中的静态对象就其性质和而言类似于全局变量
    使用.data 段、但不使用 Program.stack?[/quot]

    这是不使用全局变量的明智方法。

    我可以确认,使用 main()中的静态局部变量是一个很好的解决方案,因为它们不是在栈上分配的。

    此致、

    - Rob

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