×
单片机 > 单片机程序设计 > 详情

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

发布时间:2024-05-17 发布时间:
|

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, 0n” @%0为一个占位参数


:


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


);


}



//例2


usigned long read_p15_c1 (void)


{


usigned long value


__asm__(


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


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



:”memory”


);


return value;


}


4.2 、优化


在编程中,使用volatile来告诉编译器,不要对接下来的这部分代码进行优化(特别是在对硬件进行操作时)


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
C51 特殊功能寄存器SFR的名称和地址