SDCC reentrant library

Posted by: 邱小新 at 上午11:16 in

在 mutli-task 或是 interrupt 中想要使用長整數乘除法是不可以的。因為長整數乘除法會用到額外的全域變數 _mulint_PARM_2,如果同時有二個 task 同時用到長整數乘除法時,就會造成錯亂。

這時候就需要加入 --stack-auto 參數,讓所有編譯都搞成 reentrant 函數,這樣就可以避免使用全域變數的問題。

雖然使用 --stack-auto 可以呼叫 reentrant libray,但是也把使用者的函數全都編譯成 reentrant function 了。這樣雖然沒有什麼大問題,但是在 tiny rtos 因為 stack 空間不大,使用太多 reentrant function 有可能會讓 stack 爆掉。所以只在 SDCC Linker 地方加入 --stack-auto 即可,不要在 SDCC Compiler 加。

奇怪的是卻出現了,在 SDCC Linker 時會有錯誤訊息 ?ASlink-Warning-Undefined Global '__mulint_PARM_2' referenced by module 'ip210s_net';原來在 SDCC Linker 加上 --stack-auto 是不夠的,此時需在 SDCC Compiler 加入 --int-long-reent 才能正確無誤使用長整數乘除法。

0 意見

張貼留言