2016-11-28 6 views
0

私はコントローラICPDAS i-7188exのかなり複雑なI/Oプログラム(誰かが書いた)を持っていて、そのプログラムからのデータに基づいて計算を行うライブラリ(.lib)を書いています。I-7188exの奇妙な振る舞い

問題は、printf( "123")という行が1つしかない関数をインポートしてI/Oに埋め込むと、プログラムがクラッシュすることがあります。インポートされた関数I/Oがうまくいなければ、I/Oなしのインポート関数も同じです。

多分それはメモリの問題ですが、文字列を出力するだけの機能にはかなりのメモリを割り当てるべきですか?または私は完全に間違っていますか?

私はBorland C++ 3.1を使用しています。そして、コントローラが80186命令セットしか取らないので、私は新しいものを使うことはできません。

答えて

0

あなたのコードが複雑な場合は、コンパイラが突然動かなくなり、誤ってコンパイルして予測できない動作が発生することがあります。コードが成長すると何度も起こります...そのような場合、通常はコードの数行を入れ替えることができます。問題は、そのことを行う場所を見つけることです。また、プログラムをいくつかのファイルに分割して別々にobjにコンパイルし、最後のファイルにリンクすることもできます...

私は長い時間をかけて戦ったものを思い出します。あなたがclass/struct/templateを使用している場合は、これを試してみてください。

は、それが(旧ターボのためにこれをテストしていない)を助けるかもしれません。

I/Oへの埋め込みはどういう意味ですか?あなたはsysドライバファイルを作成していますか?その場合は、CPUレジスタを煩わせることがないようにする必要があります。それは多くの問題は、あなたがISR handlersを書くなら、あなたは正しくそれから、コンパイラが戻るようinterruptキーワードを使用する必要が

void some_function_or_whatever() 
{ 
asm { pusha }; 
// here your code 
printf("123"); 
asm { popa }; 
} 

を使用しようとする恐れがあります。実際のコードなし

及びまたはMCVEは、任意の詳細を指すように難しいです...

あなたはBDS2006または新しいバージョン(単にデバッグのために実際に機能していない)にポートこれを、それはより慎重にあなたのコードを分析することができる場合と、 (私はBCBシリーズからBDS2006に移植したときに隠された)多くの隠れたエラーを検出することができます。また、実行時にそのようなエラーを見つけるのに理想的なコンパイラにはCodeGuardオプションがあります(しかし、私はあなたがエミュレートされたDOSに存在するI/O hwなしであなたのlibを走らせることができない恐れがあります)。

+0

ありがとうございました。正直言って、I/Oプログラムの低レベルのものは分かりませんが、主な機能は のようになります。 'void main(){ init(); myInit(); //これはインポートされたfuncです。 RestoreCom(1); } ' これは、ソースファイルを追加する瞬間、コントローラでSRAMが使用されていることです(コードが使用されていなくても、coreleft()でチェックします)。ある時点でSRAMが使い果たされ、プログラムがクラッシュします。 –

+0

@IvanBoikovそれでは、メモリリークの可能性があります。あるいは、あまりにも多くの静的変数(または定数)を使用して実際のメモリサイズに合わせてヒープ/スタック制限を下げようとしました。ランタイムの前にあなたが持っているものを超える... – Spektre