在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Keil C51 中的函數(shù)指針和再入函數(shù)

            Keil C51 中的函數(shù)指針和再入函數(shù)

            作者: 時(shí)間:2016-11-27 來源:網(wǎng)絡(luò) 收藏

            本文引用地址:http://www.biyoush.com/article/201611/322385.htm

            函數(shù)指針的建議和技巧

            有些函數(shù)指針的應(yīng)用技巧。
            使用指定空間的指針

            把函數(shù)指針從一個(gè)普通的指針變成一個(gè)指定空間的指針。用一個(gè)字節(jié)保存指針。因?yàn)楹瘮?shù)屬于CODE存儲區(qū)(在8051里),一個(gè)字節(jié)可以用來保存聲明的函數(shù)指針作為CODE指針。例如:

            void (code *function_ptr) (void) = another_function;

            如果你選擇在你的函數(shù)指針聲明中包含code關(guān)鍵字,就可以在任何地方使用它。如果你聲明一個(gè)函數(shù),它接收一個(gè)3字節(jié)的普通指針,通過指定空間傳遞,2字節(jié)函數(shù)指針,壞事將要產(chǎn)生。

            再入函數(shù)和指針

            Keil C51 為函數(shù)的再入提供關(guān)鍵字“reentrant”。再入函數(shù)的參數(shù)通過模擬棧來傳遞。模擬棧對于small存儲模式位于IDATA,對于compact存儲模式位于PDATA,對于large存儲模式位于XDATA。如果你使用再入函數(shù),在STARTUP.A51中你必須初始化再入棧的指針。參考下面的啟動代碼:

            ;----------------------------------------------------------------------

            ;Reentrant Stack Initilization

            ;

            ;The following EQU statements define the stack pointer for reentrant

            ;functions and initialized it:

            ;

            ;Stack Space for reentrant functions in the SMALL model.

            IBPSTACKEQU0; set to 1 if small reentrant is used.

            IBPSTACKTOPEQU0FFH+1; set top of stack to highest location+1.

            ;

            ;Stack Space for reentrant functions in the LARGE model.

            XBPSTACKEQU0; set to 1 if large reentrant is used.

            XBPSTACKTOPEQU0FFFFH+1; set top of stack to highest location+1.

            ;

            ;Stack Space for reentrant functions in the COMPACT model.

            PBPSTACKEQU0; set to 1 if compact reentrant is used.

            PBPSTACKTOPEQU0FFFFH+1; set top of stack to highest location+1.

            ;----------------------------------------------------------------------

            你必須設(shè)置你使用的存儲模式的堆棧和設(shè)置棧頂。當(dāng)有入棧時(shí),再入函數(shù)的棧指針減少(向下移動)。為了保護(hù)內(nèi)部的數(shù)據(jù)區(qū),有一個(gè)技巧就是把所有的再入函數(shù)放在一個(gè)獨(dú)立的存儲模式,像large或compact。

            用reentrant聲明再入函數(shù)。

            void reentrant_func (long arg1, long arg2, long arg3) reentrant

            {

            }

            用large和reentrant聲明一個(gè)large模式的再入函數(shù)。

            void reentrant_func (long arg1, long arg2, long arg3) large reentrant

            {

            }

            聲明一個(gè)再入函數(shù)的函數(shù)指針,必須使用reentrant關(guān)鍵字。

            void (*rfunc_ptr) (long, long, long) reentrant = reentrant_func;

            再入函數(shù)的函數(shù)指針和非再入函數(shù)的函數(shù)指針沒有許多不同。當(dāng)使用再入函數(shù)指針時(shí),會生成更多的代碼,因?yàn)閰?shù)被壓入模擬棧。然而,沒有特殊的連接要求和不需要打亂“OVERLAY”指令。

            如果通過間接調(diào)用傳遞超過3個(gè)參數(shù)給函數(shù),需要再入函數(shù)指針。

            使用再入指針的注意事項(xiàng)

            keil中的函數(shù)遞歸調(diào)用可分為兩種情況,一種是普通函數(shù)遞歸,調(diào)用時(shí),新調(diào)用函數(shù)的程序儲存空間覆蓋原來的相同函數(shù)調(diào)用的程序儲存空間,使得原來的局部變量消失了;還有一種是再入函數(shù)(用reentrant說明)的遞歸,每次遞歸,keil為再入函數(shù)生成一個(gè)模擬棧,再入函數(shù)參數(shù)和局部變量被放在這模擬棧中,這樣使得原來調(diào)用函數(shù)的局部變量就沒有消失了,而新的調(diào)用函數(shù)參數(shù)和局部變量又可以繼續(xù)。


            再入函數(shù)的定義:


            函數(shù)類型 [reentrent] 函數(shù)名 (形式參數(shù))


            例如:int [reentrent]fution(char n)


            {if(n<1)return(1);


            else return(n*fution(n-1));


            }


            使用再入函數(shù)注意事項(xiàng):


            1: 再入函數(shù)不能傳送bit類型的參數(shù),函數(shù)內(nèi)部也不能定義局部位變量,不能有位操作??傊c位有關(guān)的定義和操作在再入函數(shù)中都不能實(shí)現(xiàn)。


            2:同一程序中可以有不同儲存模式的再入函數(shù),但是注意,任意模式的再入函數(shù)不能調(diào)用不同儲存模式的再入函數(shù),但可以調(diào)用不同儲存模式的非再入函數(shù)。


            3參數(shù)傳遞上,實(shí)際參數(shù)可以傳遞給間接調(diào)用的再入函數(shù);非再入函數(shù)不能包含調(diào)用參數(shù),因?yàn)槟菢訒采w了原來的參數(shù);但是,可以用全局變量來進(jìn)行參數(shù)傳遞。


            總結(jié)

            函數(shù)指針是非常有用的,并不是很困難的,如果你注意連接調(diào)用樹,保證用“OVERLAY”指令修正一些沖突。


            上一頁 1 2 3 下一頁

            評論


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

            關(guān)閉