如何在嵌入式ANSI C中制作锁定 /关键部分



我有这样的代码:(非常简化的代码(

// This is code for Microchip 8-bit microcontroller, XC8 compiler (GCC based)
#define TIMER_COUNT 8;
volatile uint16_t timer_values[TIMER_COUNT];
volatile uint16_t timer_max_values[TIMER_COUNT];
// executes every 100ms
void timer1_interrupt_handler()
{
    for (uint8_t i = 0; i < TIMER_COUNT ; i++){
        timer_values[i];
    }
}
void main(){
    // (...) some initialization, peripherial and interrupt handler setup
    while(1){
        for (uint8_t i = 0; i < TIMER_COUNT ; i++) {
            // what if interrupt happens in the middle of comparison?
            if (timer_values[i] >= timer_max_values[i]) 
            {
                 timer_values[i] = 0;   // reset timer
                 executeTimerElapsedAction(i);
            }
        }
    }
}

问题是,这是8位微控制器,当中断发生在16位变量的非原子操作中间时:

timer_values[i] >= timer_max_values[i]

或以下:

timer_values[i] = 0; 

有可能的是,UINT16_T的一半将被中断处理程序重新写,一切都混乱了。

这不是RTO,所以我没有内置的锁。

我该怎么办?如何从头开始锁定?

我正在考虑创建这样的"关键部分":

GlobalInterruptsDisable();     // enter critical section
if (timer_values[i] >= timer_max_values[i]) 
{
    timer_values[i] = 0;   // reset timer
    GlobalInterruptsEnable();     // exit critical section
    executeTimerElapsedAction(i);
}

但是恐怕我会跳过一些中断(我正在使用2个计时器,2个UARTS和I2C中断(,而其他事情会弄乱。

其他问题:

如果我禁用大约20-30个处理器周期的中断,然后一些数据出现在uart上 - 我将跳过此数据,或者中断处理程序将在启用中断后稍后执行?

您可以为"保存参数副本"编写一个函数,该副本可以停止中断,进行副本,然后重新启动中断。

#define protectedXfer(destination, source) protectedMemcpy(&(destination), 
                                                          &(source), 
                                                          sizeof(destination))
void protectedMemcpy(void *destination, const void *source, size_t num)
{
    int volatile oldIpl;
    oldIpl = SRbits.IPL;
    SRbits.IPL2 = 1; // If an Interrupt occurs here
    SRbits.IPL1 = 1; // the IPL bits are saved/restored
    SRbits.IPL0 = 1; // from the stack
    memcpy(destination, source, num);
    SRbits.IPL = oldIpl;
}

知道您可以从计时器值中进行保存传输并在之后检查。

protectedXfer(destinaion, source);

相关内容

  • 没有找到相关文章

最新更新