找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1496|回复: 2
收起左侧

keil编译*** WARNING L15: MULTIPLE CALL TO SEGMENT程序好像也没有被重复调用呀

[复制链接]
ID:686513 发表于 2022-4-22 21:24 | 显示全部楼层 |阅读模式
keil 5 编译时出现这个警告,但程序检查过,好像也没有被重复调用呀!

Rebuild started: Project: unit-led
Rebuild target 'Target 1'
compiling display.c...
compiling main.c...
compiling delay.c...
compiling EEPROM.c...
compiling adc.c...
linking...
*** WARNING L15: MULTIPLE CALL TO SEGMENT
    SEGMENT: ?PR?_READ_EEPROM_U16?EEPROM
    CALLER1: ?PR?TIMER1_ISR?MAIN
    CALLER2: ?C_C51STARTUP
Program Size: data=97.2 xdata=0 code=5591
creating hex file from "..\output\unit"...
"..\output\unit" - 0 Error(s), 1 Warning(s).
Build Time Elapsed:  00:00:04

回复

使用道具 举报

ID:688692 发表于 2022-4-23 00:40 | 显示全部楼层
编译器发现一个子程序被一般流程调用又被中断调用就会出这个警告了。
编译器已经说得很清楚了
CALLER1: ?PR?TIMER1_ISR?MAIN
CALLER2: ?C_C51STARTUP

可以加关键字声明子程序可以重入。
但是导致效率不高。
一般那个子程序不是很长的话,复制一个另起名字供两处不同的地方调用就好。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:686513 发表于 2022-4-26 20:45 | 显示全部楼层
cnos 发表于 2022-4-23 00:40
编译器发现一个子程序被一般流程调用又被中断调用就会出这个警告了。
编译器已经说得很清楚了
CALLER1: ? ...

void main()
{
         u16 num;                        //AD2电压检测变量
         float  ADCBat,stress;          //压力计算中间变量
           
    P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
    P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
    P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口   
    P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
          led1=0; md1=0; Beep=0;
         
                 Timer0Init();     //定时器0调用
                Timer1Init();     //定时器1调用
                 STC8ADC_INIT();         //adc.c模块ADC获取子程序调用
                 EA=1;             //中断总开关
                               
        while(1)
           {
                   ADCBat = line_bat_0-line_bat_1;           //AD0-AD1的结果赋给ADCBat无符号整型变量                       
                         if(0<ADCBat<150)                         //当压力值介于0PSI到150PSI之间时,遵循线性变换公式:y=(115-15)/(243-13)*X+15kpa
                                 {
                                         stress=((10.0/11.4)*ADCBat)-18.5;    //测试时补偿值为-18.5                                                                                 
                                         press=stress*10;                     //放大10倍,便于后面计算                                                                                                  
                                 }
         
       num=1.022*line_bat_2*1000/4095;                 //电量计算       
              if (num>776) DAT=3;                //    776  四格
              else if (num>710) DAT=2;           //    710  三格
              else if (num>660) DAT=1;                 //    664  二格
                    else if (num>610) DAT=0;                 //    613  一格
                                                                                                                                                                                                  
                          dis_Service();                      //显示服务函数
        DaQi();                       //打气服务函数
           }
}
上面主函数里定时器 Timer1Init();  调用过keynum1值显示,下面是按键函调用过EEPROM的读和写,也没看到重复调用的问题呀?请大神指点一下!
void key_scan()
{
        static unsigned char state=S0,key_time;
        unsigned char key;
  key=P3&0x1f;     //屏蔽P1低四位
  switch(state)   //检测状态
    {
          case S0: //状态0
      if(key!= 0x1f) state = S1; break;      //判断输入是否为0,为0转入状态1
               
    case S1: //状态1
           if(key==0x1f) state = S0;            //判断输入是否为1,为1返回状态0
           else                                //否则,转入状态2,执行按键程序
           {
                             state=S2;
           switch(key)
            {
                                          case 0x1E:
                                            switch(wnd)
                                                        {                                                                                               
                                                        case 0:T1Cnt=epxs_short; keynum1 = Read_EEPROM_u16(0x0200); SSCnt=0; flag=0; keyflag=0; if(keynum1>1049) keynum1=30; if(flag==0 && keyflag==0){if(keynum1<1000) keynum1 = keynum1+5; else keynum1++;} Save_EEPROM_u16(0x0200, keynum1);Setflag=1; break; //psi:0~150,0~100加5,到100退位显示100~150加1
                                                        case 1:T1Cnt=epxs_short; keynum2 = Read_EEPROM_u16(0x0400); SSCnt=0; flag=0; keyflag=0; if(keynum2>1002) keynum2=20; if(flag==0 && keyflag==0){if(keynum2<1000) keynum2 = keynum2+5; else keynum2++;} Save_EEPROM_u16(0x0400, keynum2);Setflag=1; break; //BAR:0.2-10.3   
                                                        case 2:T1Cnt=epxs_short; keynum3 = Read_EEPROM_u16(0x0600); SSCnt=0; flag=0; keyflag=0; if(keynum3>994)  keynum3=20; if(flag==0 && keyflag==0){                 keynum3 = keynum3+5;                } Save_EEPROM_u16(0x0600, keynum3);Setflag=1; break; //kpa:20-995      
                                                        case 3:T1Cnt=epxs_short; keynum4 = Read_EEPROM_u16(0x0800); SSCnt=0; flag=0; keyflag=0; if(keynum4>1002) keynum4=20; if(flag==0 && keyflag==0){if(keynum4<1000) keynum4 = keynum4+5; else keynum4++;} Save_EEPROM_u16(0x0800, keynum4);Setflag=1; break; //kg/cm:0.2-10.5                                                                 
                                                        }                                               
                                                        FMQCnt = FMQ_short;        //按键声音触发,滴一声就停。                                       
                                                        break;



void timer1_ISR(void) interrupt 3          //定时器中断1,中断号:3
{       
  TR1=0;                                   //定时器1计时关闭

//定时设定值3S显示
  if(T1Cnt != 0)                           //如果T1Cnt不等于0
    {       
      T1Cnt--;                             //每次进入定时中断都自减1,直到等于零为止。
                        keyflag=1;                           //3S到keyflag=1:读EEPROM值,显示3S按键调整值       
                        switch(wnd)                           //不同窗口显示按键值
                                {                       
                                case 0: parm1 = keynum1;  break;   
                                case 1: parm2 = keynum2;  break;
                                case 2: parm3 = keynum3;  break;
                                case 3: parm4 = keynum4;  break;
                                default:break;
                                }                                       
    }
  else                                      
          {
                        keyflag=0;                           //3S到keyflag=0:退出显示压力值
                        switch(wnd)                             //不同窗口显示压力值

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表