2 任务切换进阶(harib12b)

刚才我们只是实现了一次性从任务A切换到任务B,现在我们要尝试再切换回任务A。好,那我们就在切换到任务B的5秒后,让它再切换回任务A吧。

这其实很容易,只要稍微改写一下task_b_main就可以了。

本次的bootpack.c节选

  1. void task_b_main(void)
  2. {
  3. struct FIFO32 fifo;
  4. struct TIMER *timer;
  5. int i, fifobuf[128];
  6. fifo32_init(&fifo, 128, fifobuf);
  7. timer = timer_alloc();
  8. timer_init(timer, &fifo, 1);
  9. timer_settime(timer, 500);
  10. for (;;) {
  11. io_cli();
  12. if (fifo32_status(&fifo) == 0) {
  13. io_stihlt();
  14. } else {
  15. i = fifo32_get(&fifo);
  16. io_sti();
  17. if (i == 1) { /*超时时间为5秒 */
  18. taskswitch3(); /*返回任务A */
  19. }
  20. }
  21. }
  22. }

你看,这样就搞定了。在这里所使用的变量名,比如fifo、timer等,和HariMain里面是一样的,不过别担心,计算机会把它们当成不同的变量来处理。无论我们对这里的变量如何赋值,都不会影响到HariMain中的对应变量。这并不是因为它们处于不同的任务,而是因为它们名字虽然一样,但实际上根本是不同的变量(之前一直没有机会解释这一点,现在稍微晚了点,不过还是在这里讲一下吧)。

对了,taskswitch3还没有创建,我们需要创建它。

本次的naskfunc.nas节选

  1. _taskswitch3: ; void taskswitch3(void);
  2. JMP 3*8:0
  3. RET

好了,准备完毕!

■■■■■

我们来“make run”一下。哇,经过10秒之后光标停止闪烁,鼠标没有反应,键盘也无法输入文字了。然而又过了5秒,光标又重新开始闪烁,刚才键盘没反应的时候打进去的字一口气全都冒了出来,鼠标也又能动了。

这就说明我们已经成功回到了任务A并继续运行了,真顺利呀。