实验环境说明
硬件平台:飞凌嵌入式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, =0xd0037d80123123
调用C函数
设置好栈后可以通过bl指令调用C语言函数,例如
bl led_blink11
完整实验程序如下
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 *.dis12345678910111213141234567891011121314
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 .1234567891011121312345678910111213
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--);
}1234567891011121314151617181920212223242526272829303132333412345678910111213141516171819202122232425262728293031323334
关键字:ARM 裸机学习 汇编 启动代码
引用地址:
朱老师ARM裸机学习笔记(七):汇编写启动代码之调用C语言
推荐阅读最新更新时间:2024-03-16 15:35
ARM ADS集成开发环境的使用
8.1ADS集成开发环境组成介绍 ARM ADS全称为ARM Developer Suite。是ARM公司推出的新一代ARM集成开发工具。现在ADS的最新版本是1.2,它取代了早期的ADS1.1和ADS1.0。它除了可以安装在Windows NT4,Windows 2000,Windows 98和Windows 95操作系统下,还支持Windows XP和Windows Me操作系统。 ADS由命令行开发工具,ARM时实库,GUI开发环境(Code Warrior和AXD),实用程序和支持软件组成。有了这些部件,用户就可以为ARM系列的RISC处理器编写和调试自己的开发应用程序了。 下面就详细介绍一下ADS的各个组成部
[单片机]
ARM Linux (S3C6410架构/2.6.35内核)的内存映射(三)
这里记录一下Linux内核做二级内存映射的过程,以中断向量表的映射过程为例。 在S3C6410架构下,Linux采用的是粗粒度小页内存管理方式,即内存段(section)的大小为1M,而页(page)的大小为4K。在第一级内存映射中,每一个PGD项覆盖1M的内存区域;如果有二级内存映射的话,每一个PTE项覆盖4K的内存区域。 下面我们来看一下二级内存映射表的设计。如果段的大小是1M而页的大小是4K的话,那么每一张二级映射表即页表中就需要有1M/4K=256个表项。而不论是PGD还是PTE,每一个表项的大小是4字节,即一个长整形数的大小。一张页表的大小为256*4=1024/1K字节,所以,页表的大小与页的大小并不能对并,一张4K大
[单片机]
未来4年ARM芯片出货量上看1000亿颗
日经亚洲评论7月21日报导,ARM Holdings执行长Simon Segars20日在东京受访时表示,在“物联网(IoT)”需求的带动下,未来4年采用ARM技术的芯片出货量预估累计将达到大约1千亿颗、跟公司自1990年成立迄今的累计总量一样多。智能型手机芯片霸主安谋目前已经将焦点转移至IoT,相关产品大致可区分为微控制器、网路芯片以及服务器CPU。Segars透露,ARM正与高通(Qualcomm)、华为(Huawei Technologies)携手开发服务器芯片。 ARM目前员工人数超过5千人、较2015年底的不到4千人呈现显着增长,多数新进员工都是工程师。为了让IoT与相关服务加速普及,包括日本、美国、欧洲、中国以及韩国的
[手机便携]
基于ARM11的车载信息娱乐模块的开发与研究
车载信息娱乐系统为提高汽车驾乘的舒适度起到了重要的作用,从而使得 汽车娱乐系统 在近些年得到了飞速发展。一方面,用户对多媒体娱乐的要求在逐步增高;另一方面,由于汽车电子软硬件技术的不断发展,也使得各种各样的汽车娱乐系统应用实现成为可能。车载娱乐系统的技术发展正在变得日益复杂,通过铜缆发送音频数据的简单音频系统已经成为过去。为了满足多通道音频处理和分布式视频的要求,复杂的网络处理变得越来越流行。特别是与数字传输内容保护(DTCP)加密和解密方法相关的面向媒体的系统传输(MOST)光网络正在被许多高档和中档汽车采用。 1 系统组成 系统采用飞思卡尔IMX35处理器,该处理器基于ARM11TM核心技术,高性能、低功耗、面向数据连
[单片机]
ARM启动过程
基于ARM的芯片多数为复杂的片上系统,这种复杂系统里的多数硬件模块都是可配置的,需要由软件来设置其需要的工作状态。因此在用户的应用程序之前,需要由专门的一段代码来完成对系统的初始化。由于这类代码直接面对处理器内核和硬件控制器进行编程,一般都是用汇编语言。一般通用的内容包括: 中断向量表 初始化存储器系统 初始化堆栈 初始化有特殊要求的断口,设备 初始化用户程序执行环境 改变处理器模式 呼叫主应用程序 1. 中断向量表 ARM要求中断向量表必须放置在从0地址开始,连续8X4字节的空间内。 每当一个中断发生以后,ARM处理器便强制把PC指针置为向量表中对应中断类型的地址值。因为每个中断只占据向量表中1个字的存储空间,只
[单片机]
ARM cortex-M4 jtag 读取 dp 和 ap 寄存器 实例 解读
https://www.linmingjie.cn/index.php/archives/253/ DDI0413C_cortexm1_r0p1_trm.pdf // https://developer.arm.com/documentation/ddi0413/c/Babeagge stm32f407zg 开发板 // 随意一个 这样的卡发版即可 dsview 套装(逻辑分析仪) jlink for windows 软件 jlink (usb转jtag) 因为 没有合适的资料,所以选取了 m1 的 trm DDI0413C_cortexm1_r0p1_trm 中 有详细的 DAP 描述 读者可以 以 cortex-
[单片机]
arm7 LPC2103 中断的处理方法
向量中断控制器(VIC)具 有 32 个中断请求输入,可将其编程分为3 类:FIQ 、向量IRQ和非向量IRQ 。可编程分配机制意味着不同外设的中断优先级可以动态分配并调整。 快速中断请求(FIQ )要求具有最高优先级。如果分配给 FIQ 的请求多于1 个,VIC 将中断请求“相或”后向ARM处理器产生 FIQ 信号。当只有一个中断被分配为 FIQ 时可实现 最短的FIQ 等待时间,因为FIQ 服务程序只要简单地启动器件的处理就可以了。但如果分配给FIQ 级的中断多于1 个,FIQ 服务程序从 VIC 中读出一个字来识别产生中断请求的 FIQ中断源是哪一个。 向量IRQ 具有中等优先级。该级别可分配32 个请求中的
[单片机]
ARM、Intrinsity携手让Cortex-R4处理器拥有近双倍时脉
Cortex-R4X处理器为储存、打印机及网络设备提升两倍运作时脉 ARM与Intrinsity公司宣布,将运用ARM Cortex系列处理器于更多高效能应用上。首波计划便是采用标准的合成技术,在相同的硅组件制程下,让Cortex-R4处理器拥有将近双倍时脉,也就是Cortex-R4X处理器。该处理器目前已由ARM提供授权。 新款Cortex-R4X处理器结合了Intrinsity的Fast14 1-of-N Domino Logic(NDL)技术,创造出更快的电路速度,并将耗电量及占用的电路板空间降至最低。拥有超快处理速度的ARM Cortex-R4X 处理器,创造出更高的容量与资料速度,同时不会增加硬盘机、打印机及网络设备
[新品]