首先说说KeilGCC, 虽然很多人认为用Keil开发ARM很土,但是对于从单片机转入的人来说作为入手工具倒也不错,
其实我觉得什么工具无所谓,结果对是重要的。
(1) KeilGCC中, 堆栈设置完全靠程序实现,程序中指定
.equ Top_Stack, 0x40003000 @ 堆栈栈顶地址
.equ UND_Stack_Size, 0x00000004 @ 各部分堆栈大小
.equ SVC_Stack_Size, 0x00000004
.equ ABT_Stack_Size, 0x00000004
.equ FIQ_Stack_Size, 0x00000040
.equ IRQ_Stack_Size, 0x00000040
.equ USR_Stack_Size, 0x00000400
等设置,之后调用堆栈初始化完成则OK!
(2) Keil RV30,31 这事KEIL的新版本,据说不错,但是我也不知道如何。
若使用KEIL实例给出的方法,只需要指定
UND_Stack_Size EQU 0x00000000
SVC_Stack_Size EQU 0x00000008
ABT_Stack_Size EQU 0x00000000
FIQ_Stack_Size EQU 0x00000000
IRQ_Stack_Size EQU 0x00000080
USR_Stack_Size EQU 0x00000400
等各部分大小即可,堆栈会自动进行分配地址。
也可以用ADS的分散加载方式。
(3) ADS是ARM最早的开发工具,用的人也多,口碑也好,国内又有ZLG的支持(包括LPC系列芯片),过于他的堆栈设
置, ZLG的模板基本可以直接使用, 但是我觉得其内容比较麻烦,自己按照 KEIL GCC的方式改写了, 基本要设置的是:
UND_Stack_Size EQU 0x00000000
SVC_Stack_Size EQU 0x00000008
ABT_Stack_Size EQU 0x00000000
FIQ_Stack_Size EQU 0x00000000
IRQ_Stack_Size EQU 0x00000080
USR_Stack_Size EQU 0x00000400
等各部分大小, 并且在程序中如下实现:
AREA Stack, NOINIT, READWRITE, ALIGN="3"
Stack_Mem SPACE Size
Stack_Top
在分散加载文件中指定堆栈的起始内存位置(不是栈顶, 其值应该为 Stack_Top(Keil中指定的那个地址)-Size, 计算不
对会超出地址范围!),这样在堆栈初始化中就和Keil GCC基本相同设置了, 我本人看着比较顺眼, 感觉也易懂一些。
以上是本人的一些学习心得,记在此处,若是有什么不妥之处欢迎大家指点!
【2007-08-10】
文章评论(0条评论)
登录后参与讨论