任务自动化
今天要实现任务切换的自动化。最好能够有一个任务数组,每次定时器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()中,通