2017-07-25 12 views
2

現在、電子基板上に "シャント"タイプのセンサーを組み込んでいます。私の選択はLinear(LTC2947)にありましたが、残念ながらArduinoドライバしかありませんでした。私は、マイクロプロセッサ(APQ8009 ARM Cortex-A7)と互換性があるために、Linuxの下でC言語のすべてを翻訳する必要があります。 (遅延のための同等のもの)(はusleep見つけた後Arduino millis()に相当。

int16_t LTC2947_wake_up() //Wake up LTC2947 from shutdown mode and measure the wakeup time 
{ 
    byte data[1]; 
    unsigned long wakeupStart = millis(), wakeupTime; 
    LTC2947_WR_BYTE(LTC2947_REG_OPCTL, 0); 
    do 
    { 
     delay(1); 
     LTC2947_RD_BYTE(LTC2947_REG_OPCTL, data); 
     wakeupTime = millis() - wakeupStart; 
     if (data[0] == 0) //! check if we are in idle mode 
     { 
     return wakeupTime; 
     } 
    if (wakeupTime > 200) 
    { 
    //! failed to wake up due to timeout, return -1 
     return -1; 
    } 
    } 
    while (true); 
} 

)、私は(ミリ秒のためにそれを見つけることができません)C.にあなたは私には、この機能を翻訳に役立つことができますしてください:私は小さな疑問機能のおよそ1を持っています?

+2

ArduinoとLinuxは、非常に異なるパラダイムを使用しています。私はあなたが盲目的に行ごとにあなたの目標を達成するかどうか疑います。 @EugeneSh。 –

+0

正解ですが、一般的なガイドラインについては私の答えを見てください。 – TomServo

+0

目標は行ごとに翻訳するのではなく、自分の興味を引くツールを使って機能を再現することです。 – Lauraaaaaaaaa

答えて

1

Arduino millis()は、1KHzまたは1ミリ秒に非常に近いオーバフロー割り込みをトリップするタイマーに基づいています。同じことを達成するには、ARMプラットフォームでタイマーをセットアップし、カウンタで変数volatile unsigned longを更新することをお勧めします。これはmillis()と同等です。

SIGNAL(TIMER0_OVF_vect) 
{ 
    // copy these to local variables so they can be stored in registers 
    // (volatile variables must be read from memory on every access) 
    unsigned long m = timer0_millis; 
    unsigned char f = timer0_fract; 

    m += MILLIS_INC; 
    f += FRACT_INC; 
    if (f >= FRACT_MAX) { 
     f -= FRACT_MAX; 
     m += 1; 
    } 

    timer0_fract = f; 
    timer0_millis = m; 
    timer0_overflow_count++; 
} 

unsigned long millis() 
{ 
    unsigned long m; 
    uint8_t oldSREG = SREG; 

    // disable interrupts while we read timer0_millis or we might get an 
    // inconsistent value (e.g. in the middle of a write to timer0_millis) 
    cli(); 
    m = timer0_millis; 
    SREG = oldSREG; 

    return m; 
} 

埋め込まれた世界から来て、間違いなく新しいプラットフォーム上でプロジェクトを開始するとき、あなたが最初にすべきことは、クロックを確立し、取得することです。ここで

はミリ秒()が裏でやっていることですタイマ割込みを所定のレートで実行する。これが組み込みシステムの「Hello World」です。 ;)1KHzでこれを行うことを選択した場合、ほとんどの方法があります。

+0

あなたの答えをありがとう、私は試してみます – Lauraaaaaaaaa

+1

それはarduino互換になるためには、 "揮発性の符号なしのロング"を増やす必要があります。 –

+0

@MichaëlRoy良い観察。私はそれを反映するために私の答えを編集しました、ありがとう。 – TomServo