Sourceboost C中指向数组的全局变量指针

Posted

技术标签:

【中文标题】Sourceboost C中指向数组的全局变量指针【英文标题】:Global Variable Pointer to array in Sourceboost C 【发布时间】:2011-10-07 12:57:35 【问题描述】:

我声明了这些全局变量:

volatile unsigned char BUFFER[7]=0,0,0,0,0,0,0;//to get all data
volatile unsigned char *PTR=&BUFFER[0];//points to start address

在 Microchip PIC 中断函数内部,指针读取 UART 寄存器并根据我的代码将其引用到 BUFFER[] 数组:

*PTR=rcreg;
PTR++;

然后我检查函数 main() 中的数据:

for(i=0;i<3;i++)
    if(BUFFER[i]==DATA[i])
        k++;
        if(k==2)LED_On();
    

并设置ptr指向BUFFER[]的起始地址

ptr=BUFFER;

问题:这是读取寄存器中数据的最佳方式和正确方式吗?如何在中断函数中使用指针?

提前感谢您的关注和帮助!

【问题讨论】:

请努力正确地格式化代码。将单行 for...if...if... 倾倒在人们身上是没有办法寻求帮助的。 【参考方案1】:

您可能需要考虑实现无锁循环缓冲区以在 ISR 和 main() 之间传输数据:Circular lock-free bufferNon-blocking algorithm

【讨论】:

但它可能必须有一个“锁”(信号量/互斥锁),因为它由 ISR 和 main() 共享。如果 ISR 正在写入缓冲区,而 main 正在同时读取它,则会出现问题。 @Lundin:如果处理得当并且没有奇怪的缓存效果需要解决,只要每个只有一个读取器和一个写入器,就不需要锁(原子读/写/增量就足够了)这样的缓冲区。我已经在几个平台(x86 和 TMS32054xx)上完成了。 问题不在于访问指令是否是原子的,而在于 UART 可能在任何给定时间获得中断并覆盖存储的数据。您将有某种锁,也许还有双缓冲区来避免这种情况。请记住,这是一张 PIC,与您所获得的 x86 差不多。 PIC 执行代码的速度非常慢,甚至可能赶不上常见的 RS-232 波特率。 @Lundin:如果您的代码跟不上您的数据速率并且缓冲区溢出(7 个字节可能太少而无法容纳延迟),那么就存在严重问题。顺便说一句,控制流在这里可以提供帮助(当您接近完全填充缓冲区时,丢弃 DTR/DSR/任何向发送器发出接收器尚未准备好的信号)。 115200bps 是一种常见的波特率,这意味着您将每 87us(1/115200 * 10 位)获得一个新字节。我认为对于大多数 8 位比特币,尤其是 PIC 来说,这将很难处理。 MCU 上的 UART 外设中的大型硬件输入缓冲区会有很大帮助——我不知道 PIC 是否有这个。

以上是关于Sourceboost C中指向数组的全局变量指针的主要内容,如果未能解决你的问题,请参考以下文章

C语言中用const声明全局变量赋初值和不赋初值有何区别?变量存放位置有啥不一样?

C语言:定义指向二维数组的指针变量

C语言中怎样区分一维指针和二维指针?

《C语言程序设计》指针

《C语言程序设计》指针

在C语言中能否直接给指针指向的数据赋值?为啥?