u8 k=0;
void I2cRead() interrupt 2
{
//static u8 k=0;
//k=0;
INTTemp=INTTemp<<1;
INTTemp=INTTemp|SDA;
k=k+1;
if (k==8)
{
INTre[INTbyteflag]=INTTemp;
INTbyteflag++;
k=0;
if(INTbyteflag>2&&INTre[2]+3==INTbyteflag) //接收的长度等于定义的长度,说明接收完毕
{
INTbyteflag=0;
INTflag=1;
}
}
如上,是通过INT1中断接收数据的程序。通过仿真的时候发现k的值为上图所显示的值,导致程序运行不正常。我把变量定义成局部变量或者静态变量都不行,只有当把k=0,放进中断函数时,k的值才正常。但是我不能每次进中断的时候,把k的值清零。清各位帮我想想这是原因,或者有没有什么其他办法。谢谢了。
此帖出自
小平头技术问答
我试了也不行,感觉k的值是固定的,清零没用。
if(INTbyteflag>2&&INTre[2]+3==INTbyteflag) 逻辑能保证对莫,特别是最后一个==
我现在怀疑是编译器没有把K认为成全局变量,而是一个局部变量,这样同一个地址被多个变量共用也是有可能的.你试一下把所有优化都关掉看看是否能行。我曾经见过一个比这个还要莫名其妙的情况,用的是keil,在某些情况下,只要多定义一个变量,整个程序都无法运行的情况,最关键的就是编译器没有报任何错,而且会生成HEX文件,但烧进去死活都不运行,连仿真器调试都进不去。所以我怀疑你是不是也遇到了类似的情况。
一周热门 更多>