S5PV210开发板用汇编设置栈和调用C语言

Posted Lewin~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了S5PV210开发板用汇编设置栈和调用C语言相关的知识,希望对你有一定的参考价值。

使用C语言前为什么要先用汇编设置栈?
C语言程序运行时需要栈,因为C语言中的局部变量都是用栈来实现的,如果没有设置栈就使用C语言,局部变量就会落空,程序就会死掉,所以在使用C语言前,我们需要先在汇编编写的启动代码中设置栈。

为什么使用51单片机和Ubuntu编写应用程序时我们没有设置栈依然能使用C语言?
原因是在单片机中已经由硬件设置提供了一个默认可用的栈,而在应用程序中我们编写的C程序其实并不是全部,编译器(gcc)在链接时会帮我们自动添加一个头,这个头就是一段引导C程序能够执行的汇编代码,在这个代码中就帮我们的C程序设置了栈及其他的运行时需要。

为什么不同CPU模式下都有各自独立的sp寄存器?
如果各个模式都使用同一个sp,意味着整个程序(操作系统内核程序,用户应用程序)都使用同一个栈,这样做,一旦用户程序编写出错(栈溢出),将会影响操作系统的正常运行,操作系统会崩溃,同时运行在操作系统上的其他应用程序也会崩溃。所以各个模式下要使用不同的sp,使用不同的栈,操作系统有自己的栈,每个应用程序也有自己的栈,互不干扰。

怎么设置栈?
我们要设置栈,并不是设置所有CPU模式下的栈,而是设置当前CPU模式下的栈,因为这个程序可能只用到一种CPU模式。S5PV210复位后默认是进入SVN模式下的,我们设置当前模式下的栈,只需直接操作sp即可。
需要注意的是,栈必须是当前一段可用的内存(可用的意思是这个地方是有被初始化过的可以访问的内存,而且这个内存只会被我们用作栈,不会被其他程序征用)
当前CPU刚复位(刚启动),外部的DDR尚未初始化,需要我们后续对其初始化,所以目前可用的内存只有内部的SRAM(因为它不需初始化即可使用)。因此我们只能在SRAM中找一段内存来作为SVC的栈。

在ARM中,ATPCS(ARM关于程序应该怎么实现的一个规范)要求使用满减栈,结合iROM_application_note中的memory map,可知SVC栈应该设置为0xD0037D80。
示例代码:

#define GPJ0CON 0xE0200240
#define GPJ0DAT	0xE0200244

#define WTCON   0xE2700000

#define SVN_STACK 0xD0037D80
.global _start
_start:
	/*关看门狗*/
	ldr r0, =0
	ldr r1, =WTCON
	str r0, [r1]
	/*设置SVN栈*/
	ldr sp, =SVN_STACK
	/*流水灯*/
	ldr r0, =0x11111111
	ldr r1, =GPJ0CON
	str r0, [r1]
led:
	ldr r0, =~(1<<3)
	ldr r1, =GPJ0DAT
	str r0, [r1]	
	bl delay
	ldr r0, =~(1<<4)
	ldr r1, =GPJ0DAT
	str r0, [r1]	
	bl delay	
	ldr r0, =~(1<<5)
	ldr r1, =GPJ0DAT
	str r0, [r1]
	bl delay
	b led

//	b .
	/*延时函数*/
delay:
	ldr r2, =3000000
	ldr r3, =0
delay_loop:
	sub r2, r2, #1
	cmp r2, r3
	bne delay_loop
	mov pc, lr

以上是关于S5PV210开发板用汇编设置栈和调用C语言的主要内容,如果未能解决你的问题,请参考以下文章

S5PV210开发板用汇编设置栈和调用C语言

S5PV210开发板连接虚拟机的网络设置

s5pv210v3s开发板下载裸机程序的两种方式

s5pv210v3s开发板下载裸机程序的两种方式

s5pv210v3s开发板下载裸机程序的两种方式

S5PV210开发板常用易忘操作记录