- IF :DEF:__MICROLIB
-
- EXPORT __initial_sp
- EXPORT __heap_base
- EXPORT __heap_limit
-
- ELSE
-
- IMPORT __use_two_region_memory
- EXPORT __user_initial_stackheap
-
- __user_initial_stackheap
- LDR R0, = Heap_Mem
- LDR R1, =(Stack_Mem + Stack_Size)
- LDR R2, = (Heap_Mem + Heap_Size)
- LDR R3, = Stack_Mem
- BX LR
- ALIGN
- ENDIF
另外,在执行__main函数的过程中,不仅需要完成“使用微库”情况下的所有工作,额外的工作还需要进行库的初始化,才能使用系统库(这一部分我还没有深入探讨)。附上__main函数的内容:
- __main:
- 0x08000130 F000F802 BL.W __scatterload_rt2_thumb_only (0x08000138)
- 0x08000134 F000F83C BL.W __rt_entry_sh (0x080001B0)
- __scatterload_rt2_thumb_only:
- 0x08000138 A00A ADR r0,{pc}+4 ; @0x08000164
- 0x0800013A E8900C00 LDM r0,{r10-r11}
- 0x0800013E 4482 ADD r10,r10,r0
- 0x08000140 4483 ADD r11,r11,r0
- 0x08000142 F1AA0701 SUB r7,r10,#0x01
- __scatterload_null:
- 0x08000146 45DA CMP r10,r11
- 0x08000148 D101 BNE 0x0800014E
- 0x0800014A F000F831 BL.W __rt_entry_sh (0x080001B0)
- 0x0800014E F2AF0E09 ADR.W lr,{pc}-0x07 ; @0x08000147
- 0x08000152 E8BA000F LDM r10!,{r0-r3}
- 0x08000156 F0130F01 TST r3,#0x01
- 0x0800015A BF18 IT NE
- 0x0800015C 1AFB SUBNE r3,r7,r3
- 0x0800015E F0430301 ORR r3,r3,#0x01
- 0x08000162 4718 BX r3
- 0x08000164 0298 LSLS r0,r3,#10
- 0x08000166 0000 MOVS r0,r0
- 0x08000168 02B8 LSLS r0,r7,#10
- 0x0800016A 0000 MOVS r0,r0
- __scatterload_copy:
- 0x0800016C 3A10 SUBS r2,r2,#0x10
- 0x0800016E BF24 ITT CS
- 0x08000170 C878 LDMCS r0!,{r3-r6}
- 0x08000172 C178 STMCS r1!,{r3-r6}
- 0x08000174 D8FA BHI __scatterload_copy (0x0800016C)
- 0x08000176 0752 LSLS r2,r2,#29
- 0x08000178 BF24 ITT CS
- 0x0800017A C830 LDMCS r0!,{r4-r5}
- 0x0800017C C130 STMCS r1!,{r4-r5}
- 0x0800017E BF44 ITT MI
- 0x08000180 6804 LDRMI r4,[r0,#0x00]
- 0x08000182 600C STRMI r4,[r1,#0x00]
- 0x08000184 4770 BX lr
- 0x08000186 0000 MOVS r0,r0
- __scatterload_zeroinit:
- 0x08000188 2300 MOVS r3,#0x00
- 0x0800018A 2400 MOVS r4,#0x00
- 0x0800018C 2500 MOVS r5,#0x00
- 0x0800018E 2600 MOVS r6,#0x00
- 0x08000190 3A10 SUBS r2,r2,#0x10
- 0x08000192 BF28 IT CS
- 0x08000194 C178 STMCS r1!,{r3-r6}
- 0x08000196 D8FB BHI 0x08000190
- 0x08000198 0752 LSLS r2,r2,#29
- 0x0800019A BF28 IT CS
- 0x0800019C C130 STMCS r1!,{r4-r5}
- 0x0800019E BF48 IT MI
- 0x080001A0 600B STRMI r3,[r1,#0x00]
- 0x080001A2 4770 BX lr
- __rt_lib_init:
- 0x080001A4 B51F PUSH {r0-r4,lr}
- 0x080001A6 F3AF8000 NOP.W
- __rt_lib_init_user_alloc_1:
- 0x080001AA BD1F POP {r0-r4,pc}
- __rt_lib_shutdown:
- 0x080001AC B510 PUSH {r4,lr}
- __rt_lib_shutdown_user_alloc_1:
- 0x080001AE BD10 POP {r4,pc}
- __rt_entry_sh:
- 0x080001B0 F000F82F BL.W __user_setup_stackheap (0x08000212)
- 0x080001B4 4611 MOV r1,r2
- __rt_entry_postsh_1:
- 0x080001B6 F7FFFFF5 BL.W __rt_lib_init (0x080001A4)
- __rt_entry_postli_1:
- 0x080001BA F000F919 BL.W main (0x080003F0)
2、使用微库而不使用系统库
在程序连接时,不会把包含printf函数的库连接到终极目标文件中,而使用我们定义的库。
启动时需要完成的工作就是之前论述的步骤1、2、3、4、5,相比使用系统库,启动过程步骤更少。