日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 芯聞號 > 技術解析
[導讀]對于c編譯器,很多朋友均有所了解。往期文章中,小編為大家?guī)磉^諸多c編譯器文章。在這篇c編譯器相關文章中,小編將介紹如何基于SDCC c編譯器開發(fā)微控制器。如果你對c編譯器的應用同樣存在興趣,不妨繼續(xù)往下閱讀哦。

對于c編譯器,很多朋友均有所了解。往期文章中,小編為大家?guī)磉^諸多c編譯器文章。在這篇c編譯器相關文章中,小編將介紹如何基于SDCC c編譯器開發(fā)微控制器。如果你對c編譯器的應用同樣存在興趣,不妨繼續(xù)往下閱讀哦。

簡介

SDCC (小型設備C編譯器)是為8位微控制器開發(fā)的免費C編譯器。盡管兼容多種不同體系結構,但SDCC C編譯器更適合8051內核。本應用筆記主要介紹采用SDCC來開發(fā)Maxim/Dallas Semiconductor的DS89C430/450系列超高速8051兼容微控制器固件。

SDCC是命令行固件開發(fā)工具,含預處理器、編譯器、匯編器、鏈接器和優(yōu)化器。安裝文件中還捆綁了SDCDB、類似于gdb (GNU調試器)的源碼級調試器。無錯的程序采用SDCC編譯、鏈接后,生成一個Intel十六進制格式的加載模塊。之后可采用串行加載器將該文件加載至DS89C430/450微控制器閃存。(參見DS89C430/450文檔和應用筆記,了解固件下載至器件的詳細信息。)

關于SDCC的最新信息,請訪問http://sdcc.sourceforge.net,或者閱讀SDCC手冊sdccman.pdf (在安裝過程中復制到您的硬盤上)。也可以將問題提交給SDCC在線消息論壇,或發(fā)郵件至SDCC網(wǎng)頁“Support”列出的郵件地址。

安裝SDCC免費C編譯器

如果需要安裝SDCC,請從官網(wǎng)下載SDCC最新版本。雖然也可使用該軟件的日常構建(nightly builds)版,但通常最安全的方式是下載經(jīng)過完全測試的最新發(fā)布版。

在“Download”頁為不同的操作系統(tǒng)提供不同的SDCC。如果您使用運行Microsoft Windows的PC,請下載并運行win32自解壓SDCC安裝文件。

安裝程序時會出現(xiàn)一個提示,詢問是否將含有程序二進制文件的目錄添加到您的路徑中。建議同意添加,本應用筆記假設用戶路徑中已添加該目錄。

采用SDCC編譯器編譯一個簡單的C程序

為確保SDCC已在您的硬盤上正確安裝,請在命令提示符下鍵入sdcc --version,然后回車,窗口中應出現(xiàn)圖1所示文本(實際文本與您下載的SDCC版本有關):

圖1. 通過版本檢查確認SDCC是否正確安裝

為測試包含路徑,生成名為sdcctest.c的文件,并將以下源代碼復制到該文件中。

以普通ASCII格式(如使用Microsoft記事本程序)保存該文件。在命令提示符下,鍵入sdcc sdcctest.c,然后回車。如像圖2那樣沒有任何反應,則說明程序編譯成功。

圖2. 編譯簡單的SDCC程序

當源代碼編譯成功時,SDCC會生成多個文件。在編譯目錄中可找到以下文件:

sdcctest.asm:程序的匯編文件

sdcctest.lst:程序的列表文件

sdcctest.rst:被鏈接器更新的列表文件

sdcctest.map:被鏈接器更新的最終存儲器映射

sdcctest.ihx:Intel十六進制格式的加載模塊。該文件必須被下載到微控制器中。

同時還生成其它文件(多數(shù)用于源碼級調試器)。請閱讀SDCC文檔了解更詳細的信息。

SDCC專有數(shù)據(jù)類型

SDCC支持多數(shù)ANSI-C數(shù)據(jù)類型。此外,SDCC支持多種擴展數(shù)據(jù)類型(也稱為存儲類型),以充分利用8051體系結構的優(yōu)勢,這將在后面以實例說明。

與一些商用8051微控制器開發(fā)工具不同,SDCC僅支持聲明位和字節(jié)可尋址特殊功能寄存器。盡管8051匯編語言支持,但SDCC并不支持共享位和字節(jié)可尋址RAM。為證實這一點,請觀察以下代碼實例和編譯完的匯編代碼。

C源程序:

盡管在聲明中“a”看起來是位尋址存儲器,但匯編列表文件(來自由SDCC生成的.rst文件)表明變量并沒有使用位尋址。在列表中不要混淆“a”和“_a”。“a”指累加器,而“_a”指變量。

注意,本應用筆記在“絕對尋址”一節(jié)介紹了一種可真正實現(xiàn)存儲器位尋址的方法。

near/data

以near或data存儲類型聲明的變量將被放在8051內核的直接尋址RAM中。DS89C430/450系列微控制器具有128字節(jié)直接尋址存儲器,這是8051能夠訪問的速度最快的存儲器,生成的匯編代碼只需一個MOV指令即可讀寫該RAM中的數(shù)據(jù)。

far/xdata

以far或xdata存儲類型聲明的變量將被放在外部RAM中。這樣開發(fā)人員能夠訪問更大的RAM空間,但生成的匯編代碼需要使用MOVX指令來讀寫該存儲器,這要求將外部存儲器地址裝入數(shù)據(jù)指針。

DS89C430/450系列微控制器含有1K字節(jié)的內部SRAM,可被用于以far/xdata聲明的變量。注意,電源管理寄存器(PMR)中的DME1:0位在該存儲器初始化或使用之前,必須先被置為內部SRAM模式。

idata

以idata存儲類型聲明的變量將被放在8051內核的間接尋址存儲器中。間接可尋址存儲器與直接尋址存儲器類似,在8051內核中共有128字節(jié)(不包括特殊功能寄存器)。但是,訪問idata需要額外的MOV命令將RAM地址移至工作寄存器中。

pdata

存儲類型pdata用于訪問分頁的外部數(shù)據(jù)存儲器。該存儲類型超出了本應用筆記范疇,有興趣的讀者可以閱讀SDCC文檔的pdata部分。

code

以code存儲類型聲明的變量將被放在程序存儲器(DS89C430/450微控制器內部的閃存)中。對于SDCC來說,這類變量只讀,因此常使用code來聲明常量(如:查找表)。

bit

以bit存儲類型聲明的變量被放在8051內核的位尋址存儲器中。8051內核的16字節(jié)直接尋址RAM可用作位尋址存儲器(字節(jié)0x20至0x2F),提供128個可尋址位。使用該類變量作為標志位可高效利用存儲空間。

sfr

存儲類型sfr被用來定義8051內核專有的特殊功能寄存器(SFR)。附錄A定義文件中使用sfr標識符定義了DS89C430/450微控制器中的所有SFR。

注意,下面的實例已定義了SFR,因此沒有必要包含定義文件sdcc_reg420.h。

sbit

存儲類型sbit用于定義可位尋址SFR中的特殊位。在8051內核中,地址以0或者8 (十六進制)結束的所有SFR均可位尋址。附錄A定義文件中使用sbit標識符定義了DS89C430/450微控制器SFR的所有可尋址位。

絕對尋址

SDCC支持采用at標識符的絕對尋址。但是,SDCC不跟蹤聲明的絕對尋址變量,而且可能在其地址聲明其它變量,造成相互覆蓋。

以下程序顯示了有趣的潛在錯誤。

使用SDCC時,盡管變量"y"和"z"分配同一個位置,也可進行無錯誤或警告的編譯。如果要運行該程序,我們認為程序(a = c[5])中"a"最終將被設置為0xAA。但情況并非如此。"a"最終被分配的值為0xF2。

絕對尋址可用于仿真位尋址變量。在下面的例子中,在位尋址存儲器的最后一個字節(jié)處定義變量n_byte。然后,在8051內核位尋址存儲器的最后8位定義n_bit0至n_bit7。由于這種重疊,可采用變量n_bit0至n_bit7對變量n_byte進行位尋址。

存儲器模式

SDCC支持兩種存儲器模式:小模式和大模式。使用存儲器小模式時,SDCC在內部RAM中聲明所有不帶存儲類型的變量(如,data、idata、xdata、pdata、bit、code)。使用存儲器大模式時,SDCC在外部RAM中聲明所有不帶存儲類型的變量。

采用SDCC編譯時,默認為小模式。如果要強制SDCC使用特定的存儲器模式,可使用以下命令行參數(shù):

sdcc --model-small sdcctest.c

或者

sdcc --model-large sdcctest.c

不要鏈接使用不同存儲器模式編譯的模塊或目標文件。

SDCC的中斷

定義中斷服務程序(ISR)時,應使用以下格式:

其中interrupt_idenTIfier可以是任意有效的SDCC函數(shù)名,interrupt_number代表中斷在中斷向量表中的位置。表1列出了DS89C430/450系列微控制器支持的每個中斷的中斷號。可選參數(shù)bank_number用于指示SDCC采用哪個寄存器區(qū)存儲ISR中的局部變量。

表1. DS89C430/450中斷服務程序的中斷號

SDCC處理與ISR編程相關的許多細節(jié),如使用堆棧保存和恢復累加器及數(shù)據(jù)指針。(實際上所有函數(shù)均進行此操作。請參考SDCC手冊中的_naked關鍵字來禁止在堆棧中保存這些變量)。其它細節(jié)不由SDCC處理(因為合理的原因),這對嵌入式編程開發(fā)新手帶來一定難度。許多這類問題屬于高級編程范疇,已超出本文討論的范圍,SDCC手冊和嵌入式編程教材可提供更深入的內容。

使用中斷時,應遵循以下原則。

可在ISR內部寫、并可在ISR外部訪問的每個全局變量必須被聲明為volatile,以確保優(yōu)化器不會刪除與該變量相關的指令。

以非原子(non-atomic)方式使用數(shù)據(jù)時(如,訪問16位/32位變量)應禁止中斷。當對變量的訪問為原子方式時,處理器無法中斷(帶有ISR)對存儲器的數(shù)據(jù)存取。

避免在ISR內部調用函數(shù)。如果必須這樣做,需要將函數(shù)聲明為reentrant (參見SDCC手冊),這樣函數(shù)中的所有局部變量被分配在堆棧中,而不是在RAM中。

注意,如果被SDCC使用的含ISR的源文件不含main()函數(shù),那么含main()函數(shù)的源文件應包含每個ISR的函數(shù)原型。

下面的例子定義了一個處理串行通信接口1 (SCI_1)的中斷服務程序(ISR)。程序接收來自SCI_1接收器的一個字節(jié),將接收字節(jié)加1,通過SCI_1發(fā)射器連續(xù)發(fā)送出去。

內嵌匯編

SDCC完全支持內嵌匯編。使用該功能時,匯編代碼應嵌在_asm和_endasm標識符之間。注意,通過在變量名前加下劃線,內嵌匯編代碼也可以訪問C變量。以下實例采用內嵌匯編執(zhí)行nop指令(用于在微控制器內部占用一個時鐘周期),然后將變量"a"加1。

SDCC還可用于C和匯編函數(shù)接口,這是較深入的問題。

以上便是此次小編帶來的“c編譯器”相關內容,希望大家對本文講解的內容具備一定的認知。如果你喜歡本文,不妨持續(xù)關注我們網(wǎng)站哦,小編將于后期帶來更多精彩內容。最后,十分感謝大家的閱讀,have a nice day!

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

LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅動性能的關鍵。

關鍵字: 工業(yè)電機 驅動電源

LED 驅動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅動電源 照明系統(tǒng) 散熱

根據(jù)LED驅動電源的公式,電感內電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質量和效率直接關系到城市的公共安全、居民生活質量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅動電源 功率因數(shù)校正

在LED照明技術日益普及的今天,LED驅動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅動電源

關鍵字: LED 驅動電源 開關電源

LED驅動電源是把電源供應轉換為特定的電壓電流以驅動LED發(fā)光的電壓轉換器,通常情況下:LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅動電源
關閉