新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ASM5無(wú)參數(shù)化調(diào)用C51函數(shù)的實(shí)現(xiàn)

        ASM5無(wú)參數(shù)化調(diào)用C51函數(shù)的實(shí)現(xiàn)

        作者: 時(shí)間:2012-03-08 來(lái)源:網(wǎng)絡(luò) 收藏

        這些小模塊用匯編實(shí)現(xiàn)起來(lái)不僅容易,而且程序員可以清楚地了解到各個(gè)模塊的出入口及其相應(yīng)的功能,實(shí)現(xiàn)對(duì)程序空間的充分配置。最后用來(lái)實(shí)現(xiàn)車速的計(jì)算模塊CALL1()。以前用匯編編寫的近400行代碼,一下子被壓縮到20~30行(真正的計(jì)算代碼僅9行),不僅簡(jiǎn)短易懂,而且?guī)缀蹙筒恍枰{(diào)試了。

        下面的代碼是計(jì)算模塊CALL1()及其需要的絕對(duì)地址定義。

        #pragma code small

        #include absacc.h>

        #include math.h>

        #define PI 3.1415926

        #define NCIRCLE DBYTE[0x3A] ;定義放置轉(zhuǎn)速的絕對(duì)地址

        #define DIRECT1 DBYTE[0x70] ;定義放置輪徑千位的絕對(duì)地址

        #define DIRECT2 DBYTE[0x71] ;定義放置輪徑百位的絕對(duì)地址

        #define DIRECT3 DBYTE[0x72] ;定義放置輪徑十位的絕對(duì)地址

        #define DIRECT4 DBYTE[0x73] ;定義放置輪徑個(gè)位的絕對(duì)地址

        #define VELOCITY1 DBYTE[0x74] ;定義返回車速的千位絕對(duì)地址

        #define VELOCITY2 DBYTE[0x75] ;定義返回車速的百位絕對(duì)地址

        #define VELOCITY3 DBYTE[0x76] ;定義返回車速的十位絕對(duì)地址

        #define VELOCITY4 DBYTE[0x77] ;定義返回車速的個(gè)位絕對(duì)地址

        void call1()

        {

        float data result;

        int data DIRECT;

        DIRECT=DIRECT1*1000+DIRECT2*100+DIRECT3*10+DIRECT4;

        result=(DIRECT/1000.0)*PI*NCIRCLE*3.6;

        VELOCITY1=result/100;

        Result=result-VELOCITY1*100;

        VELOCITY2=result/10;

        result=result-CELOCITY 2*10;

        VELOCITY3=result;

        result=result-VELOCITY3;

        VELOCITY4=result*10;

        }

        在本例中定義了絕對(duì)地址空間70h~77H和3AH。其中3AH存放采樣轉(zhuǎn)速值輸入模塊輸入的轉(zhuǎn)速;70H~73H的地址空間中存放鍵盤輸入中斷模塊中鍵盤輸入的輪徑值;而地址為74H~77H的空間中則存放計(jì)算模塊中的車速計(jì)算返回值。盡管需要傳遞和返回的參數(shù)比較多,但通過(guò)這些絕對(duì)地址的定義,完全解決了原來(lái)復(fù)雜的匯編與C51之間的調(diào)用接口配置。計(jì)算模塊中需要使用轉(zhuǎn)速和輪徑值時(shí),將自動(dòng)從絕對(duì)地址3AH和70H~73H中取值;在循環(huán)顯示車速和輪徑值的主程序模塊中則直接讀取絕對(duì)地址空間70H~77H的各個(gè)數(shù)據(jù)進(jìn)行循環(huán)顯示。當(dāng)然,程序員可以根據(jù)自己的空間配置另外定義這些絕對(duì)地址。

        以上程序代碼均已在Dais-52.196P仿真器上順利調(diào)試通過(guò)。

        由上面的簡(jiǎn)單程序可以看出這種方法的優(yōu)越性和有效:從程序代碼看,無(wú)論是編寫C51子程序還是匯編主程序,都與編寫純C51函數(shù)或者純匯編主程序的格式完全一樣,從根本上簡(jiǎn)化了C51與匯編函數(shù)之間的接口編程,提高了程序調(diào)用的效率;充分利用了匯編與高測(cè)驗(yàn)各自的優(yōu)點(diǎn),開發(fā)、調(diào)試快速方便,通用性強(qiáng),尤其適合于初學(xué)者。對(duì)于復(fù)雜程序,同樣可以利用無(wú)參數(shù)化方法來(lái)幫助實(shí)現(xiàn)。這對(duì)于提高單片機(jī)應(yīng)用程序的開發(fā)效率很有意義。

        實(shí)質(zhì)上在C51函數(shù)中定義了幾個(gè)全局變量(絕對(duì)地址),依靠它們直接完成參數(shù)值的傳遞和返回值的調(diào)用,相當(dāng)于一種程序員自定義的傳遞方式,拋棄了傳統(tǒng)C與匯編之間的接口約定。只要程序員安排得當(dāng),還可以進(jìn)一步人工實(shí)現(xiàn)C51中的動(dòng)態(tài)覆蓋重用,提高RAM區(qū)的利用效率。由上也可看出:方法要在ASM匯編調(diào)用C51函數(shù)時(shí)才分依速無(wú)參數(shù)化思想,就違背了利用C51編程,過(guò)衷,得不償失。當(dāng)然,如果開發(fā)人員已經(jīng)對(duì)C51與匯編函數(shù)之間的參數(shù)傳遞接口很熟悉,完全可以按接口約定或者由編譯器自動(dòng)完成參數(shù)的傳遞


        上一頁(yè) 1 2 下一頁(yè)

        評(píng)論


        相關(guān)推薦

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

        關(guān)閉
        主站蜘蛛池模板: 平山县| 咸宁市| 南郑县| 海南省| 井陉县| 海阳市| 昭苏县| 庆城县| 玉屏| 福泉市| 茂名市| 武宁县| 房产| 晴隆县| 安徽省| 彰化市| 闵行区| 甘德县| 扬州市| 周至县| 滦南县| 苍山县| 清涧县| 新乐市| 如皋市| 淄博市| 宁都县| 雅江县| 彰化县| 高平市| 阳泉市| 东辽县| 山阴县| 凤城市| 津南区| 石林| 梧州市| 信阳市| 宁河县| 大关县| 宁波市|