C-定义堆栈指针地址的人



在带有C启动代码的微控制器和嵌入式系统方面,C启动代码的功能之一是初始化堆栈指针。

这个初始堆栈指针地址和C启动代码通常由芯片供应商定义和提供?

还是作为固件/软件开发人员手动修改或创建C启动代码并指定堆栈指针的固件/软件开发人员?这部分使我感到困惑。

每个体系结构都这样做。ARM Cortex UC的初始堆栈指针位置存储为矢量表中的第一个32位值。启动UC时,硬件加载了此值。因此,该地址由程序员完全控制。

然后,启动例程可以更改或设置双堆栈(一个用于特权模式的线程另一个线程)。

RAM中的堆栈位置几乎总是可以通过软件配置。在您的工具链特定的链接器脚本中,将有一个称为.stack或类似区域的区域,您可以决定放置在某个地址上,或者给出一定尺寸的区域。这只是内存映射部分。

在任何启动代码中完成的第一件事是设置堆栈指针。它必须通过汇编器完成,因为C没有直接写入堆栈指针的方法。在某些内核上,堆栈指针是通过重置的硬件自动设置的,这是您的链接脚本放置在矢量表中并在flash中进行编程的值。

通常,硅供应商几乎总是将其完全留给程序员来决定。但是,核心确实指定是否有上计数或下调堆栈。到目前为止,最常见的是下调,但是一些奇怪的架构有上堆的堆栈(最著名的图片)。

至于设置堆栈指针的位置,如果使用工具链交付了此类代码,则在启动代码(" CRT")中很早就发现它。通常,它采用从链接脚本获得的值,但是如果需要,您也可以硬编码。需要在执行任何C代码之前就需要完成,因为C喜欢使用堆栈。

如果您自己写所有内容,则应将您从重置矢量内部进行的第一件事写入堆栈指针。

最新更新