不会调用driverlib ADC触发器

时间:2016-10-29 07:09:32

标签: c texas-instruments

描述很冗长,对不起。我用粗体突出了问题。

我目前正在尝试设置执行以下操作的驱动程序库机制:

  • 大约每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_RTC_function定义指向rom_map.h的点。它们被定义为rom.h中的内存地址(惊喜!)。我们的记录中没有对driverlib进行任何更改,但在某些时候他们停止了工作。

这两个问题可以相关吗?它们看起来都像记忆诡计。关于如何进一步诊断这些东西的任何想法都受到高度赞赏。

1 个答案:

答案 0 :(得分:0)

通过再次键入(非功能)补丁解决了问题。似乎有某种宏观破坏的劫掠空间错误正在发生。