编译时使用extern变量的链接问题?

时间:2019-01-11 10:37:16

标签: c compilation extern

我正在使用PIC v7.2的MikroC来编程PIC18f67k40。

functii.h 中,我具有以下变量声明:

extern volatile unsigned char byte_count;

main.c 中,以下代码:

#include <functii.h>
// ...
volatile unsigned char byte_count = 0;
// ...

void interrupt () {
    if (RC1IF_bit) {
        uart_rx = Uart1_read();
        uart_string[byte_count] = uart_rx;    
        byte_count++;
    } 
// ...
}

然后,在 command.c 中,我具有以下代码:

#include <functii.h> 

void how_many_bytes () {
    // ...
    uart1_write(byte_count);
    // ...
}

main.c中,我使用中断处理通过UART传输的数据。接收到传输结束符后,我将调用how_many_bytes(),它会发送回接收到的消息的长度(加上数据字节本身,以及我在此处未包括的代码,但这些都是好!!)。

问题在于,在uart1_write()调用中,byte_count始终为0,而​​不是在中断序列中递增。

1 个答案:

答案 0 :(得分:-1)

可能您需要在中断处理程序和主处理程序之间进行一些同步。

如果您做这样的事情

if(byte_count != 0) {
    uart1_write(byte_count);
    byte_count = 0;
}

中断可以发生在任何地方,例如

  1. if(byte_count != 0)uart1_write(byte_count);
  2. 之间
  3. uart1_write(byte_count);的处理过程中,该过程使用旧值的副本,而值被更改,或者
  4. 介于uart1_write(byte_count);byte_count = 0;之间。

使用上面的代码,情况1没问题,但是2和3没问题。读取byte_count用于函数调用后,您将丢失所有收到的字符。

也许您可以在某些时候禁用/启用中断。

更好的解决方案可能是不重置byte_count之外的interrupt(),而是实现具有单独的读写索引的环形缓冲区。读索引只能由how_many_bytes()(或uart1_write())修改,写索引只能由interrupt()修改。