1、栈的初始化(弄清楚栈的概念和作用)
init_stack:
ldr sp, =0x54000000
mov pc, lr
2、bss段初始化
初始化的全局变量->数据段
局部变量->栈
malloc->堆
未初始化的全局变量->bss段
bss段初始化就是bss全段清零。
clean_bss:
ldr r0, =bss_start
ldr r1, =bss_end
cmp r0,r1
moveq pc,lr
clean_loop:
mov r2, #0
str r2, [r0], #4
cmp r0, r1
bne clean_loop
mov pc,lr
3、跃进c语言大门
建立一个新文件main.c,把start.S中的bl light_led注释掉,把#define GPKCON 0x7F008800
#define GPKDAT 0x7F008808
light_led:
ldr r0, =GPKCON
ldr r1, =0x11110000
str r1, [r0]
ldr r0, =GPKDAT
ldr r1, =0xa0
str r1, [r0]
mov pc, lr
拷贝到main.c文件中,并且修改为#define GPKCON (volatile unsigned long*)0x7F008800
#define GPKDAT (volatile unsigned long*)0x7F008808
int gboot_main()
{
*(GPKCON) = 0x11110000;
*(GPKDAT) = 0xa0;
return 0;
}
在start.S中加上跳转ldr pc, =gboot_main
4、c与汇编混合编程
在c语言中调用汇编函数,在汇编语言中调用c语言函数
重点是在c语言中内嵌汇编代码。
格式如下:
__asm__(
汇编语句部分
:输出部分
:输入部分
:破坏描述部分
);
main.c:
//#define GPKCON (volatile unsigned long*)0x7F008800
//#define GPKDAT (volatile unsigned long*)0x7F008808
#define GPKCON 0x7F008800
#define GPKDAT 0x7F008808
int gboot_main()
{
//*(GPKCON) = 0x11110000;
//*(GPKDAT) = 0xa0;
/*light_led(); */
__asm__(
"ldr r1, =0x11110000\n"
"str r1, [%0]\n"
"ldr r1, =0xa0\n"
"str r1, [%1]\n"
:
:"r"(GPKCON),"r"(GPKDAT)
:"r1"
);
return 0;
}