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
周立功启动代码: ;/****************************************Copyright (c)************************************************** ;** Guangzou ZLG-MCU Development Co.,LTD. ;** graduate school ;** http://www.zlgmcu.com ;** ;**--------------File Info------------------------------------------------------------------------------- ;** File name: Startup.s ;** Last modified Date: 2004-09-17 ;** Last Version: 1.0 ;** Descriptions: The start up codes for LPC2100, including the initializing codes for the entry point of exceptions and the stacks of user tasks. ;** Every project should have a independent copy of this file for related modifications ;**------------------------------------------------------------------------------------------------------ ;** Created by: Chenmingji ;** Created date: 2004-02-02 ;** Version: 1.0 ;** Descriptions: The original version//原著 ;** ;**------------------------------------------------------------------------------------------------------ ;** Modified by: Chenmingji ;** Modified date: 2004-09-17 ;** Version: 1.01 ;** Descriptions: Modified the bus setting to adapt for many common situations ;** //改进了总线,可以根据这里的更改来控制总线的速率 ;**------------------------------------------------------------------------------------------------------ ;** Modified by: Chenmingji ;** Modified date: 2004-09-17 ;** Version: 1.02 ;** Descriptions: Added codes to support the enciphering of the chip ;** //增加了芯片加密 ;**------------------------------------------------------------------------------------------------------ ;** Modified by: Chenmingji ;** Modified date: 2004-09-17 ;** Version: 1.04 ;** Descriptions: Renewed the template, added codes to support more compilers ;** //重建模板,加入更多代码来支持更多的编译 ;**------------------------------------------------------------------------------------------------------ ;** Modified by: ;** Modified date: ;** Version: ;** Descriptions: ;** ;********************************************************************************************************/
;define the stack size ;定义堆栈的大小 SVC_STACK_LEGTH EQU 0 FIQ_STACK_LEGTH EQU 0 IRQ_STACK_LEGTH EQU 256 ABT_STACK_LEGTH EQU 0 UND_STACK_LEGTH EQU 0
NoInt EQU 0x80
;定义处理器模式,用户/管理/系统/中断 USR32Mode EQU 0x10 SVC32Mode EQU 0x13 SYS32Mode EQU 0x1f IRQ32Mode EQU 0x12 FIQ32Mode EQU 0x11
PINSEL2 EQU 0xE002C014//定义PINSEL2地址,这个地址的值一般用户不需要改变,和芯片的加密有关 //更改后有可能使得JTAG调试失效,进入芯片加密状态. BCFG0 EQU 0xFFE00000 BCFG1 EQU 0xFFE00004 BCFG2 EQU 0xFFE00008 BCFG3 EQU 0xFFE0000C//定义存储器组配置寄存器
BCFG_16DEF EQU 0x10000400 ;// 16Bit Bus BCFG_CS3 EQU (BCFG_16DEF | (0x01<<00) | (0x07<<05) | (0x07<<11)) ;// 分别是IDCY/WST1/WST2对应读写速率等 ;//从第0位开始对其写入0001, ;//从第5位开始写入0111 ;//从11位开始写入0111(0x07)/11111(0x1f) IMPORT __use_no_semihosting_swi
;The imported labels ;引入的外部标号在这声明 IMPORT FIQ_Exception ;Fast interrupt exceptions handler 快速中断异常处理程序 IMPORT __main ;The entry point to the main function C语言主程序入口 IMPORT TargetResetInit ;initialize the target board 目标板基本初始化
;The emported labels ;给外部使用的标号在这声明 EXPORT bottom_of_heap EXPORT StackUsr EXPORT Reset EXPORT __user_initial_stackheap
CODE32
AREA vectors,CODE,READONLY ENTRY
;interrupt vectors ;中断向量表 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 ;/********************************************************************************************************* ;** unction name 函数名称: InitStack ;** Descriptions 功能描述: Initialize the stacks 初始化堆栈 ;** input parameters 输 入: None 无 ;** Returned value 输 出 : None 无 ;** Used global variables 全局变量: None 无 ;** Calling modules 调用模块: None 无 ;** ;** Created by 作 者: Chenmingji 陈明计 ;** Created Date 日 期: 2004/02/02 2004年2月2日 ;**------------------------------------------------------------------------------------------------------- ;** Modified by 修 改: ;** Modified date 日 期: ;**------------------------------------------------------------------------------------------------------- ;********************************************************************************************************/ 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
;/********************************************************************************************************* ;** unction name 函数名称: ResetInit ;** Descriptions 功能描述: RESET 复位入口 ;** input parameters 输 入: None 无 ;** Returned value 输 出 : None 无 ;** Used global variables 全局变量: None 无 ;** Calling modules 调用模块: None 无 ;** ;** Created by 作 者: Chenmingji 陈明计 ;** Created Date 日 期: 2004/02/02 2004年2月2日 ;**------------------------------------------------------------------------------------------------------- ;** Modified by 修 改: Chenmingji 陈明计 ;** Modified date 日 期: 2004/02/02 2004年3月3日 ;**------------------------------------------------------------------------------------------------------- ;********************************************************************************************************/ ResetInit ;初始化外部总线控制器,根据目标板决定配置 ; ; LDR R0, =PINSEL2 ; IF :DEF: EN_CRP ; LDR R1, =0x0f814910 ; ELSE ; LDR R1, =0x0f814914 ; ENDIF ; STR R1, [R0]
LDR R0, =BCFG0 LDR R1, =0x1000ffef ;0x00001046 STR R1, [R0]
LDR R0, =BCFG1 LDR R1, =BCFG_CS3 ;0x1000ffef ;0x1000ffef;; STR R1, [R0]
LDR R0, =BCFG2 LDR R1, =0x2000ffef STR R1, [R0]
; LDR R0, =BCFG3 ; LDR R1, =0x00000CA0 ;0x2000ffef ; STR R1, [R0] BL InitStack ;初始化堆栈 Initialize the stack BL TargetResetInit ;目标板基本初始化 Initialize the target board ;跳转到c语言入口 Jump to the entry point of C program B __main
;/********************************************************************************************************* ;** unction name 函数名称: __user_initial_stackheap ;** Descriptions 功能描述: Initial the function library stacks and heaps, can not deleted! 库函数初始化堆和栈,不能删除 ;** input parameters 输 入: reference by function library 参考库函数手册 ;** Returned value 输 出 : reference by function library 参考库函数手册 ;** Used global variables 全局变量: None 无 ;** Calling modules 调用模块: None 无 ;** ;** Created by 作 者: Chenmingji 陈明计 ;** Created Date 日 期: 2004/02/02 2004年2月2日 ;**------------------------------------------------------------------------------------------------------- ;** Modified by ;** Modified date ;**------------------------------------------------------------------------------------------------------- ;********************************************************************************************************/ __user_initial_stackheap LDR r0,=bottom_of_heap ; LDR r1,=StackUsr MOV pc,lr
StackSvc DCD SvcStackSpace + (SVC_STACK_LEGTH - 1)* 4 StackIrq DCD IrqStackSpace + (IRQ_STACK_LEGTH - 1)* 4 StackFiq DCD FiqStackSpace + (FIQ_STACK_LEGTH - 1)* 4 StackAbt DCD AbtStackSpace + (ABT_STACK_LEGTH - 1)* 4 StackUnd DCD UndtStackSpace + (UND_STACK_LEGTH - 1)* 4
;/********************************************************************************************************* ;** unction name 函数名称: CrpData ;** Descriptions 功能描述: encrypt the chip ;** input parameters 输 入: None 无 ;** Returned value 输 出 : None 无 ;** Used global variables 全局变量: None 无 ;** Calling modules 调用模块: None 无 ;** ;** Created by 作 者: Chenmingji 陈明计 ;** Created Date 日 期: 2004/03/27 2004年3月27日 ;**------------------------------------------------------------------------------------------------------- ;** Modified by 修 改: ;** Modified date 日 期: ;**------------------------------------------------------------------------------------------------------- ;********************************************************************************************************/ IF :DEF: EN_CRP IF . >= 0x1fc INFO 1,"The data at 0x000001fc must be 0x87654321.Please delete some source before this line." ENDIF CrpData WHILE . < 0x1fc NOP WEND CrpData1 DCD 0x87654321 ;/*When the Data is 为0x87654321,user code be protected. 当此数为0x87654321时,用户程序被保护 */ ENDIF ;/* 分配堆栈空间 */ AREA MyStacks, DATA, NOINIT, ALIGN=2 SvcStackSpace SPACE SVC_STACK_LEGTH * 4 ;Stack spaces for Administration Mode 管理模式堆栈空间 IrqStackSpace SPACE IRQ_STACK_LEGTH * 4 ;Stack spaces for Interrupt ReQuest Mode 中断模式堆栈空间 FiqStackSpace SPACE FIQ_STACK_LEGTH * 4 ;Stack spaces for Fast Interrupt reQuest Mode 快速中断模式堆栈空间 AbtStackSpace SPACE ABT_STACK_LEGTH * 4 ;Stack spaces for Suspend Mode 中止义模式堆栈空间 UndtStackSpace SPACE UND_STACK_LEGTH * 4 ;Stack spaces for Undefined Mode 未定义模式堆栈
AREA Heap, DATA, NOINIT bottom_of_heap SPACE 1
AREA Stacks, DATA, NOINIT StackUsr
END ;/********************************************************************************************************* ;** End Of File ;********************************************************************************************************/
|