80387で超越関数の演算確認を行いました。
0~360度のsin(x)を求めて総和をとり、正常に計算されれば∫sin(x)dx[0~2π]で0になるはずです。
0~360度のsin(x)を求めて総和をとり、正常に計算されれば∫sin(x)dx[0~2π]で0になるはずです。
またシステム変数_8087を強制的にセットしてソフトエミュレーションとの速度比較をしています。
char str[64]; extern int _8087; void test(void) { double x,s; unsigned int t; int i; tmr_start(3); /* タイマスタート 625kHz */ s=0; for(i=0;i<360;i+=10){ /* sin(x)を0~360°で積分 */ x=i*PI/180; s+=sin(x); } t=tmr_check(); /* タイマ停止 */ sprintf(str,"sum=%f time=%luus\n\r",s,(65536-t)*16/10); putstr(str); /* 経過時間表示 */ } void main(void) { putstr("80387 ON :"); /*_8087=1; */ /* 80387 イネーブル(もともと)*/ test(); putstr("80387 OFF :"); _8087=0; /* 80387 強制ディセーブル */ test(); while(1){ } }
結果は
ソフトエミュレーション85ms
8087コード 19msで約4.5倍の速度向上が見られますが、思ったよりかなり遅く感じます。
ウェイト処理が適切でないとか?ハードも少し確認いりそうです。
ソフトエミュレーション85ms
8087コード 19msで約4.5倍の速度向上が見られますが、思ったよりかなり遅く感じます。
ウェイト処理が適切でないとか?ハードも少し確認いりそうです。