問題タブ [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コードを別のファイルに入れる
私はAVRマイクロコントローラーをプログラミングしており、WINAVRスイートのプログラマーのメモ帳でプログラミングしています。
コードを分離しようとしていますが、sepeaet.cファイルでAVRの事前定義された変数を使用できません。(AVRが特定のビットを指すために提供する変数)
たとえば、このコードは私のmain.cファイルで機能します。しかし、別のrandom.cファイルにはありません:
エラーが発生します:
私のmain.cファイルには、次のものしか含まれていません。
c - AVRC割り込みを停止する方法
私はAVRMCUをプログラミングしています。
アナログピンを読み取るPOTがあります。割り込みは常に呼び出されているようですが、LCDが混乱しているため、LCD_displayメソッドの実行中に呼び出す必要があります。
ブロックが実行されるまで、中断を停止する方法はありますか?
avr - avr-gcc で再コンパイルされた ledramp の例でセグメンテーション エラーが発生する
Ubuntuにsimavrをインストールしました。次のパッケージがインストールされています: avrdude binutils-avr gcc-avr avr-libc gdb-avr libelf-dev libglut3-dev gtkwave build-essential.
ledramp の例 (simarv フォルダー内の 1 つの例) を実行しようとしましたが、正常に動作します。しかし、board_ledramp フォルダーを board_ledramp2 フォルダーにコピーし、board_ledramp2 フォルダーで再コンパイルして実行すると、セグメンテーション フォールト エラーが発生しました。
私のコマンドは次のとおりです。
make コマンド後のコンソール ログは次のとおりです。
エラーメッセージは次のとおりです。
「file」コマンドを使用して元のelfファイルと私のelfファイルを比較しようとしましたが、出力は同じです:
誰が何がうまくいかなかったのか説明できますか?
ありがとう!
assembly - 偶発的なファームウェアの上書きの回避
最初にいくつかの背景。何らかの理由でファームウェアがクラッシュすると (スタック オーバーフロー、関数ポインタの破損など)、どこかにジャンプして何らかのコードの実行を開始することがあります。これにより、遅かれ早かれウォッチドッグがリセットされます。MCU はリセットされ、軌道に戻ります。そうでもなければ...
フラッシュに書き込むコード (ブートローダなど) がある場合はどうでしょうか? ここで、すべてのチェックをスキップして、誤ってフラッシュ書き込みコードに直接ジャンプしてしまう可能性があります。ウォッチドッグが吠える前に、ファームウェアが破損することになります。これはまさに私に起こっていたことです。
今、一部の人は言うかもしれません - コードの記述に飛び込む原因となった根本的なバグを修正してください。開発中は常にコードを変更しています。現時点でそのようなバグがなくても、明日はあるかもしれません。その上、バグのないコードはありません - または少なくとも私のものではありません。
だから今、私はある種のクロスチェックを行っています。「wen」という名前の変数があり、通常のチェック (宛先が有効であることを確認するなど) の前に 0xa5 に設定します。次に、実際の消去または書き込みを行う直前に、「wen」が本当に 0xa5 に設定されているかどうかを確認します。それ以外の場合、これは何らかの形で誤ってコードの記述に飛び込んだことを意味します。書き込みが成功すると、「wen」はクリアされます。私はこれをCで行いましたが、うまくいきました。ただし、理論的には破損が発生する可能性がわずかにあります。これは、この「wen」の最終チェックから SPMCR レジスタへの書き込みまでの命令がほとんどないためです。
ここで、このチェックを SPMCR への書き込みと spm 命令の間のアセンブリに入れることで、これを改善したいと考えています。
コードはまだ試していません。明日試してみます。問題はありますか?そのような問題をどのように解決しますか?
gcc - 未使用のモジュールを除外するように gcc/ld に指示できますか?
未使用のモジュールを出力ファイルに含めないように gcc/ld に指示できるかどうか知りたいです。
モジュールa.c
、b.c
およびがあるとしc.c
ます。a.c
とb.c
相互に依存しており、そのうちの 1 つに が含まれておりmain()
、何らかの理由で のどの部分c.c
も参照されていません。
ライブラリにまとめてバンドルするc.c
と、出力に含まれないコードはありません。
しかし、.o
ファイルを gcc に直接渡すと、 c.c
resp. c.o
含まれています。
どうにかして、ライブラリに入れずに未使用のモジュールを除外するよう gcc に指示できますか?
私は AVR µC をプログラミングしており、ライブラリの作成を許可しない AVR Studio を使用していますが、ビルド構成によっては使用されていないソース ファイルを省略したいと考えています。
c++ - C++; 日食リンカエラー
だから、私のEclipse IDEを動かして、私のarduino unoをEclipseで開発できるように取り組んでいます。私の C++ は弱いので、これはおそらく私の側の nube エラーです。
arduino IDEのライブラリからコンパイルしたarduinoライブラリを探す点滅プログラムがあります。私のコードはヘッダー ファイルを指しており、私のコードは問題ないと判断しました。つまり、クリックできます:
ヘッダーを表示します
これ:「C:/programs/arduino-1.0/hardware/arduino/cores/328p_lib/libuno_library.a」は有効なパスです...しかし、次のエラーが表示されます:
c - int の未定義のインクリメントに関する警告
avr-gcc で奇妙な問題が発生しています。私がこれを行う場合:
コンパイラの警告が表示されます。
ここで何が問題なのですか?
に書き換えると
警告にはなりません。
avr-gcc はバージョン 4.3.4 で、これを Ubuntu 10.04 で実行しています。
avr - avr-gccを使用して変数を未使用のAVRI/ Oレジスタにバインドするにはどうすればよいですか?
コードサイズを小さくするために、avr-gccを使用してグローバル変数を未使用のI / Oレジスタ(PORTBなど)にバインドしたいと思います。私はこのトリックをAVRのアプリケーションノートAVR035(14ページ)で学びました。
アプリケーションノートでは、IARコンパイラを使用して、次のように変数をI/Oレジスタにバインドします。
avr-gccを使用すると、次の行を使用して変数を標準レジスタ(この場合はr3)にバインドできます。
ただし、これはI/Oレジスタでは機能しません。I / Oレジスタに対してこれを行う方法はありますか?
c - 手でCのモジュラスを効率的に計算する方法は?
ルックアップ テーブルを利用する正弦関数の基本的な固定小数点の変形を作成しました (FPU なしの AVR マイクロ コントローラーをターゲットにしています)。私の実装は、 math.hの浮動小数点ペンダントのように、負の値と 2π を超える値も受け入れます。
したがって、指定された値を 0 ~ 2π の範囲 (つまり、対応する固定小数点) にマップする必要があります。正の引数の場合、C の組み込み剰余演算子%を使用して簡単にトリムできます。これは負の値のオプションではないため、次の (明白な) アプローチを使用しています。
aとbは整数型の値であり、INT_FLOOR() は (a/b) の小数部分が切り捨てられるというヒントとしてのみ使用されます。この式は、計算されたモジュラス (テーブル配列のインデックスとして使用される) が常に正であること、および負の引数も対応する正の値にマップされることを保証します (両方向の位相シフトを維持します)。
このアプローチに関する私の問題は、5 つ以上の算術演算が含まれるため、過度に複雑に見えることです。私が見逃しているより効率的なアプローチはありますか?
c++ - 温度は2桁の整数を浮動小数点に変換します
floatの桁と小数部分を表す2つの符号なし整数を1つのfloatに変換するにはどうすればよいですか。
これを行うには、小数コンポーネントを浮動小数点数に変換し、それを乗算して小数を取得して桁に追加するなど、いくつかの方法があることを知っていますが、それは最適ではないようです。
私はこれを行うための最適な方法を探しています。
DigitとDecimalのパーツを取得して、digit.decimalのようにfloatタイプに変換したいと思います。
最終的にはこのように見えるかもしれませんが、私は最も最適な解決策を見つけたいと思います。
////更新///-7月5日
ライブラリだけを利用する代わりに、ソースコードを入手することができました。このGISTDS12B20.cに投稿しました。
この関数は、数字と小数として別々の部分を返すことを強制しませんが、温度センサーからの読み取りにはこれが必要なようです(何かが足りず、フロートとして取得できる場合を除く)。
元の質問は、2つの部分を使用してこれをCでフロートにする(これはAVRと8ビットマイクロプロセッサで使用し、最適化キーを作成するためのものです)、または次のように直接取得できるようにするための最適な方法はまだあると思いますフロート。