tiny6410的C语言环境初始化

来源:互联网 发布:mac不能玩游戏的原因 编辑:程序博客网 时间:2024/06/14 18:10

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;


}

0 0
原创粉丝点击