2017-07-25 43 views
2

我目前正在研究電子板上「分流」型傳感器的集成。我選擇的是Linear(LTC2947),不幸的是它只有一個Arduino驅動程序。爲了與我的微處理器(APQ8009 ARM Cortex-A7)兼容,我必須在Linux下用C語言翻譯所有內容。我有一個小問題有關的功能之一:相當於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); 
} 

發現usleep()函式等同延遲(),我無法找到它米利斯()後在C.你能不能幫我翻譯這個功能,請?

+2

Arduino和Linux正在使用*非常*不同的範例。我懷疑你會盲目地逐行翻譯你的目標。 –

+0

@EugeneSh。是正確的,但請參閱下面的答案以獲取一般準則。 – TomServo

+0

目標不是逐行翻譯,而是採用讓我感興趣的工具重新創建我的功能。 – Lauraaaaaaaaa

回答

1

Arduino millis()基於一個定時器,該定時器以非常接近1 KHz或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」。 ;)如果您選擇以1 KHz的速度進行操作,那麼您就完成了大部分任務。

+0

謝謝你的回答,我會嘗試 – Lauraaaaaaaaa

+1

它必須增加'volatile unsigned long'以兼容arduino。 –

+0

@MichaëlRoy很好的觀察。我編輯了我的答案以反映它,謝謝。 – TomServo