启动文件,其实也就是裸机编程文件
关于这个问题,三种解决方法:
三者我都尝试过,这里我建议选第三种方法吧。(而且我现在是在windows系统上搞这个,网上大部分教程都是在Ubuntu系统,对初学者不友好)
没必要重复造轮子,我们直接找现成的,国产嵌入式实时操作系统 rtthread 这方面就做得比较好,在各种处理器体系都有适配。
rtthread 官网:RT-Thread, RTOS, 物联网操作系统 - RT-Thread物联网操作系统
- _reset:
- /* set the cpu to SVC32 mode and disable interrupt */
- cps #Mode_SVC
-
- #ifdef RT_USING_FPU
- mov r4, #0xfffffff
- mcr p15, 0, r4, c1, c0, 2
- #endif
-
- /* disable the data alignment check */
- mrc p15, 0, r1, c1, c0, 0
- bic r1, #(1<<1)
- mcr p15, 0, r1, c1, c0, 0
-
- /* setup stack */
- bl stack_setup
-
- /* clear .bss */
- mov r0,#0 /* get a zero */
- ldr r1,=__bss_start /* bss start */
- ldr r2,=__bss_end /* bss end */
-
- bss_loop:
- cmp r1,r2 /* check if data to clear */
- strlo r0,[r1],#4 /* clear 4 bytes */
- blo bss_loop /* loop until done */
-
- #ifdef RT_USING_SMP
- mrc p15, 0, r1, c1, c0, 1
- mov r0, #(1<<6)
- orr r1, r0
- mcr p15, 0, r1, c1, c0, 1 //enable smp
- #endif
-
- /* initialize the mmu table and enable mmu */
- ldr r0, =platform_mem_desc
- ldr r1, =platform_mem_desc_size
- ldr r1, [r1]
- bl rt_hw_init_mmu_table
- bl rt_hw_mmu_init
-
- /* call C++ constructors of global objects */
- ldr r0, =__ctors_start__
- ldr r1, =__ctors_end__
-
- ctor_loop:
- cmp r0, r1
- beq ctor_end
- ldr r2, [r0], #4
- stmfd sp!, {r0-r1}
- mov lr, pc
- bx r2
- ldmfd sp!, {r0-r1}
- b ctor_loop
- ctor_end:
-
- /* start RT-Thread Kernel */
- ldr pc, _rtthread_startup
- _rtthread_startup:
-
- /* 这里就是把rtthread_startup这个函数地址放在这儿了,实现上面的跳入C语言函数了 */
- .word rtthread_startup