jianhong_wu 发表于 2015-1-7 13:59:37

发现keil的一个秘密,编译环境Memory Mode只能选Small,否则容易出现诡异现象。

本帖最后由 jianhong_wu 于 2015-1-8 19:48 编辑

鸿哥-深圳:

今天用stc15w204s单片机调试发现了一个惊天秘密,于是决定把它写出来,避免后来人犯错。就是在我们使用keil的时候,在编译环境Memory Model选项里,强烈推荐大家使用Small模式,千万不要选Compact和Large模式,否则会出现以下诡异的现象。比如,我以下两个代码都是让一个LED灯闪烁。第一个是用delay延时方式,第二个是用累加主循环次数的延时方式。结果发现,当我用Compact和Large模式的时候,第一个代码能正常闪烁,第二个代码不能正常闪烁。而当我用Small模式的时候,两个代码都能正常闪烁。


第一个是用delay延时方式:

//假定测试芯片的工作频率为11.0592MHz

#include "reg51.h"

sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;

sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;


sbit P30 = P3^0;
sbit P31 = P3^1;
sbit P32 = P3^2;
sbit P33 = P3^3;


void delay()
{
    int i, j;

    for (i=0; i<1000; i++)
    for (j=0; j<500; j++);
}


void main()
{

    P3M0 = 0x00;//P3为普通的准双向口
    P3M1 = 0x00;

    P5M0 = 0x00;//P5为比较器IO口,必须设置为高阻输入
    P5M1 = 0xff;



    P33 = 1;
    P32 = 1;




    while (1)
    {
         P33 = 0;
       P32 = 1;
       delay();
         P33 = 1;
       P32 = 0;
       delay();
    }
}


第二个是用累加主循环次数的延时方式:

//假定测试芯片的工作频率为11.0592MHz

#include "reg51.h"

#define const_time_level 10000

sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;

sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;


sbit P30 = P3^0;
sbit P31 = P3^1;
sbit P32 = P3^2;
sbit P33 = P3^3;

void led_flicker(void);


unsigned char ucLedStep=0; //步骤变量
unsigned longulTimeCnt=0; //统计循环次数的延时计数器

void main()
{

    P3M0 = 0x00;//P3为普通的准双向口
    P3M1 = 0x00;

    P5M0 = 0x00;//P5为比较器IO口,必须设置为高阻输入
    P5M1 = 0xff;

    P33 = 1;
    P32 = 1;


    while (1)
    {
         led_flicker();   
    }
}


void led_flicker(void)
{

switch(ucLedStep)
{
   case 0:
          ulTimeCnt++;//累加循环次数,
          if(ulTimeCnt>=const_time_level) //时间到
          {
             ulTimeCnt=0; //时间计数器清零
               P33 = 0;
             P32 = 1;
             ucLedStep=1; //切换到下一个步骤
          }
          break;
   case 1:
          ulTimeCnt++;//累加循环次数,
          if(ulTimeCnt>=const_time_level) //时间到
          {
             ulTimeCnt=0; //时间计数器清零
               P33 = 1;
             P32 = 0;
             ucLedStep=0; //返回到上一个步骤
          }
          break;
}

}



fzwwj95 发表于 2015-1-13 22:04:09

是仿真时有诡异现象还是实物也有?

jianhong_wu 发表于 2015-1-20 23:27:12

fzwwj95 发表于 2015-1-13 22:04
是仿真时有诡异现象还是实物也有?

实物。就是stc15那款单片机。
页: [1]
查看完整版本: 发现keil的一个秘密,编译环境Memory Mode只能选Small,否则容易出现诡异现象。