最近写了个用环形缓冲区发送数据的STM32串口程序:使用头指针(front)指向下一个要发送数据,使用尾指针(rear)指向新数据存储的地方。中断里面会判断front和rear是否相等,如果相等则表示缓冲区为空,发送已经完成,关闭中断;反过来说,front和rear相等表示缓冲区还有数据要发送,那么就在中断里面把数据一个一个地发送出去。
那么问题来了,我在存数据的时候写了这么一行代码:
USART1_SendQueue[USART1_SendRear ++] = data;
也就是说,把数据存入缓冲区后,尾指针自+1。这看起来没毛病,但编译器给出汇编代码是这样的:
0x0800213C LDR r0,[pc,#492] ;取出USART1_SendRear的地址存到r0
……
0x08002148 LDR r1,[r0,#0x00] ;将USART1_SendRear的值存入r1
0x0800214A LDR r0,[r0,#0x00] ;将USART1_SendRear的值存入r0
0x0800214C ADDS r0,r0,#1 ;将r0自加1
0x0800214E LDR r2,[pc,#476] ;取出USART1_SendRear的地址存到r2
0x08002150