問題タブ [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 - これはCで許可されていますか?
次の行を C で書きました。言語でサポートされているかどうかを知りたいです。それは次のようになります:
基本的に、Config_Msg.DHCP の値に応じて、「DHCP」または「STATIC」の文字列値をモードに挿入したいと考えています。
IAR でコンパイルすると、次の警告が表示されます。
この警告はどういう意味ですか?
debugging - Debug failed with IAR Embedded workbench IDE
I'm trying to run an example code on Texas instrument (TI) device: MSP430F2274. When I click the debug button, this error occurs:
In the Regular Options for the project I select the device and use the "FET debugger".
Why am I getting this error?
c - アプリケーションによってリンカー スクリプトで定義されたシンボルにアクセスする
リンカー スクリプト ファイルで、2 つのシンボルを定義しました。
そして、以下に示すようにそれらをエクスポートしました
アプリケーションコードから、これらのシンボルにアクセスしようとします
ここで、戻り値が 0x00100000 になると予想していましたが、返されるのは 0 だけです。そのため、デバッガーに目を向けると、値がそれぞれ 0xC0000000 と 0xC00fffff であることに気付き_region_RAM_start__
まし_region_RAM_end__
たがaddress_1
、address_2
値は 0 です。
コンパイラの最適化は「なし」に設定されています。これはしばらくの間私を悩ませてきました。ここで私が見逃している非常に明白なものはありますか(「そもそもこれを行うべきではない」以外)?
解決策 答えてくれた nm に感謝
それ以外の場合address_1
、address_2
両方ともガベージ値を含みます (つまり、アドレス 0xC0000000 と 0xC00fffff でそれぞれ利用可能な値ですが、このコードの観点からはガベージです)。
c - 内部フラッシュ メモリの C 構造体のアラインメント
ARM Cortex M3 の内部フラッシュに保存したい構成構造があります。仕様上、内部フラッシュに保存するデータは 32bit に揃える必要があります。構造体にはブール値と文字がたくさんあるので、8 ビットを格納するために 32 ビットを使用したくありません...__packed
プリプロセッサ プラグマを使用して構造体をパックすることにしました。次に、構造体全体として保存すると、構造体のサイズが 4 で割り切れる (4 バイト = 32 ビット) ことを確認する必要があるだけです。必要に応じてパディング バイトを追加します。現在、開発中に構造を大幅に変更し、32 ビットに合わせるため、常にパディング バイトを変更する必要があります。現在、構造はこのように見えます
私がやっていることを達成するためのより良い方法はありますか? 私は組み込みプログラミングの初心者であり、間違いを犯していないことを確認したいと考えています。
編集:注意してください。データは内部フラッシュの最後に保持されるため、パディングを省略しても機能しません...
arm - ISR と main() 同期を実装する方法は?
私はARMマイクロコントローラープログラミングの初心者で、次の問題を解決する必要があります。
- プログラムにはISR_TimerとISR_Bufferの 2 つの ISR があります。ISR_Timer は 5 分ごとに実行されます。ISR_Buffer は、外部デバイス バッファがいっぱいになるたびに実行されます (1 秒間に数回)。外部デバイス バッファは小さいものです。
- ISR_Bufferは、外部 SRAM からバッファを満たすデータを受け取ります。SRAM には 2 つの大きなバッファがあります。1 番目は現在使用されており、2 番目は再計算に使用されています。次に、それらが交換されます。
- ISR_Timerは、 main()が外部 SRAM の 2 番目のバッファーを再計算することを示すフラグを設定します。その後、ISR_Buffer はそのバッファーを使用します。最初のものは、次の再計算に使用されます。再計算には約 1 分かかります。
問題は、main() と ISR_Buffer の両方が外部 SRAM にアクセスし、それらのアクセスがアトミックでないことです。main() 関数は、バッファの再計算中にデータを SRAM に書き込みます。ISR_Buffers はデータを読み取り、小さなデバイス バッファを埋めます。この問題を解決するには?
井出: IAR. チップ: AT91SAM7。
embedded - MSP430F5418でのRTC割り込みの問題
IAREW5.10でMSP430F5418を使用しています。
私のプロジェクトでは、オペレーティングシステムとしてFreeRTOS7.0を使用しています。
シーンリオを考えてみましょう。
- 1分間の割り込みでRTCをアラームモードに設定します。
- 2つのタスクを作成します。
- 1分間の割り込みが到着したら、タスク1でタスク2に要求を送信します。
- 4つのメッセージを含むタスク1へのタスク2の応答。
- メッセージを受信している間、タスク1は0x7FFF回ループする単純な関数を呼び出します。
ここでは、4回目のリクエスト後、1分経過しなくてもすぐにRTC割り込みが発生します。
TIが提供する回避策コードをRTC操作に使用しています。
誰かがこの予期しない動作が発生する理由を教えてもらえますか?
ありがとうございました、
ハリ
c - MISRA C:2004、ビットシフトによるエラー
MISRA C:2004 チェックをオンにして IAR Workbench コンパイラを使用しています。
フラグメントは次のとおりです。
MISRA エラーは次のとおりです。 エラー [Pm136]: 基礎となる MISRA 型 "unsigned char" から "unsigned int" への不正な明示的変換 (MISRA C 2004 ルール 10.3)
unsigned char
上記のコードには何も表示されません。
なぜミスラはここでエラーをスローしたのですか?での議論 左シフトとは異なる昇格規則を持つ可能性のある乗算について説明します。
私の理解では、コンパイラは式を小さいサイズに降格するのではなく、より大きなサイズのデータ型に昇格させる必要があります。
ここで実際に何が起こっているのですか?
コードを MISRA C:2004 に準拠させるにはどうすればよいですか?
編集1:
エラー行を次のように変更します。
エラーが消えません。
linker - IAR EmbeddedWorkbenchMSP430および*.libファイルのリンク
本当に簡単な作業だと思っていたのですが、関係のあることや間違いは見つかりませんでした。だからここに私の問題を置く、すなわち私は実際にコードコンポーザースタジオにあるMSP430のためのいくつかのプロジェクトを持っています。このコード全体をIAR組み込みワークベンチで実行する必要があります。プロジェクトに付属しているライブラリファイル(* .lib)がいくつかあり、プロジェクトをビルドするにはリンクする必要があります。少し変更を加えた後、コードは正常にコンパイルされていますが、ライブラリをリンクできず、リンカーエラーが発生します。私はavrを使ってIARに取り組みましたが、いくつかのサンプルコードをテストするためだけにほとんど作業しませんでした。これらのライブラリ名とそれぞれのパスについて言及するオプションが見つかりませんでした。リンカタブをチェックアウトしましたが、これらの.libファイルをプロジェクトにリンクするための手がかりが得られません。
c - void* で IAR がエラーをスローする理由
gcc を使用するプロジェクトを IAR コンパイラに移植したいのですが、IAR は void* を仮パラメータとして使用するいくつかの関数について文句を言います。
関数プロトタイプは
使用法は次のとおりです。
エラー [Pe167]: 型 "struct *" の引数は、型 "void const *" のパラメーターと互換性がありません。
そして別の場所
エラー [Pe852]: 式は完全なオブジェクト型へのポインターでなければなりません。私が知っているように、void* は任意のポインターを受け入れることができます。コードを変更してこれらのエラーを削除するにはどうすればよいですか? ありがとう!
クリス
c - 列挙型を定義すると、メモリの痕跡が大きくなりますか?
32Kのメモリを搭載し、IAREWARMv6.30を使用してプレーンCで書き込みを行う組み込みデバイスを使用しています。
コードを読みやすくするために、いくつかの列挙型を定義したいと思います。たとえば、次のようなものです。
0、1、2の値を使用する代わりに、すでに不足している追加のメモリが必要になるのではないかと思います。
だから私は2つの質問があります:1)列挙型をintではなくshort型またはbyte型にすることはできますか?2)列挙型を定義する正確なメモリインプリントとは何ですか?