在高编译器优化模式下在msp430中定时使用

问题描述 投票:0回答:1

我在MSP430中使用了具有高编译器优化的定时器A,但发现我的定时器代码在使用高编译器优化时失败。当没有使用任何优化时,代码工作正常。

此代码用于实现1 ms计时器滴答。 timeOutCNT在中断时增加。

以下是代码,

        //Disable interrupt and clear CCR0
        TIMER_A_TACTL = TIMER_A_TASSEL |                        // set the clock source as SMCLK
            TIMER_A_ID |                            // set the divider to 8
            TACLR |                                 // clear the timer
            MC_1;                   // continuous mode
        TIMER_A_TACTL &= ~TIMER_A_TAIE;                         // timer interrupt disabled
        TIMER_A_TACTL &= 0;                             // timer interrupt flag disabled

        CCTL0 = CCIE;                                   // CCR0 interrupt enabled
        CCR0 = 500;
        TIMER_A_TACTL &= TIMER_A_TAIE;              //enable timer interrupt
        TIMER_A_TACTL &= TIMER_A_TAIFG;             //enable timer interrupt
        TACTL = TIMER_A_TASSEL + MC_1 + ID_3;                   // SMCLK, upmode

        timeOutCNT = 0;

        //timeOutCNT is increased in timer interrupt
        while(timeOutCNT <= 1); //delay of 1 milisecond 

        TIMER_A_TACTL = TIMER_A_TASSEL |                        // set the clock source as SMCLK
        TIMER_A_ID |                                    // set the divider to 8
        TACLR |                                         // clear the timer
        MC_1;                           // continuous mode
        TIMER_A_TACTL &= ~TIMER_A_TAIE;                         // timer interrupt disabled
        TIMER_A_TACTL &= 0x00;                              // timer interrupt flag disabled

有人可以帮我解决这个问题吗?有没有其他方法我们可以使用计时器A,所以它在优化模式下工作正常?或者我是否错误地使用了1 ms中断?

c timer msp430
1个回答
5
投票

您是否在中断处理程序中修改了任何变量(例如timeOutCNT)?

如果是这样,请确保将它们声明为volatile,例如

volatile int timeOutCNT;

这可以防止编译器进行优化,假设timeOutCNT未被中断处理程序或其他线程修改。

© www.soinside.com 2019 - 2024. All rights reserved.