30天自制操作系统day16

来源:互联网 发布:js 获取dom css样式 编辑:程序博客网 时间:2024/05/22 05:06

任务自动化

今天要实现任务切换的自动化。最好能够有一个任务数组,每次定时器timeout就切换到下一个,这样就不用写很复杂的taskswitch()了。
首先执行task_init(),这里创建TASKCTL结构,为task数组的每一个TASK在段表中注册。最后设置当前的任务,也就是把调用task_init()函数的这个程序变成一个任务。之后便可进行任务切换了。
task_run()只是将任务加入running列表,真正的运行是在task_switch()切换到该任务时。

让任务休眠

如果任务主要是IO操作,没有IO的时候没事干,这时可以让它休眠。当IO中断时再把它叫醒。休眠的方法是将任务从running列表中删除,需要唤醒时再次task_run()即可。
task_sleep():将指定的task移出running列表。如果要sleep的任务是当前正在执行的任务(taskctl->now),则立刻进行切换。

具体的做法是:
1. 为FIFO结构添加task成员变量,表示当这个FIFO来数据时,唤醒哪一个task。
2. 在fifo32_put()中,当有数据来时,判断task是否处于休眠,是则调用task_run()。
3. 在主程序for循环中,判断fifo的状态。如果fifo中没有数据则让task休眠。

实现任务的优先级

之前的任务切换都是以0.02秒为固定间隔。要实现优先级,则应该能够以不同的时间间隔切换。

  1. 为TASK结构添加priority成员变量。可以在task_init()中设置,也可以在task_run()中改变。
  2. 在task_switch()中,通过timer_settime(),根据task的priority来设置定时器的timeout值,从而改变任务切换的间隔。

除了时间长短不同,不同优先级的执行顺序也应该不一样。在这里使用了多级队列。处在高级队列中的全部任务休眠或降级时,低级队列才有机会执行。

  1. 新增TASKLEVEL结构,每个结构包含一个TASK指针数组。在TASKCTL结构中加入一个TASKLEVEL结构的数组,保存所有TASK结构的数组只在TASKCTL中有一个。这样形成多级任务队列。
  2. 添加task_add(),task_remove()函数,方便任务在多级间的移动。
  3. 添加task_switchsub()函数,用于改变level。

为实现多级队列,还是改了挺多地方。总的来说,首先将处理鼠标键盘的任务A放在LEVEL0(高优先级),其他任务放在LEVEL1。如果任务A休眠了,则LEVEL0空了,task_sleep()就会调用task_switchsub(),找到一个有任务的level。如果任务A要唤醒了,则task_run()会改变lv_change值,提醒切换任务时切换到更高级level中。

0 0
原创粉丝点击