我們?cè)谧霾藛纬绦蚧蛲ㄟ^(guò)函數(shù)指針調(diào)用函數(shù)時(shí),如果被調(diào)用的函數(shù)中有包含了常量字符串,那么經(jīng)常會(huì)出現(xiàn)這樣的的錯(cuò)誤提示:"RECURSIVECALLTOSEGMENT"意思是"遞歸調(diào)用段",如何解決呢,之前我沒(méi)有找到很好的方法,這段時(shí)間我回過(guò)頭來(lái)看keil的datasheet,找到了解決方法,當(dāng)然keil手冊(cè)提供的解決方法是編寫一個(gè).lin文件,我覺(jué)得麻煩,現(xiàn)提供我的解決方法,實(shí)例還是用keil提供的那個(gè)實(shí)例:#pragma code symbols debug oe void func1(unsigned char *msg ) { ; } void func2( void ) { unsigned char uc; func1("xxxxxxxxxxxxxxx"); } code void (*func_array[])() = { func2 }; void main( void ) { (*func_array[0])(); } 這樣會(huì)提示:
*** WARNING 13: RECURSIVE CALL TO SEGMENT SEGMENT: ?CO?EXAMPLE1 CALLER: ?PR?FUNC2?EXAMPLE1 我的解決方法是:
把code void (*func_array[])() = { func2 };放在另外一個(gè)段,
即另外一個(gè).c文件中也就不存在同一個(gè)段遞歸調(diào)用情況,如下:
keilrecur.c文件
#i nclude
void func2( void );
extern code void (*func_array[])();
void func1(unsigned char *msg ) { msg=msg; }
void func2( void ) { unsigned char uc; uc=uc; func1("xxxxxxxxxxxxxxx");}
void main( void ) { (*func_array[0])();}
funcptr.c文件
#i nclude
void func2( void );code void (*func_array[])() = { func2 };
這樣就可以解決段遞歸問(wèn)題.
我們?cè)谧鯨CD菜單時(shí),喜歡做一個(gè)KeyTab,這樣也會(huì)出現(xiàn)"遞歸調(diào)用段"情況,
那么我們可以把KeyTab單獨(dú)作為.c文件,方便管理又可以避免這種錯(cuò)誤提示.
評(píng)論