在刚开始使用低功耗的时候照葫芦画瓢(好像是LIERDA的一个技术支持工程师给我的例程),喜欢将低功耗的代码写成:
for(;;)
{
_BIS_SR(LPM0_bits);
_NOP();
}
那个GG说这样才能保证低功耗(当时对这个GG十分的佩服,居然比TI的程序员都厉害)。后来仿真才知道,这个循环完全是没有必要的。这是因为低功耗模式和中断唤醒CPU的工作过程是这样子滴:1)低功耗,CPU休眠;2)有中断标志位置位,唤醒CPU;3)执行中断服务程序,至完成;4)退出中断服务,MSP继续进入低功耗,CPU再次休眠,直到下次中断到来。所以MSP根本就没有执行这个循环过程。还是TI的程序是对的。即
_BIS_SR(LPM0_bits);
不过,这个循环还是在某些情况下有用处的,我们可以在中断的结束前加一个人工唤醒CPU的一个本征函数,比如_BIC_SR_IRQ(LPM0_bits);(查查.h文件看看,我记得是这个函数)这让就可以让MSP在退出中断服务后继续执行下面的语句,直到再次循环到_BIS_SR();这条语句。这样还是很有用处的。比如可以使得我的键盘中断函数只处理得到键值的部分,而键盘的功能(其中要用到发送中断)的实现放在_BIS_SR();后面,这样能尽量减少中断的嵌套。
for(;;)
{
_BIS_SR(LPM0_bits);
key_deal();
}
/* interrupt p1 */
#pragma vector=PORT1_VECTOR
__interrupt void getKeyValue(void)
{
. . .
_BIC_SR_IRQ(LPM0_bits);
} |