問題タブ [avr-gcc]
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 - main()を呼び出すときにavr-gccがわざわざレジスタの状態を保存するのはなぜですか?
avr-gccプログラムのmain()関数は、レジスタの状態をスタックに保存しますが、ランタイムがそれを呼び出すと、マイクロコントローラーでは何も戻らないことがわかります。これはRAMの無駄ですか?この状態の保存をどのように防ぐことができますか?
timer - タイマー割り込み内からのAVR長時間実行コード
2分ごとに実行する必要のあるコードがありますが、これは十分に単純なようです。問題は、タイマー内から長時間実行されるプロセスをトリガーすると、タイマーが不安定になるようです。助言がありますか。
私のCの知識はそれほど素晴らしいものではないので、いくつかの基本的なアイデアを手伝ってください。MCUはAtmelMega128Lです
長時間実行されるプロセスは、Telit GSMデバイスを介した(UART1を介した)http呼び出しです。これはそれ自体でうまく機能しますが、他のプロセスを監視する必要があるため、メインループから実行する必要があります。
memory - 配列が 256 バイト境界を超えていない
256 バイト境界を越えない配列を作成することは可能ですか? つまり、個々の配列項目のアドレスは下位バイトのみが異なります。これは、配列を 256 バイトに揃えるよりも弱い要件です。私が考えることができる唯一の解決策は、に合わせることでしたがnext_power_of_two(sizeof(array))
、このように現れるギャップについてはわかりません.
これは AVR マイクロコントローラー用のライブラリー用であり、これにより、割り込みハンドラーでいくつかの貴重な命令を節約できます。このプロパティを持つ必要がある配列は、ライブラリーによって使用される約 80 バイトの合計静的メモリーのうち 54 バイトの長さです。メモリ要件を増やさない方法を探しています。
avr-as gnu アセンブラーと avr-ld リンカーを使用しています。
例: 配列がアドレス 0x00f0 で開始する場合、上位ワードは配列を走査する間に 0x00 から 0x01 に変化します。
境界を越えない限り、アドレス 0x0100 から始まるか 0x0101 から始まるかはあまり気にしません。
c - avr-gcc 3.4.0 と avr-gcc 4.3.x 間のバイナリ互換性
gcc3 でビルドされた可能性があるライブラリにリンクするアプリケーションを継承しました。または、imagecraft コンパイラを使用することもできます。その情報は天国のビットフィールドに消えてしまい、アプリをリンクするための libXXX.a ライブラリが残っています。libXXX.a を再コンパイルできません。これには、imagecraft や他の場所からの特定の不明なヘッダーが必要なためです。これは、ある時点で私の環境に遍在していた可能性がありますが、現在はどこにも見つかりません。
私の質問は、私のアプリを avr-gcc バージョン 3.4.0 (およびその「特別な」libXXX へのリンク) でコンパイルした結果、動作するバイナリ イメージが得られた場合、他のすべての部分をコンパイルできると期待するのは合理的ですか? avr-gcc 4 を使用した私のアプリ (このアクションには、いくつかの非常に優れた実証済みの利点があります)、libXXX とリンクしても、動作するプログラムを取得できますか?
基本的に、それはすべて次のように要約されます: avr-gcc バイナリは、「avr-gcc 3.something である可能性がある謎のコンパイラ X」と互換性がありますか?
正直なところ、アプリの残りの部分を avr-gcc4 でコンパイルしてライブラリにリンクし、結果が機能することを確認しましたが、どのような副作用や癖に気をつければよいでしょうか?
c - ATmega32 を使用した LCD 上の配列からの ASCII 文字の表示
この関数を使用して単一の文字を操作する Atmega32 に接続された LCD があります。
文字を引数としてこれを呼び出すことができます。これはsend_char('a');
機能します。
次に、 send_string 関数をラップしてみました。
これは、ASCII 値が大きくずれていることを示す意味不明なメッセージを LCD に表示するだけです。また、空の文字列 ( send_string("")
) を渡そうとすると、少なくとも 3 つの意味不明な文字が LCD に表示されます。
serial-port - Atxmega USART フロー制御
Atxmega256 の USART フロー制御に問題があります。フロー制御に RTS/CTS を使用するモデムと通信しています。モデムが CTS を Low に設定したら、再び High になるまでデータの送信を停止したいと考えています。現在、割り込み駆動の USART ルーチンを使用していますが、送信を停止する良い方法が見つからないようです。CTS が低くなったときに送信を停止すると、送信バッファーに既にあるデータが送信され、失われます。
送信を無効/有効にするために次のことを試しました:
残念ながら、それは送信を永久に無効にしているようです。何か案は?
よろしくフレドリック
c - EEPROMに文字を保存してエコーバック
LEDを循環しているAVRSTK600ボード用のプログラムを書き込もうとしています。スイッチを押すと、適切なLEDが点灯します(この時点までは、すべてうまくいきます)。現在、USART(RS232シリアル通信)を使用しようとして、ボードに別の機能を追加しています。
-ユーザーがキーを押すと、(ハイパーターミナルで)エコーされる必要があります。-crtl-Zを押すと、データがEEPROMに記録されます(もう一度crtl-zを押すと、記録が停止します)。-crtl-yを押すと、記録されたデータが再生されます。
ここで発生している問題はUSARTにあります(すべてのハードウェア設定をチェックし、ループバックテストを実行しました...すべてが正常に機能しています)ので、コードに問題があるはずです。LEDを切り替えるまでは、EEPROMの後ですべてがうまくいきますが、USARTはうまくいきません。
これが私のコードです。AVR-GCCを使用しています。また、受講しているコースでは使用できないため、「avrlib」を使用していません。
これがheader.hファイルです
その下でひどく溺れているので、誰かが私がこのパズルを解くのを手伝ってくれるなら、私は非常にありがたいです。
前もって感謝します。
c - AVR EEPROM 読み書き
EEPROM (マイクロコントローラATmega2560 )からデータを読み書きしようとしていますが、間違った答えが返ってきます。デバッグすると、データが異なるアドレスに書き込まれていることがわかりますが、最後の文字だけが読み取られていることがわかります。
uiAddress = 1 のデータはA
、uiAddress = 2 のデータはB
、uiAddress=3 data=67'C' などです。したがって、uiAddress = 0 から最後のアドレスまで読み取ると、ABCDE が得られるはずです。一度に 1 文字ずつ、1 ビットずつ読んでいます。
EESAVE が有効になっています。
なぜそれが起こっているのですか?(できるだけ多くのコードを含めようとしましたが、元のファイルは大きすぎます。しかし、これは懸念される領域です)。
avr - 「バイナリが見つからなかったため、起動に失敗しました」というメッセージが表示される
AVR32 Studio (2.6) で AVR プロジェクトをデバッグしようとすると、「バイナリが見つからなかったため、起動に失敗しました」というエラー メッセージが表示されます。
ビルドが完了したこと (実行可能な .elf ファイルがビルド フォルダーにある) をコンソールで確認でき、プロジェクトをクリーンアップし、新しいビルド構成を作成しましたが、まだ起動できないようです (およびまたはチップをプログラムすることもできません)。 ) デバッガー。
avr - ATMEGA88 のブートローダーを置き換える方法
アドレス 0x1800 にブートローダーがあり、アドレス 0x0000 にファームウェアがある ATMEGA88 チップを搭載したボードがあります。どちらもUSBにアクセスできます。ブートローダーは新しいファームウェアを書き込むことができますが、新しいブートローダーを作成する必要があります。
確かに、これは AVR プログラマーを使用する場合は問題ありませんが、USB を介してこれを行うことも可能ですか? 私の考えは、新しいブートローダーを書き込むことができる古いブートローダーを介して特別なファームウェアをフラッシュすることでした。それは可能ですか?はいの場合、どのように?
私の現在の試みは成功しませんでした。すべてのコマンド (boot_page_erase、boot_page_fill、および boot_page_write) は、ブートローダーが実行しているのと同じ方法で正常に実行されます (唯一の違いは、0x0000 ではなくインデックス 0x1800 で書き込みを開始することです)。フラッシュには実際には何も書き込まれませんでした。