1
5
您会问到将堆栈和堆放在哪里的问题。在uC上,由于许多原因,答案不如@a2f所述的那么明显。 堆栈首先,许多ARM uC有两个堆栈。一个称为主堆栈,另一个称为进程堆栈。当然,您不需要启用此选项。 另一个问题是,皮层uC可能有(例如STM32F3、许多F4、F7、H7)许多SRAM块。由开发人员决定在哪里放置堆栈和堆。 在哪里放置堆栈? 我建议将MSP放在所选RAM的开头。为什么? 如果堆栈位于末尾,则无法控制堆栈的使用。当堆栈溢出时,它可能会自动覆盖变量,程序的行为变得不可预测。如果是LED闪烁问题,则不是问题所在。但想象一下,一个大型机器控制器或汽车损坏了电脑。 当您将堆栈放置在RAM的开头时(作为开头,我指的是RAM开始地址+堆栈大小),当堆栈将溢出时,会生成硬件异常。您完全可以控制uC,您可以看到问题的原因(例如损坏的传感器向uC发送大量数据),并启动紧急例行程序(例如停止机器,将车辆置于维修模式等)。堆栈溢出不会在未检测到的情况下发生。 堆。动态分配必须在uCs上小心使用。第一个问题是可用内存可能存在内存碎片,因为uC的资源非常有限。必须非常小心地考虑动态分配内存的使用,否则它会成为严重问题的根源。不久前,USB HAL库在中断例程中使用了动态分配——有时,秒数的一小部分足以将堆分割成碎片,从而不允许进一步分配。 另一个问题是在大多数可用的工具链中错误地实现了sbrk。我所知道的唯一正确的工具是我们的同事FreddieChopin在这个论坛上维护的BleedingEdge工具链。 问题是,这些实现假设堆和堆栈相互靠近,最终可以相遇,这当然是错误的。另一个问题是不正确地使用和初始化具有堆开始和结束地址的静态变量。 |
2
3
因为这里的堆栈会向下增长(从高地址到低地址),所以它实际上是堆栈内存区域的开始。
它们的特殊之处在于,以下划线开头,后跟大写字母的符号是为实现保留的。e、 g。
这是最小尺寸。堆栈和堆中断都可能增长。
它只剩下0x400字节
并非所有事情都是安全关键的。如果您不想/不需要/不被允许,您可以自由地不使用堆。(好的,后者不是免费的) |
conopizda2 · 为什么我的静态数组没有被memset清除? 2 年前 |
jhe4x · C按位OR返回的值不正确 2 年前 |
Tim · 如何用c语言打印程序的执行流程# 6 年前 |
jatinBatra · 关于嵌入式固件开发[已关闭] 6 年前 |
Will · 嵌入链接器脚本-是否正确放置“堆栈”和“堆”区域? 6 年前 |
K. Crow · 不等于PIC32上启用中断时操作员不工作[关闭] 6 年前 |
spiff42 · 清除位时唯一的最大不同字节值集 6 年前 |