問題タブ [avr32]
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 - AVR32 例外: バス データ エラー
最近、組み込みソフトウェアで奇妙な動作に直面しています。
私が得たもの:ファイルサイズが大きすぎてマイクロコントローラーフラッシュから直接開始できないため、32ビットAVR32コントローラーを実行し、外部SDRAMからプログラムを開始します。物理メモリ マップにより、メモリ領域は次のように分割されます。
スタック (0x1000 から始まり、0xF000 の長さ) (< 0x1000 は MPU によって保護されます)
EBI SDRAM (0xD0000000 から始まり、0x00400000 の長さ)。
何が起こるか:残念ながら、再現できない例外が発生しました。与えられたスタック トレースを見ると、次のイベントが不規則に発生します。
名前: バス エラー データ フェッチ - イベント ソース: データ バス - ストアド リターン アドレス: 未完了の最初の命令
さらに、スタック ポインターには有効な値がありますが、例外が発生したアドレス (命令をフェッチするための最後のエントリ ポイント) はメモリ ニルヴァーナ (0x496e6372、0x5...、0x6.... 付近など) を指します。たぶん、これは「最初の未完了の指示」である必要があると思います。マニュアルが話しています。ただし、ソース コードの行は常に同じです。ポインターを介してデータ配列からメンバー関数にアクセスします。
問題は、他のソース コードを追加または削除すると、イベントが消えて再び戻ることです。
考えたこと:何かが私の記憶 (マッピング) を壊しています。これにはどのような種類のエラーが考えられますか?
- バッファオーバーフロー?
- SDRAM コントローラがオフになる可能性があるため、一部のデータが失われます。それは不可能ではありませんが、むしろありそうもないことです
- スタックは十分に大きく、透かしで確認済みです
- データ バス レートと AVR クロックが正しく設定されている
これを解決する方法:もっと主張しますか? 残念ながら、これを AVRStudio でデバッグすることはできません。誰でもヒントやアイデアはありますか? それとも、明らかな何かが欠けていますか?
編集:
ユーザーからの言及されたアプローチ:
- 関数ポインタと配列エントリのアドレスをチェック
- スタック配列の上書き
- 正しく書き込まれていない割り込み
- 初期化されていないポインター
i
クラッシュ ケース経由でアレイ アクセスを確認する- 不正なメモリアクセスには例外ハンドラアドレスを使用
snprintf
の代わりに使用sprintf
スレッドへの後半の付録: 問題は、私のモジュールとは関係のない、古いソフトウェア モジュールでの間違った配列アクセス (間違ったインデックスが設定された) でした。これは偶然見つけたもので、以前は表示されなかったのが好奇心で、コード行を見つけるのにかなりの時間がかかりました。与えられた唯一の答えを正解としてマークします。
ご意見をお寄せいただきありがとうございます。
(あなたのソフトウェアの)世話をしてください;))
c++ - 型がパニングされたポインターを逆参照すると、厳密なエイリアシング規則が破られます
AVR32 Studio スタジオを使用して、AVRUC3 コントローラー用のコードをコンパイルしています。最適化レベル -O2(optimization more) に切り替えたとき、このポインターの警告「 dereferncing type-punned pointer will break strict aliasing rules 」が表示され始めました。この警告が表示される理由はわかっています...
しかし、私の質問は、-O2 を指定してコードを実行し、このすべてのエラーを解決する必要があるか、またはそれらを引き続き使用して -O0(最適化なし) でコンパイルしても問題ないかということです。
助けてください...ありがとう。
c - 動的にリンクされたシンボルに対して C でポインター演算を実行すると、間違った結果になるのはなぜですか?
動的にリンクされたシンボルを含むポインター演算を実行すると、誤った結果が生じるという奇妙な状況に遭遇しました。単にいくつかのリンカ パラメータが欠落しているのか、それともリンカのバグなのかはわかりません。次の例の何が問題なのか誰か説明できますか?
lib.c
次の単純な共有ライブラリのコード ( ) を考えてみましょう。
問題の演算は、 のアドレスfn1
と変数の間のビットごとの AND ですmask
。アプリケーション ( ) は次のようapp.c
に呼び出します。fn2
それは次の出力につながります...
... と に対して同じ結果が期待されるため、これは明らかに正しくありませfn1
んp
。コードは AVR32 アーキテクチャで実行され、次のようにコンパイルされます。
mask
コンパイラは、変数を 32 ビット レジスタ 7 にロードし、& 演算を即値オペランドを持つ 2 つのアセンブラ演算に分割することが最適なソリューションであると考え
ます。
and
命令の即値オペランドはfn1
、共有ライブラリがアプリケーションのアドレス空間にロードされるときのロード アドレスに再配置されないと仮定します。
- この動作は意図的なものですか?
- 共有ライブラリをリンクするとき、または実行可能ファイルをロードするときに問題が発生するかどうかを調べるにはどうすればよいですか?
背景:これは学術的な質問ではありません。OpenSSL と LibreSSL は同様のコードを使用するため、C ソースを変更することはできません。このコードは他のアーキテクチャでも問題なく動作しますが、関数ポインタに対してビット単位の操作を行う理由は明らかではありません。
avr - Atmel Studio 7.0 でサポートされていない Atmel AT32AP7001-ALUT デバイス
2008 年に avr32studio バージョン 2.5 を使用して開発された Atmel AT32AP7001-ALUT のプロジェクトがあります。
このプロジェクトの新機能を実装する必要があり、開発作業を開始するために Atmel Studio 7.0 をインストールしました。ただし、Atmel Studio 7.0 はこのデバイス (AT32AP7001) をサポートしていないようです。avr32studio v2.5 も使用しようとしましたが、このソフトウェアは新しいバージョンの Windows にはインストールされません。AT32AP7001 を Atmel Studio 7.0 で使用するためのボード サポート パッケージを検索しましたが、何も見つかりませんでした。私は組み込みプログラミングに慣れていません。Atmel Studio 7.0 でこのデバイスのプロジェクトをセットアップする方法を誰か教えてもらえますか?
embedded - INT0 のベクトルの数がデータシートの 2 ではなく 1 であるのはなぜですか?
外部割り込み0のドライバーを実行しようとすると、ATmega32を使用して割り込みを実行していますが、問題に直面しました
ATmega32 の割り込みベクタ テーブル
ISR(vector) の割り込みベクトル コード
iom32.h コードでは、 ((INT0_vect " _VECTOR(1) ")) は 1 番ですが、データ シートでは 2 番であることがわかります。