《加菲猫-51OS》简介

一直想巩固下操作系统的知识,但直接在PC机上写个操作系统可不是简单的活,正好现在学51于是就拿他来开刀,不过在这上面写实在是太憋屈了!


有些同学可能觉得你这也能叫操作系统?然后开始扣操作系统的定义了。我想有这时间还不如把功能帮我加进去,我会很感激的,也不会忘了你的功劳的。其实最早的操作系统比我这个还要原始得多呢,只能完成单任务调度而已。我也想过要添加内存管理,外设管理,进程通信,等。但是仔细想想51就那么大内存需要管理么;不同的应用有不同的外设,没办法统一;8个进程之间互相通信,用户自己完成也不会有问题。于是我就将主要问题放在处理器调度,及定时器0的管理上。后期如果需要还会继续添加更多功能,比如中断管理,更丰富的系统调用。但我的原则是系统的效率不得低于80%,并方便用户的使用。



源代码在:https://github.com/ghking1/Garfield-51OS 

演示视频在:http://v.youku.com/v_show/id_XODM2NDk3NDY0.html

使用手册:还没写好

实现功能:1.任务切换,每1ms切换一次任务,每秒切换1000次,每次切换消耗100个时钟周期左右,平均效率在90%左右。

                    2.系统调用,暂时只提供WAIT和WAKEUP系统调用来定时,最小单位是10ms。

                    3.可同时并行执行8个任务,其中包括3个快速任务和5个标准任务

                    4.更多特性敬请期待!

设计思路:

                   这是RAM空间分布图,30H~37H保存每个任务的SP值,38H~3FH保存任务的状态,40H~47H做其他活。剩下空白的地方可以自由使用。

                  



                  任务切换的实现,用定时器零每1ms产生一次中断并运行_SEITCH_函数切换任务,切换时:

                  先保存当前寄存器环境:因为中断时PC值已保存到栈顶,所以只要将R0~R7,PSW, ACC,  B, DPL, DPH依次入栈即可,SP要保存到30H~37H相应的位置

                  选择下一个任务:根据38H~3FH的值判断下一个任务号

                  恢复到该任务现场:先恢复SP,然后依次弹出个寄存器值

                  用RETI切换到该任务:现在栈顶的值就是PC值了,RETI可以切换到该PC处继续运行



                 系统调用WAIT和WAKEUP,每进行10次任务切换就将38H~3FH里的某些值减去一,代表过去了10ms。最小单位是10ms,而不是1ms(因为有8个任务,切换一圈也要8ms,那么1ms的精确度是永远无法达到的),也不是8ms(你要定1s该把值设成多少呢?5,4,3,2,1。。。算出来了吗?没有吧!)。

                 WAIT调用中如果把状态设成0FFH则表示休眠状态,暂停运行。

                 WAKEUP调用可以唤醒休眠任务也可以唤醒延时任务,都是简单的把状态设为00H。



暂时就写到这吧,整体思路不难,但主要是细节,如何才能达到更高的效率,如何才能更节省空间,如何才能更方便使用,等等问题才是设计的关键。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值