driverlib ADC 触发器未被调用
driverlib ADC trigger does not get invoked
描述很长,抱歉。我用粗体突出了问题。
我目前正在尝试设置执行以下操作的 driverlib 机制:
大约每 20 个 RTC 预分频器 1 事件,检查是否应进行 ADC 测量。
如果需要,请设置要执行的测量次数。
然后开始实测
在测量回调时,减少测量计数器。如果不为零,则 运行 另一个。
我正在为所有四个频道做。代码看起来像这样(这里不能 post 原始代码):
文件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
,所以代码似乎没有挂在 infloop 中,阻止 ADC_ISR
触发。
我也试过为 rem_runs
使用其他存储 类,但也没有成功。信号量将不起作用,因为它们在 ISR 期间被禁用。尝试在另一个任务中获取信号量会导致可重现的崩溃重置。
另一个观察结果是,在某些时候,MAP_RTC_whatsitsface
例程没有修改我们可以再检查的寄存器,我们不得不求助于使用代码中的 RTC_whatsitsface
例程。一开始我们以为可能是我们混用了,但是即使用MAP_RTC_
...一路走来,我们的时钟定时器也没有触发。
MAP_RTC_function
根据 driverlib 的 rom_map.h
定义指向 ROM_RTC_function
的点。它们被定义为 rom.h
中的内存地址(惊喜!)。我们的记录中没有对 driverlib 进行任何更改,但在某些时候它们停止了工作。
这两个问题有关联吗?它们看起来都像是记忆恶作剧。高度赞赏有关如何进一步诊断这些东西的任何想法。
问题已通过再次输入(非功能性)补丁解决。似乎发生了某种破坏宏的掠夺 space 错误。
描述很长,抱歉。我用粗体突出了问题。
我目前正在尝试设置执行以下操作的 driverlib 机制:
大约每 20 个 RTC 预分频器 1 事件,检查是否应进行 ADC 测量。
如果需要,请设置要执行的测量次数。
然后开始实测
在测量回调时,减少测量计数器。如果不为零,则 运行 另一个。
我正在为所有四个频道做。代码看起来像这样(这里不能 post 原始代码):
文件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
,所以代码似乎没有挂在 infloop 中,阻止 ADC_ISR
触发。
我也试过为 rem_runs
使用其他存储 类,但也没有成功。信号量将不起作用,因为它们在 ISR 期间被禁用。尝试在另一个任务中获取信号量会导致可重现的崩溃重置。
另一个观察结果是,在某些时候,MAP_RTC_whatsitsface
例程没有修改我们可以再检查的寄存器,我们不得不求助于使用代码中的 RTC_whatsitsface
例程。一开始我们以为可能是我们混用了,但是即使用MAP_RTC_
...一路走来,我们的时钟定时器也没有触发。
MAP_RTC_function
根据 driverlib 的 rom_map.h
定义指向 ROM_RTC_function
的点。它们被定义为 rom.h
中的内存地址(惊喜!)。我们的记录中没有对 driverlib 进行任何更改,但在某些时候它们停止了工作。
这两个问题有关联吗?它们看起来都像是记忆恶作剧。高度赞赏有关如何进一步诊断这些东西的任何想法。
问题已通过再次输入(非功能性)补丁解决。似乎发生了某种破坏宏的掠夺 space 错误。