分类: 嵌入式
2016-05-24 12:58:25
汇编语言可以直接对硬件进行操作,因此他是很高效的,所以启动代码使用汇编语言进行编写,然后讲程序交给C语言进行后续的操作,这就涉及到C语言运行环境的设置(主要是设置栈)和汇编语言对C函数的调用。
1 栈的设置
C语言运行时需要栈(C语言的局部变量都是通过栈来实现的),因此我们需要在C语言运行前,使用汇编语言给后续的C代码设置合理合法的栈地址,否则C代码中定义的局部变量就会落空,整个程序就会死掉。
注:用C语言编写单片机程序(如51单片机)或应用程序时,通常并不会“明文”设置栈,但C代码依然可以运行,原因是:单片机硬件初始化时会默认提供一个可用的栈;应用程序中我们编写的C代码其实并不是全部代码,编译器(gcc)会在链接时自动添加一个头代码,这个头代码就会引导并设置C语言需要的栈。
ARM的7中工作模式和37个寄存器的2.3节说明每种工作模式下都有自己的独立的堆栈指针(SP)寄存器(r13),这样设计的目的是: 如果各种工作模式共用同一个SP寄存器,意味着整个程序(操作系统内核程序、用户应用程序)都用同一个栈的,应用程序一旦出错(譬如栈溢出),就连累操作系统的栈也损坏,整个操作系统就会崩溃,这样的操作系统设计是脆弱的,不合理的。因此解决方案就是各种工作模式使用不同的栈,操作系统内核使用自己的栈,每个应用程序也使用自己独立的栈,各不关联,一个损坏不会连累其他人。
我们希望设置SVC模式下的SP寄存器,而ARM复位启动后默认进入SVC模式,因此我们直接设置SP寄存器即可。结合iROM_application_note中的memory map,可知SVC栈应该设置为0xD0037D80(S5PV210s使用满减栈,因此地址为0xD0037D80),代码如下
点击(此处)折叠或打开
汇编语言使用bl指令来调用C语言函数,如调用led_blink函数的代码为
点击(此处)折叠或打开
3 汇编语言设置栈和调用C语言函数的代码展示
点击(此处)折叠或打开
在5.rar 中,包括start.S、led.c、Makefile、mkv210_image.c和write2sd(这里没有用处,仅前4个文件有用),
下面通过阅读start.S和led.c的代码,可以看到栈的设置、汇编语言使用bl指令来调用C语言函数和C语言调用函数的具体指令和过程
点击(此处)折叠或打开