2007年7月15日 星期日

FPPA 副程式區城變數的問題

FPPA 由於各 CPU 沒有各自獨立的 RAM SPACE,8-CPU RAM 都是共用的,所以在呼叫副程式時有可能會造成變數干擾的情況發生,例如一個DELAY的副程式…


Delay:
mov a, 50;
mov count, a;
DelayLoop:
delay 200;
dzsn count;
goto DelayLoop;
ret;
外迴圈要用到一個變數 count,如果多 cpu 同時來呼叫這個副程式,那必定會大亂。
當然,同樣的狀況也可能發生在主程式,我想這也是多核心程式撰上要很小心的一個問題。(最好 complier 有辦法預先檢驗出來? )
何解?
首先想到的是要規畫一段記憶體給這個副程式用,而且當不同的 CPU 進來的時候,副程式要能「知道」
最先想到的是 stack space,因為每個 cpu sp 不一樣,所以可以拿來利用。
問題是 FPPA 沒有類似 idzsn [index] 的指令,不可以直接操作 sp 指到的記憶體內容。
pushw [sp]?
POPW [SP]?
idzsn [index]?

或者如果能在硬體上多一個可以拿來作 ram index 的 暫存器 問題就都解決了。

於是要多一個變數來暫存,問題又回到原點嘍~同變數名一定會被不同 cpu 干擾(或說 thread 比較恰當)
再想想?
嗯~沒錯,要 lock,用 lock、unlock 的概念來控制這個變數的存取試試…
wait0 SIGNAL; // or any other signal.
set1 SIGNAL; // lock signal
…使用變數…

set0 SIGNAL; // unlock signal
結果,失敗,8-CPU同時等在 wait0 SIGNAL 時,又會同時跑到 set1 SIGNAL。
所以除非 CPU 有錯開,否則一樣會錯亂。
但程式在隨機呼叫的情況下又不可能保證不會同時呼叫到。
還有什麼好方法?
下回分解…

沒有留言:

更高效處理 micro second 的方式

更高效處理 micro second 的方式…  以 STM32 為例… __IO unsigned long sys_tick = 0; void SysTick_Handler(void) {     HAL_IncTick();     sys_tick += (SysTi...