2016-10-29 50 views
0

描述冗長,對此表示遺憾。我用粗體突出顯示了問題。driverlib ADC觸發器未被調用

目前我正在試圖建立的DriverLib機制,執行以下操作:

  • 上,大約每20 RTC預分頻器1時,檢查是否有ADC測量應該發生。

  • 如果應該,請設置要執行的測量次數。

  • 然後開始實際測量。

  • 關於測量回調,遞減測量計數器。如果不是零,則運行另一個。

我正在爲所有四個頻道做。代碼看起來大約是這樣的(不能張貼在這裏的原):

文件adccapture.c:

# define NUMBER_OF_CHANNELS 4 

uint8_t start_each[NUMBER_OF_CHANNELS]; 
uint8_t start_ctd[NUMBER_OF_CHANNELS]; 
uint8_t run_for[NUMBER_OF_CHANNELS]; 
uint8_t rem_runs[NUMBER_OF_CHANNELS]; 

// some code setting run_for and start_each 

void timerISR() { 
    // this checker is invoked every odd time 
    // by the actual prescaler event handler 
    for (int i=0; i<NUMBER_OF_CHANNELS; ++i) { 
     --start_ctd[i]; 
     if (!start_ctd[i]) { 
      // start ADC 
      uint8_t adc_busy = 0; 
      for (int j=0; j < NUMBER_OF_CHANNELS; ++j) { 
       // start critical section 
       if (rem_runs[i]) 
        ++adc_busy; 
       // end critical section 
      } 
      rem_runs[i] += run_for[i]; 
      if (!adc_busy) { 
       // start ADC 
      } 
      start_ctd[i] = start_each[i]; 
     } 
    } 
} 

void ADCISR() { 
    // this method is registered in the startup_diddly.c file 
    // for ADC_ISR and the port that provides data to the ADC. 
} 

我遇到的錯誤是:如果我離開了關鍵部分的代碼, ISR從不觸發。如果我不這樣做,或者如果我使用獨立於rem_runs的東西,那麼一切正常。

我試過不同的數據類型,在循環之前設置adc_busy(和取消它,如果我發生什麼開始),但毫無效果。奇怪的是,設置rem_runs沒有影響。在第一次運行中,總是隻有一個通道觸發,並且在我期望得到任何結果(timerISR每秒只觸發三次或四次,而測量受到數據表限制以在微秒範圍內採取某些操作)之前,我沒有進入timerISR去完成)。

ADC寄存器也被檢查過。當功能代碼開始測量時,它們中的所有十個或十二個(加上MCTL/MEM數組)具有與故障代碼運行時相同的值。這符合一般工作的代碼。

我再次遇到timerISR,所以代碼似乎不會掛起在阻止ADC_ISR觸發的infloop中。

我試過使用其他存儲類rem_runs也沒有成功。信號量不會工作,因爲它們在ISR期間被禁用。嘗試在另一個任務中獲取信號量會導致可重現的崩潰重置。

另一個觀察結果是,在某些時候,MAP_RTC_whatsitsface例程沒有修改我們可能再次檢查的寄存器,我們不得不求助於代碼使用RTC_whatsitsface例程。起初我們認爲它可能是我們在混合它們,但是即使使用MAP_RTC_ ......一路上,我們的時鐘計時器沒有觸發

MAP_RTC_function根據driverlib的rom_map.h定義指向ROM_RTC_function。它們被定義爲rom.h(驚喜!)中的內存地址。在我們的記錄中,我們沒有對driverlib進行任何更改,但是在某些時候他們停止了工作。

這兩個問題可以相關嗎?他們都看起來像記憶神器。任何關於如何診斷這些東西的想法都將得到高度讚賞。

回答

0

問題通過再次輸入(非功能性)補丁來解決。似乎有某種破壞宏觀的掠奪空間錯誤正在進行。