|
发表于 2012-10-26 09:57:18
|
显示全部楼层
1、比如ucos中的一段源码:
void OSStatInit (void)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr = 0;
#endif
OSTimeDly(2); /* Synchronize with clock tick */
OS_ENTER_CRITICAL();
OSIdleCtr = 0L; /* Clear idle counter */
OS_EXIT_CRITICAL();
OSTimeDly(OS_TICKS_PER_SEC / 10); /* Determine MAX. idle counter value for 1/10 second */
OS_ENTER_CRITICAL();
OSIdleCtrMax = OSIdleCtr; /* Store maximum idle counter count in 1/10 second */
OSStatRdy = OS_TRUE;
OS_EXIT_CRITICAL();
}
OSIdleCtr = 0L;语句功能对于后面的语句OSTimeDly(OS_TICKS_PER_SEC / 10); 功能是独立的,OSTimeDly(OS_TICKS_PER_SEC / 10);并不会用到由于OSIdleCtr = 0L;语句的执行导致的状态标志位变化。
2、比如说一段简单的代码:
int i = 1;
int j = 1;
if(i == 1)
{
j = 2;
}
else
{
j = 3;
}
用汇编编写大概是:
0x08000176 2401 MOVS r4,#0x01
0x08000178 2501 MOVS r5,#0x01
0x0800017A 2C01 CMP r4,#0x01
0x0800017C D101 BNE 0x08000182
0x0800017E 2502 MOVS r5,#0x02
0x08000180 E000 B 0x08000184
0x08000182 2503 MOVS r5,#0x03
其中
0x0800017A 2C01 CMP r4,#0x01
0x0800017C D101 BNE 0x08000182
这两条语句用到了状态标志位。那么有没有可能在0x0800017A 2C01 CMP r4,#0x01语句之前插入一条OS_ENTER_CRITICAL();,而在0x0800017A 2C01 CMP r4,#0x01语句之后插入OS_EXIT_CRITICAL();语句。用汇编可以做到,虽然这样写是错误的,不合逻辑的。但用c语言写的代码中,没有办法做到,因为0x0800017A 2C01 CMP r4,#0x01
0x0800017C D101 BNE 0x08000182
这两条语句在c程序中就一条if(i==1)。所以c语言在一定程度上可以避免这种问题的发生。 |
|