問題タブ [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 - Cでの8ビット列挙型
シリアル経由で受信する命令、コマンドを保存する必要があります。コマンドの長さは 8 ビットです。
コマンド名とその値の間の透明性を維持する必要があります。シリアルで受信した 8 ビットの数値を任意の型に変換する必要がないようにします。
コードでそれらを処理するために列挙型を使用したいと思います。このプラットフォームでは、列挙のみが 16 ビット整数に対応します。
プラットフォームは、Butterfly デモ ボード上の AVR ATmega169V マイクロコントローラーです。これは、16 ビット操作のサポートが一部制限された 8 ビット システムです。これは高速なシステムではなく、約 1KB の RAM を備えています。ファイル I/O やオペレーティング システムなどの贅沢はありません。
8ビットコマンドを保存するためにどのタイプを使用する必要があるかについての提案はありますか?
#defines の大量のヘッダーよりも優れたものがあるに違いありません。
c - 関数ポインタの場所が渡されない
AVRをターゲットにしているCコードがいくつかあります。コードはavr-gcc、基本的には適切なバックエンドを備えたgnuコンパイラでコンパイルされています。
私がやろうとしているのは、イベント/割り込み駆動型ライブラリの1つにコールバックメカニズムを作成することですが、関数ポインタの値を維持するのに問題があるようです。
まず、静的ライブラリがあります。twi_master_driver.h
次のようなヘッダーファイル( )があります。
ここで、Cファイル(twi_driver.c
):
次に、これら2つのファイルを静的ライブラリ(.a)にビルドし、メインプログラムを作成します(main.c
)#include #include #include #include #include "twi_master_driver.h"
割り込みを発生させるイベントを注意深くトリガーし、適切なハンドラーを呼び出します。いくつかのfprintfsを使用すると、関数で割り当てられた場所twi->slave.slave_callback
がtwi_init
関数内の場所とは異なることがわかりtwi_slave_interrupt_handler
ます。
数字は無意味ですがtwi_init
、値は0x13bであり、twi_slave_interrupt_handler
印刷時の値は0x100です。
コメント付きの回避策を次の行に追加しtwi_driver.c
ます。
問題はなくなりますが、これは明らかに魔法で望ましくない解決策です。私は何が間違っているのですか?
私が知る限り、適切な変数volatile
にマークを付け、他の部分を揮発性にマークし、揮発性のマークを削除してみました。fprintf
割り当て後にステートメントを削除するtwi_init
と、後で値の読み取りが異なることに気付いたときに、回避策を思いつきました。
問題は、関数ポインターをどのように渡すかにあるようです。特に、ポインターの値にアクセスしているプログラムの部分(関数自体?)は、技術的には別のスレッドにあります。
何か案は?
編集:
コードのタイプミスを解決しました。
実際のファイルへのリンク:http : //straymark.com/code/ [test.c | twi_driver.c | twi_driver.h]
fwiw:コンパイラオプション:
-Wall -Os -fpack-struct -fshort-enums -funsigned-char -funsigned-bitfields -mmcu=atxmega128a1 -DF_CPU=2000000UL
(ライブラリ経由ではなく)直接含まれている同じコードを試しましたが、同じ問題が発生しました。
編集(ラウンド2):
- 「回避策」なしですべての最適化を削除しましたが、コードは期待どおりに機能します。-Osを追加すると、エラーが発生します。-Osが私のコードを破壊しているのはなぜですか?
c - 文字の配列をlongintの配列として使用する
私のAVRには、{R、G、B、x、R、G、B、x、...}(xは未使用のバイト)の形式で色の強度情報を保持する文字の配列があります。char myArray[4*LIGHTS]
0x00BBGGRR番号を簡単に書き込めるようにlongint (32ビット)を書き込む簡単な方法はありますか?
私の型キャストはラフで、書き方がわかりません。long int型へのポインタを作成し、それをmyArrayと等しく設定するだけだと思いますが、グループxをmyColorに設定するように任意に指示する方法がわかりません。
編集:型キャストが適切な用語であるかどうかはわかりません。32ビットの数値を8ビットに切り捨てただけの場合はそうなると思いますか?
parsing - 8 ビット組み込みシステムで使用可能な Flex/Bison のようなパーサーを作成する
avr-gcc ツールチェーンを使用して、C の AVR マイクロコントローラーでの演習として、単純な BASIC のような言語用の小さなインタープリターを作成しています。
Linux ボックスで実行するためにこれを書いていた場合、flex/bison を使用できます。8 ビット プラットフォームに限定したので、パーサーをどのようにコーディングすればよいでしょうか。
osx-snow-leopard - シンボルが見つかりません-ユキヒョウのCUnit
MacPorts/DarwinPortsを搭載したSnowLeopardにCUnitをインストールしました。インストールは正常に行われましたが、単体テストを実行しようとするとエラーが発生します。
誰かがこの問題に遭遇したことがありますか、または誰かがCUnitをSnow Leopardで他の方法で正常に動作させることができましたか?
embedded - AVRアナログコンパレータ+内部プルアップ?
AtmelAVRマイクロコントローラーに関する簡単な質問です。そこで、ATTiny85のアナログコンパレータを使用して、信号がしきい値を上回っているか下回っているかを判断したいと思います。この信号は通常「フローティング」であり、「アクティブ」のときはグランドに向かって引っ張られます(つまり、アクティブロー-オープンコレクタ信号です)。入力ピン(コンパレータ入力でもある)のプルアップを有効にするには、次のようにします。
アナログコンパレータを使用し、AIN1としてPORTB.1を選択した場合、内部プルアップが入力信号に適用されますか?私は誰かがこの振る舞いを検証するための個人的な経験を持っていることを望んでいます。この質問がスタックオーバーフローに対して「ハードウェア指向」ではないことを願っています。ありがとう!
編集 「デジタルで扱ってみませんか」という以下のコメントのいくつかに応えて、それは私の「信号」がセンサー(つまり光IRセンサー)によって生成されているためです。デジタルでゼロとして解釈されるのに「十分にハード」にプルダウンされるとは保証できないので、スイッチングしきい値として内部2.56Vリファレンスを使用します。私は「IRイベント」を取り上げようとしているだけなので、これが私にとって最も簡単な方法のように思えました。
また、アナログコンパレータを使用することで、ISRを使用して「非同期に」イベントを検出できます。一部のピンはデジタルエッジで割り込みを呼び出すことができますが、V_ILを下回る応答に依存することは望ましくありません。
assembly - AVR sbi コマンド - エラー: 数値は正で 32 未満でなければなりません
AVR 開発システムを完全な GCC ツール チェーン (すべて最新の安定版) でセットアップするのにかなりの時間を費やしましたが、ほとんどの問題は 1 つを除いて解決しました。
この次のコードは、私が得られないエラーを私に与えます。AVR アセンブリ マニュアルには、sbi 命令は定数式として 0 ~ 7 を受け入れることができると記載されていますが、それでもエラーが発生します。なぜこれが喜ばれるのか、誰かが光を当てることができますか?
問題の行は sbi PORTB, 0 です。
コンパイル/アセンブル:
avr-gcc ledon.S -mmcu=atmega168
c - crt0.oとcrt1.o-違いは何ですか?
最近、私はいくつかの低レベルの作業をデバッグしようとしていcrt0.S
て、コンパイラー(avr-gcc)のを見つけることができませんでしたが、crt1.S
(そして対応する.o
ファイルと同じ)を見つけました。
これら2つのファイルの違いは何ですか?何かcrt1
が完全に違うのですか、それとも何ですか?どちらも「ブートストラップ」(セットアップstack frame
など)に関係しているようですが、なぜその違いがあるのでしょうか。
compilation - AVR_GCC コンパイル エラー delay.h
手順は、blinky.zip、gcc セクション、Teensy++ v.2 にあります。Makefileとblinky.cはzipに入っています。Makefile を使用していないため、最初に F_CPU を定義することで、blinky.c を変更しました。以下を参照してください。では、なぜエラーが発生するのでしょうか? at90usb1286 チップ用に C ファイルをコンパイルするにはどうすればよいでしょうか?