发生异常,系统就死机
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"了!!!一个最简单的操作系统就出来了
文章来源于领测软件测试网 https://www.ltesting.net/