环境:Windows7 旗舰版;Keil MDK-ARM V4.20 前段时间使用了KEIL开发cortex-M4系列的ARM,在我的上篇日志中说明了如何在KEIL中开启cortex-M4的DSP浮点运算单元(见http://blog.chinaunix.net/space.php?uid=7921647&do=blog&id=267417)。这篇日志写一下keil下的最小启动代码,用以搭建一个最小的C语言环境,写在这里以备以后查看。
新建一个KEIL工程,ARM选择cortex-m4(带DSP运算单元),整个工程主要包括3个文件:head.s main.c start.sct
①head.s 启动文件,汇编代码
- IMPORT main
- AREA startup,CODE
- THUMB
- DCD 0x20000000 ;MSP,主堆栈起始地址,注意是向下增长
- DCD reset ;复位地址,复位后PC被赋予这个值
-
-
reset PROC
- ENTRY
- ; CPACR is located at address 0xE000ED88
- LDR.W R0, =0xE000ED88
- ; Read CPACR
- LDR R1, [R0]
- ; Set bits 20-23 to enable CP10 and CP11 coprocessors
- ORR R1, R1, #(0xF << 20)
- ; Write back the modified value to the CPACR
- STR R1, [R0] ;上面的这一段是开启硬件浮点运算DSP,否则后面如果出现硬件浮点代码会fault
-
- LDR R0,=main ;获取main函数的地址
- BL main ;跳转到main执行
- B .
- ENDP
- END
上面的这个启动代码非常简单,只是用来测试用,没有实用价值。实际上代码所在的区域应该用来填写中断向量的(如果不重定向中断向量表的话)。
②main.c C程序测试代码
- int main()
-
{
-
float a=1;
-
float b=1;
-
float c;
-
c=a*b;
-
return (int)c;
-
}
这段代码使用了float,可以用来测试cortex-m4的DSP运算单元。
③分散加载文件start.sct
- ROMLOAD 0x0 0x4000
-
{
- EXEC_RO 0x0
- {
- head.o(startup, +first)
- *(+RO)
-
- }
- RAM 0x1FFF8000
- {
- *(+RW,+ZI)
- }
-
- }
工程的设置中,只更改了linker选项,在Misc controls中增加了“-o start.axf --no_startup”选项,所以,等效的linker命令行就是(--cpu Cortex-M4.fp *.o --strict --scatter "start.sct" -o start.axf --no_startup),括号中的内容,不包括括号。这里有个--no_startup需要说明一下,在不添加这个选项时,Keil会“自作聪明”的在生成的汇编代码中添加一些代码,这些代码也许是我们并不想要的,所以增加这个--no_startup选项后就不再有这些代码了。
最终生成的汇编代码如下所示:
- 0x00000000 0000 MOVS r0,r0
-
0x00000002 2000 MOVS r0,#0x00
-
0x00000004 0009 MOVS r1,r1
-
0x00000006 0000 MOVS r0,r0
-
reset:
-
0x00000008 F8DF0010 LDR.W r0,[pc,#16] ; @0x0000001C
-
0x0000000C 6801 LDR r1,[r0,#0x00]
-
0x0000000E F4410170 ORR r1,r1,#0xF00000
-
0x00000012 6001 STR r1,[r0,#0x00]
-
0x00000014 4802 LDR r0,[pc,#8] ; @0x00000020
-
0x00000016 F000F805 BL.W main (0x00000024)
-
0x0000001A E7FE B 0x0000001A
-
0x0000001C ED88E000 STC P0,C14,[r8,#0x00]
-
0x00000020 0025 MOVS r5,r4
-
0x00000022 0000 MOVS r0,r0
-
main:
-
0x00000024 EEF71A00 VMOV.F32 s3,#0x3F800000
-
0x00000028 EEB00A61 VMOV.F32 s0,s3
-
0x0000002C EEF71A00 VMOV.F32 s3,#0x3F800000
-
0x00000030 EEF00A61 VMOV.F32 s1,s3
-
0x00000034 EE601A20 VMUL.F32 s3,s0,s1
-
0x00000038 EEB01A61 VMOV.F32 s2,s3
-
0x0000003C EEFD1AC1 VCVT.S32.F32 s3,s2
-
0x00000040 EE110A90 VMOV r0,s3
-
0x00000044 4770 BX lr
从生成的汇编代码可以看到,代码非常简洁了,没有出现我们不想要的代码;而且浮点运算使用的是硬件代码,形如VMOV.F32 s3,#0x3F800000。
阅读(6362) | 评论(0) | 转发(1) |