用ram实现寄存器堆_纯C语言实现bootloader

之前有用很少一部分汇编实现过bootloader,但经过后来慢慢改进,发现是可以用纯C语言实现嵌入式操作系统的引导。

下面是之前对不能完全使用C语言引导系统的几点说明:

1、C程序中所有的代码都是以函数的形式出现,而函数定义通常会用到参数和在函数里面定义一堆局部变量,而这些变量一旦过多时,寄存器就无法全部保存,此时就会将剩下的变量存到堆栈里面,即,SP寄存器所指向的内存里面,而此时的SP寄存器并未赋初值,也就没有确切的内存地址可用。所以需要用到堆栈的前提是SP堆栈指针已经有了明确指向,否则就是非法访问内存,那么SP的设置又离不开汇编。
2、一般bootloader都会分成多阶段完成,而第一阶段的运行内存空间和第二阶段的内存运行空间往往相差很远,所以如果要从第一阶段跳转到第二阶段,那么就是必要用绝对转移,也就是给PC寄存器直接赋值的那种方式,而C语言中用的是函数调用,而函数调用全部都是相对跳转,也就是相对于当前PC地址跳到另一个偏移地址。这里并不是说相对跳转的距离不够,而是地址空间分配有问题。一般第一阶段代码都是与地址不相关的,而所有的两阶段程序都被链接到统一地址空间,所谓统一就是一二阶段不能分家,但不分家不可能,如果都不分家,那就不叫两阶段或多阶段了,就直接是单阶段启动。那么要给PC寄存器赋值,也是离不开汇编的。
3、当然还有,在运行bootloader第二阶段代码之前要用到动态内存,它不像静态内存可以直接使用,动态内存是一种廉价的RAM,是需要先初始化后才能使用的,这就必然导致在运行真正的应用程序之前有一段程序会在静态内存中先执行。不过对动态内存的初如化是很容易使用C语言实现的,无需堆栈的支持。

所以根据以上三点分析,发现重点就是前两条,也就是怎样在C语言中实现对寄存器的访问,我之前做的bootloader虽然没有用到汇编文件,但使用了内嵌汇编来做,感觉还是有汇编存在,对于不懂汇编的人看起来还是不够爽快。后来想到了定义寄存器变量,所以就这么干了,这次使用了两个寄存器变量(分别是R13和R15)实现了纯C语言的bootloader。第一阶段代码可以参考如下:

register 

整个工程到http://iask.sina.com.cn/u/2487717952/ish下载。

需要注意的是:第一个标号的名称一般默认为_start ,但也可以取别的名,可能会有警告,本标号是否会被链接到第一个地址,主要取决于lds和Makefile是怎么写的,请参考源码工程。整个源码参考vivi和u-boot完成,代码量很小,只是完成了操作系统的引导,并不支持下载功能,其实添加一种下载模式就是完成一个驱动再加上一个下载协议,大家可以自己往里面加。

喜欢涛哥文章的可以动动小手,点个赞哦!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值