問:我得到一個(gè)錯(cuò)誤:“function * appears in multiple call graphs: rooted at *”,這是什么意思?
答:它意味著有一個(gè)函數(shù)既在中斷里調(diào)用了又在主函數(shù)中調(diào)用了,而編譯器是不支持重入的。因?yàn)楹瘮?shù)是不能重入的,所以它基于在兩個(gè)地方同時(shí)調(diào)用的可能性而報(bào)這個(gè)錯(cuò)誤。有幾種辦法可以繞開這個(gè)問題:
1. 如果ROM空間允許的話,可以把這個(gè)函數(shù)復(fù)制一份并另取一個(gè)不一樣的名稱。一個(gè)給中斷調(diào)用,另一個(gè)給主函數(shù)調(diào)用。
2. 重寫這個(gè)函數(shù),讓它不帶參數(shù)并且沒有局部變量。如果函數(shù)沒有參數(shù)和局部變量,那么它將可以被中斷和主函數(shù)同時(shí)調(diào)用。
3. 如果你能夠保證這個(gè)函數(shù)一定不會(huì)同時(shí)被調(diào)用,那么你可以使用#pragma interrupt_level 偽指令。這個(gè)指令在使用說明書里已經(jīng)詳細(xì)說明了,這里簡(jiǎn)單介紹如下:
#pragma interrupt_level 1
void common_func(void)
{
/* local variable definitions */
/* code */
}
#pragma interrupt_level 1
void interrupt isr(void)
{
common_func();
/* more code */
}
void main(void)
{
common_func(); /* 在中斷使能之前被調(diào)用 */
EI(); /* 使能中斷 */
/* more code */
-
編碼器
+關(guān)注
關(guān)注
45文章
3953瀏覽量
142709 -
MPLAB
+關(guān)注
關(guān)注
9文章
222瀏覽量
68563
發(fā)布評(píng)論請(qǐng)先 登錄
XC8編譯器與8位PIC MCU兼容嗎?
怎么在兼容模式下使用XC8編譯器
XC8編譯器中的eeprom_read/write宏出現(xiàn)問題
MPLAB XC8 C編譯器是否可以屏蔽/禁用有關(guān)pitch的咨詢報(bào)告?
MPLAB C18編譯器到MPLAB XC8 C編譯器的移植過程詳細(xì)中文資料概述
MPLAB XC8 C編譯器的用戶指南詳細(xì)中文資料概述免費(fèi)下載
如何將C源代碼從MPLAB C18編譯器移植到MPLAB XC8C編譯器的詳細(xì)概述
MPLAB XC8入門教程之啟動(dòng)指南資料免費(fèi)下載
MPLAB C18到MPLAB XC8的移植概述
PIC MCC配置與XC8編譯器問題
MPLAB XC8 PIC匯編器的簡(jiǎn)單介紹
適用于AVR MCU的MPLAB XC8 C編譯器用戶指南
適用于PIC MCU的MPLAB XC8 C編譯器用戶指南
MPLAB XC8編譯器得到錯(cuò)誤function什么意思
評(píng)論