タグ付けされた質問 「c」

Cは、命令型(手続き型)システム実装言語です。比較的単純なコンパイラを使用してコンパイルし、メモリへの低レベルのアクセスを提供し、機械語命令に効率的にマップする言語構造を提供し、最小限のランタイムサポートを必要とするように設計されました。したがって、Cは以前はアセンブリ言語でコーディングされていた多くのアプリケーションに役立ちました。http://en.wikipedia.org/wiki/C_(programming_language)から

8
組み込みシステムのデバッグにprintf()が悪いのはなぜですか?
を使用してマイクロコントローラベースのプロジェクトをデバッグしようとするのは悪いことだと思いprintf()ます。 出力する場所が事前に定義されておらず、貴重なピンを消費する可能性があることを理解できます。同時に、カスタムDEBUG_PRINT()マクロを使用してIDE端末に出力するためにUART TXピンを消費する人もいます。
16 c  debugging 

3
Cからアセンブリへ
avr-8bit用の次のCコードがあると仮定します。 int v1=1; int v2=2; v2=v2+v1; 次の分解が予想されました ldi r18, 1; ldi r19, 2; add r19, r18; しかし、私が走った後: avr-gcc -mmcu=atmega2560 Test.c -o Test.elf そして avr-objdump -S Test.elf > Test.lss 私は次のものを分解しました ldi r24, 0x01 ; 1 ldi r25, 0x00 ; 0 std Y+2, r25 ; 0x02 std Y+1, r24 ; 0x01 ldi …
16 avr  c  assembly 

1
PWMを使用した正弦信号生成
MC68HC908GP32マイクロコントローラーを使用してサイン信号を適切に生成することはできません。PWMの説明は349ページから始まります。クロック周波数は2.4MHzですが、プリスケーラを使用し、タイマーを次のようにモジュロを350に設定して7 kHz PWMを使用しました。 T1SC = 0x60; // Prescaler: Div entre 64 //Counter modulo = 0x015E = 350 T1MODH = 0x01; // High T1MODL = 0x5E; // Low PWM出力は、次のRLCフィルターによってフィルターされ、その後、1uFの直列コンデンサを使用してDCが除去されます。カットオフ周波数は、PWMの7kHzをかなり下回っています。 まず、このサイトを使用して生成されたサンプル(100サンプル、振幅= 250)を使用してみました。これは単一の期間で構成されます。 int seno[100]={ 125, 133, 141, 148, 156, 164, 171, 178, 185, 192, 198, 205, 211, 216, 221, 226, 231, 235, …
16 microcontroller  c  pwm 

2
STM32F2:商用IDEを使用しないMakefile、リンカースクリプト、起動ファイルの組み合わせ
私はSTM32F2で働いている(具体的には、開発ボード上のSTM32F217IGH6)約2ヶ月間。はるかに私の最大の問題はメイクファイル、リンカスクリプトと起動ファイルを含む「セットアップ」、としなければなりませんでした。 特に、割り込みベクターテーブルを適切に設定できず、割り込みハンドラーを呼び出すことができませんでした。STは、商用IDEに合わせた例を提供しています。代わりに、私は(JTAG経由で画像をロードし、OpenOCD)GCCツールチェーンの自由YAGARTOの再コンパイルを使用しています。 呼び出される割り込みハンドラ用に設定されている非商用のIDEに適したメイクファイル、リンカスクリプトと起動ファイルの組み合わせを含むが例の私のボードのためのプロジェクト(またはそれの近いいとこ)がありますか?
16 c  stm32  gcc 

4
ARM Cortex A9にクリティカルセクションを実装する方法
ARM926コアからCortexA9にいくつかのレガシーコードを移植しています。このコードはベアメタルであり、OSまたは標準ライブラリは含まれていません。すべてカスタムです。コードのクリティカルセクショニングによって防止されるべき競合状態に関連すると思われる障害が発生しています。 このCPUにクリティカルセクションが正しく実装されていない可能性があるかどうかを確認するには、アプローチに関するフィードバックが必要です。GCCを使用しています。微妙なエラーがあると思います。 また、ARM用のこれらのタイプのプリミティブを備えたオープンソースライブラリ(または優れた軽量スピンロック/セメフォライブラリ)もありますか? #define ARM_INT_KEY_TYPE unsigned int #define ARM_INT_LOCK(key_) \ asm volatile(\ "mrs %[key], cpsr\n\t"\ "orr r1, %[key], #0xC0\n\t"\ "msr cpsr_c, r1\n\t" : [key]"=r"(key_) :: "r1", "cc" ); #define ARM_INT_UNLOCK(key_) asm volatile ("MSR cpsr_c,%0" : : "r" (key_)) コードは次のように使用されます。 /* lock interrupts */ ARM_INT_KEY_TYPE key; ARM_INT_LOCK(key); <access registers, shared globals, …
15 c  embedded  interrupts 

3
8ビットMCUでのC整数プロモーション
例としてavr-gccを使用すると、int型は16ビット幅に指定されます。Cの8ビットオペランドで演算を実行すると、Cでの整数の昇格により、それらのオペランドが16ビットint型に変換されます。これは、AVRでの8ビット算術演算はすべて、C Cの整数昇格のためにアセンブリで記述されている場合
14 microcontroller  avr  c 

9
より良いパフォーマンスを得るために、組み込みソフトウェア用の関数を作成する際の最良のアプローチは何ですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 2年前に閉店。 マイクロコントローラ用のライブラリをいくつか見てきましたが、それらの機能は一度に1つのことを行います。たとえば、次のようなものです: void setCLK() { // Code to set the clock } void setConfig() { // Code to set the config } void setSomethingElse() { // 1 line code to write something to a register. } 次に、その上に、関数を含むこの1行のコードを使用して他の目的に役立つ他の関数を追加します。例えば: void initModule() { setCLK(); setConfig(); setSomethingElse(); } 確かではありませんが、この方法では、ジャンプの呼び出しが増え、関数が呼び出されるか終了するたびに戻りアドレスをスタックするオーバーヘッドが発生すると思います。そして、それはプログラムの動作を遅くするでしょう? 私は検索しましたが、プログラミングの経験則では、関数は1つのタスクのみを実行する必要があると彼らは言います。 したがって、クロックを設定するInitModule汎用モジュールを直接記述し、必要な構成を追加し、関数を呼び出さずに他のことを行います。組み込みソフトウェアを書くとき、それは悪いアプローチですか? 編集2: …

6
組み込みシステムで割り込みを使用する場合のグローバル変数の回避
グローバル変数を回避する組み込みシステムのために、ISRとプログラムの残りの部分との間の通信を実装する良い方法はありますか? 一般的なパターンは、ISRとプログラムの残りの部分との間で共有され、フラグとして使用されるグローバル変数を持つことですが、このグローバル変数の使用は、粒度に反しています。avr-libcスタイルのISRを使用した簡単な例を含めました。 volatile uint8_t flag; int main() { ... if (flag == 1) { ... } ... } ISR(...) { ... flag = 1; ... } 基本的にスコーピングの問題が何であるかを見逃すことはできません。ISRと残りのプログラムの両方がアクセスできる変数は、必ず本質的にグローバルでなければなりませんか?それにもかかわらず、「グローバル変数はISRとプログラムの残りの部分との間の通信を実装する1つの方法」(強調は私のもの)という言葉に沿って人々が言うことをよく目にします。他の方法がある場合、それらは何ですか?

3
Cで@を使用した変数宣言
私はいくつかのCコードを読んでいて、プログラムでこの宣言に遭遇しました: unsigned char serv_ctr @0x0002; Mplab XC8 v1.35 Cコンパイラで「@ 0x0002」が何のためにあるのか、誰かがドキュメントを教えてくれたり、説明してもらえますか?
11 c  embedded  mplabx  xc8  variable 

4
STM32のエンディアンの問題
arm gcc(CooCox)を使用してSTM32F4discoveryをプログラムしていますが、エンディアンの問題と格闘しています。 SPIを介して24ビットADCでサンプリングしています。3バイトが入ってくるので、MSBを最初に、それらを共用体にロードして、少しでも使いやすくすることを考えました(とにかく希望!)。 typedef union { int32_t spilong; uint8_t spibytes [4]; uint16_t spihalfwords [2];} spidata; spidata analogin0; spi読み取りを使用してデータをanalogin0.spibytes [0]-[2]にロードし、[0]をMSBにしてから、USARTを介して8ビットずつメガボーで吐き出します。問題はありません。 問題は、データを12ビットDACに渡そうとしたときに始まりました。このSPI DACは、MSBで始まる4ビットのプレフィックスとそれに続く12ビットのデータで構成される16ビットワードを必要とします。 最初の試みは、ADCから与えられた2の補数を変換して、analogin0.spihalfwords [0]を0x8000とxor-ingし、結果を下位12ビットにシフトし、算術的にプレフィックスを追加することでした。 analogin0.spibytes [0] = 0xFFおよびanalogin0.spibytes [1] = 0xB5の場合、analogin0.halfwords [0]は0xFFB5ではなく0xB5FFに等しかったことに気付くまで、非常にイライラします。 これに気づいた後、算術演算とハーフワードの使用を停止し、ビット単位のロジックとバイトに固執しました uint16_t temp=0; . . . // work on top 16 bits temp= (uint16_t)(analogin0.spibytes[0])<<8|(uint16_t)(analogin0.spibytes[1]); temp=temp^0x8000; // convert twos complement …
11 c  stm32  cortex-m  gcc 

2
Cソースから直接AVR EEPROMをプログラム
AVR Cソースに以下のコードを含めると、追加のコマンドや.hexファイルを必要とせずに、ヒューズを直接プログラムすることができます。 #include <avr/io.h> FUSES = { .low = LFUSE_DEFAULT , .high = HFUSE_DEFAULT , .extended = EFUSE_DEFAULT , }; EEPROMに値をプログラムする同様のトリックはありますか? /usr/lib/avr/include/avr/fuse.hマクロに関するコメントが見つかる場所を確認しましたが、で同様のコメントが見つからず/usr/lib/avr/include/avr/eeprom.h、プリプロセッサの解釈が私のリーグから少し外れています。 CのソースコードにデフォルトのEEPROM値を含めることができれば、とても便利です。誰でもそれを達成する方法を知っていますか? edit1: このFUSESトリックはISP時間にのみ実行され、RUN時間には実行されません。そのため、コントローラーの結果のアセンブリコードにはヒューズがプログラムされていません。代わりに、プログラマーは追加のFUSESプログラミングサイクルを自動的に繰り返します。 edit2: Linuxではavr-gccおよびavrdudeツールチェーンを使用しています。
11 avr  c  attiny  eeprom 

3
マイクロコントローラのスリープレース状態
次のコードを実行しているマイクロコントローラーがあるとします。 volatile bool has_flag = false; void interrupt(void) //called when an interrupt is received { clear_interrupt_flag(); //clear interrupt flag has_flag = true; //signal that we have an interrupt to process } int main() { while(1) { if(has_flag) //if we had an interrupt { has_flag = false; //clear the interrupt flag …

6
PIC16マルチタスクRTOSカーネルが機能しない理由は何ですか?
PIC x16マイクロコントローラー用のセミプリエンプティブ(協調)RTOSを作成しようとしています。私には、前の質問、私は、ハードウェアスタックポインタにアクセスすると、これらのコアは不可能であることを学びました。私はPIClist でこのページを見てきましたが、これはCを使用して実装しようとしているものです。 私のコンパイラはMicrochip XC8で、現在、構成ビットで4MHzの内部RC発振器が選択されたPIC16F616で作業しています。 コンパイラのヘッダーファイルを確認しながら、CでPCLATHおよびPCLレジスタにアクセスできることを学びました。そこで、簡単なタスクスイッチャーを実装してみました。 カーソルが最初の行(TRISA=0;)ではなく別の行(などANSEL=0;)にあるときに、再起動後にデバッガを一時停止してリセットし、カーソルにPCを設定すると、デバッガで必要に応じて機能します。デバッガーの最初の起動時に、これらのメッセージがに表示されますDebugger Console。 Launching Programming target User program running No source code lines were found at current PC 0x204 編集:私はそれがうまくいった理由はわかりませんが、デバッガは完全に動作するようになりました。したがって、上記の出力と段落は省略してください。 編集:このようにメイン定義を変更すると、以下のコードが機能します。これはプログラムアドレスでメイン機能を開始します0x0099。何が原因なのかわかりません。これは実際の解決策ではありません。コンパイラ固有のエラーがあると思います。 void main(void) @ 0x0099 { これが私のCコードです: /* * File: main.c * Author: abdullah * * Created on 10 Haziran 2012 Pazar, 14:43 */ #include …

1
PIC18F4550 Cコンパイラはオープンソースでクロスプラットフォームですか?
私は長い間AVRユーザーです。AVR-GCCが私が使用する2つの主要なOS(Mac OS XとLinux)で動作し、オープンソースであり、Atmelでサポートされていることが本当に気に入っています。PIC18F4550クラスのチップのようなかなり良いPICが世の中にあるので、私はPICプログラミング(90年代に使用)に戻りたいと思います。 残念ながら、PIC18のほとんどすべてのコンパイラは、Windows専用で有料のようです。そしてほとんどの場合、私には必要のないIDEがあります。私はコマンドラインコンパイラとMakefileを好むので、コードがどのように構築されるかを1つのファイルで一目で確認できます。(そしてダイアログボックスの曲がりくねった迷路を通り抜けないでください) 私は周りに突きSDCCが、PIC18F4550のサポートを持っており、それがなかったとしても、それがそのPIC18をサポートように聞こえるネットメイクのgrumblingsが弱い、または最高の状態で非常に使用に混乱して表示されません。 それでは、PIC18F4550をサポートするクロスプラットフォームのコマンドラインCコンパイラは何でしょうか。 それができない場合、PIC18F4550に最適なCコンパイラは何ですか?Makefileでどのように使用しますか?
11 pic  c  compiler 

1
I2Cのスルーレートとは何ですか?
ドキュメントのセクション2.4で説明されているように、C18コンパイラの組み込み関数を使用して、PIC18でI 2 Cを構成しています。 void OpenI2C2( unsigned char sync_mode, unsigned char slew ); どうすればよいかわかりませんslew。で定義されている2つのオプションから選択できますi2c.h。 SLEW_OFF:100 kHzモードではスルーレートが無効 SLEW_ON:スルーレートは400 kHzモードで有効 257ページのレジスタ15-1 のデータシートでは、2つのオプションについてもう少し詳しく説明しています。 1 =標準速度モード(100 kHzおよび1 MHz)のスルーレート制御が無効 0 =高速モード(400 kHz)のスルーレート制御が有効 私にはわかりませんが、いくつか質問があります。 スルーレートとは何ですか? 私にとって、2つのオプションは意味がありません-400kHzのスルーレートを無効にし、100kHzで有効にしたい場合はどうなりますか?どうしてこれなの? いつSLEW_OFF、いつを選択すればよいSLEW_ONですか?
10 pic  c  i2c  software  c18 

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.