【发布时间】:2014-07-09 14:55:19
【问题描述】:
我正在使用 MSP430 LaunchPad 开发套件对 MSP430 微控制器进行编程,但在这个简单的代码中遇到了一些问题。
#include <msp430.h>
void Delay(void);
#define LED1 BIT0 //define LED1 as bit 0 (0x00)
#define LED2 BIT6 //define LED2 as bit 6 (0x40)
#define delayTime 20000 //define iTime as 20000
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; //stop watchdog timer
P1DIR |= (LED1|LED2); //set P1.0 and P1.6 to output direction (P1.3 is naturally an input)
P1OUT |= LED1; //set P1.0 high so the LEDs will blink alternatively
while(1)
{
Delay();
P1OUT ^= (LED1|LED2); //toggle P1.0 using exclusive-OR
}
}
void Delay(void)
{
int i = 0;
while(delayTime > i)
{
i++;
}
}
这段代码编译得很好,但是在调试代码时,函数调用'Delay()'被完全跳过,并且从未进入该函数。但是,当我给函数一个返回类型为“unsigned int”时:
unsigned int Delay(void)
{
int i = 0;
while(delayTime > i)
{
i++;
}
return 1;
}
我可以像下面这样在 if 语句中调用延迟函数,调试器将进入该函数。
if(Delay() == 1)
{
P1OUT ^= (LED1|LED2); //toggle P1.0 using exclusive-OR
}
我确信我正在做一些简单的疏忽。我一生都无法弄清楚为什么调试器会跳过我的第一个 void 函数调用。有什么智慧吗?
【问题讨论】:
-
是否启用了编译器优化?
-
当前优化/调试设置:--opt_level=0 --opt_for_speed=1 -g
-
尝试在
Delay()函数中将声明int i = 0;更改为volatile int i = 0;。这告诉优化器不要碰那个变量,这可能是优化器是否优化代码之间的区别。 -
效果很好!谢谢!你想把它作为答案发布,以便我可以勾选它吗?另外,知道为什么 if 语句有效吗?
-
您是否观察到
Delay函数被调用,或者您想要施加的延迟实际发生了?因为如果没有volatile,while 循环可能仍会被优化掉。
标签: c microcontroller msp430 texas-instruments code-composer