IAR5.20 开发2440初步

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

采用IAR 作为2440开发板单片机部分的开发环境不知道是否正确。
首先对IAR 开发环境做一下简要介绍对IAR开发环境并不了解,在网上查找到的资料也都是IAR 4.3的,而我所使用的IAR5.20的资料相当少。IAR5.20 与IAR4.3的主要区别在于IAR5.20开始连接器linker开始采用ilinker,不再是以前4.30所采用的xlinker,连接生成的文件格式为标准的elf格式文件。不要小瞧这个修改,就是这部分导致IAR5.20环境上手十分困难。
IAR5.20 EWARM支持几乎所有的ARM核CPU,包括最新的Context M3,ARM 11等,并且IAR环境为许多嵌入式CPU提供了相应的例程,当然,各个例程大多只是提供对相应CPU的初始化,引导main函数等操作。而对于没有在例程中出现的CPU就非常非常麻烦了,这就意味着开发环境没仅为你提供了基本的一些设置方法,所有的部分需要自己根据CPU的spec进行设置,同时由于是用IAR开发环境,你还需要了解IAR开发环境的设置方式。为了调通第一个IAR下的2440A点灯程序费了我将近半个月的业余时间,现在把总体过程总结一下,希望能够对大家有所帮助。
首先,IAR5.20环境的基本设置我就不详细说了,网上关于这部分有很多。CPU类型不选错就好啦,哈哈,只说几个重中之重,关键的部分,
在C/C++ Compiler选项Preprocessor选项中可以添加自己的头文件路径,$PROJ_DIR$\代表工程目录,例如:$PROJ_DIR$\inc\;
最重要的是Linker选项卡中,一定要在Config配置项中设置自己的icf配置文件,对该部分下面会详细说明。在该选项卡的List选项下勾选Gererate linker map file,这个map文件非常重要,由IAR在链接是自动生成,map文件内包含的就是在链接过程中不同文件在最终二进制文件中所处的置是否正确。
在Debugger选项卡中是关于所使用的仿真器的描述选择自己的调试工具,这部分下面也会有详细说明。
下面进行详细说明:进行嵌入式开发,IAR5.20只是一个编译环境,编译生成目标CPU上可运行的二进制代码而已。这句似乎就是废话,任何有一点嵌入式经验的人都知道。但这句话的潜台词就是进行嵌入式开发,如果你不是运行在操作系统之上的,那么你就需要完成所有的硬件初始化,CPU 总线、flash,SDRAM,各个IO端口,等。这样我们就需要了解CPU的启动过程,CPU启动后运行代码的过程。而这部分是我们正常开发软件所不会接触的。为了快速开发嵌入式、减低嵌入式开发的难度,在IAR环境中为很多CPU提供程序运行时所处内存位置的描述。也就是我们刚才所提到的icf文件。
icf链接文件内包含对程序段各部分存放位置的描述,相当于ADS中link内文件摆放位置就是最终代码顺序的关系。默认所使用的icf文件在IAR文件夹下\

IAR Systems\Embedded Workbench 5.0 Evaluation\ARM\config文件夹下的generic.icf文件,我们可以将该文件拷贝到工程目录中,通过在Config选项卡中选择路径来配置自己的icf文件,在icf文件中需要指定interrupt vector的位置,默认的ARM处理器在启动后都是从0x0000 0000位置开始设置中断向量表的,可以查找芯片的中断向量表修改,对应几个模式的中断处理函数的地址,在Memory Region内包括对CPU内的ROM,RAM空间的地址,这里就要详细说明了,首先如果你所使用的CPU只使用CPU内部的SROM,SRAM的话,直接查找SROM,SRAM所对应的地址填入就好啦,这里的数值还涉及到你所采用的调试方式,如果采用仿真器调试的话,可以将ROM RAM地址都指定为CPU内SRAM的地址段,这样程序通过仿真器就自动的下载到CPU内SRAM运行了。如果在CPU外有自己的SDRAM的话,就把RAM地址段指定为SDRAM在CPU内映射的位置,同时在启动程序中需要设置SDRAM内存段的配置。同样如果采用片外的NAND FLASH/NORFLASH的话在ROM地址段就需要在启动代码段内进行相应的初始化设置。最后需要设置各种堆栈的大小,CSTACK是C程序运行所需要的堆栈空间,下面的SVC,IRQ,FIQ,UND,ABT分别对应ARM内5种特殊运行模式的堆栈空间,在ARM下用户态与超级系统态内所使用的堆栈空间是相同的,可以根据代码量、RAM空间的大小进行设置,HEAP/CSTACK应该设置的大一些,至少要0x1000以上。如果不使用Linker选项卡下Config选项中Edit可以使用IAR提供的脚本进行自动的修改,我们也可以通过手动直接修改icf文件来实现。通过阅读icf文件我们可以发现在icf文件中根据我们的设置选项生成了多个堆栈空间地址。我们所指定的堆栈都在指定的RAM 空间中。
对icf文件的描述就到这里,完成icf文件的设置后,我们需要编写自己的startup代码,我们可以通过修改IAR5.20例子中所提供的cstartup.s文件修改为自己的CPU启动代码。在IAR5.2O中,程序启动以__iar_program_start段名指定,可以再Linker选项卡Library选项内进行修改,改为自己指定的启动段名。修改cstartup的代码我就不献丑了,附上一个标准的cstartup.s代码,大家考下来看看就明白了,需要添加自己的代码就在相应的位置进行添加。

MODULE ?cstartup

;; Forward declaration of sections.
SECTION IRQ_STACK:DATA:NOROOT(3)
SECTION ABT_STACK:DATA:NOROOT(3)
SECTION SVC_STACK:DATA:NOROOT(3)
SECTION UND_STACK:DATA:NOROOT(3)
SECTION FIQ_STACK:DATA:NOROOT(3)
SECTION CSTACK:DATA:NOROOT(3)

;
; The module in this file are included in the libraries, and may be
; replaced by any user-defined modules that define the PUBLIC symbol
; __iar_program_start or a user defined start symbol.
;
; To override the c

startup defined in the library, simply add your
; modified version to the workbench project.

SECTION .intvec:CODE:NOROOT(2)

PUBLIC __vector
PUBLIC __iar_program_start
EXTERN undef_handler, prefetch_handler, data_handler,
EXTERN irq_handler, fiq_handler


ARM
__vector:
;;
ldr pc,=__iar_program_start ;; Reset
B . ;; Undefined instructions
B . ;; Software interrupt (SWI/SVC)
B . ;; Prefetch abort
B . ;; Data abort
B . ;; RESERVED
ldr pc,[pc,#-0xF20] ;; IRQ
ldr pc,[pc,#-0xF20] ;; FIQ

; --------------------------------------------------
; ?cstartup -- low-level system initialization code.
;
; After a reser execution starts here, the mode is ARM, supervisor
; with interrupts disabled.
;



SECTION .text:CODE:NOROOT(2)

; PUBLIC ?cstartup
EXTERN ?main
REQUIRE __vector

ARM

__iar_program_start:
?cstartup:

;
; Add initialization needed before setup of stackpointers here.
;
; Initialize the stack pointers.
; The pattern below can be used for any of the exception stacks:
; FIQ, IRQ, SVC, ABT, UND, SYS.
; The USR mode uses the same stack as SYS.
; The stack segments must be defined in the linker command file,
; and be declared above.
;
; --------------------
; Mode, correspords to bits 0-5 in CPSR
MODE_BITS DEFINE 0x1F ; Bit mask for mode bits in CPSR
USR_MODE DEFINE 0x10 ; User mode
FIQ_MODE DEFINE 0x11 ; Fast Interrupt Request mode
IRQ_MODE DEFINE 0x12 ; Interrupt Request mode
SVC_MODE DEFINE 0x13 ; Supervisor mode
ABT_MODE DEFINE 0x17 ; Abort mode
UND_MODE DEFINE 0x1B ; Undefined Instruction mode
SYS_MODE DEFINE 0x1F ; System mode

MRS r0, cpsr ; Original PSR value

BIC r0, r0, #MODE_BITS ; Clear the mode bits
ORR r0, r0, #ABT_MODE ; Set ABT mode bits
MSR cpsr_c, r0 ; Change the mode
LDR sp, =SFE(ABT_STACK) ; End of ABT_STACK

BIC r0, r0, #MODE_BITS ; Clear the mode bits
ORR r0, r0, #SVC_MODE ; Set SVC mode bits
MSR cpsr_c, r0 ; Change the mode
LDR sp, =SFE(SVC_STACK) ; End of SVC_STACK

BIC r0, r0, #MODE_BITS ; Clear the mode bits
ORR r0, r0, #UND_MODE ; Set UND mode bits
MSR cpsr_c, r0 ; Change the mode
LDR sp, =SFE(UND_STACK) ; End of UND_STACK

BIC r0, r0, #MODE_BITS ; Clear the mode bits
ORR r0, r0, #FIQ_MODE ; Set FIQ mode bits
MSR cpsr_c, r0 ; Change the mode
LDR sp, =SFE(FIQ_

STACK) ; End of FIQ_STACK

BIC r0, r0, #MODE_BITS ; Clear the mode bits
ORR r0, r0, #IRQ_MODE ; Set IRQ mode bits
MSR cpsr_c, r0 ; Change the mode
LDR sp, =SFE(IRQ_STACK) ; End of IRQ_STACK

BIC r0 ,r0, #MODE_BITS ; Clear the mode bits
ORR r0 ,r0, #SYS_MODE ; Set System mode bits
MSR cpsr_c, r0 ; Change the mode
LDR sp, =SFE(CSTACK) ; End of CSTACK

#ifdef __ARMVFP__
;; Enable the VFP coprocessor.

MOV r0, #0x40000000 ; Set EN bit in VFP
FMXR fpexc, r0 ; FPEXC, clear others.

;
; Disable underflow exceptions by setting flush to zero mode.
; For full IEEE 754 underflow compliance this code should be removed
; and the appropriate exception handler installed.
;

MOV r0, #0x01000000 ; Set FZ bit in VFP
FMXR fpscr, r0 ; FPSCR, clear others.
#endif

;
; Add more initialization here
;

; Continue to ?main for C-level initialization.

LDR r0, =?main
BX r0

END

在完成cstartup.s后我们就可以最基本的使用C代码进行编程了,大家加油啊!!
其实IAR环境的选项众多,它们就是gas gar等进行编译时选项,只是IAR环境以可视化的形式进行呈现了,还有就是icf文件,icf文件在这里其实就是表现为在调用cstartup.s前所使用的一个选项文件,链接器会根据该文件进行代码段的安排,为了不造成冲突,需要在cstartup.s中根据icf文件对堆栈进行相应的设置。在完成cstartup.s后就可以进入main函数了,这里的main函数还只是能够运行最基本的c语言,对所要使用的C函数库的话还要查找相应的文件进行相应的设置才行。深入进去后再了解吧。IAR环境非要加入个icf文件,并且隐藏提供cstartup.s文件,这个到底是方便了还是复杂了就是仁者见仁的事了。


总结如下:首先进行嵌入式开发就需要对CPU的data sheet认真仔细的阅读一下,重点是CPU memory地址分配、CPU启动后中断向量位置,等,在IAR5.20的环境中,它的编译过程其实就是首先编译icf文件,后在cstartup中使用icf文件内声明的程序段位置进行初始化的过程。就是说icf文件相当于程序链接后的Option程序,在icf文件中声明这些变量的值在cstartup.s中直接使用这些变量。在CPU启动后其实只要有堆栈空间,就为CPU提供了最基本的运行环境,也就是在icf文件的内容为CPU启动的最基本设置值,在cstartup.s中只需要将icf内的堆栈变量赋给系统各个模式就可以跳转到main函数运行了。在IAR5.20中所使用的汇编语言比较特殊,我们不必完全掌握,其提供的examples内有比较多的启动代码,可以通过修改这些例子来实

现我们的需要。好啦,就先写这些吧,希望对大家有帮助。天道酬勤!诸君共勉!

相关文档
最新文档