問:我得到一個錯誤:“function * appears in multiple call graphs: rooted at *”,這是什么意思?
答:它意味著有一個函數(shù)既在中斷里調(diào)用了又在主函數(shù)中調(diào)用了,而編譯器是不支持重入的。因為函數(shù)是不能重入的,所以它基于在兩個地方同時調(diào)用的可能性而報這個錯誤。有幾種辦法可以繞開這個問題:
1. 如果ROM空間允許的話,可以把這個函數(shù)復(fù)制一份并另取一個不一樣的名稱。一個給中斷調(diào)用,另一個給主函數(shù)調(diào)用。
2. 重寫這個函數(shù),讓它不帶參數(shù)并且沒有局部變量。如果函數(shù)沒有參數(shù)和局部變量,那么它將可以被中斷和主函數(shù)同時調(diào)用。
3. 如果你能夠保證這個函數(shù)一定不會同時被調(diào)用,那么你可以使用#pragma interrupt_level 偽指令。這個指令在使用說明書里已經(jīng)詳細(xì)說明了,這里簡單介紹如下:
#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文章
3708瀏覽量
135779 -
MPLAB
+關(guān)注
關(guān)注
9文章
220瀏覽量
67192
發(fā)布評論請先 登錄
相關(guān)推薦
XC8編譯器與8位PIC MCU兼容嗎?
怎么在兼容模式下使用XC8編譯器
XC8編譯器中的eeprom_read/write宏出現(xiàn)問題
MPLAB XC8 C編譯器是否可以屏蔽/禁用有關(guān)pitch的咨詢報告?
MPLAB C18編譯器到MPLAB XC8 C編譯器的移植過程詳細(xì)中文資料概述
MPLAB XC8 C編譯器的用戶指南詳細(xì)中文資料概述免費下載

如何將C源代碼從MPLAB C18編譯器移植到MPLAB XC8C編譯器的詳細(xì)概述

MPLAB XC8入門教程之啟動指南資料免費下載
MPLAB C18到MPLAB XC8的移植概述
PIC MCC配置與XC8編譯器問題

MPLAB XC8 PIC匯編器的簡單介紹
適用于AVR MCU的MPLAB XC8 C編譯器用戶指南

適用于PIC MCU的MPLAB XC8 C編譯器用戶指南

評論