注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

一步一步写嵌入式操作系统3—操作系统的启动代码  

2011-10-06 16:35:14|  分类: ARM学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

前面的两章基本上把一些基础的东西讲了一下,有些汇编的代码和其必要的说明大家可以查阅资料,这样再和书上印证,会学习的更深入一些。今天开始正式的写操作系统的代码,要有耐心,要坚持,不要总想着一步就能成功到达幸福的彼岸。
这里当然的会用到上面讲过的汇编和C语言混合编程的知识,我们将SDRAM的地址从原来的0x0的位置重新映射到0x30000000 这个位置上,这样,应该就和实际的代码有所相同了,大家看上去也就比较的顺眼了。我们建立四个文件,即boot.c、init.s、start.s、abnormal.s,这四个文件的作用如下:boot.c用来完成简单的抽象,并定义实际运行的代码和映射的函数,这个如果大家看过LINUX或WIN下的驱动中的中断例程就会立刻明白他的意思,当然,如果没看过也没有什么问题,想想就会了,不过是一个函数指针的数组,不过,你要是说你不明白什么是函数指针,什么是数组,那个,建议你回头看看C语言的书籍。init.s主要是用来初始化一些中断和处理器模式的宏,另外还要对一些内存地址进行重定义,

这样在阅读和编写代码时,会大大的减轻难度。.equ和C 语言中的#define用法大致相同,看看2410系列里的寄存器定义吧,你就会明白一切了。然后是对系统启动后进入的地址进行定位,模式的处理等等。
start.s中的东东主要是将启动函数,模式处理的函数,中断处理函数等进行装载,那我们就会发现,我们到处都在使用,都在调用一系列的函数,那他们在哪儿定义的呢,毕竟在C语言中是要求先声明后使用的,这样,就必须有一个abnormal.s文件,这里面声明了我们使用的一系列函数,但由于目前我们还不需要处理这些个函数,所以我们只需要在这些函数内用一条nop空指令来动作一下即可,是不是象在高级语言中做的接口,啥都没有,只有一个函数体,然后直接return。

这里为了简单,可以把上面写好的Makefile文件复制过来,然后在上面简单修改即可,同样,skyeye.conf和leeos.lds亦是如此,但这里却出现了一些错误,有几个是小笔误,不认真造成的,比如. = ALIGN(32);写成了. = ALIGN(2);少写了冒号,但最要命的是在init.s里面重复的复制了几次竟然都没有察觉,编译出来错误才发现,但最最让人伤心的是这些都改正,代码编译正确后,拷贝到执行目录下,却发现,报bank找不到,程序无法运行,程序不断的打印这个错误,第一次写这个,也没啥感觉,来回的修改,编译,运行,都不成,最后真是没有办法了。后来仔细的看了下错误,觉得应该是内存映射不对,按照真正的硬件,这个东西应该是映射的位置错误或者说硬件的RAM根本就没有起来。
于是开始怀疑配置文件skyeye.conf是不是写错了,就几行代码嘛,一个个的对,结果完全一样,只是字体变了颜色,这个应该是正常的啊,后来测试还是不行,最后决定把好的直接拷贝过去,结果,直接程序就通过了,再在原来的错误的上面改,也改好了,不知道什么原因,一样的路,又走了一次就通过了。
所以说,做事,要认真,细心,胆大,有耐心,不要轻言放弃!
代码就不贴了,白占地儿。

  评论这张
 
阅读(1113)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017