問:我得到一個(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è)指令在使用說(shuō)明書里已經(jīng)詳細(xì)說(shuō)明了,這里簡(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文章
3667瀏覽量
135235 -
MPLAB
+關(guān)注
關(guān)注
9文章
217瀏覽量
67019
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論