【发布时间】:2019-02-20 18:50:52
【问题描述】:
对于带有 C 启动代码的微控制器和嵌入式系统而言,C 启动代码的功能之一是初始化堆栈指针。
这个初始栈指针地址和C启动代码一般都是芯片厂商定义和提供的吗?
还是由我们作为固件/软件开发人员手动修改或创建 C 启动代码并指定堆栈指针?这部分让我很困惑。
【问题讨论】:
-
初始堆栈指针状态应在微控制器的数据手册中指定。
-
快速回答是你做的。通常,堆栈指针是启动代码中首先定义的东西之一。您在内存中放置堆栈指针的位置通常由您的数据表强烈暗示,但您(或任何编写 crt0 或 init 内核或其他内容的人)可以选择。您的电路板将跳转到内存中的某个硬连线地址,并在上电时开始执行代码。这是该定义所在的位置,或者您将 .org 启动代码的位置。
-
旁白:在某些处理器中,NMI 并不是真正不可屏蔽的:它只有在设置堆栈指针后才会启用。
-
两者。某些体系结构堆栈指针是由硬件定义的,我认为这很少见。以 6502 为例。其他架构完全取决于您,例如基于 arm7 和 cortex-m。你阅读了文档,看看设备有多少内存,决定了软件开发人员希望如何为你的项目分配内存,留下一些用于堆栈。
-
如果可以并且选择如何设置堆栈指针也是特定于架构的。
标签: c embedded microcontroller startup stack-pointer