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

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

9
組み込みC開発でvolatileを使用する
volatileキーワードを使用してコンパイラが判断できない方法で変化する可能性のあるオブジェクトに最適化を適用しないようにするためのキーワードの使用に関するいくつかの記事とStack Exchangeの回答を読んでいます。 ADCから読み取り(変数を呼び出しましょうadcValue)、この変数をグローバルとして宣言volatileしている場合、この場合はキーワードを使用する必要がありますか? volatileキーワードを使用せずに // Includes #include "adcDriver.h" // Global variables uint16_t adcValue; // Some code void readFromADC(void) { adcValue = readADC(); } volatileキーワードを使用する // Includes #include "adcDriver.h" // Global variables volatile uint16_t adcValue; // Some code void readFromADC(void) { adcValue = readADC(); } 私の場合(ハードウェアから直接変更されるグローバル変数)のベストプラクティスによると、使用することvolatileは必須ですが、デバッグ時に両方のアプローチに違いは見られないため、この質問をしています。


9
高速でメモリ効率の良い移動平均計算
Cで移動平均を計算するための時間とメモリの効率的なソリューションを探しています。専用の除算ユニットを持たないPIC 16にいるため、除算を避ける必要があります。 現時点では、すべての値をリングバッファに保存し、新しい値が到着するたびに合計を保存および更新します。これは本当に効率的ですが、残念ながら利用可能なメモリのほとんどを使用します...
33 pic  c 

2
ビットバンギングとは
私はマイクロコントローラのプログラミングは初めてです。ATmega32-AコントローラーとCodeVisionAVRコンパイラーを使用しています。SPI通信を使用して正弦波信号を生成するために、波形ジェネレーター(AD9833)を使用しています。サイン波を正常に生成できました。今、私はその信号をセンサーに渡しています。センサーの出力はマルチプレクサを介して選択され、ADCに送信されます。次に、SPI通信を使用してADC値を読み取ります。ADCのレジスタをセットアップするために多くのことを試みました。それでも動作しません。SPI通信コードを確認するには、spi通信を使用した以前のポストADCレジスタ設定を参照してください。USART(RS232)通信を使用して、PC(PuTTY)に値を印刷しています。 誰かがビットバンギングを使用するようにアドバイスしました。私はその概念に新しいです。SPI通信のビットバンギングのコード例を教えてください。その手順を開始する方法は?誰も私に良い材料を提供できますか。外部ハードウェアは必要ですか? ピン接続を含め、これを書きました。 #define ADC_CS PORTB.3 #define MOSI PORTB.5 #define MISO PINB.6 #define SCK PORTB.7 void send_8bit_serial_data(unsigned char data) { int i; ADC_CS=0; for (i = 0; i < 8; i++) { // consider leftmost bit // set line high if bit is 1, low if bit is 0 if …

3
マイクロコントローラのさまざまなメモリタイプには何がありますか?
さまざまなタイプのデータがコンパイル後にCコードから入力されるさまざまなメモリセグメントがあります。すなわち:.text、.data、.bss、スタックとヒープ。これらの各セグメントがマイクロコントローラのメモリのどこにあるかを知りたいだけです。つまり、メモリタイプがRAM、NVRAM、ROM、EEPROM、フラッシュなどの場合、どのデータがどのタイプのメモリに入るかです。 私はここで同様の質問に対する答えを見つけましたが、彼らは異なるメモリタイプのそれぞれの内容がどうなるかを説明できませんでした。 どんな種類の助けも大歓迎です。前もって感謝します!

2
Cコーディング設計-関数ポインター?
私が持っているPIC18F46K22をしてXC8コンパイラでそれをプログラムします。最後に、私は、搭載したPCのようなシステムがあるでしょうstdinし、をstdout。したがって、メインループには、新しい入力があるかどうかをチェックする関数があります。入力がある場合、それに応じて関数が呼び出されます。たとえば、Aを入力するstdinと、PICはBを入力したときに呼び出される関数のfunction_A代わりに、次のような関数を実行しますfunction_B。 関数でPICが完了したら、新しい入力が関数に送信されるようにします。したがって、Aを押すとRS232トランスミッタが開き、その瞬間からすべての入力がRS232経由で送信されます。最終的に、プロジェクトはスタンドアロンのテキストエディターです。そのため、Aを押すとファイルシステムが開き、その瞬間からテキストの編集は行われず、ファイルのリストを確認します。つまり、上と下を押すことは、テキスト編集環境とは異なることを意味します。 私はこれをCでプログラムする方法について多くのことを考えてきました。昨晩、これを考えて、可能かどうか、可能であればどのようにしたらよいかを知りたいと思います。私がやりたいことは: main機能のような関数を呼び出しますfunction_A function_Aグローバル変数function_addrを関数のアドレスポインターに変更しますin_function_A その瞬間から、新しい入力があるときにmain関数を呼び出しfunction_addrます。 したがって、必要なのは、ゼロmainかどうかをチェックする関数function_addrです。もしそうなら、「通常の」関数を呼び出す必要がありますfunction_A。そうでない場合、関数at function_addrを呼び出す必要があります。またfunction_A、function_addrへのポインタに変更するが必要in_function_Aです。 注:ファイルシステム関数を閉じる必要がある場合は、0にis_function_A変更function_addrするだけです。 だから基本的に私の質問は 関数のアドレスを取得(および変数に格納) 指定されたアドレスで関数を呼び出す

5
ベアメタル上のC標準ライブラリ
私は主にLinuxを移植したデバイスで開発を行っているため、標準Cライブラリは、標準化された動作を持つシステムコールを実装することにより、多くの機能を提供します。 ただし、ベアメタルの場合、基盤となるOSはありません。acライブラリの実装方法に関連する標準はありますか?または、異なるBSPを提供する新しいボードに切り替えるときにライブラリ実装の特性を再学習する必要がありますか?
24 c  library 

6
シリアルプロトコルの区切り/同期技術
非同期シリアル通信は今日でも電子機器に広く普及しているため、私たちの多くはそのような質問に時々出くわしたと思います。電子デバイスDと、PCシリアル回線(RS-232または同様のもの)で接続され、継続的に情報を交換する必要があるコンピューターを検討してください。すなわち、PCそれぞれコマンドフレームを送信しており、それぞれステータスレポート/テレメトリーフレームで応答しています(レポートはリクエストへの応答として、または独立して送信できます-ここでは実際には関係ありません)。通信フレームには、任意のバイナリデータを含めることができます。通信フレームが固定長パケットであると仮定します。X msDY ms 問題: プロトコルは継続的であるため、受信側は同期を失ったり、進行中の送信フレームの途中で「結合」したりする可能性があるため、フレームの開始(SOF)がどこにあるかはわかりません。Aデータは、SOFに対する相対的な位置に基づいて異なる意味を持ち、受信したデータは破損する可能性があり、永久に破損する可能性があります。 必要なソリューション 短い回復時間でSOFを検出するための信頼性の高い区切り/同期スキーム(つまり、再同期に1フレーム以上かかることはありません)。 私が知っている(そして使用している)既存のテクニック: 1)ヘッダー/チェックサム -事前定義されたバイト値としてのSOF。フレームの最後のチェックサム。 長所:シンプル。 短所:信頼できません。不明な回復時間。 2)バイトスタッフィング: 長所:信頼性が高く高速な回復で、どのハードウェアでも使用可能 短所:固定サイズのフレームベースの通信には適していません 3)9番目のビットマーキング -各バイトに追加ビットを追加します。SOFでマークされたSOF 1とデータバイトには次のマークが付けられ0ます。 長所:信頼性が高く、高速な回復 短所:ハードウェアサポートが必要です。ほとんどのPCハードウェアおよびソフトウェアでは直接サポートされていません。 4)8番目のビットマーキング -上記の一種のエミュレーション。9番目ではなく8番目のビットを使用し、各データワードに7ビットのみを残します。 長所:信頼性の高い高速リカバリは、どのハードウェアでも使用できます。 短所:従来の8ビット表現と7ビット表現の間のエンコード/デコードスキームが必要です。やや無駄だ。 5)タイムアウトベース -定義されたアイドル時間の後に来る最初のバイトとしてSOFを想定します。 長所:データオーバーヘッドなし、シンプル。 短所:それほど信頼できません。Windows PCなどのタイミングの悪いシステムではうまく動作しません。潜在的なスループットのオーバーヘッド。 質問: 問題に対処するために存在する他の可能な技術/解決策は何ですか?上記のリストで簡単に回避できる短所を指摘できますか?システムプロトコルをどのように設計しますか(または設計しますか)?
24 serial  communication  protocol  brushless-dc-motor  hall-effect  hdd  scr  flipflop  state-machines  pic  c  uart  gps  arduino  gsm  microcontroller  can  resonance  memory  microprocessor  verilog  modelsim  transistors  relay  voltage-regulator  switch-mode-power-supply  resistance  bluetooth  emc  fcc  microcontroller  atmel  flash  microcontroller  pic  c  stm32  interrupts  freertos  oscilloscope  arduino  esp8266  pcb-assembly  microcontroller  uart  level  arduino  transistors  amplifier  audio  transistors  diodes  spice  ltspice  schmitt-trigger  voltage  digital-logic  microprocessor  clock-speed  overclocking  filter  passive-networks  arduino  mosfet  control  12v  switching  temperature  light  luminous-flux  photometry  circuit-analysis  integrated-circuit  memory  pwm  simulation  behavioral-source  usb  serial  rs232  converter  diy  energia  diodes  7segmentdisplay  keypad  pcb-design  schematics  fuses  fuse-holders  radio  transmitter  power-supply  voltage  multimeter  tools  control  servo  avr  adc  uc3  identification  wire  port  not-gate  dc-motor  microcontroller  c  spi  voltage-regulator  microcontroller  sensor  c  i2c  conversion  microcontroller  low-battery  arduino  resistors  voltage-divider  lipo  pic  microchip  gpio  remappable-pins  peripheral-pin-select  soldering  flux  cleaning  sampling  filter  noise  computers  interference  power-supply  switch-mode-power-supply  efficiency  lm78xx 

7
埋め込みコードの場合、「unsigned int」ではなく「uint_t」タイプを使用する必要があるのはなぜですか?
gccを使用して、STM32F105用のアプリケーションをcで作成しています。 (単純なプロジェクトで)過去には、私はいつものように、変数定義されているchar、int、unsigned int、などを。 私は、次のような、stdint.hで定義された型を使用するのが一般的であることがわかりint8_t、uint8_t、uint32_tそれは私が使用していることを複数のAPIのでは、ともSTからARM CMSISライブラリにtrueこの、など。 なぜそうするべきかを理解していると思います。コンパイラがメモリ空間をより最適化できるようにします。他にも理由があると思います。 ただし、cの整数プロモーションルールのため、2つの値を追加したり、ビットごとの演算を実行したりするたびに、変換警告に対して実行し続けますconversion to 'uint16_t' from 'int' may alter its value [-Wconversion]。この問題については、こことここで説明します。 intまたはとして宣言された変数を使用する場合は発生しませんunsigned int。 これを考えて、いくつかの例を挙げます。 uint16_t value16; uint8_t value8; これを変更する必要があります。 value16 <<= 8; value8 += 2; これに: value16 = (uint16_t)(value16 << 8); value8 = (uint8_t)(value8 + 2); いですが、必要に応じてできます。私の質問は次のとおりです。 変換する場合があり、符号なしに署名したとするバック符号なしの結果が不正確になりますか? stdint.h整数型を使用する/使用しない他の大きな理由はありますか? 私が受け取った答えに基づいて、cが変換uintしint、戻っても、stdint.hタイプが一般的に好まれているようです。これはより大きな質問につながります: 型キャスト(例value16 = (uint16_t)(value16 << 8);)を使用して、コンパイラの警告を防ぐことができます。問題を隠しているだけですか?それについてもっと良い方法はありますか?
22 c  embedded  gcc 

10
電子技術者向けのプログラミング言語
私は電子通信工学の学生です。大学に入る前は、プログラミングとコンピューターアプリケーションに興味がありました。私はWindowsアプリケーションの設計とそのテクニックの学習に集中していましたが、今では、これは私の分野では役に立たないと感じています...コンピュータサイエンスとソフトウェアの開発についてすべてを学ぶ必要はありません!(私はこれについて正しいですか?) VB .Net、C#、C ++を知っています。私は休日に十分な時間があるので、「電子工学の分野」でプログラムにより深く掘り下げたいです。それで、あなたは何を学び、または集中することをお勧めしますか? マイクロコントローラーやその他の集積回路のプログラミングにこれらの言語を使用したいです。C ++で十分ですか、それともCをマスターする必要がありますか?あなたの考えを教えてください。

6
STM32でprintf関数を使用するにはどうすればよいですか?
printf関数を使用してシリアルポートに印刷する方法を見つけようとしています。 私の現在のセットアップは、STM32CubeMXで生成されたコードと、STM32F407ディスカバリーボードを備えたSystemWorkbench32 です。 stdio.hでは、printfプロトタイプが次のように定義されていることがわかります。 int _EXFUN(printf, (const char *__restrict, ...) _ATTRIBUTE ((__format__ (__printf__, 1, 2)))); どういう意味ですか?この関数定義の正確な場所はどこですか?この種の関数を使用して出力する方法を見つける一般的なポイントは何ですか?

4
工場出荷時設定へのリセットはどのように機能しますか?
すべての組み込みデバイスには、何かがおかしい場合にユーザーが自分のデバイスをリセットできるようにする「工場出荷時リセット」オプションが含まれています。 STM32ボードでファームウェアを開発しています。ファームウェアには、(新しいイメージを含むバイナリファイルを送信することにより)UARTを介してアプリケーションをアップグレードできるブートローダーが含まれており、別の機能を追加したい:ファクトリーリセット。ユーザーがこのオプションを選択すると、ボードは元の画像をロードします。 工場出荷時リセットとは何ですか?バイナリファイル全体をメモリに再度読み込むことですか、それともエンドユーザーによって変更された変数を再初期化する関数を呼び出すだけですか? そうするためのベストプラクティスは何ですか? 元のFWを保存する場所は?内部または外部フラッシュにありますか?

8
DSPアルゴリズムをCまたはアセンブリで直接作成しますか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 2年前に閉店しました。 私は、Analog Devicesのデジタル信号プロセッサ(BF706)でDSPプロジェクト(IIRフィルタリング)に取り組んでおり、それに付属するコンパイラスイートCrossCore Studioを使用しています。FIRやIIRフィルターなどの単純なDSPの例と、そのためのライブラリ関数の例があります。プロセッサのマニュアルにはアセンブリ命令セットが記載されていますが、Cについてはコメントしていません。 私の疑問はこの特定のアプリケーションから生じますが、DSP開発者が従うべきベストプラクティスがあると思いました。だから私は一般的な方法でそれを組み立てます: このDSPに付属する例で理解したのは、DSPアプリケーション用に設計された回路を使用する場合、アセンブリでプログラムしてそれらの命令を直接実行する必要があるということです(乗算や加算など)。私はCでプログラムするだけですが、コンパイラ(DSPチップ会社からも提供されています)は、そのDSP用に最適化し、その機能を使用しませんか?それとも、アセンブリで直接DSPルーチンを記述する必要がありますか?

6
組み込みシステムでのグローバル変数の使用
私は自分の製品のファームウェアを書き始め、私はここで新人です。グローバル変数またはグローバル関数を使用しないことに関する多くの記事を読みました。8ビットシステムでグローバル変数を使用するための制限はありますか、それとも完全な「No-No」ですか。システムでグローバル変数を使用する方法、またはそれらを完全に回避する必要がありますか? 私のファームウェアをよりコンパクトにするために、このトピックに関して皆さんから貴重なアドバイスを受けたいと思います。
17 c  embedded  firmware 

5
Cでのモジュラーファームウェア設計用のメモリ割り当ての可能性
モジュラーアプローチは一般的に非常に便利(ポータブルでクリーン)であるため、可能な限り他のモジュールから独立したモジュールをプログラムするようにします。私のアプローチのほとんどは、モジュール自体を記述する構造体に基づいています。初期化関数は主なパラメーターを設定し、その後、ハンドラー(desriptive構造体へのポインター)がモジュール内の任意の関数に渡されます。 今、私はモジュールを記述する構造体のためのメモリの割り当ての最良のアプローチが何であるか疑問に思っています。可能であれば、私は次のものが欲しいです: 不透明な構造体。したがって、構造体は、提供されたインターフェイス関数を使用することによってのみ変更できます。 複数のインスタンス リンカによって割り当てられたメモリ 次の可能性があり、それはすべて私の目標の1つと矛盾しています。 グローバル宣言 複数のインスタンス、リンカーによって割り当てられますが、構造体は不透明ではありません (#includes) module_struct module; void main(){ module_init(&module); } malloc 不透明な構造体、複数のインスタンス、ただしヒープ上の割り当て module.h内: typedef module_struct Module; module.c init関数、mallocおよび割り当てられたメモリへの戻りポインタ module_mem = malloc(sizeof(module_struct )); /* initialize values here */ return module_mem; main.c内 (#includes) Module *module; void main(){ module = module_init(); } モジュール内の宣言 リンカによって割り当てられた不透明な構造体、事前定義された数のインスタンスのみ 構造体とメモリ全体をモジュールの内部に保持し、ハンドラーまたは構造体を公開しないでください。 (#includes) void main(){ …
16 c  design  firmware 

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