一直想巩固下操作系统的知识,但直接在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。
暂时就写到这吧,整体思路不难,但主要是细节,如何才能达到更高的效率,如何才能更节省空间,如何才能更方便使用,等等问题才是设计的关键。