【问题标题】:MSP430 Function Call Being SkippedMSP430 函数调用被跳过
【发布时间】: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


【解决方案1】:

swineone 在评论中回复了以下正确的解决方案:

“尝试将声明 int i = 0; 更改为 volatile int i = 0; 在 延迟()函数。这告诉优化器不要碰那个变量, 并且可能是优化器优化代码之间的区别 离开与否。”

感谢您的帮助!

【讨论】:

    【解决方案2】:

    建议使用中断。这样的任务是这样的:

    #include "io430.h"
    
    #define ON 1
    #define OFF 0
    
    #define LED1 P1OUT_bit.P0
    #define LED2 P1OUT_bit.P6
    
    void init(void)
    {
    
      // Stop watchdog timer to prevent time out reset
      WDTCTL = WDTPW + WDTHOLD;
    
      P1OUT = 0x00;
      P1DIR = 0xFF;
    
      // initialize Timer0_A
      TA0CCR0 = 62500;  // set up terminal count
      TA0CTL = TASSEL_2 + ID_3 + MC_1; // configure and start timer
    
      // enable interrupts
      TA0CCTL0_bit.CCIE = 1;   // enable timer interrupts
      __enable_interrupt();    // set GIE in SR
    }
    
    #pragma vector = TIMER0_A0_VECTOR
    __interrupt void myTimerISR(void)
    {
      LED1 = ~LED1;
    }
    

    【讨论】:

    • 我刚刚回复了 Lasse V. Karlsen 的评论,上面谈到了这个问题。这是一个个人测试。但是这篇文章确实帮助我完成了一个类似的测试,我正在使用中断和计时器运行,所以感谢你的抢先! :)
    猜你喜欢
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-21
    • 2018-01-11
    • 1970-01-01
    相关资源
    最近更新 更多