这与 os 或者没有 os 有什么关系?当然,如果有 os, 这道为 os 量身定做的题很简单,不过裸奔也不难。我不想写程序了,给出一点思路:
假设只允许使用一个中断(两个这题就没有意义了),那么只要中断能重入即可。也就是说,只要保护好计时的 500 ms 任务的现场,就能满足要求。对 51,有一点小小的技巧,就是 reti 的处理, 调用一次可以恢复中断以重入。
Timer_Interrupt: acall _reset_timer ; 开放中断, reset timer. acall Task_500ms ;调用 计时任务 if (timeout(60)) goto _task_700ms ret
_task_700ms acall F071 .... acall F075 ret
_reset_timer: ... reti
这里裸奔的关键之处是让 F071 等变成了 背景 程序,定时器的作用仅仅是启动他们,之后相当于 定时中断 只运行 一个 500ms 的程序。如果认为 500 ms 太长,可以用状态机原理把它分成若干时间片。
不过,我个人认为:如果资源允许,os 显然会比 裸奔 更好,尽管初期需要花费相当的苦工,但未来会事半功倍。
|