S5PV210-NoOS-汇编写启动代码之设置栈和调用C语言

C语言运行时需要和栈的意义

"C语言运行时(runtime)"需要一定的条件,这些条件由汇编来提供。

有些单片机直接写C语言是因为启动文件已经做好了这部分工作。

C语言运行时,主要是需要栈。

C语言与栈的关系:C语言中的局部变量都是用栈来实现的。如果我们汇编部分没有给C部分预先设置合理合法的栈地址,那么C代码中定义的局部变量就会落空,整个程序就死掉了。

我们平时在编写单片机程序或者写应用程序时并没有去设置栈,但是C语言还是可以运行的。原因是:在单片机由硬件初始化时提供了一个默认的栈。在应用程序中,我们编写的C程序其实并不是全部,编译器在链接时会帮我们自动添加一个头,就是一个段引导我们的C程序能够执行的汇编实现的代码,这段代码中就帮我们C程序设置了栈和其他的运行时需要。

CPU模式和各种模式下的栈

在arm的37个寄存器中,每个模式下都有自己的独立的sp寄存器(r13),为什么这么设计?

如果各种模式都使用同一个sp就意味着整个程序(操作系统内核程序、用户自己编写的应用程序)都是用一个栈。你的应用程序一旦出错(栈溢出),就会连累操作系统的栈也损坏,整个操作系统的程序就会崩溃。这样设计是脆弱的,不合理的。

解决方案就是各种模式下用不同的栈。我们的操作系统内核使用自己的栈,每个应用程序使用自己独立的栈,这样各是各的,一个损坏不会连累其它。

我们要设置栈,不可能也没必要去设置所有的栈,我们先要找到自己的模式,然后设置自己的模式下的栈到合理、合法的位置即可。

系统在复位后默认是进入SVC模式的。

我们怎么访问SVC下面的SP呢?先把模式设置为SVC,再直接操作SP。但是因为我们复位后就已经是SVC模式了,所以直接设置SP即可。

我们的栈应该指向哪里?

栈必须是当前一段可用的内存(可用的意思是这个地方必须 有被初始化过可以访问的内存,而且这个内存只会被我们用作栈,不会被其他程序征用)

当前CPU刚(复位)外部的DRAM尚未初始化,目前可用的内存只有内部的SRAM(不需要初始化即可使用)。因此我们只能在SRAM中找一段内存来作为SVC的栈。

栈有四种:满减栈、满增栈、空减栈、空增栈。

满栈:往里存的时候,因为当前位置已经有数据了,所以进栈时先移动指针再存,出栈时先出数据再移动指针。

空栈:相反

减栈:进栈时指针向下移动,出栈时向上移动

增栈:相反

在ARM中,ATPCS(ARM程序规范)要求使用满减栈。我们彩满减栈

结合iROM_application_note中的memory_map可知SVC栈应该设置为0xd0037D80.

程序编写

 

你可能感兴趣的:(linux,单片机)