ZHCAD47 September 2023 UCD3138 , UCD3138064 , UCD3138064A , UCD3138128 , UCD3138128A , UCD3138A , UCD3138A64
演示代码中通常使用四种栈:用户栈、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(顶部)。
至于用户栈的底部,请查看 .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 */.