久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2850|回復(fù): 8
打印 上一主題 下一主題
收起左側(cè)

C語言函數(shù)編譯時一直報重復(fù)?WARNING L15: MULTIPLE CALL TO SEGMENT

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:232366 發(fā)表于 2021-9-5 12:21 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
上代碼:void Timer1Init(void)                //20毫秒@12.000MHz
{
        TMOD &= 0x0F;        //設(shè)置定時器模式
        TMOD |= 0x10;        //設(shè)置定時器模式
        TL1 = 0xE0;                //設(shè)置定時初值
        TH1 = 0xB1;                //設(shè)置定時初值
        TF1 = 0;                //清除TF1標志
        TR1 = 1;                //定時器1開始計時
        ET1=1;                        //允許定時器申請中斷
        EA=1;                        //打開總中斷
}





bit Teset()
{
        bit ack;
        
        ack=0;
        
        return ack;
}

bit Teset2()
{
        bit ack;
        
        ack=Teset();
        if(ack==0)
        {
               
        }
        return ack;
}


void Drive()
{
        static xdata uint16 Count=0;
        
        bit ack;
        
        Count++;
        if(Count>=100)
        {
                Count=0;
                ack=Teset();
                if(ack==1)
                {
                        
                }
                Teset2();
        }
}


void main(void)
{        
        Timer1Init();                                        //20毫秒@12.000MHz        
        delay(100);
        Teset2();
        while(1)
        {
                 //Drive();//在這里調(diào)用又沒事??????這是什么邏輯????
        }
}


void Timer1(void) interrupt 3//20毫秒@12.000MHz
{
        TR1=0;
        Drive();//在這里中斷這里調(diào)用就報錯????
        TL1 = 0xE0;                //設(shè)置定時初值
        TH1 = 0xB1;                //設(shè)置定時初值
        TR1=1;
}




編譯器報錯為    *** WARNING L15: MULTIPLE CALL TO SEGMENT


請教論壇師傅
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:161164 發(fā)表于 2021-9-5 14:45 | 只看該作者
因為你的兩個函數(shù)中會同時呼叫Teset()                               (PS: 不是Test嗎?從上一個貼子已出現(xiàn)這個錯字了,還沒改過來?)
有機會在運行Teset2()中的Teset()時剛好進入中斷
于是又呼叫Teset()

如果放進while(1)里就不會有這種情況

當然,這只是有機會發(fā)生,
所以他只是一個警告(Waring)而不是錯誤(Error)
不影響編譯,不理會也可以運行
但編程時最好不要有太多嵌套

回復(fù)

使用道具 舉報

板凳
ID:232366 發(fā)表于 2021-9-5 14:50 | 只看該作者
lkc8210 發(fā)表于 2021-9-5 14:45
因為你的兩個函數(shù)中會同時呼叫Teset()                               (PS: 不是Test嗎?從上一個貼子已出 ...

真的是太感謝您了!!!!!我前面一直在想是不是我程序框架搭錯了想了很久   沒想到給您一語道破!!!!太感謝了
回復(fù)

使用道具 舉報

地板
ID:232366 發(fā)表于 2021-9-5 14:53 | 只看該作者
lkc8210 發(fā)表于 2021-9-5 14:45
因為你的兩個函數(shù)中會同時呼叫Teset()                               (PS: 不是Test嗎?從上一個貼子已出 ...

不好意思敲錯錯了我一直沒發(fā)現(xiàn)呢!!!!尷尬
回復(fù)

使用道具 舉報

5#
ID:232366 發(fā)表于 2021-9-5 15:03 | 只看該作者
lkc8210 發(fā)表于 2021-9-5 14:45
因為你的兩個函數(shù)中會同時呼叫Teset()                               (PS: 不是Test嗎?從上一個貼子已出 ...

還是要感謝您耐心指出我的問題并作出修改
回復(fù)

使用道具 舉報

6#
ID:624769 發(fā)表于 2021-9-5 16:54 | 只看該作者
中斷要調(diào)用的子函數(shù),必須單獨寫,不然別的程序調(diào)用中,中斷時又調(diào)用,會有 重入錯誤。
你要是實在要用一樣的子函數(shù),就原封不動照抄一編,重新命名一個名字給中斷單獨用。
建議養(yǎng)成習(xí)慣,中斷不調(diào)用任何子函數(shù)。要么直接寫中斷里,要么精簡中斷,中斷只作標志,讓主程序周期執(zhí)行。
回復(fù)

使用道具 舉報

7#
ID:960726 發(fā)表于 2021-9-5 23:11 | 只看該作者
主程序和中斷服務(wù)程序通常不允許同時調(diào)用同一個函數(shù),除非函數(shù)為可重入函數(shù)。你的程序思路沒有錯,但是編譯系統(tǒng)邏輯上會混亂,想象一下,主程序正在執(zhí)行函數(shù)A,突然中斷了,再次調(diào)用這個函數(shù),當中斷返回時無法回到斷點了。建議你單獨寫主程序中的Teset2(),因為初始化只需要執(zhí)行一次。
回復(fù)

使用道具 舉報

8#
ID:883242 發(fā)表于 2021-9-5 23:30 | 只看該作者
樓主的寫法在正規(guī)的c語言編譯器里面是正確無誤的,不管是主循環(huán)還是中斷調(diào)用Teset()都是在堆棧上臨時生成局部變量空間,退出后堆棧上面的局部變量失效,可以參閱用c語言寫的《數(shù)據(jù)結(jié)構(gòu)》關(guān)于遞歸那一章。

但是在大多數(shù)8位單片機上面使用標準c語言做法,因為8位單片機設(shè)計之初就沒想過用什么高級語言,相關(guān)指令都沒有,所以代碼會變得很長,運行時間也會變長,時間和空間都要付出相當大的代價。所以Keil C51之類的編譯器就違反了標準c語言的做法,在RAM內(nèi)部靜態(tài)分配變量,比如Teset()局部變量地址0x20(隨手舉個栗子),主函數(shù)調(diào)用Teset(),發(fā)生中斷,中斷調(diào)用Teset(),0x20局部變量的值就被修改了,中斷返回后繼續(xù)執(zhí)行主函數(shù)調(diào)用的Teset(),就會因為局部變量被修改而發(fā)生異常。
回復(fù)

使用道具 舉報

9#
ID:232366 發(fā)表于 2021-9-6 07:23 來自手機 | 只看該作者
Hephaestus 發(fā)表于 2021-9-5 23:30
樓主的寫法在正規(guī)的c語言編譯器里面是正確無誤的,不管是主循環(huán)還是中斷調(diào)用Teset()都是在堆棧上臨時生成局 ...

原來如此!感謝您回復(fù)個耐心回答。
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美一区视频 | 国产精品久久久 | 国产欧美日韩综合精品一区二区 | 老司机久久 | 日韩精品1区2区3区 爱爱综合网 | 国产午夜在线观看 | 色婷婷综合在线观看 | 久久国产亚洲 | 在线播放一区二区三区 | 久久久毛片 | 欧美性精品| 福利精品 | 日韩精品一区二区三区中文在线 | 亚洲精品视频在线播放 | 精品国产欧美一区二区三区成人 | 久久在线免费 | 一区二区在线免费观看 | 色综合99| 欧美一级在线视频 | 国产视频福利在线观看 | 国产毛片毛片 | 国产精品成人一区二区三区吃奶 | 国产精品夜色一区二区三区 | 亚洲 中文 欧美 日韩 在线观看 | 国产精品久久久久久久久久 | 一本色道久久综合亚洲精品高清 | www..99re | av电影一区二区 | 日韩伦理一区二区三区 | 草久久久 | 夜夜骑天天干 | 欧美日韩最新 | 久久9999久久| 黄色在线免费播放 | 国产精品久久久久久久久久免费 | 自拍偷拍精品 | 国产精品99久久久久久动医院 | 国产激情91久久精品导航 | 精品色 | 日本在线视频一区二区 | 一级国产精品一级国产精品片 |