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秒为固定间隔。要实现优先级,则应该能够以不同的时间间隔切换。
- 为TASK结构添加priority成员变量。可以在task_init()中设置,也可以在task_run()中改变。
- 在task_switch()中,通过timer_settime(),根据task的priority来设置定时器的timeout值,从而改变任务切换的间隔。
除了时间长短不同,不同优先级的执行顺序也应该不一样。在这里使用了多级队列。处在高级队列中的全部任务休眠或降级时,低级队列才有机会执行。
- 新增TASKLEVEL结构,每个结构包含一个TASK指针数组。在TASKCTL结构中加入一个TASKLEVEL结构的数组,保存所有TASK结构的数组只在TASKCTL中有一个。这样形成多级任务队列。
- 添加task_add(),task_remove()函数,方便任务在多级间的移动。
- 添加task_switchsub()函数,用于改变level。
为实现多级队列,还是改了挺多地方。总的来说,首先将处理鼠标键盘的任务A放在LEVEL0(高优先级),其他任务放在LEVEL1。如果任务A休眠了,则LEVEL0空了,task_sleep()就会调用task_switchsub(),找到一个有任务的level。如果任务A要唤醒了,则task_run()会改变lv_change值,提醒切换任务时切换到更高级level中。
- 30天自制操作系统day16
- 《30天自制操作系统》读书笔记Day16
- 30天自制操作系统
- 30天自制操作系统
- 30天自制操作系统
- 30天自制操作系统
- 30天自制操作系统 导读
- [30天自制操作系统]day_2
- 30天自制操作系统day00
- 30天自制操作系统day01
- 30天自制操作系统day02
- 30天自制操作系统(1)
- 30天自制操作系统day2
- 30天自制操作系统day3
- 30天自制操作系统day4
- 30天自制操作系统day5
- 30天自制操作系统day7
- 30天自制操作系统day8
- Python的一些常见问题的解决
- java包的概念
- Missing contentDescription attribute on image
- [iOS手写代码UI界面调试利器]Reveal及破解版本(1.5.1)
- Eclipse将引用了第三方jar包的Java项目打包成jar文件的三种方法
- 30天自制操作系统day16
- 特征选择方法之信息增益
- 在ubuntu 12.04 上将默认的gcc 4.6 改成gcc 4.4
- 超越MySQL:三个流行MySQL分支的对比
- Java基础知识总汇—初学者必备
- 工业相机中的全局快门与卷帘快门
- error: stray ‘\302’ in program; error: stray ‘\240’ in program 问题解决办法
- JS中常用函数(一)启动运行函数addLoadEvent
- Freemodbus文档1:模块