ZHCAD47 September   2023 UCD3138 , UCD3138064 , UCD3138064A , UCD3138128 , UCD3138128A , UCD3138A , UCD3138A64

 

  1.   1
  2.   摘要
  3.   商标
  4. 1引言
    1. 1.1 检查每个栈的大小
  5. 2检查是否发生溢出
  6. 3总结
  7. 4参考文献

检查每个栈的大小

演示代码中通常使用四种栈:用户栈、IRQ 栈、FIQ 栈和监控器栈。用户栈适用于后台例程,IRQ 栈适用于标准中断例程,FIQ 栈适用于快速中断例程,监控器栈适用于软件中断 (SWI) 例程。有些可能在例外情况下具有未定义的栈和中止栈,但在正常情况下很少使用。栈在 load.asm 文件的顶部声明。考虑下面的示例,了解如何分配每个栈。


SUP_STACK_TOP  .equ	0x6bffc ;Supervisor mode (SWI stack) starts at top of memory
FIQ_STACK_TOP	.equ	0x6be00 ;allocate 256 bytes to supervisor stack, then do FIQ stack
IRQ_STACK_TOP	.equ	0x6bd00 ;allocate 256 bytes to fiq stack, then start irq stack
USER_STACK_TOP	.equ	0x6bb00 ;Allocate 512 bytes to irq stack, regular stack gets rest, down to variables
		.global _c_int00
		.global $c_int00

上述定义表明用户栈的顶部位于地址 0x6bb00,再往下是变量,IRQ 栈的分配范围从地址 0x6bb00(底部)到 0x6bd00(顶部),FIQ 栈的分配范围从地址 0x6bd00(底部)到 0x6be00(顶部),监控器栈的分配范围从地址 0x6be00(底部)到 0x6bffc(顶部)。

GUID-20230901-SS0I-HCVD-XNND-RJLM5GFCJSTG-low.svg图 1-1 栈分配

至于用户栈的底部,请查看 .map 文件,其中显示了 RAM 存储器分配。在构建固件工程时,.map 文件由 CCS 生成,应位于 .x0 文件所在的目录中。下面是从 .map 文件复制的示例,其中的文本显示变量从地址 0x6a000 开始,到地址 0x6a80d 结束。因此,用户栈可向下到达 0x6a80e。

 
        name            origin    length      used     unused   attr    fill
----------------------  --------  ---------  --------  --------  ----  --------
  FLASHVECS             00000000   00000020  00000020  00000000  R  X
  PFLASH                00000020   00007f34  00003d1e  00004216  R  X
  DEVICEID              00007f54   00000020  0000001f  00000001  R  X
  FIXTFA                00007f74   00000004  00000000  00000004  R  X
  FIXCONST              00007f78   00000080  00000000  00000080  R  X
  FLASHSUM              00007ff8   00000008  00000000  00000008  R  X
  ROMVECS               00020000   00000020  00000000  00000020  RWIX
  ROM                   00020020   00001d5e  00000000  00001d5e  RWIX
  SINE                  00021d7e   00000282  00000000  00000282  RWIX
  DFLASH                00069800   00000800  00000398  00000468  R  X
  RAM                   0006a000   00001dd0  0000080d  000015c3  RW  
  RAM_PGM_AREA          0006bdd0   00000080  00000000  00000080  RW  
  STACKS                0006be50   000001b0  00000000  000001b0  RW  
  LOOP_MUX              00120000   00000070  0000006c  00000004  RWIX

在一些演示代码中,.cmd 文件中有栈分配,如下所示。栈分配不会生效,栈分配实际上是在 load.asm 中完成的。


STACKS    (RW) : org = 0x0006BE50, len = 0x000001B0
.stack         : {                              /* total = 400 = 0x190               */
                        _StackUSER_  = .            + 184;   /* USER                      */
                        _StackFIQ_   = _StackUSER_  + 112;   /* FIQ                       */
	                    _StackIRQ_   = _StackFIQ_   + 84;    /* IRQ                       */
                        _StackABORT_ = _StackIRQ_   + 4;     /* ABORT                     */
                        _StackUND_   = _StackABORT_ + 4;     /* UND                       */
                        _StackSUPER_ = _StackUND_   + 12;    /* SUPER                     */
	                 } > STACKS                          /* Software System stack     */.