网站导航: 首页 > 设计参考 > 正文 文章搜索
ARM启动代码研究
 
文章编号:
091112205015
文章分类: 单片机 ARM
点 击:
...
关 键 词: 启动代
文章来源:
网络
摘 要:

1:PRESERVE8:
Reguire8和Preserve8
C和汇编有8位对齐的要求,这两个伪指令可以满足此要求,存在REQUIRE8<——> PRESERVE8的对应关系,但不是说有一个REQUIRE8就要有一个 PRESERVE8,如果是一个c文件和一个汇编文件的调用,也就涉及一个PRESERVE8或者是一个REQUIRE8.
另外,REQUIRE8和PRESERVE8并不完成8 byte 对齐的操作,对齐由ALIGN完成。

将ADS的代码移植到KEIL MDK上需要做的修改:
当用户拥有ADS遗留工程的所有源代码时,使用MDK重新编译链接全部代码是最好的解决方法,MDK中的新版本编译工具会重新生成满足堆栈8BYTE对齐要求的目标文件,避免由于堆栈不对齐引起的链接错误.
从ADS到KEIL很重要的一个修改的地方就是这里的8BYTE对齐,想要编译通过,在startup.s里面我们必须加入PRESERVE8指令,使得寄存器8BYTE对齐.
代码:
CODE32
PRESERVE8  ;这个在KEIL里面是必须的,要求8BYTE对齐.在ADS的启动代码中就没有.
AREA vectors,CODE,READONLY

2: ARM的处理器可工作于多种模式,下面设置个模式的一些参数.
Mode_USR        EQU     0x10  用户模式 
Mode_FIQ        EQU     0x11  快中断模式
Mode_IRQ        EQU     0x12  中断模式
Mode_SVC        EQU     0x13  管理模式
Mode_ABT        EQU     0x17  中止模式
Mode_UND        EQU     0x1B  未定义模式
Mode_SYS        EQU     0x1F  系统模式
参数的由来:这里各个模式的参数是由寄存器CPSR的模式位设置M[4:0]得来的,比如这里的用户模式,CPSR的M[4:0]设置为10000就是0x10,同理其他.详见<<ARM嵌入式系统基础教程>>P47页,CPSR设置很关键!

3:
I_Bit           EQU     0x80            ; when I bit is set, IRQ is disabled
F_Bit           EQU     0x40            ; when F bit is set, FIQ is disabled
也和CPSR寄存器的设置有关,这里两位是禁止/开启快速中断和一般中断的设置.

4: 各模式下定义的堆栈地址.
UND_Stack_Size  EQU     0x00000000
SVC_Stack_Size  EQU     0x00000100
ABT_Stack_Size  EQU     0x00000000
FIQ_Stack_Size  EQU     0x00000000
IRQ_Stack_Size  EQU     0x00000100
USR_Stack_Size  EQU     0x00000200
设置堆栈大小
Stack_Size      EQU     (UND_Stack_Size + SVC_Stack_Size + ABT_Stack_Size +
                         FIQ_Stack_Size + IRQ_Stack_Size + USR_Stack_Size)
                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
Stack_Top       EQU     Stack_Mem + Stack_Size
堆栈大小的设置,各公司写的启动代码有所不同,但是不影响大局,可以借鉴一些你认为比较简单的启动代码,然后写自己的堆栈地址和大小设置程序.

5:堆的设置
Heap_Size       EQU     0x00000000
                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
Heap_Mem        SPACE   Heap_Size
AREA Init,CODE,READONLY,ALIGN=3 //指定后面的指令为8位对齐(2的3次方)
align n
它的含义就是使得下面的代码按一定规则对齐,.align n 指令的对齐值有两种方案,n 或 2^n ,各种平台最初的汇编器一般都不是gas,采取方案1或2的都很多,gas的目标是取代原来的汇编器,必然要保持和原来汇编器的兼容,因此在gas中如何解释 .align指令会显得有些混乱,原因在于保持兼容。arm-linux是按照2^n的方案对齐的. ARM的.align 5就是2的5次方(32位)对齐,也就是4字节(32位)对齐.

6: AREA    RESET, CODE, READONLY
   ARM
下面的是ARM的代码,不是THUMB.

7: 中断向量表
Reset
        LDR     PC, ResetAddr
        LDR     PC, UndefinedAddr
        LDR     PC, SWI_Addr
        LDR     PC, PrefetchAddr
        LDR     PC, DataAbortAddr
        DCD     0xb9205f80
        LDR     PC, [PC, #-0xff0]
        LDR     PC, FIQ_Addr

ResetAddr           DCD     ResetInit
UndefinedAddr       DCD     Undefined
SWI_Addr            DCD     SoftwareInterrupt
PrefetchAddr        DCD     PrefetchAbort
DataAbortAddr       DCD     DataAbort
Nouse               DCD     0
IRQ_Addr            DCD     0
FIQ_Addr            DCD     FIQ_Handler

;未定义指令
Undefined
        B       Undefined
;软中断
SoftwareInterrupt   
        B       SoftwareInterrupt 
;取指令中止
PrefetchAbort
        B       PrefetchAbort
;取数据中止
DataAbort
        B       DataAbort
;快速中断
FIQ_Handler
        STMFD   SP!, {R0-R3, LR}
        BL      FIQ_Exception
        LDMFD   SP!, {R0-R3, LR}
        SUBS    PC,  LR,  #4

8: InitStack   
        MOV     R0, LR
;Build the SVC stack
;设置管理模式堆栈
        MSR     CPSR_c, #0xd3  
        LDR     SP, StackSvc 
;Build the IRQ stack 
;设置中断模式堆栈
        MSR     CPSR_c, #0xd2
        LDR     SP, StackIrq
;Build the FIQ stack
;设置快速中断模式堆栈
        MSR     CPSR_c, #0xd1
        LDR     SP, StackFiq
;Build the DATAABORT stack
;设置中止模式堆栈
        MSR     CPSR_c, #0xd7
        LDR     SP, StackAbt
;Build the UDF stack
;设置未定义模式堆栈
        MSR     CPSR_c, #0xdb
        LDR     SP, StackUnd
;Build the SYS stack
;设置系统模式堆栈
        MSR     CPSR_c, #0x5f                  ;#0xdf
        LDR     SP, =StackUsr
        MOV     PC, R0

9:  BL  InitStack               ;初始化堆栈 Initialize the stack
    BL  TargetResetIni;目标板基本初始化                                        ;跳转到c语言入口 Jump to the entry point of C program
B       __main
 

 
  1. 周立功启动代码:   
  2. ;/****************************************Copyright (c)**************************************************  
  3. ;**                               Guangzou ZLG-MCU Development Co.,LTD.  
  4. ;**                                      graduate school  
  5. ;**                                 http://www.zlgmcu.com  
  6. ;**  
  7. ;**--------------File Info-------------------------------------------------------------------------------  
  8. ;** File name:    Startup.s  
  9. ;** Last modified Date:  2004-09-17  
  10. ;** Last Version:   1.0  
  11. ;** Descriptions:   The start up codes for LPC2100, including the initializing codes for the entry point of exceptions and the stacks of user tasks.  
  12. ;**    Every project should have a independent copy of this file for related modifications  
  13. ;**------------------------------------------------------------------------------------------------------  
  14. ;** Created by:    Chenmingji  
  15. ;** Created date:     2004-02-02  
  16. ;** Version:    1.0  
  17. ;** Descriptions:   The original version//原著  
  18. ;**  
  19. ;**------------------------------------------------------------------------------------------------------  
  20. ;** Modified by:   Chenmingji  
  21. ;** Modified date:  2004-09-17  
  22. ;** Version:    1.01  
  23. ;** Descriptions:   Modified the bus setting to adapt for many common situations   
  24. ;**                             //改进了总线,可以根据这里的更改来控制总线的速率  
  25. ;**------------------------------------------------------------------------------------------------------  
  26. ;** Modified by:   Chenmingji  
  27. ;** Modified date:  2004-09-17  
  28. ;** Version:    1.02  
  29. ;** Descriptions:   Added codes to support the enciphering of the chip  
  30. ;**                             //增加了芯片加密  
  31. ;**------------------------------------------------------------------------------------------------------  
  32. ;** Modified by:   Chenmingji  
  33. ;** Modified date:  2004-09-17  
  34. ;** Version:    1.04  
  35. ;** Descriptions:   Renewed the template, added codes to support more compilers   
  36. ;**                             //重建模板,加入更多代码来支持更多的编译  
  37. ;**------------------------------------------------------------------------------------------------------  
  38. ;** Modified by:     
  39. ;** Modified date:  
  40. ;** Version:   
  41. ;** Descriptions:   
  42. ;**  
  43. ;********************************************************************************************************/  
  44.   
  45. ;define the stack size   
  46. ;定义堆栈的大小   
  47. SVC_STACK_LEGTH         EQU         0   
  48. FIQ_STACK_LEGTH         EQU         0   
  49. IRQ_STACK_LEGTH         EQU         256   
  50. ABT_STACK_LEGTH         EQU         0   
  51. UND_STACK_LEGTH         EQU         0   
  52.   
  53. NoInt       EQU 0x80   
  54.   
  55. ;定义处理器模式,用户/管理/系统/中断   
  56. USR32Mode   EQU 0x10   
  57. SVC32Mode   EQU 0x13   
  58. SYS32Mode   EQU 0x1f   
  59. IRQ32Mode   EQU 0x12   
  60. FIQ32Mode   EQU 0x11   
  61.   
  62. PINSEL2     EQU 0xE002C014//定义PINSEL2地址,这个地址的值一般用户不需要改变,和芯片的加密有关   
  63.                             //更改后有可能使得JTAG调试失效,进入芯片加密状态.   
  64. BCFG0       EQU 0xFFE00000   
  65. BCFG1       EQU 0xFFE00004   
  66. BCFG2       EQU 0xFFE00008   
  67. BCFG3       EQU 0xFFE0000C//定义存储器组配置寄存器   
  68.   
  69. BCFG_16DEF EQU     0x10000400      ;// 16Bit Bus   
  70. BCFG_CS3    EQU  (BCFG_16DEF | (0x01<<00) | (0x07<<05) | (0x07<<11))   ;// 分别是IDCY/WST1/WST2对应读写速率等   
  71.                                   ;//从第0位开始对其写入0001,   
  72.                                                ;//从第5位开始写入0111   
  73.                                                              ;//从11位开始写入0111(0x07)/11111(0x1f)    
  74.     IMPORT __use_no_semihosting_swi   
  75.   
  76. ;The imported labels   
  77. ;引入的外部标号在这声明   
  78.     IMPORT  FIQ_Exception                   ;Fast interrupt exceptions handler 快速中断异常处理程序   
  79.     IMPORT  __main                          ;The entry point to the main function C语言主程序入口    
  80.     IMPORT  TargetResetInit                 ;initialize the target board 目标板基本初始化   
  81.   
  82. ;The emported labels   
  83. ;给外部使用的标号在这声明   
  84.     EXPORT  bottom_of_heap   
  85.     EXPORT  StackUsr   
  86.        
  87.     EXPORT  Reset   
  88.     EXPORT __user_initial_stackheap   
  89.   
  90.     CODE32   
  91.   
  92.     AREA    vectors,CODE,READONLY   
  93.         ENTRY   
  94.   
  95. ;interrupt vectors   
  96. ;中断向量表   
  97. Reset   
  98.         LDR     PC, ResetAddr   
  99.         LDR     PC, UndefinedAddr   
  100.         LDR     PC, SWI_Addr   
  101.         LDR     PC, PrefetchAddr   
  102.         LDR     PC, DataAbortAddr   
  103.         DCD     0xb9205f80   
  104.         LDR     PC, [PC, #-0xff0]   
  105.         LDR     PC, FIQ_Addr   
  106.   
  107. ResetAddr           DCD     ResetInit   
  108. UndefinedAddr       DCD     Undefined   
  109. SWI_Addr            DCD     SoftwareInterrupt   
  110. PrefetchAddr        DCD     PrefetchAbort   
  111. DataAbortAddr       DCD     DataAbort   
  112. Nouse               DCD     0   
  113. IRQ_Addr            DCD     0   
  114. FIQ_Addr            DCD     FIQ_Handler   
  115.   
  116. ;未定义指令   
  117. Undefined   
  118.         B       Undefined   
  119.   
  120. ;软中断   
  121. SoftwareInterrupt      
  122.         B       SoftwareInterrupt    
  123.   
  124. ;取指令中止   
  125. PrefetchAbort   
  126.         B       PrefetchAbort   
  127.   
  128. ;取数据中止   
  129. DataAbort   
  130.         B       DataAbort   
  131.   
  132. ;快速中断   
  133. FIQ_Handler   
  134.         STMFD   SP!, {R0-R3, LR}   
  135.         BL      FIQ_Exception   
  136.         LDMFD   SP!, {R0-R3, LR}   
  137.         SUBS    PC,  LR,  #4   
  138.            
  139. ;/*********************************************************************************************************  
  140. ;** unction name  函数名称:  InitStack  
  141. ;** Descriptions  功能描述:  Initialize the stacks  初始化堆栈  
  142. ;** input parameters  输 入:    None 无  
  143. ;** Returned value    输 出 :   None 无  
  144. ;** Used global variables 全局变量:  None 无  
  145. ;** Calling modules  调用模块:  None 无  
  146. ;**   
  147. ;** Created by   作 者:  Chenmingji 陈明计  
  148. ;** Created Date  日 期:  2004/02/02 2004年2月2日  
  149. ;**-------------------------------------------------------------------------------------------------------  
  150. ;** Modified by  修 改:   
  151. ;** Modified date  日 期:   
  152. ;**-------------------------------------------------------------------------------------------------------  
  153. ;********************************************************************************************************/  
  154. InitStack       
  155.         MOV     R0, LR   
  156. ;Build the SVC stack   
  157. ;设置管理模式堆栈   
  158.         MSR     CPSR_c, #0xd3     
  159.         LDR     SP, StackSvc    
  160. ;Build the IRQ stack    
  161. ;设置中断模式堆栈   
  162.         MSR     CPSR_c, #0xd2   
  163.         LDR     SP, StackIrq   
  164. ;Build the FIQ stack   
  165. ;设置快速中断模式堆栈   
  166.         MSR     CPSR_c, #0xd1   
  167.         LDR     SP, StackFiq   
  168. ;Build the DATAABORT stack   
  169. ;设置中止模式堆栈   
  170.         MSR     CPSR_c, #0xd7   
  171.         LDR     SP, StackAbt   
  172. ;Build the UDF stack   
  173. ;设置未定义模式堆栈   
  174.         MSR     CPSR_c, #0xdb   
  175.         LDR     SP, StackUnd   
  176. ;Build the SYS stack   
  177. ;设置系统模式堆栈   
  178.         MSR     CPSR_c, #0x5f                  ;#0xdf   
  179.         LDR     SP, =StackUsr   
  180.   
  181.         MOV     PC, R0   
  182.   
  183. ;/*********************************************************************************************************  
  184. ;** unction name  函数名称:  ResetInit  
  185. ;** Descriptions  功能描述:  RESET  复位入口  
  186. ;** input parameters  输 入:    None 无  
  187. ;** Returned value    输 出 :   None 无  
  188. ;** Used global variables 全局变量:  None 无  
  189. ;** Calling modules  调用模块:  None 无  
  190. ;**   
  191. ;** Created by   作 者:  Chenmingji 陈明计  
  192. ;** Created Date  日 期:  2004/02/02 2004年2月2日  
  193. ;**-------------------------------------------------------------------------------------------------------  
  194. ;** Modified by  修 改: Chenmingji 陈明计  
  195. ;** Modified date  日 期: 2004/02/02 2004年3月3日  
  196. ;**-------------------------------------------------------------------------------------------------------  
  197. ;********************************************************************************************************/  
  198. ResetInit   
  199. ;初始化外部总线控制器,根据目标板决定配置   
  200. ;   
  201. ;           LDR     R0, =PINSEL2   
  202. ;   IF :DEF: EN_CRP   
  203. ;        LDR     R1, =0x0f814910   
  204. ;    ELSE   
  205. ;        LDR     R1, =0x0f814914   
  206. ;    ENDIF   
  207. ;        STR     R1, [R0]   
  208.   
  209.         LDR     R0, =BCFG0   
  210.         LDR     R1, =0x1000ffef           ;0x00001046   
  211.         STR     R1, [R0]   
  212.   
  213.         LDR     R0, =BCFG1   
  214.         LDR     R1, =BCFG_CS3               ;0x1000ffef          ;0x1000ffef;;   
  215.         STR     R1, [R0]   
  216.   
  217.         LDR     R0, =BCFG2   
  218.         LDR     R1, =0x2000ffef   
  219.         STR     R1, [R0]   
  220.   
  221. ;        LDR     R0, =BCFG3   
  222. ;        LDR     R1, =0x00000CA0           ;0x2000ffef   
  223. ;        STR     R1, [R0]   
  224.                   
  225.         BL      InitStack               ;初始化堆栈 Initialize the stack   
  226.         BL      TargetResetInit         ;目标板基本初始化 Initialize the target board   
  227.                                         ;跳转到c语言入口 Jump to the entry point of C program   
  228.          
  229.         B       __main   
  230.   
  231. ;/*********************************************************************************************************  
  232. ;** unction name  函数名称:  __user_initial_stackheap  
  233. ;** Descriptions  功能描述:  Initial the function library stacks and heaps, can not deleted!   库函数初始化堆和栈,不能删除  
  234. ;** input parameters  输 入:    reference by function library 参考库函数手册  
  235. ;** Returned value    输 出 :   reference by function library 参考库函数手册  
  236. ;** Used global variables 全局变量:  None 无  
  237. ;** Calling modules  调用模块:  None 无  
  238. ;**   
  239. ;** Created by   作 者:  Chenmingji 陈明计  
  240. ;** Created Date  日 期:  2004/02/02 2004年2月2日  
  241. ;**-------------------------------------------------------------------------------------------------------  
  242. ;** Modified by    
  243. ;** Modified date    
  244. ;**-------------------------------------------------------------------------------------------------------  
  245. ;********************************************************************************************************/  
  246. __user_initial_stackheap       
  247.     LDR   r0,=bottom_of_heap   
  248. ;    LDR   r1,=StackUsr   
  249.     MOV   pc,lr   
  250.   
  251. StackSvc           DCD     SvcStackSpace + (SVC_STACK_LEGTH - 1)* 4   
  252. StackIrq           DCD     IrqStackSpace + (IRQ_STACK_LEGTH - 1)* 4   
  253. StackFiq           DCD     FiqStackSpace + (FIQ_STACK_LEGTH - 1)* 4   
  254. StackAbt           DCD     AbtStackSpace + (ABT_STACK_LEGTH - 1)* 4   
  255. StackUnd           DCD     UndtStackSpace + (UND_STACK_LEGTH - 1)* 4   
  256.   
  257. ;/*********************************************************************************************************  
  258. ;** unction name  函数名称:  CrpData  
  259. ;** Descriptions  功能描述:  encrypt the chip  
  260. ;** input parameters  输 入:    None 无  
  261. ;** Returned value    输 出 :   None 无  
  262. ;** Used global variables 全局变量:  None 无  
  263. ;** Calling modules  调用模块:  None 无  
  264. ;**   
  265. ;** Created by   作 者:  Chenmingji 陈明计  
  266. ;** Created Date  日 期:  2004/03/27 2004年3月27日  
  267. ;**-------------------------------------------------------------------------------------------------------  
  268. ;** Modified by  修 改:   
  269. ;** Modified date  日 期:   
  270. ;**-------------------------------------------------------------------------------------------------------  
  271. ;********************************************************************************************************/  
  272.     IF :DEF: EN_CRP   
  273.         IF  . >= 0x1fc   
  274.         INFO    1," The data at 0x000001fc must be 0x87654321. Please delete some source before this line."  
  275.         ENDIF   
  276. CrpData   
  277.     WHILE . < 0x1fc   
  278.     NOP   
  279.     WEND   
  280. CrpData1   
  281.     DCD     0x87654321          ;/*When the Data is 为0x87654321,user code be protected. 当此数为0x87654321时,用户程序被保护 */  
  282.     ENDIF   
  283.        
  284. ;/* 分配堆栈空间 */  
  285.         AREA    MyStacks, DATA, NOINIT, ALIGN=2   
  286. SvcStackSpace      SPACE   SVC_STACK_LEGTH * 4  ;Stack spaces for Administration Mode 管理模式堆栈空间   
  287. IrqStackSpace      SPACE   IRQ_STACK_LEGTH * 4  ;Stack spaces for Interrupt ReQuest Mode 中断模式堆栈空间   
  288. FiqStackSpace      SPACE   FIQ_STACK_LEGTH * 4  ;Stack spaces for Fast Interrupt reQuest Mode 快速中断模式堆栈空间   
  289. AbtStackSpace      SPACE   ABT_STACK_LEGTH * 4  ;Stack spaces for Suspend Mode 中止义模式堆栈空间   
  290. UndtStackSpace     SPACE   UND_STACK_LEGTH * 4  ;Stack spaces for Undefined Mode 未定义模式堆栈   
  291.   
  292.         AREA    Heap, DATA, NOINIT   
  293. bottom_of_heap    SPACE   1   
  294.   
  295.         AREA    Stacks, DATA, NOINIT   
  296. StackUsr   
  297.   
  298.     END   
  299. ;/*********************************************************************************************************  
  300. ;**                            End Of File  
  301. ;********************************************************************************************************/  

 

 
相关文章:

 
最新开源项目
 
 
  查看更多...  
 
本站相关产品   淘宝网店
 




 
  查看更多...  

 

本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4