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中指向数组的全局变量指针的主要内容,如果未能解决你的问题,请参考以下文章