SDRAM和重定位---开始在汇编代码中调用 C 语言

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SDRAM和重定位---开始在汇编代码中调用 C 语言相关的知识,希望对你有一定的参考价值。

  前面的点亮led的代码由于比较简单,所以全部用汇编代码完成,但是随着代码越来越多,逻辑关系越来越复杂,想要完全用汇编代码来写程序不太现实,必须要借助 c 语言程序,那么就会有从汇编语言到 c 语言的一个过渡阶段。
=======================================================
如何在汇编语言中调用 c 语言?
  在汇编中调用 c语言程序的方法很简单,只需利用汇编代码:bl xxx(函数名)即可,但是重点不是如何调用 c 程序,而是汇编代码要为运行 c 程序做哪些准备?
  从以前的掌握的知识来看,当 c 程序被编译成汇编代码后会有text段、data段和bss段,这三个段会在链接脚本中被指定链接地址,所以不需要额外的汇编代码来提供环境(除了需要汇编代码来将bss段清零),这三个段是和 c 程序中的代码、全局变量或者静态变量等资源相关的,但是 c 程序中的局部变量是存放在栈中的,从 c 程序编译而来的汇编代码可以看到,汇编代码中直接使用了 sp 这个堆栈寄存器(见下图),所以在执行 c 程序之前必须由汇编代码先设置好 栈顶(sp)的值。(在s5pv210中,由于iROM中的代码其实已经设置好了栈的,所以我们不设置也是可以的
  至于为什么我们在编写应用程序的时候为什么没有先用汇编代码设置好栈呢?这个问题在之前谈c 程序的入口地址的时候已经解决了,在执行 main 函数之前会执行一些库代码,在这些库代码中就会设置好 栈顶(sp)的值。
技术分享
技术分享
 
 
技术分享
技术分享
======================================================
下面的问题就是我们应该将 栈顶(sp) 设置在哪里?
  由于我们的裸机程序是被当作 BL1 来执行的,也就是说会被 BL0(iRom中的代码)复制到 iRAM中执行,由于此时 SDRAM 控制器还没有被初始化,所以还不能够直接使用 SDRAM 的地址,无法使用SDRAM的空间。故此时裸机的栈只能被设置在 iRAM 中,iRAM有96KB的大小,其中16KB是用来存放 BL1 代码的,那么 栈顶(sp)被具体设置在 iRAM 中的哪个位置?Samsung的工程师已经帮我们考虑了这个问题,给出了建议的 栈的位置,见下图
技术分享
技术分享
根据ATPCS的规定,推荐的栈的类型是满减栈,这也就是说,c 程序被编译后生成的汇编代码中,对于 栈 的使用,是默认使用的满减栈,所以栈顶位置(sp)应该设置为 高地址0xD003_7D80。如果设置为 低地址,那么由于 c 语言默认按照满减栈来使用,在入栈数据的时候会先将 sp 减4,那么这就不在Samsung推荐的栈的区域内。

以上是关于SDRAM和重定位---开始在汇编代码中调用 C 语言的主要内容,如果未能解决你的问题,请参考以下文章

SDRAM和重定位---看门狗详解

SDRAM和重定位---icache的开启和关闭

代码重定位和位置无关码

Arm中的c和汇编混合编程

c语言中函数调用的本质从汇编角度分析

代码重定位