當(dāng)前位置:首頁 > 單片機 > 單片機
[導(dǎo)讀]  主要介紹Keil C51的預(yù)處理方法如宏定義、常用的預(yù)處理指令及文件包含指令,C51編譯庫的選擇及代碼優(yōu)化原理,C51與匯編混合編程的方法與實現(xiàn)以及超過64KB空間的地址分頁方法的C51實現(xiàn)。教學(xué)目標(biāo)  1.了解Keil C5

  主要介紹Keil C51的預(yù)處理方法如宏定義、常用的預(yù)處理指令及文件包含指令,C51編譯庫的選擇及代碼優(yōu)化原理,C51與匯編混合編程的方法與實現(xiàn)以及超過64KB空間的地址分頁方法的C51實現(xiàn)。

教學(xué)目標(biāo)

  1.了解Keil C51的預(yù)處理方法,主要有宏定義#define、常用的預(yù)處理指令#define、#error、#if 、#else、#elif、#endif、#ifdef、#ifndef 、#undef 、#line 、#pragma 及文件包含指令#include。

  2.了解small、compact、large三種編譯模式信代碼優(yōu)化方法。

  3. 掌握C51模塊內(nèi)部調(diào)用匯編程序的三種方法,理解C51模塊與匯編模塊之間的接口規(guī)則,主要有C51函數(shù)名與匯編程序名的轉(zhuǎn)換規(guī)則、C51函數(shù)及其相關(guān)段的命名規(guī)則、C51函數(shù)的參數(shù)傳遞規(guī)則。

  4.理解Keil C51的Bankswitch原理,了解Keil C51的三種分頁方式、公共空間的概念,掌握BL51有關(guān)分頁的配置,以PSD813F2為硬件基礎(chǔ),掌握Keil C51分頁的實現(xiàn)過程,能進行分頁的程序設(shè)計。

  一、預(yù)處理器

  1.1宏定義

宏定義格式如下:#define 名稱 替換文字

宏是一種簡單的替換,在程序中凡是出現(xiàn)“名稱”之處均被“替換文字”替代,替換文字可以是數(shù)字,也可以是字符串。

  1.2預(yù)處理指令

由ANSI C的標(biāo)準(zhǔn)規(guī)定,預(yù)處理指令主要包括: #define、#error、#if 、#else、#elif、#endif、#ifdef、#ifndef 、#undef 、#line 、#pragma。

  #define 指令
  例如:#define PI 3.1415926凡是出現(xiàn)“PI”的地方均以“3.1415926”替換。宏的出現(xiàn)有助于提高程序的可讀性及書寫方便性,也有助于程序的調(diào)試。但是,出現(xiàn)在引號中的字符串是不能替換的。如printf(“PIn”);該語句運行后輸出的是:PI而不是3.1415926。

  define注意事項:
1)在宏定義語名后沒有“;”;
2)在C51程序中習(xí)慣上用大寫字符作為宏替換名,常放在程序開頭;
3)宏定義還有一個特點,就是宏替換名可以帶有形式參數(shù),在程序中用到時,實際參數(shù)會代替這些形式參數(shù)。
例如: #define MAX(x, y) (x>y)?x:y

main(){inti=10,j=15;printf("TheMaxmumis%d",MAX(i,j);}

上例宏定義語句的含義是用宏替換名MAX(x, y)代替x, y中較大者,同樣也可定義:
#define MIN(x, y) (x表示用宏替換名MIN(x, y)代替x, y中較小者。
4)#define命令在程序之外,其有效范圍為定義命令之后到源文件結(jié)束,但是可以用#undef命令終止宏定義的作用域。如:

#definePI3.1415926voidmain(void){……}#undefPI

PI的范圍從#define 開始到#undef PI 結(jié)束。

  #if、#else、#endif指令
#if、#els和#endif指令為條件編擇指令, 它的一般形式為:

#if常數(shù)表達式語句段;#else語句段;#endif

上述結(jié)構(gòu)的含義是: 若#if指令后的常數(shù)表達式為真, 則編譯#if到#else 之間的程序段; 否則編譯#else到#endif之間的程序段。
例如:

#defineMAX200main(){#ifMAX>999printf("compiledforbiggern");#elseprintf("compiledforsmalln");#endif}

  #undef指令
#undef指令用來刪除事先定義的宏定義, 其一般形式為:
#undef 宏替換名
例如:

#defineTRUE1...#undefTURE

#undef主要用來使宏替換名只限定在需要使用它們的程序段中。

  #include
文件包含是指用#include通常用來將一些常用的宏定義或變量定義所在的源文件包含到“#include”所在的文件中來。
通常格式如下:
#include“filename”或#include
在編譯預(yù)處理時,將#include命令進行文件包含處理,即將filename中的全部內(nèi)容復(fù)制插入到該指令處,減少重復(fù)勞動。通常引號包含的文件與現(xiàn)文件在同一個位置,否則用“<>”括起來。
在源文件開始處一般都要用一些#include指令,如

#include“stdio.h”#include“reg51.h”

如用戶自定義了一個字庫文件”kzk.h”,在源文件開始用#include “hzk.h”,之后,則可以在源程序中使用字庫。

  二、C51編譯庫及代碼優(yōu)化技術(shù)

  2.1 C51編譯庫
  C51編譯器包含6個不同的編譯庫,如表12-2-1可根據(jù)不同需要進行優(yōu)化 , C51 編譯器包含的庫模塊,都有源代碼,對它們可作與硬件相關(guān)的修改。用戶改變對于現(xiàn)有硬件輸入和輸出結(jié)構(gòu)的兩個模塊,就可修改所有庫函數(shù),同樣也可以重新很快地構(gòu)造如“printf”和“puts”函數(shù)系統(tǒng)默認(rèn)串口為輸出設(shè)備,但用戶可修改為LCD 顯示。

  2.2 代碼優(yōu)化
C51可將即使有經(jīng)驗的程序員編制的代碼進行優(yōu)化,用戶可選6個優(yōu)化級,C51的所有優(yōu)化方法如下:
  1)一般優(yōu)化:
常數(shù)折迭:發(fā)生在一個表達式或地址計算中的幾個常數(shù)值組合為一個常數(shù);
跳轉(zhuǎn)優(yōu)化:跳轉(zhuǎn)轉(zhuǎn)到最終的目標(biāo)地址,以提高程序效率;
死碼消除:不可執(zhí)行代碼(死碼)可從程序中去掉;
寄存器變量:只要有可能,自動變量和參量放入寄存器中;
通過寄存器傳遞參數(shù):寄存器中可傳遞最多三個參數(shù);
全局公共子式消除:相同的子表達式或地址計算(多次發(fā)生在同一函數(shù)中)將被識別出來,并且只要有可能,將只計算一次。
  2)基于8051 的優(yōu)化
窺孔(PEEPHOLE)優(yōu)化:只要能節(jié)省存貯空間或執(zhí)行時間,復(fù)雜的運算都將化簡。
訪問優(yōu)化:常數(shù)和變量直接包含在操作中。
數(shù)據(jù)覆蓋:函數(shù)的數(shù)據(jù)和位移被標(biāo)記為OVERLAYABLE,被L51 用其它數(shù)據(jù)和位覆蓋。
CASE/SWITCH 優(yōu)化:SWITCH/CASE 語句優(yōu)化為一個跳轉(zhuǎn)或一串跳轉(zhuǎn)。
  3)代碼生成選項:
OPTMIZE(SIZE):共同的“C”操作被子程序代替:程序碼長被壓縮。
NOAREGS:不使用絕對寄存器訪問,程序代碼在這種方式下獨立于寄存器組。
NOREGPARMS:參數(shù)傳遞總是在本數(shù)據(jù)段完成,程序代碼與早期C51 版本兼容。

  三、C51與ASM混合編程技術(shù)
  3.1 混合編程意義
通常用C51來編寫主程序。然而,在一些時序要求嚴(yán)格的采用匯編程序設(shè)計具有更高的效率,因此要求在C程序中調(diào)用一些用匯編語言編寫的子程序。
另一方面,在以匯編語言為主體的程序開發(fā)過程中,如果涉及到復(fù)雜的數(shù)學(xué)運算,往往需要借助C51提供的運算庫函數(shù)和強大的數(shù)據(jù)處理能力,這就要求在匯編中調(diào)用C51函數(shù)。
  3.2 C51模塊內(nèi)的匯編接口
模塊內(nèi)接口通常是指在C函數(shù)內(nèi)部插入?yún)R編代碼,也稱內(nèi)嵌匯編語句 。
在線匯編提供了能直接讀寫硬件的能力,如讀寫中斷控制允許寄存器等,但編譯器并不檢查和分析在線匯編語言,插入在線匯編語言改變匯編環(huán)境或可能改變C變量的值可能導(dǎo)致嚴(yán)重的錯誤。
  方法一、直接在函數(shù)體內(nèi)的每個匯編語句前加?“asm”預(yù)編譯指令。

voidreset_data(void){asmMOVR1,#0AHasmLOOP:INCAasmDJNZR0,LOOPreturn;}

  方法二、把asm作為關(guān)鍵字后續(xù)匯編用大括號括起來即可。

voidreset_data(void){asm{MOVR1,#0AHLOOP:INCADJNZR0,LOOP}return;}

  方法三、在C模塊內(nèi)通過語句“#pragma”嵌入?yún)R編代碼。

voidreset(void){#pragmaasmMOVR1,#0AHLOOP:INCADJNZR0,LOOP#pragmaendasmreturn;}

  Keil C51編譯環(huán)境相關(guān)設(shè)置
  將嵌有匯編語句源文件加入要編譯的項目文件,將光標(biāo)指向此文件,選擇右鍵菜單“option?for?file?'asm.c'”,將屬性單“properties”中的“Generate?Assembler?SRC?File”與“Assemble?SRC?File”兩項設(shè)置成黑體的“√”,將“Link?Public?Only”的“√”去掉,再編譯即可。用此方法可以在C51源代碼的任意位置用#pragma?asm和#pragma?endasm嵌入?yún)R編語句。如果編譯時未用SRC指令,則C51中的匯編代碼會被編譯器忽略。

3.3 C51與匯編的模塊間接口
1、C51函數(shù)名與匯編程序名的轉(zhuǎn)換規(guī)則
C51程序模塊編譯成目標(biāo)文件后,其中的函數(shù)名依據(jù)其定義的性質(zhì)不同會轉(zhuǎn)換為不同的函數(shù)名,因此在C51和匯編程序的相互調(diào)用時要求匯編程序必須服從這種函數(shù)名的轉(zhuǎn)換規(guī)則。C51中函數(shù)名轉(zhuǎn)換規(guī)則如表12-3-1所列。


2、C51函數(shù)及其相關(guān)段的命名規(guī)則
一個C51源程序模塊被編譯后,其中的每一個函數(shù)以“?PR?函數(shù)名?模塊名”為名的命名規(guī)則被分配到一個獨立的CODE段。
如:模塊“FUNC51”內(nèi)包含一個名為“func”的函數(shù),則其CODE段的名字是“?PR?FUNC?FUNC51”。
如果一個函數(shù)包含有data和bit對象的局部變量,編譯器將按“?函數(shù)名?BYTE和?函數(shù)名?BIT”命令規(guī)則建立一個data和bit段,它們代表所要傳遞參數(shù)的起始位置,其偏移值為零。這些段是公開的,因而它們的地址可被其它模塊訪問。另外,這些段被編譯器賦予“OVERLAYABLE”標(biāo)志,故可被L51連接/定位器作覆蓋分析。
依賴于所使用的存儲器模式,這些段的段名按表12-3-2所列規(guī)則命名,在相互調(diào)用時,匯編語言必須服從C51有關(guān)段名的命名規(guī)則。
各種存儲器模式下函數(shù)相關(guān)段名的命名規(guī)則

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉