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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2870|回復: 8
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
跳轉到指定樓層
樓主
上代碼:void Timer1Init(void)                //20毫秒@12.000MHz
{
        TMOD &= 0x0F;        //設置定時器模式
        TMOD |= 0x10;        //設置定時器模式
        TL1 = 0xE0;                //設置定時初值
        TH1 = 0xB1;                //設置定時初值
        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();//在這里調用又沒事??????這是什么邏輯????
        }
}


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




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


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

使用道具 舉報

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

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

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

回復

使用道具 舉報

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

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

使用道具 舉報

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

不好意思敲錯錯了我一直沒發現呢。。。擂
回復

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

原來如此!感謝您回復個耐心回答。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩一二区 | 精品欧美一区二区精品久久久 | xxxxxx国产| 欧美一区在线看 | 久久精品久久精品久久精品 | 亚洲视频免费观看 | 亚洲三级在线 | 农村真人裸体丰满少妇毛片 | 午夜成人免费视频 | 黄色在线免费网站 | h视频免费观看 | 欧美日韩在线视频一区二区 | 成人午夜影院 | 国产精品99久久久久久宅男 | 欧美日韩成人在线 | 亚洲国产精品91 | 中文福利视频 | 2018国产大陆天天弄 | 亚洲人va欧美va人人爽 | 日韩福利| 午夜视频在线观看网站 | 欧美一区二区在线播放 | 99热这里都是精品 | 99国产在线 | 国产亚洲欧美在线视频 | 久久久婷 | 一区二区三区国产精品 | 91精品久久久久久久 | 亚洲一区二区三区 | 亚洲欧美日韩一区 | 中文字幕在线观看视频一区 | 欧美一区二区 | 欧美精品一区三区 | 久久精品一区二区 | 女女百合av大片一区二区三区九县 | 久久久久久国产精品 | 美国一级片在线观看 | 中文字幕在线免费视频 | 国产丝袜一区二区三区免费视频 | 国产高清一区二区三区 | 天天综合91|