問題タブ [iar]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - IAR Embedded Workbench - 変数のエンディアンネスの設定
私は IAR Embedded Workbench for ARM (ARM7TDMI-S) を使用しており、私の作業の大部分はリトルエンディアン形式を使用して行われています。ただし、次のようなことができることをマニュアルで見ました:
これらの 2 つの変数をビッグ エンディアンとして宣言します (アプリの残りの部分はリトル エンディアンとして宣言します)。これは素晴らしい機能のように思えますが、コンパイルしようとすると、常にエラーが発生します。
上記のビッグ エンディアンの行は、マニュアルから直接コピーしたものですが、機能しません。これはコンパイラの優れた機能であり、作業が大幅に楽になります。それを機能させる方法はありますか?
IDE オプションの [C/C++ コンパイラ オプション] タブで、言語適合性を [IAR 拡張を許可する] に設定しています。
c - STM32 printf と RTC
* アップデート *
これが私が見つけたものです。その関数がそこにあるときはいつでも、実際にコードがロックされることはありません。実際には、RTC I²C 関数の読み取りが非常に遅くなりますが、コードは適切に実行されますが、RTC を読み取るたびに、通過するまで非常に長い時間待たなければなりませんでした。
そのため、RTC のアラーム割り込みがあり、これが ISR 内の他の I²C 相互作用をトリガーしていたため、2 つの I²C 通信を同時に実行しようとしていたようで、プロセスが遅くなりました。ISR の機能を削除しましたが、現在は機能しています。引き続き調査していきます。
IAR 5.40 を使用して STM32F103 マイクロコントローラをプログラミングしているときに、この問題が発生しています。ローカル変数を printf しようとすると、問題の関数に到達する前に別の時点でコードがフリーズするというこの関数があります。
これを引き起こしている可能性があるのは何ですか?
これは機能です:
私もこれを試しましたが、これは私が経験したロックを引き起こしません:
最適化がまったく有効になっておらず、I²C RTC からバイトを読み込もうとするとコードが動かなくなりますが、これを削除するprintf("index = %s\n", bTmpSms);
か、代わりにこれを使用するとすぐにprintf("index = 2\n");
、すべてがうまくいきます。何か案は?
bSmsIndex が実際には 30 を超えることはありません。その場合でも、この関数が呼び出される前にロックが発生します。
debugging - 8051シリアルデバッグモニター
jtag / bdm機能を備えていない8051(Cypress FX2LP)を使用しています。通常、このプロジェクトの開発者は、デバッグにアドホックシリアルprintfsを使用しています。KeilのMon51、Isd51、IARの汎用ROMモニターなどのシリアルデバッグモニターのオプションを検討しています。
コードRAMに書き込むために(ソフトウェアブレークポイントを設定するために)、このデバッグモニターを変更/構成する必要があります。ほとんどの8051デバッグモニターは、ハーバードアーキテクチャまたはバンク切り替えをサポートするためにそのような変更の機能を提供していると思います。
8051または同様のプロセッサ用のシリアルデバッガに関する推奨事項はありますか?
ハーバードコードのRAMやフラッシュなどに書き込むために変更する必要がありましたか?
c - IAR での C プログラミング
IAR プラットフォームでコーディングを行っており、次のことを行いたいと考えています。私は次のように持ってtypedef
います
これらの後、次の変数を宣言します。
しかし、エラーが発生します:
これを解決するにはどうすればよいですか?
c - 一度参照される静的関数の最適化
IARコンパイラを最高の最適化レベルで使用して、MSP430用の組み込みコードを書いています(速度やサイズは何も変わりません)。
関数を静的として定義し、同じファイル内で一度だけ参照します。関数には内部リンケージがあり、一度だけ使用されるため、オプティマイザーがインライン展開を実行することを期待していました。そうしない理由はありません。
関数は短く、16 ワードのマシン コードになります。ISR から呼び出されます。inline キーワードを追加すると関数がインラインになりますが、オプティマイザにはヒントが必要なようです。インラインにすると、 / が 1と 1の 2 つのpush
/pop
がスタックに保存されます。calla
reta
(キーワードがなくても)インライン展開が実行されると期待するのは正しいinline
ですか、それとも何か不足していますか?
編集:さらにいくつかのテストでは、インライン展開が関数のサイズに依存し、しきい値が非常に低いことが示されました。15 ワードか 16 ワードのマシン コードのようです。それ以上では、キーワードが指定されていない場合、オプティマイザーは展開しません。
なぜそうしないのかはまだわかりません (読みやすさはオプティマイザーの関心事ではないはずですよね?) が、IAR だけがこれに答えることができることは理解しています。
gcc - C コードからセグメントの開始とサイズを参照する方法
ARM チップ用のプログラムを IAR コンパイラから gcc に移植しています。
__segment_begin
元のコードでは、やなどの IAR 固有の演算子__segment_size
を使用して、特定のメモリ セグメントの先頭とサイズを取得していました。
GCCで同じことをする方法はありますか? GCC マニュアルを検索しましたが、関連するものは見つかりませんでした。
詳細:
問題のメモリ セグメントは、プログラムがチップ上の特定の周辺機器と正しくインターフェイスできるように、固定位置に配置する必要があります。元のコードでは、__segment_begin
演算子を使用してこのメモリのアドレスを取得し、このメモリ__segment_size
がオーバーフローしないようにします。
これらのメモリ セグメントの開始と終了を示す変数を追加することで同じ機能を実現できますが、GCC に同様の演算子があり、コンパイラに依存するコードの量を最小限に抑えるのに役立つ場合は、作成して維持する必要があります。
debugging - IARを使用したMSP430のIRQハンドラーの下にコールスタックを表示します
MSP430のプロジェクトでスタックオーバーフローを見つけようとしていますが、スタックがかなりいっぱいになった後にIRQが発生したときに主に発生することがわかりました。
スタックの開始アドレスよりも小さい値でスタックポインター書き込みにブレークポイントを設定しましたが、CPUはIRQハンドラーで停止します。
IAR C-SPYの呼び出しスタックの表示は、ハンドラー関数で終了しますが、これがスタックを埋めたものであるため、これより下にあるものに関心があります。
現在の割り込みハンドラの下にコールスタックを表示する方法はありますか?
c - ウォッチ ウィンドウを IAR に保存する方法は? アプリケーションを閉じる/再度開くときに保存しない
IAR Embedded Workbench for ARM でウォッチ ウィンドウを保存して、アプリケーションを閉じる/再度開くたびに消えないようにする方法はありますか? 変数のグループを監視するためのいくつかのウォッチ ウィンドウがあり、IAR を開くたびにそれらを再入力する必要があるのは本当に苦痛です。IAR Embedded Workbench を開くたびに設定する必要がないように、ウォッチ ウィンドウの設定を保存する方法はありますか?
build - IARに複数の入力があるカスタムビルドステップ
IAR Workbenchに、中間ファイルをビルドするためのカスタムビルドステップを必要とするプロジェクトがあります。このファイルは、共通の拡張子を持つ他のファイルのセットからまとめられます(つまり、ドメイン固有言語の入力ファイルの中間リンク手順があります)。
「カスタムツール」は一度に1つの入力ファイルしか処理できないように見えます。これは本当ですか、それとも拡張子リストに一致するすべてのファイルが1回の実行で渡されるように設定する必要があるチェックマークがありますか?
windows-7 - Windows7でのTFTP
TFTPサービスを使用して、組み込みボード(IARシステム)からファイルを取得/配置しています。これは、以前はWindows XPでファイルを機能させていましたが、Windows7ではtftpサービスは機能しません。うまく機能しているウェブページやtelnetなどを開いて、windos7マシンとボード間のネットワーク接続を確認しました。
そのため、TFTPを使用してファイルを配置しようとすると、ボード(フラッシュメモリ)にファイルが作成されているのがわかりますが、ファイルが空であり、接続がタイムアウトします。そこに到達したようですが、その後は何も起こりません。Windowsファイアウォールもオフにしました。助言がありますか?