c - driverlib ADC 触发器未被调用

标签 c texas-instruments

描述很长,抱歉。我用粗体突出显示了问题。

我目前正在尝试建立一个 driverlib 机制来执行以下操作:

  • 大约每 20 个 RTC 预分频器 1 事件,检查是否应进行 ADC 测量。

  • 如果需要,请设置要执行的测量次数。

  • 然后开始实际测量。

  • 在测量回调中,减少测量计数器。如果不为零,则运行另一个。

我正在为所有四个 channel 做这件事。代码看起来像这样(不能在这里发布原始代码):

文件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没有影响。在第一次运行中,总是只有一个 channel 触发,我不会进入 timerISR在我期望任何结果之前(timerISR每秒仅触发三到四次,而测量受到数据表的限制,需要在微秒范围内完成)。

ADC 寄存器也已被检查。当功能代码开始测量时,所有十个或十二个(加上 MCTL/MEM 数组)都具有与故障代码运行时相同的值。这符合一般情况下工作的代码。

我确实遇到了timerISR再次,所以代码似乎没有卡在 infloop 阻塞 ADC_ISR 中从触发。

我尝试使用其他存储类 rem_runs也没有成功。信号量无法工作,因为它们在 ISR 期间被禁用。尝试在另一个任务中获取信号量会导致可重现的崩溃重置。

另一个观察结果是,在某个时刻,MAP_RTC_whatsitsface例程没有修改我们可以再检查的寄存器,我们不得不求助于使用 RTC_whatsitsface而是从代码中获取例程。起初我们认为可能是我们将它们混合在一起,但是即使使用 MAP_RTC_ ...一直以来,我们的时钟定时器都没有触发

MAP_RTC_function定义指向 ROM_RTC_function根据 driverlib 的 rom_map.h 。它们被定义为 rom.h 中的内存地址。 (惊喜!)。我们的记录中没有对 driverlib 进行任何更改,但在某些时候它们停止了工作。

这两个问题有关联吗?它们看起来都像是内存恶作剧。任何关于如何进一步诊断这些东西的想法都将受到高度赞赏。

最佳答案

通过再次输入(非功能性)补丁解决了该问题。似乎发生了某种破坏宏的掠夺空间错误。

关于c - driverlib ADC 触发器未被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40316900/

相关文章:

c - -M gcc 选项的用例是什么?

c++ - SDL2 可以用 C 语言(相对于 C++)编程吗?

c - 超时后如何关闭上下文菜单?

c - 如何仅使用 3 个 printf 和 3 个 n\t\在 c 中创建钻石

assembly - 是否可以移植 .8xk 应用程序以适用于 TI 84 Plus CE?

linux - TIUSB3410 Linux 驱动

c - 为什么这个 IA32 汇编代码有 3 个真正的指令?

python - 连接到 TI Sensortag cc2541 的 Macbook Pro 2015

algorithm - 计算机上的 TI-84 随机数生成

c++ - 通过 TI 编译器使用定义类型的成员