RTOS嵌入式学习

http://blog.csdn.net/dzpkhas/article/details/1643274

转载


【地址】
像Windows,Linux 这类需要MMU 支持的操作系统,其程序都是放置在虚拟地址
空间的一个固定的内存地址。不管程序在真正RAM 空间的地址位置在哪里,最后都由MMU
映射到虚拟地址空间的一个固定的地址

【地址相关】
为什么程序的运行与存放的地址要相关呢?
学过汇编原理,或者看过最后编译成机器码程序的人就知道,程序中的变量、函数最后都在机器码中体现为地址,
程序的跳转,子程序的调用,以及变量调用最后都是CPU 通过直接提取其地址来实现的


【动态加载】
编译时指定的TEXT_BASE 就是所有一切地址的参考值。如果你指定的地
址与最后程序放置的地址不一致显然不能正常运行


但也有例外,不过不寻常的用法当然要
付出不寻常的努力。有两种方法可以解决这个问题。一种方法是在程序的最起始编写与地址
无关的代码,最后将后面的程序自搬移到你真正指定的TEXT_BASE 然后跳转到你将要运
行的代码处


另一种方法是,TEXT_BASE 指定为你程序的存放地址,然后将程序搬移到真
正运行的地址,有一个变量将后者的地址记录下来作为参考值,在以后的符号表地址都以此
值作为参考与偏移值合成为其真正的地址


听起来很拗口,实现起来也很难,在后面的内容
中有更好的解决办法——用一个BootLoader 支持


【程序分段】
另外,一个完整的程序必然至少有三个段
TEXT 段 (正文,也就是最后用程序编译后的机器指令)
BSS 段 (未初始变量)
DATA 段(初始化变量)




【BootLoader】
前面讲到的TEXT_BASE 只是TEXT 段的基址,对于另外的BSS 段和DATA 段,如果最后的整个程序放在RAM 中,那么三个段可以连续放置,
但是,如果程序是放置在ROM 或者FLASH 这种只读存储器中,那么你还需要指定你的其他段的地址,因为代码在运行中是不改变的,而后两者却不同
这些工作都是在链接的时候完成,编译器必然为你提供了一些手段让你完成这些工作。


还是那句话,有操作系统支持的编程屏蔽了这些细节,让你完全不用考虑这些头痛的问题
但是嵌入式开发者没有那么幸运,他们总是在一个冷冰冰的芯片上从头做起。
CPU 上电复位总是从一个固定的地址去找程序,开始其繁忙的工作
对于我们的PC 来说这个地址就是我们的BIOS 程序,
对于嵌入式系统,一般没有BIOS 支持,RAM 不能在掉电情况下保留你的程序,
所以必须将程序存放在ROM或FLASH中,但是一般来讲,这些存储器的宽度和速度都无法与RAM 相提并论程序在这些存储器上运行会降低运行速率。
大多数的方案是在此处存放一个BootLoader,
BootLoader 所完成的功能可多可少,一个基本的BootLoader 只完成一些系统初始化并将用户程序搬移到一定地址,然后跳转到用户程序即交出CPU 控制权
功能强大的BootLoad 还可以支持网络、串口下载,甚至调试功能。


但不要指望有一个像PC BIOS 那样通用的BootLoader 供你使用,至
少你需要作一些移植工作使其符合你的系统,这个移植工作也是你开发的一个部分,作为嵌
入式开发个入门者来讲,移植或者编写一个BootLoader 会使你受益匪浅


【没有BootLoader 行不行?】
当然可以,要么你就牺牲效率直接从ROM 中运行,要么你就自己编写程序搬移代码
去RAM 运行,最主要的是,开发过程中你要有好的调试工具支持在线调试,
否则你就得在改动哪怕一个变量的情况下都要去重新烧片验证


【程序的入口】
继续程序入口的话题,不管过程如何,程序最后在执行时都是变成了机器指令,一个纯的执行程序就是这些机器指令的集合。
像我们在操作系统上的可运行程序都不是纯的执行程序,而是带有格式的。
一般除了包含上面提到的几个段以外,还有程序的长度,校验以及程序入口——就是从哪儿开始执行用户程序。
为什么有了程序地址还需要有程序的入口呢?这是因为你要真正开始执行的代码并非一定放置在一个文件的最开始,
就算放在最开始,除非你去控制链接,否则在多文件的情况下,编译器也不一定将你的这段程序放置在最后程序的最顶端。
像我们一般有操作系统支持的程序,只需在你的代码中有一个main 作为程序入口——注意这个main 只是大多数编译器约成定俗的入口,
除非你利用了别人的初始化库,否则程序入口可以自行设定——即可。显然,带有格式的这种执行文件使用更加灵活,但需要BootLoader 的支持。
有关执行文件格式的内容可以看看ELF 文件格式。


=======================================================================
一.依据重量级排序


free-rtos ,   RT-Thread , UC-OS,UC-Linux


free-rtos    
免费
内核只由几个源码文件实现,实现了任务管理,时间管理。


RT-Thread  
免费,国产
实现了任务管理,时间管理,内存管理,设备管理(和linux的设备管理类似),可选组件【文件系统, TCP/IP 协议,图形用户界面,FINSH-SHELL(用于调试)】




UC-OS 
收费,文档很多


uclinux
免费
移植相对复杂.  


二.选型依据(个人看法)


ucos 收费,不做考虑。


如果系统很简单,可以不使用操作系统。


如果系统只需要任务管理,可以选用free-rtos。


如果系统需要任务管理,内存管理,界面,网络支持,可以考虑 RT-Thread.


如果系统很复杂,比如有很多个应用程序而且以后还有可能扩充应用程序,才考虑ucLinux。


=================================================
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值