查看: 490|回复: 4
打印 上一主题 下一主题

实现一个最简单的嵌入式操作系统(三)

[复制链接] qrcode

3

主题

8

帖子

21

积分

新手上路

Rank: 1

积分
21
楼主
跳转到指定楼层
发表于 2015-12-22 12:06 PM | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

如何实现一个最简单的操作系统

这里为了简单,就不考虑可移植性开求,不从BOOT部分来接收参数,也不对硬件进行检测,
也不需要进行DATA段,代码段的重定位。我只是读了LINUX内核相关部分,并未自己去实现
一个操作系统,所以我以下所说的只是概念性的东西:


1.接管系统的中断处理,由于BOOT部分的代码决定了那个中断向量表,从而决定了系统中断
之后进入的内存位置,但BOOT并不知道操作系统的中断处理函数位置所在啊,怎么办呢?
有几种方法,其一是:如果你的板子可以重映射地址,也就是可以将内存条所在的位置
重映射成0x0开始,那么在链接内核的时候,就将操作系统自己的中断向量表定位在0x0处
并且在BOOTLOADER引导结束时就完成映射操作,并让CPU跳转到0x0处执行;如果没有重映
射功能,我就不晓得怎么办了,不过我想到一个折衷的办法,就是在BOOTLOADER启动完成
时(也就是将CPU控制权交给操作系统内核时),重新改写FLASH的0x0区域,就是将操作
系统的内核的中断向量表写入FLASH区的0x0处,比如,当一个IRQ发生时,CPU决定了会
跳入0x18(假设这里FLASH占用地址总线0x0至0x0fffffff,内存占用0x20000000至0x2fffffff)
,而BOOTLOADER在最后将0x18处的代码修改成了0x20000000加上0x18的地址处的代码,而这个
地址就是内核的中断向量表中的相关跳转指令,就相当于跳转进了内核所关联的IRQ处理函数
的地址上去执行中断处理函数了,而这样的不好之处在于:当系统重新上电之后,BOOT的
中断向量表已经被修改,除非BOOT本身不使用中断,呵,在这样简单的系统中,BOOT是不
需要中断功能的

2.这里为了简单,所以没有使用分页内存管理,就不需要建立页表等操作,直接进行操作
系统的堆栈设置,同BOOT一样的设置过程一样,接着就进行BSS段清零操作,这里的BSS段
是指操作系统自身的BSS段,与BOOT的BSS段是同一个含义只是用在了不同的地方了,接着
就跳入了MAIN函数

3.为了最大可能的简单,采用静态建立任务结构数组,比如只建立十个任务,那么首先要
为这十个任务结构分配段内存,可以在堆上分配(这个分配的内存直到操作系统结束才会
被释放,当然也可以指定一片操作系统的其它地方都用不到的内存区域,不过这样写的话
就有点外行的味道了,而符务结构数组的指针却是全局变量,存放在BSS段或者DATA段),
由于在上一步中已经分配了一个系统堆栈,那么我们这十个任务就分享这总体的堆栈区域
这里的重点就是如果定义每个任务结构数组里面的结构,可以参照LINUX的相关部分设计

4.中断处理:在第一步中已经确定了CPU进行相关的几类型的中断跳转地址,而相同类型
的中断却只有一个入口地址,这里的中断处理就会完成以几个动作:
其一:入栈操作,包括所有寄存器入栈,至于这个栈,就是在第二步中所设置的IRQ栈,
其二:屏掉所有中断,呵,这里为了简单起见,所以在处理中断时不允许再次发生中断
其三:读取中断相关的寄存器,判别是发生了什么中断,以至于跳进相关的中断处理函
数中去执行(在这里只包括两种中断,一是时钟中断,另一个是SWI中断,也就是所谓
的系统调用时需要用到的)
其四:等待中断处理完成,然后就开启中断并出栈,恢复现场,将CPU控制权交给被中断
的代码处
注意:
其一:在MIAN中必须首先确定整个系统有哪些需要处理的中断,也就是有哪些中断处理
函数,然后才编写这里的中断处理函数
其二:本操作系统不处理虚拟内存,其至连CPU异常都不处理(一切都为了简单),一旦
发生异常,系统就死机

5.对TIMER的实现,首先确定时间片,为了让系统更稳定,而且我们不需要实时功能,尽
可能让时间片设置长一点,比如我们让一个任务运行20个时钟滴答数,然后应根据系统
频率来确定每个系统滴答所占用的毫秒,这里使用5毫秒让系统定时器中断一次,那么就
需要写时钟寄存器,具体参阅芯片资料,计算下来,一个任务最大可能连续运行100毫秒
,注意:我们的操作系统不支持内核抢占,同时只支持两级中断优先级,就是只有时钟
中断的优先级高一点,其它的优先级都低一级,但是在中断处理一节中却屏掉了这个功能
因为一进入中断处理,就禁止中断,所以不管其它中断优先级有多高都没有用的,这样做
优点是简单了,但不好之处显而易见,特别在相关中断处理函数如果进入了死循环,那么
整个系统就死了,而且时间片也变得不准确了,反正都不用实时,也不需要实时钟支持嘛
至于中断优先级设置请参阅芯片资料


6.进程调度的实现,也就是do_timer函数(时钟中断处理函数),有一个全局变量指针,
指向的就是当前任务结构数组(或者链表),当时钟中断时,就进入此函数中,首先判断
任务结构体中的时间片是否用完,如未用完,就减一,然后退出中断,让CPU继续运行当
前的任结构,若用完了时间片,就重置时间片,并重新寻找任何结构数组中的下一个等待
运行的任务,若找到了,就切换至新的任务,至于如何切换,请见下一页描述,如果未找
到就切换到IDLE任务(类似于LINUX,呵呵,所有的处理就是模仿LINUX,由于本人水平太
差,所就不能自创一招),注意:为了简单,所以没有实现任务优先级,也未实现任务
休眠等,也就是说只要静态地决定了有十个任务,这十个任务就按先后顺序一个一个执行
而且每个任务都不允许结束,就是说在每个进程中的最后一句代码都必须用死循环,不然
的话系统就跑飞了),还有一点,进程不支持信号,没有休眠与唤醒操作,这个CPU就是
不停地在运行,呵呵,反正CPU又不是人,所以不需要人权的哈!!!这种调度是不是简
单得不能再简单了?????!!!!

7.串口不使用中断,这就是最大可能的降低难度,串口使用论询的方式来实现读写(当
然是阻塞的方式了哦,而且只有写,不允许读,因为读的时候需要涉及到采用中断方式,
因为轮询方式有个不好的地方,那就是正在读的时候,这里有可能当前进程的时间片用
完了,系统切换到另一个进程,这里你在PC机的串口输入的数据就丢弃了,唉,又是为
了简单嘛)

8,最后一步就是MIAN函数的最后一部分,将本进程当作IDLE进程(相当于修改任务结构
数组中的数据),开启中断,将当前进程加入一段死循环,以免它退出去。

9.编译你的BOOTLOADER,KERNEL,并烧写至FLASH,反复调试

10.至此将你的at91rm9200(或者是其它相类似的芯片)的串口接上PC机,打开超级终端,
打开板子电源,说不定你的操作系统就打印出了"hello,world"了!!!一个最简单的操作
系统就出来了

下一页是具体的功能模块实现

回复

使用道具 举报

0

主题

8

帖子

18

积分

新手上路

Rank: 1

积分
18
沙发
发表于 2006-4-26 11:12 AM | 只看该作者
这是个全新的设计思路,希望大家发表意见。或直接回MAIL与我们交流:
info@cyclone.com.cn
回复 支持 反对

使用道具 举报

1

主题

12

帖子

27

积分

新手上路

Rank: 1

积分
27
板凳
发表于 2006-5-27 11:46 AM | 只看该作者
楼主厉害啊


DSP+CPLD+单片机学习板 特价:480元
多功能红外单片机开发板 特价:180元
TMS320vc5502最小系统板(DSP5502开发板) 290元
S3C44B0开发板 特价:380元
USB2.0增强型DSP仿真器 特价:780元

QQ:342665334
Email:wen_zl@163.com
淘宝网店:http://shop33496317.taobao.com/
中国DSP网: http://www.chinadsp.cn/ (现有大量空板免费赠送活动,呵)
回复 支持 反对

使用道具 举报

0

主题

8

帖子

18

积分

新手上路

Rank: 1

积分
18
地板
发表于 2006-5-27 02:26 PM | 只看该作者
果然厉害!!!                                                                                                                                                                       
回复 支持 反对

使用道具 举报

0

主题

8

帖子

18

积分

新手上路

Rank: 1

积分
18
5#
发表于 2006-5-27 04:40 PM | 只看该作者

隆重推出Cyclone/II系列FPGA/SOPC(NiosII)开发套件V3.0版本
在广大朋友的支持下,本站取得了喜人的发展,为答谢大家, 在周年誌庆期间,本站全线产品学生客户以及本站老客户可享受8.8折!一:特色:
1、 多款FPGA核心板可选:EP1C6、EP1C12、EP2C5、EP2C8核心板;
SDRAM:64Mbit SDRAM;
FLASH:16Mbit(可升级到32Mbit);
配置芯片:EPCS1或EPCS4;
I2C EEPROM;
50Mhz有源时钟等;
提供配置模式:JTAG和AS;
所有IO、Avalon总线、配置管脚等都通过4排插针引出,用户可以充分自由发挥,扩展更灵活。
2、 实验板3.0
配备:
★RS-232串口:用于与计算机的数据通信;
★VGA接口:直接VGA与显示器对接,用FPGA实现VGA接口协议可在显示器上显示文字、图型等;
★PS/2鼠标,键盘接口:标准鼠标,键盘接口,提供的例程用VHDL实现在数码管上同时显示键盘扫描码和ASCII码,也可结合SOPC编程使其显示在LCD上;
★16*2字符型LCD:可以显示英文字符和自定义字符;
★128*64图形式LCD:可以显示中文、图形等;
★蜂鸣器:使用NIOSS II定时器中断编程产生特定波形,可奏出各式乐曲如:北国风光,康定情歌...
★两个USB:
(1)采用USB-UART桥接芯片CP2102,兼容USB1.1和USB2.0协议,最高通信速率为1Mbps,抗干扰性能好,可直接用于通信速率要求不是很高的场合,如工控设备、仪器仪表等,方便实用;
(2)USB1.1实验接口,直接扩展FPGA的IO到USB接口,用于评估FPGA上实现USB Controler的功能。
★4位7段数码管:分别提供用VHDL和NiosII实现动态扫描的程序,用VHDL实现自动动态扫描,不占用CPU处理时间。
★4个按键开关:同样秉承简约风格,不追求多,但求简约,节省有限的IO资源,用于NiosII的外部按键输入、中断等实验足矣。

3、其它配件:
(1) ByteBlasterII下载线;
(2) USB线;
(3) 5V开关电源;
(4) 用户手册以及详细的入门教程;
(5) 齐全的软件、文档资料等;
(6) 详尽电路原理图;
(7) 1602A字符LCD,(选配,仅需20元);
(8) 128*64图形LCD,(选配,仅需80元);

详情请登陆:http://21control.com/

三、特点:
(一) 设计独特,既适合学生学习使用,也适合于实际项目设计中快速搭建系统原型以验证设计方案。核心板(EP1C6型V2.0)实际上是一块独立的SOPC最小系统板,SDRAM和Flash都集成在核心板上,用户甚至可以用面包板制作特定项目所需的外围电路,并插上该核心板就构成了一个完整的项目系统原型。另外,如果项目试验中只需用到FPGA功能(即无需定制Nios系统),则可以将SDRAM和Flash卸下,核心板就成了一个将所有FPGA的IO管脚引出的FPGA核心板,同样可用于快速搭建项目系统原型。
(二) 模块化结构,简单明了,有详尽文档、教程,真正适合初学者。经验表明,很多学生在学习FPGA、ARM、DSP等设计技术的过程中,虽然刚开始学习热情很高,但真正能坚持下来一直到“学会”的却只有寥寥几个。除了学生个人的毅力因素的原因外,另外一个更主要的原因是由于所选用的学习板不适合初学者学习使用。对于初学者来说,理解和消化开发板并不容易(事实上如果能达到这种程度的话,也就没必要借助学习板了),再加上这些开发板在文档资料、教程上都非常欠缺
,有些几乎连说明文档都没有,这就给学生们的学习增添了更多的困难,很多学生会因为找不到入门的口子而慢慢失去兴趣和信心。我们从初学者的角度出发,尽量明了化学习套件的设计,并针对学习套件编写详尽的说明文档和教程,希望学生从简单到深入地理解开发的过程,并能快速地跨入这个门槛,建立起学习的信息和兴趣。
(三) 具有可持续学习性。传统的学习板将FPGA与实验电路集成一体,虽然预留了一些FPGA的I/O给学生扩展用,但预留的I/O有限,当学生学习到一定程度并初步具备自主设计能力的时候,这样的学习板显然已经不能满足进一步学习的要求。我们采用FPGA核心板与实验板相分离的结构,核心板主要由FPGA芯片和电源、配置芯片和时钟源组成,即FPGA的最小系统组成,FPGA的所有I/O都以核心板的插针引出。当学生初步具备自主设计能力的时候,可以自主设计
实现更复杂功能的实验板,并将核心板插接到自主设计的实验板的插座上,即可利用FPGA的所有I/O。
(四)价格低,真正面向广大学习者,特别是在校学生。


详情请登陆 http://21control.com

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表