4 做个简单的多任务(2)(harib12d)

为了确认task_b_main到底有没有运行,我们需要让task_b_main显示点什么东西出来,最好是显示点会动的东西,要不还是让它数数吧……喂喂,是谁在下面叫“又来了啊”?(笑)

本次的bootpack.c节选

  1. void task_b_main(void)
  2. {
  3. struct FIFO32 fifo;
  4. struct TIMER *timer_ts;
  5. int i, fifobuf[128], count = 0;
  6. char s[11];
  7. struct SHEET *sht_back;
  8. (中略)
  9. for (;;) {
  10. count++;
  11. sprintf(s, "%10d", count);
  12. putfonts8_asc_sht(sht_back, 0, 144, COL8_FFFFFF, COL8_008484, s, 10);
  13. io_cli();
  14. if (fifo32_status(&fifo) == 0) {
  15. io_sti();
  16. } else {
  17. (中略)
  18. }
  19. }
  20. }

写到这里,我们遇到了一个问题,那就是sht_back。HariMain知道这个变量的值,但task_b_main可不知道。怎么办呢?怎样才能把这个变量的值从任务A传递给任务B呢?随便找一个内存地址存进去,然后再从那里读出来,这样应该可以吧。好,就用0x0fec这个地址,这个地址是BOOTINFO-4。

本次的HariMain节选

  1. *((int *) 0x0fec) = (int) sht_back;

本次的task_b_main节选

  1. sht_back = (struct SHEET *) *((int *) 0x0fec);

这里用了很多强制数据类型转换操作,代码比较难读,不过就先这样吧。

■■■■■

现在让我们来运行一下。不知道结果如何,心里好紧张啊。“make run”,哇,动了动了!task_b_main和HariMain在同时运行!当然,实际上只是因为切换速度很快,所以造成了在同时运行的假象。无论如何,我们的多任务取得了圆满成功!

4 做个简单的多任务(2)(harib12d) - 图1

多任务成功

(其实我们在harib12c的时候就已经成功实现了多任务,只不过当时还没有加入显示功能,所以无法实际感受到而已。)