C 执行/计时差异取决于语句样式

C 执行/计时差异取决于语句样式,c,iar,C,Iar,以下两条语句在wrt定时/执行方面有何不同。 我正在使用AT91CSAM7x512设备。 我们能够通过更改下面的分配样式来解决一个麻烦的bug 我使用的是IAR Embedded Workbench版本4.41A。发生这种情况是由于某些编译器指令还是其他原因 AT91C_BASE_PIOA->PIO_PER |=((unsigned int)1是否会出现一些计时问题?是否有任何分配到硬件寄存器的问题?@计时问题…我认为是的。我认为这与处理器/编译器每次遇到此语句时发生的堆栈推送和弹出有关。集合

以下两条语句在wrt定时/执行方面有何不同。 我正在使用AT91CSAM7x512设备。 我们能够通过更改下面的分配样式来解决一个麻烦的bug

我使用的是IAR Embedded Workbench版本4.41A。发生这种情况是由于某些编译器指令还是其他原因



AT91C_BASE_PIOA->PIO_PER |=((unsigned int)1是否会出现一些计时问题?是否有任何分配到硬件寄存器的问题?@计时问题…我认为是的。我认为这与处理器/编译器每次遇到此语句时发生的堆栈推送和弹出有关。集合语句(第一组命令)工作正常,我能想到的可能原因是它更快,需要更少的命令。第一个版本读写PIOA寄存器一次,同时设置2位。第二个版本读写PIOA寄存器两次,先设置一位再设置另一位。不知道这些位表示什么,也不知道是否重新设置读取这些寄存器会改变一切,我无能为力,但在设备级别,可能会有很大的不同。如果这些是硬件寄存器,您可能必须将字段定义为
volatile
,否则编译器甚至可以像第一组指令一样执行第二组指令(两者之间不使用
->PIO…
,而是更新两次计算两者的效果并一次性完成)。
AT91C_BASE_PIOA->PIO_PER  |= (((unsigned int)1<<12) | ((unsigned int)1<<13));  
AT91C_BASE_PIOA->PIO_ODR  |= (((unsigned int)1<<12) | ((unsigned int)1<<13));  
AT91C_BASE_PIOA->PIO_IFER |= (((unsigned int)1<<12) | ((unsigned int)1<<13));  
MARK1.occurrence = 0;  
MARK2.occurrence = 0;
AT91C_BASE_PIOA->PIO_PER  |= (unsigned int)1<<12) ;  
AT91C_BASE_PIOA->PIO_ODR  |= (unsigned int)1<<12) ;  
AT91C_BASE_PIOA->PIO_IFER |= (unsigned int)1<<12) ;  
MARK1.occurrence = 0;


AT91C_BASE_PIOA->PIO_PER  |= (unsigned int)1<<13) ;  
AT91C_BASE_PIOA->PIO_ODR  |= (unsigned int)1<<13) ;  
AT91C_BASE_PIOA->PIO_IFER |= (unsigned int)1<<13) ;  
MARK2.occurrence = 0;