新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Keil “RECURSIVE CALL TO SEGMENT“徹底解決

Keil “RECURSIVE CALL TO SEGMENT“徹底解決

作者: 時(shí)間:2016-11-24 來源:網(wǎng)絡(luò) 收藏
我們?cè)谧霾藛纬绦蚧蛲ㄟ^函數(shù)指針調(diào)用函數(shù)時(shí),如果被調(diào)用的函數(shù)中有包含了常量字符串,那么經(jīng)常會(huì)出現(xiàn)這樣的的錯(cuò)誤提示:"RECURSIVECALLTOSEGMENT"意思是"遞歸調(diào)用段",如何解決呢,之前我沒有找到很好的方法,這段時(shí)間我回過頭來看keil的datasheet,找到了解決方法,當(dāng)然keil手冊(cè)提供的解決方法是編寫一個(gè).lin文件,我覺得麻煩,現(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 };
這樣就可以解決段遞歸問題.
我們?cè)谧鯨CD菜單時(shí),喜歡做一個(gè)KeyTab,這樣也會(huì)出現(xiàn)"遞歸調(diào)用段"情況,
那么我們可以把KeyTab單獨(dú)作為.c文件,方便管理又可以避免這種錯(cuò)誤提示.


關(guān)鍵詞: KeilRECURSIVECALLTOSEGMEN

評(píng)論


技術(shù)專區(qū)

關(guān)閉