程式碼實現也非常容易。(但需注意評估 bit shift 造成周邊硬體元件的影響)
底下是基本的串接線路圖。

// ======== START RAM Define ========
.ramadr 0x00
word nousePC;
word task0PC;
word task1PC;
word task2PC;
word task3PC;
word t16index;
int taskno;
// ======== END RAM Define ========
// ======== START FPPA ========
.romadr 0x0000
goto fpp0Boot;
goto fpp1Boot;
goto fpp2Boot;
goto fpp3Boot;
goto fpp4Boot;
goto fpp5Boot;
goto fpp6Boot;
goto fpp7Boot;
// ======== END FPPA ========
// ======== START Interrpt Service Routine ========
.romadr 0x0010
mov a, 0xFF; /// 第一次產生中斷,stack裡的pc是無用的
ceqsn taskno, a;
goto switch01;
popw nousePC;
pushw task0PC; /// 準備切到task0 pc
goto switchOk;
switch01:
mov a, 0;
ceqsn taskno, a;
goto switch12;
popw task0PC; /// 保存好task0 PC
pushw task1PC; /// 準備切到task1
goto switchOk;
switch12:
mov a, 1;
ceqsn taskno, a;
goto switch23;
popw task1PC; /// 保存好task1 PC
pushw task2PC; /// 準備切到task2
goto switchOk;
switch23:
mov a, 2;
ceqsn taskno, a;
goto switch30;
popw task2PC; /// 保存好task2 PC
pushw task3PC; /// 準備切到task3
goto switchOk;
switch30:
mov a, 3;
ceqsn taskno, a;
goto switchOk;
popw task3PC; /// 保存好task3 PC
pushw task0PC; // /準備切到task0
switchOk:
inc taskno; /// 記錄目前task編號-遞增循環
mov a, 0b00000011;
and taskno, a;
stt16 t16index ; /// 重置 Time Slice
set0 intrq.2;
reti;
// ======== END Interrpt Service Routine ========
fpp0boot:
// -------- START FPPA Boot Setting --------
///...略
// -------- END FPPA Boot Setting --------
// -------- START Interrupt initial setup --------
mov a, 0x00;
mov intrq, a; /// clear interrpt reqest register
mov a, 0b00000100;
mov inten, a; /// enable Timer16 interrupt
// -------- END Interrupt initial setup --------
// -------- START Timer16 initial setup --------
mov a, 0x00; /// timer 16 is up-count
mov lb@t16index, a ; ///Time Slice
mov a, 0x00;
mov hb@t16index, a ;
mov a, 0b10010000 ;
mov t16m, a ; /// Set OSC/Prescale
// -------- END Timer16 initial setup --------
// -------- START variables initialize --------
mov a, la@Task0;
mov lb@task0PC, a;
mov a, ha@Task0;
mov hb@task0PC, a;
mov a, la@Task1;
mov lb@task1PC, a;
mov a, ha@Task1;
mov hb@task1PC, a;
mov a, la@Task2;
mov lb@task2PC, a;
mov a, ha@Task2;
mov hb@task2PC, a;
mov a, la@Task3;
mov lb@task3PC, a;
mov a, ha@Task3;
mov hb@task3PC, a;
mov a, 0xFF;
mov taskno, a;
// -------- END variables initialize --------
/// Enable ALL FPP !!
mov a, 0b11111111;
mov fppen, a ;
/// Stack Pointer Setting for fpp0
mov a, 0x60;
mov sp, a;
stt16 t16index ;
engint;
goto $; /// Idle... waitting first interrupt
Task0:
tog LED0;
goto Task0;
Task1:
tog LED1;
goto Task1;
Task2:
tog LED2;
goto Task2;
Task3:
tog LED3;
goto Task3;
wait1 BTN0;
call Delay;
t1sn BTN0;
goto $-3;
// TODO: button down
wait0 BTN0;
call Delay;
t0sn BTN0;
goto $-3;
// TODO: button release
這樣子的結果,感覺還不錯
雖然還不確定在實際應用面能起多大作用
但是,至少在多了一種控制多 cpu 的方式
可以預見,在一些場合,會須要有類似這樣子的(先後)機制
譬如,一個專司 LCM 模組的 cpu,就不能隨機的接受輸出,不然輸出會不成樣…
當然,這些是必須要花一些 cpu 成本的,(大約7-8個指令周期)
而且,可能會有不確定性~(的等待時間)
再者,這也只是自己試的一個方法,還沒有完整的驗證過(包括硬體層面)
說不一定在怎樣的情況下會造成打死結的情況~!?
sdelete64 -z c: VBoxManage modifymedium disk "/Users/fellow/VirtualBox VMs/Win10/Win10.vdi" --compact *.vdi 路徑可以在 VirtualBox 儲...