發新話題
打印

c程式上的問題,使用C8051F300

c程式上的問題,使用C8051F300

做一些運算的時候
發現有些狀況下的程式量會變很大
ex:
unsigned long result;
float gain;
unsigned long offset;
unsigned char a;

result=result*65535.0/4095;     ->這個程式量比下面的小了約200byte
result=result*65535/4095;

gain=gain+a                  ->這個程式量也會變很大
result=result*gain+offset    ->這個程式量也會變很大
這兩個如果只用其中一個,程式量突然變很大,200byte左右
但是如果兩個都用,其中一個才多50byte左右

這是因為計算時用到某些內建的函式嗎?
之前有include<math.h>
可是現在把它刪掉,程式量也沒減少
請問有人遇過這樣的狀況嗎?
謝謝!!

TOP

您寫的程式中~完全沒有使用到math.h的副程式~
都是C語言的標準語法~
8位元MCU~去執行32位元的乘除運算~
就不要太苛責速度未什麼那樣慢了~
做乘除運算之前,如果有意要將code降到最低~
則應該要去設法讓計算方式是符合8位元mcu.

例如~  
n除8~  可以寫成 n/8 但是這樣程式碼很大~
如果寫成 n>>3 右移三位 ,這樣程式碼就是最小的了~

應用不只如此~
數學運算中 常見到的圓周率 3.14
其實也有很特別的8位元算法喔~
當然最直接的方式就是 n *314/100 , 但是這樣程式碼很大~

TOP

我又發現這一段程式在使用C8051F413和C8051F330的時候有不一樣的程式量
float a;
a=a/256;

用F330時,程式量多了快400byte
用F413時,程式量只多了100多byte

這是因為它們的MIPS不同的原因嗎?
謝謝回覆!!

TOP

C8051F41x的MIPS是50
C8051F330的MIPS是25

以前沒碰過MCU這類的東西
所以都沒去注意程式量的問題
尤其F330只有8K flash.....orz

TOP

Hi!
這是因為你的Compiler的問題,C8051F330 or C8051F410它在init C main時,所安排的會不同,及Compiler會幫你簡化一些code size,除非你設置Compiler不簡化code. 那Code size會很大.
當你要用C code寫程式,就會這樣.

TOP

了解了~
謝謝!!
那我有沒有辦法可以解決code size的問題
要改變程式的寫法?
或是還有其他辦法?

TOP

要改變程式的寫法? Yes
或是還有其他辦法? 多用point寫法~

J.K

TOP

發新話題