描述冗長,對此表示遺憾。我用粗體突出顯示了問題。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進行任何更改,但是在某些時候他們停止了工作。
這兩個問題可以相關嗎?他們都看起來像記憶神器。任何關於如何診斷這些東西的想法都將得到高度讚賞。