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.

[参考译文] CCS/TM4C129ENCPDT:如何控制堆栈大小

Guru**** 2585275 points
Other Parts Discussed in Thread: TM4C129ENCPDT

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/602262/ccs-tm4c129encpdt-how-to-control-stack-size

零件号:TM4C129ENCPDT

工具/软件:Code Composer Studio

我们正在尝试确定如何控制堆栈的大小。

我们正在使用CCSv7版本7.1 .0.0.0016万 ,并使用两个不同的编译器工具链来构建我们的项目: TI-CGT-ARM_CCSV.3.LTS 16.9 和 gcc-AR臂-NONE-eabi-4_9-2015q3。

很明显,我们的项目是使用512字节的默认堆栈大小创建的。 假设我们希望将其增加到4096个。

对于TI链接器,我们将设置“Set C system stack size (--stack_size,-stack)”更改为4096,如屏幕截图所示。 但是,这似乎不是故事的结尾。 我们的项目包含链接器命令文件tm4c129encpdt.cmd,它包含行“__stack_top =__stack + 512”;“CCS似乎从C:\ti\ccsv7\cmd_base\arm\include\tm4c129encpdt.css将此文件复制到我们的项目中,因为这两个文件是相同的,并且都包含这一行。 将项目的链接器设置从512更改为4096似乎不会自动更新此文件。  __stack_top用于启动c文件中矢量表的第0条目。

对于GCC链接器,堆栈大小似乎没有任何项目设置。 在这种情况下,我们有一个链接器命令文件tm4c129encpdt.lds和我们的启动文件tm4c129encpdt_startup gcc.cc. 链接程序命令文件似乎根本不处理堆栈大小,而启动c文件包含"static UINT32_t pui32Stack[128];"行,并且对于向量表,使用sizeof()计算初始堆栈指针。

因此,我们的问题是:

(1)对于TI链接器,我们是否需要在两个位置更新堆栈大小:项目设置和链接器命令文件中的__stack_top行? 是否有其他地方需要更新?

(2)对于GCC编译器/链接器,更新"static UINT32_t pui32Stack[128];"行是否足够? 是否有其他地方需要更新?

(3)无论采用哪一种方法,我们如何确定堆栈大小是否确实设置正确?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我忘了提到我们没有使用TI RTOS。 此时,我们只是使用TivaWare。

    另一个问题:链接程序命令文件中的__stack_top行是否与C启动文件中引用的行相同? C文件识别链接程序文件中声明的符号似乎有点奇怪。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,
    TM4C论坛中有一个相关的主题:
    e2e.ti.com/.../42.8953万

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

    对不起,我忽略了关于TI编译器的问题:

    (1)对于TI链接器,我们是否需要在以下两个位置更新堆栈大小:项目设置和链接器命令文件中的__stack_top行? 是否还有其他地方需要更新?[/QUOT]

    是的,我相信您是对的。 下面的线程中也提到了它:

    https://e2e.ti.com/support/microcontrollers/tiva_arm/f/908/p/41.393万/1476356#1476356</s>147.6356万 147.6356万

    KI

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的,您链接的线程提到了相同的内容。 堆栈大小似乎必须在两个位置更新,如果它们不同步,将会导致问题。 但也许有一种方法可以简化这一过程。 对于TI链接器,链接器似乎根据它收到的--stack-size参数创建了一个特殊的变量__stack_size,我认为,您可以使用这个__stack_size,而不是使用硬编码数字。 因此,只需在一个位置更新设置。 当然,我只想**可能是这样。 目前我还没有尝试过。 现在,该程序在使用TI工具链编译时运行。

    但我在GCC构建配置方面遇到了一个大问题。 似乎无论我提供了什么堆栈大小(在C启动文件的"static UINT32_t pui32Stack[128];"行中指定),除非我遗漏了一些内容,否则在第一次返回函数时,程序都会进入FaultISR。 这让我相信堆栈中有一些东西是混乱的。 到目前为止,NVIC寄存器显示它由于指令总线错误而崩溃。 我真的认为它正在尝试从函数返回到某个垃圾地址。 我想看看程序第一次启动并到达main()时SP (堆栈指针)是什么。 使用TI编译时,它是0x2万E30;使用GCC编译时,它是0x2000.1358万,大大增加了数字。 我不知道为什么会这样。 是否应该有一些指令将堆栈放置在特定位置? 因为,只要声明pui32Stack[128],就会将堆栈置于任何“随机”位置,并且可能会从一个版本更改为下一个版本。 我在任何地方都看不到任何东西,这就告诉了我该去哪里。