您的位置:首页 > 编程语言 > C语言/C++

ARM裸机程序开发(十):C语言环境初始化

2015-10-14 20:43 351 查看
Part1 栈初始化

一、满 / 空栈

1.1 满栈: 当堆栈指针SP总是指向最后压入堆栈的数据(ARM采用)

1.2 空栈: 当堆栈指针SP总是指向下一个将要放入数据的空位置

二、升 / 降 栈

根据入栈时,SP指针的移动方向分:若从低——》高 为升栈,从高到低为降栈(ARM使用)

三、栈帧

定义:一个函数所使用的那一部分栈,称为栈帧

栈帧的两个边界 :fp(r11) 、 sp(r13)

三、栈作用

3.1 保存局部变量

3.2 传递参数 :当传递的参数大于4个时,使用栈来传递,否则,用通用寄存器来传递

3.3 传递寄存器的值

Part2 BSS段1初始化

Part3 从汇编跳转到C

跳转方式:绝对跳转

Part4 c与汇编混合编程

一、何处使用汇编:1、效率要求高的地方;2、需要直接操作硬件(如协处理器的操作)

二、汇编中调用C:直接把C的入口指针直接赋值个PC

(C代码在单独的C文件中)

三、C中调用汇编:在汇编文件中将标号声明为.global,然后在C中直接作为函数调用即可。

(汇编代码在单独的文件中)

四、C中内嵌汇编

4.1 、格式

__asm__(

汇编语句部分

:输出部分

:输入部分

:破坏描述部分

);

//例1

void write_p15_c1(unsigned long value)

{

__asm__(

“mcr p15, 0, %0, c1, c0, 0\n” @%0为一个占位参数

:

:”r”(value) @r指明为通用寄存器

);

}

//例2

usigned long read_p15_c1 (void)

{

usigned long value

__asm__(

“mrc p15, 0, %0, c1, c0, 0\n” @c1中读出值送入Value中

:”=r”(value) @’=’表示只写操作数,用于输出部



:”memory”

);

return value;

}

4.2 、优化

在编程中,使用volatile来告诉编译器,不要对接下来的这部分代码进行优化(特别是在对硬件进行操作时)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: