环境: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 mainAREA startup,CODETHUMBDCD 0x20000000;MSP,主堆栈起始地址,注意是向下增长DCD reset;复位地址,复位后PC被赋予这个值resetPROCENTRY; CPACR is located at address 0xE000ED88LDR.W R0, =0xE000ED88; Read CPACRLDR R1, [R0]; Set bits 20-23 to enable CP10 and CP11 coprocessorsORR R1, R1, #(0xF ; Write back the modified value to the CPACRSTR R1, [R0];上面的这一段是开启硬件浮点运算DSP,否则后面如果出现硬件浮点代码会faultLDR R0,=main;获取main函数的地址BL main;跳转到main执行B .ENDPEND上面的这个启动代码非常简单,只是用来测试用,没有实用价值。实际上代码所在的区域应该用来填写中断向量的(如果不重定向中断向量表的话)。②main.c C程序测试代码int main(){    float a=1;    float b=1;    float c;    c=a*b;    return (int)c;}这段代码使用了float,可以用来测试cortex-m4的DSP运算单元。③分散加载文件start.sctROMLOAD 0x0 0x4000{EXEC_RO0x0{head.o(startup, +first)*(+RO)}RAM0x1FFF8000{*(+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,r00x00000002 2000 MOVS r0,#0x000x00000004 0009 MOVS r1,r10x00000006 0000 MOVS r0,r0 reset:0x00000008 F8DF0010 LDR.W r0,[pc,#16] ; @0x0000001C0x0000000C 6801 LDR r1,[r0,#0x00]0x0000000E F4410170 ORR r1,r1,#0xF000000x00000012 6001 STR r1,[r0,#0x00]0x00000014 4802 LDR r0,[pc,#8] ; @0x000000200x00000016 F000F805 BL.W main (0x00000024)0x0000001A E7FE B 0x0000001A0x0000001C ED88E000 STC P0,C14,[r8,#0x00]0x00000020 0025 MOVS r5,r40x00000022 0000 MOVS r0,r0 main:0x00000024 EEF71A00 VMOV.F32 s3,#0x3F8000000x00000028 EEB00A61 VMOV.F32 s0,s30x0000002C EEF71A00 VMOV.F32 s3,#0x3F8000000x00000030 EEF00A61 VMOV.F32 s1,s30x00000034 EE601A20 VMUL.F32 s3,s0,s10x00000038 EEB01A61 VMOV.F32 s2,s30x0000003C EEFD1AC1 VCVT.S32.F32 s3,s20x00000040 EE110A90 VMOV r0,s30x00000044 4770 BX lr从生成的汇编代码可以看到,代码非常简洁了,没有出现我们不想要的代码;而且浮点运算使用的是硬件代码,形如VMOV.F32 s3,#0x3F800000。
10-08 05:15