在高编译器优化模式下在msp430中定时使用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在高编译器优化模式下在msp430中定时使用相关的知识,希望对你有一定的参考价值。
我在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中断?
答案
您是否在中断处理程序中修改了任何变量(例如timeOutCNT)?
如果是这样,请确保将它们声明为volatile
,例如
volatile int timeOutCNT;
这可以防止编译器进行优化,假设timeOutCNT未被中断处理程序或其他线程修改。
以上是关于在高编译器优化模式下在msp430中定时使用的主要内容,如果未能解决你的问题,请参考以下文章