朱老师ARM裸机学习笔记(七):汇编写启动代码之调用C语言
来源:互联网 发布:linux 知乎 编辑:程序博客网 时间:2024/05/19 13:24
实验环境说明
硬件平台:飞凌嵌入式OK210开发板(S5PV210)
说明:开发板已经刷入OK210原厂u-boot,本文程序直接下载进CPU iRAm中运行
软件平台:Ubuntu15.10 + arm-linux-gcc 4.4.3
初始化栈
1、C语言运行需要栈空间来存储临时变量和函数调用时的所占用的空间。我们在操作系统下写的应用程序以及其他一些单片机程序不需要设置栈是因为,操作系统或者单片机内置的代码已经初始化过栈空间,所以我们可以直接使用,但是ARM需要我们自己初始化栈。
2、栈又分为,满减栈,满增栈,空增栈和空减栈之分。而ATPCS(ARM-THUMB procedure call standard(ARM-Thumb过程调用标准)的简称,PCS规定了应用程序的函数可以如何分开地写,分开地编译,最后将它们连接在一起,所以它实际上定义了一套有关过程(函数)调用者与被调用者之间的协议。)规定ARM使用的是满减栈。所以初始化栈就是把栈指针指向栈的最高位地址即可。
3、S5PV210的CPU共有6个sp(r14)寄存器,即每种处理器模式下一个sp指针,也就是说每种处理器模式下都有一个栈。但是处理器复位后默认进入SVC模式,因此我们只用初始化SVC下的sp指针即可。
4、由于裸机程序并没有初始化SDRAM所以栈只能设置为iRAm的内存空间,关于栈的分配《S5PV210_iROM_ApplicationNote_Preliminary_20091126》中已经给出建议,
所以初始化栈的代码如下
/* step 1: set SVC stack*/ ldr sp, =0xd0037d80
调用C函数
设置好栈后可以通过bl指令调用C语言函数,例如
bl led_blink
完整实验程序如下
Makefile
arm-linux-ld -Ttext 0x0 -o led.elf $^ arm-linux-objcopy -O binary led.elf led.bin arm-linux-objdump -D led.elf > led_elf.dis%.o : %.S arm-linux-gcc $(CFLAGS) -o $@ $< -c%.o : %.c arm-linux-gcc $(CFLAGS) -o $@ $< -c clean: rm -rf *.o *.elf *.bin *.dis
start.S
/**S5PV210 汇编调用C语言*/.global _start_start: /* step 1: set SVC stack*/ ldr sp, =0xd0037d80 /* step 2: call c function*/ bl led_blink /* step 3: while(1) */ b .
led.c
#define GPH2_CON 0xE0200C40#define GPH2_DAT 0xE0200C44#define rGPH2_CON *((volatile unsigned int *)GPH2_CON)#define rGPH2_DAT *((volatile unsigned int *)GPH2_DAT)void delay(void);void led_blink(void){ /* step 1: set GPH2_CON mode to GPIO output*/ /* GPH2_CON[0-3] all 0b0001 */ rGPH2_CON = 0x01111; /* step 2: load off into GPH0_DAT*/ rGPH2_DAT = 0xFF; //all off while(1) { rGPH2_DAT = 0X0; delay(); rGPH2_DAT = 0XFF; delay(); }}void delay(void){ volatile unsigned int i = 60000; while(i--);}
0 0
- 朱老师ARM裸机学习笔记(七):汇编写启动代码之调用C语言
- 五.ARM裸机学习之汇编写启动代码之关看门狗,开iCache,汇编程序和C程序互相调用
- 朱老师ARM裸机学习笔记(六):ARM汇编
- 朱老师ARM裸机学习笔记(四):S5PV210启动过程详解
- 朱老师ARM裸机学习笔记(一):计算机基础知识
- 汇编写启动代码之设置栈和调用C语言1
- 汇编写启动代码之设置栈和调用C语言2
- 汇编写启动代码之关看门狗和设置栈和调用C语言和ICache
- 汇编写启动代码之设置栈和调用C语言
- 汇编写启动代码之设置栈和调用C语言
- ARM汇编写的流水灯,完全裸机(对于汇编学习,板子启动初始化认识帮助很大)
- 一.ARM裸机学习之ARM汇编
- 朱老师ARM裸机学习笔记(二):S5PV210的内存映射
- 朱老师ARM裸机学习笔记(三):CPU和与外部存储器的接口
- 朱老师ARM裸机学习笔记(五):ARMCPU工作模式以及寄存器讲解
- 朱老师ARM裸机学习笔记(二):S5PV210的内存映射
- s3c6410裸机学习笔记(一)--汇编启动代码start.S
- ARM汇编冒泡排序之c语言调用汇编
- java 实现给定一个excel表中的列标题,返回相应的行号
- misc_register杂项设备
- POI 2004 Cave
- DML、DDL、DCL
- android,动画切换界面 animation
- 朱老师ARM裸机学习笔记(七):汇编写启动代码之调用C语言
- shell 命令
- Units Problem: How to read text size as custom attr from xml and set it to TextView in java code
- 设备中断绑定到特定CPU(SMP IRQ AFFINITY)
- 海量数据处理问题
- 每日一bootstrap 表单
- 态度
- Android-改变文字颜色的上下文菜单
- 拒绝被坑 超实用的移动电源选购技巧 分享给大家