Cortex-M3-建立堆栈

Cortex-M3-建立堆栈

  • 当开发的程序比较简单时,可以从头到尾都只使用 MSP。这时,只需要保证开出一个容量够大的堆栈,再把 MSP 初始化到其顶即可——这也是单片机开发最常见的做法。堆栈用穿是非常致命的错误,必须非常严肃地计算安全容量。在计算时,除了要计入最深函数调用时对堆栈的需求,还需要判定最多可能有多少级中断嵌套。一个笨方法(但是很保险)是假设每个中断都可以嵌套。对于每一级嵌套的中断,至少需要 8 个字(32 字节),而且如果 ISR 过于复杂,还可能有更多的堆栈需求。
  • 因为 CM3 中的堆栈是以“向下生长的满栈”来操作 SP 的。在简单的场合中,经常可以把 SP 初始化为 SRAM 的末尾,这么一来就使所有的空闲内存都能为堆栈所用——反正不用白不用,用了也白用.如下图
Cortex-M3-建立堆栈_第1张图片 存储器的分配
  • 从图中我们可以看出,这种分配方式能给堆栈区留下最大的容量——所有剩余内存,而有省事又省心——省去了令人头痛的堆栈需求计算了。
  • 然而,对于比较大型的或者是有高性能指标的嵌入式系统,往往需要两个堆栈配合使用。这时,就只好勇敢地面对。必须保证各堆栈都有足够的容量,尤其是主堆栈,最容易栽在它上面。要注意的是,进程堆栈除了要满足本进程最大需求量,还需要额外留出 8 个字,用于容纳第一级中断时被保护的寄存器。
  • 事实上,准确计算主堆栈需求往往是不可能的任务,也容易过于保守而浪费宝贵的血液资源。在调试阶段时,最好先选用内存更大点的器件,然后开出足够大的内存给主堆栈。然后在调试程序时,允许随时把主堆栈曾经的最大用量输出(通过调试串口或仿真器等),这样时间长了就能估算对主堆栈的需求,正如上图中边界的作用。 

你可能感兴趣的:(Cortex-M3,Cortex-M3,建立堆栈)