之前有用很少一部分汇编实现过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完成,代码量很小,只是完成了操作系统的引导,并不支持下载功能,其实添加一种下载模式就是完成一个驱动再加上一个下载协议,大家可以自己往里面加。

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

用ram实现寄存器堆_纯C语言实现bootloader相关推荐

  1. 河南理工大学c语言报告封面,河南理工大学图书信息管理系统设计_纯c语言课程设计.doc...

    河南理工大学图书信息管理系统设计_纯c语言课程设计 C语言课程设计报告 题 目:图书信息管理系统设计 河南理工大学计算机学院 目 录 第一章 题目与要求 1.1 问题提出1 1.2 本系统涉及的知识点 ...

  2. 用ram实现寄存器堆_Verilog如何实现低功耗设计?

    做芯片第一应该关注的是芯片的PPA(Performance, Power, Area),本篇浅显的部分讨论,第二个 P,Power功耗,在RTL设计中如何做到低功耗设计,对于移动设备续航的十分重要,不 ...

  3. c语言模拟java面向对象_纯c语言实现面向对象分析与示例分享

    #include #include //接口 #ifndef Interface #define Interface struct #endif //类 #ifndef Class #define C ...

  4. android游戏编程之从零开始_纯C语言程序员写的编程新手入门基础小游戏之最炫酷推箱子...

    很多编程爱好者都编写过推箱子游戏编程吧,最近有好些朋友看见我以前的推箱子程序后, 问我是怎么做的.我一直想把这个程序的整个过程写一份详细的东西,与各位编程爱好者分享,一直没空.正好现在放假了,而且离回 ...

  5. 安卓zip解压软件_纯C语言编写的开源免费解压压缩软件——拥有极致性能的 7-zip...

    7-Zip是干什么的 7-Zip是一款及解压与压缩功能于一体的软件.7-Zip可以将单个.多个文件或单个.多个文件夹打包成压缩包.压缩后占用的空间比原来文件占用的空间要减少20%-40%(依据原文件格 ...

  6. CPU部件实现之ALU、寄存器堆、PC、RAM

    系统硬件综合设计-多周期CPU的设计与实现 计算机组成原理 实验五 单周期CPU设计与实现--十条指令CPU 文章目录 ALU和寄存器堆 一.实验目的: 二.实验内容: 三. 源代码 PC和半导体存储 ...

  7. (转)【CPU微架构设计】分布式多端口(4写2读)寄存器堆设计

    寄存器堆(Register File)是微处理的关键部件之一.寄存器堆往往具有多个读写端口,其中写端口往往与多个处理单元相对应.传统的方法是使用集中式寄存器堆,即一个集中式寄存器堆匹配N个处理单元.随 ...

  8. 【此后无良辰】实验二 CPU部件实现之ALU和寄存器堆

    一. 实验目的 理解和掌握CPU中的算术逻辑运算部件(ALU)和寄存器堆(Register File)的工作原理,并使用Verilog和ModelSim进行设计和仿真. 二. 实验内容 使用Veril ...

  9. 19.jvm内存结构部分——堆_内存诊断_jmap

    接下来我们给大家介绍一下堆内存的一个诊断. 这里主要先介绍一些堆内存诊断相关的一些工具. 我们接下来会掌握这样几个工具啊, 第一个叫 jps 的工具,它是查看当前系统中有哪些java 进程,并且把它们 ...

最新文章

  1. 声明与函数、函数指针
  2. python编写一个软件-python写一个随机点名软件的实例
  3. 高度平衡二叉树的构建_平衡二叉树建立及其增删改查(JAVA)
  4. idea离线下载lombok,以及lobok版本不兼容
  5. Java虚拟机JVM简单理解
  6. 基于OpenCL的mean filter性能
  7. 2017.10.2 loli测试
  8. html图片从中间淡入淡出效果,CSS中的多个图像交叉淡入淡出-无需(java)脚本
  9. c52单片机控制l298n步进电机角度_【设计图文】单片机实现的步进电机控制系统(开题报告+论文+文献综述+外文翻译+DWG图纸)...
  10. c++篇 vc++2010设置和c#一样的代码段,vs2010 两下tab设置
  11. solaris perl print不输出_IC设计中的perl编程
  12. python写机器人程序_从Python写入机器人框架控制台
  13. 你们要的最小样本量计算来了。
  14. linux503解决方法,解决nginx 503 Service Temporarily Unavailable方法示例
  15. string与int之间转换
  16. 线性表示线性相关线性无关
  17. 4月热搜:揭秘金融级人脸实名认证解决方案背后的技术硬货
  18. 【连载】第三章刚体的定轴转动第三节——定轴转动刚体的角动量守恒定律
  19. 1N4148、1N5819、1N4007的区别
  20. 分享十个预加载功能生成器

热门文章

  1. POPUP_TO_DECIDE
  2. 将客户端图片保存到数据库中的方法
  3. 领跑BI赛道,永洪科技入选大数据创新排行榜
  4. 从一年关店千家到营利双增,都市丽人做对了什么?
  5. python中函数可以赋值给一个变量_python中函数赋值给变量时的问题注意详解
  6. linux go语言运行环境,安装Go语言运行环境
  7. Misc-wireshark-1(秒懂!!)
  8. java生成验证码工具类_Java生成图形验证码工具类
  9. easyui treegrid获取父节点的id_超简单的分布式ID生成方案!美团开源框架介绍
  10. python教程:apscheduler模块使用教程