單片機(jī) -c與匯編混合編程_第1頁(yè)
單片機(jī) -c與匯編混合編程_第2頁(yè)
單片機(jī) -c與匯編混合編程_第3頁(yè)
單片機(jī) -c與匯編混合編程_第4頁(yè)
單片機(jī) -c與匯編混合編程_第5頁(yè)
已閱讀5頁(yè),還剩35頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

C和ASM的混合編程jianghq2003-5

TsinghuaDEE《單片機(jī)與嵌入式系統(tǒng)》Content程序的結(jié)構(gòu)匯編程序C程序project框架如何改寫匯編程序?在C程序中如何做一些底層操作?存儲(chǔ)空間結(jié)構(gòu)程序的結(jié)構(gòu)匯編程序結(jié)構(gòu)C程序結(jié)構(gòu)M30624FGFPMemoryMap幾個(gè)主要的參數(shù)RAM區(qū)

ramTOP ramENDROM區(qū)

progTOPVvector匯編程序結(jié)構(gòu)-段類型 RAM->DATA

ROM->CODE ROMDATA匯編程序結(jié)構(gòu)-段定義 .SECTION memory,DATA;數(shù)據(jù)段 .ORG VramTOP

.SECTION prog,CODE ;代碼段 .ORG VprogTOP

.SECTION val_vect,ROMDATA;用戶自定義中斷向量段 .ORG Vintbase

.SECTION inter,ROMDATA;固定中斷向量段 .ORG Vvector+(8*4)匯編程序中幾個(gè)主要的參數(shù)VramTOP .EQU 000400HVramEND .EQU 002BFFHVIstack .EQU 002C00H-》ISPVprogTOP .EQU 0F0000H Vintbase .EQU 0FA000HVvector .EQU 0FFFDCH

SB_base .EQU 000380H-》SB關(guān)于SB和FB .SB SB_base .SBSYMrecv_nums

告訴編譯器使用該變量的指令尋址方式采用相對(duì)基址尋址方式,可以提高生成代碼的效率。關(guān)于堆棧兩種堆棧:堆棧指針I(yè)SP和USP使用何種堆棧,由堆棧指針選擇標(biāo)志位(U標(biāo)志)選取。

U=0

選取中斷堆棧指針I(yè)SPU=1

選取用戶堆棧指針USP響應(yīng)中斷后,該標(biāo)志清0,執(zhí)行中斷子程序SP指針位置如何設(shè)定:棧頂指針

Push:SP=SP–1 Pop:SP=SP+1C程序結(jié)構(gòu)RAM->DATA->data

bss

stack heapROM->CODE->

program ROMDATA->rom

vector

fvectorNC編譯器對(duì)Section的處理Section的屬性屬性:I(是否初值),N/F(擴(kuò)展區(qū))S(SB尋址區(qū)),E/O(偶地址對(duì)齊)舉例:bss_SE,bss_NE,data_FE,data_SEI

data_SE

bss_SE data_SO bss_SO

data_NE bss_NE data_NO bss_NO stack heap data_FE bss_FE data_FO data_FE

C程序中所有的section列表DATA

rom_NE rom_NO rom_FE rom_FO

data_SEI data_SOI data_NEI data_NOI

data_FEI data_FOI vector fvectorROMDATACODE program interrupt program_S根據(jù)芯片修改sect30.inc注釋掉不存在的段最重要的三個(gè)段的位置設(shè)定 .section data_SE,DATA .org 400H

.section rom_FE,ROMDATA .org 0C0000H

.section vector,ROMDATA .org VECTOR_ADR VECTOR_ADR .equ 0FA000H其他的段就交給編譯器來(lái)處理 例子:一個(gè)Section分配的結(jié)果C程序結(jié)構(gòu)-project可能包括多個(gè)asm文件,C文件如何安排project的結(jié)構(gòu)?程序的入口首先要清楚整個(gè)程序的執(zhí)行過程從哪里開始執(zhí)行?Startup文件

sect30.inc文件;fixedvectorsection .org 0fffdch…………NMI: .lword dummy_intRESET:

.lword start.endStartup文件

ncrt0.a30文件 .glb start .section interruptstart:;---------------------------------------------------------------------;afterreset,thisprogramwillstart;--------------------------------------------------------------------- ldc #istack_top, isp ;setistackpointer

ncrt0.a30設(shè)定單片機(jī)工作模式RAM清0變量初值設(shè)定堆初始化調(diào)用全局Init子程序調(diào)用全局Main子程序exit循環(huán)啟動(dòng)過程

主C程序VoidInit(){ ……}VoidMain(){}主C文件:

init(){int1();int2();int3();……}

main(){sub1();sub4();……}Project層次框架Startup文件:ncrt0.a30系統(tǒng)提供的庫(kù)程序:#include“stdlib.h”ASM子程序:

init1();sub1()C子程序1:

init2();sub2();sub3()C子程序2:

init3();sub4();ASM子程序:

init4();sub5()一個(gè)project的層次圖程序結(jié)構(gòu)小結(jié)明白各個(gè)Section的含義根據(jù)芯片參數(shù)和自己的程序需要來(lái)修改startup程序用層次化來(lái)保持整個(gè)組織結(jié)構(gòu)的清晰如何改寫匯編程序?目標(biāo): 將他人提供的匯編程序轉(zhuǎn)為可供自己在C程序中調(diào)用的子函數(shù)。例子: 紅外接收的子程序Step1大致看懂原程序完成了一個(gè)什么樣的功能。 主要的幾個(gè)變量是什么含義。Step2分析自己的要求如果將該匯編程序獨(dú)立出來(lái)作為一個(gè)子函數(shù);那么其功能是什么?輸入?yún)?shù):有哪些返回值:有哪些我希望實(shí)現(xiàn)的功能等待接收一個(gè)字節(jié),如果收到立刻返回該字節(jié),沒收到且時(shí)間超過300ms,那么也返回,同時(shí)指示狀態(tài)為未接收。

charrecv_status=IR_RECV(charuserID,char*pByte);

指示接收狀態(tài)接收用戶碼接收字節(jié)地址Step3對(duì)原來(lái)的程序進(jìn)行裁減刪去原有的各個(gè)段定義重新定義各個(gè)Section:bss_SE,rom_FE,program定義和聲明全局子函數(shù)_IRR_INIT_IR_RECVI_timera0 涉及C和匯編子程序之間的參數(shù)傳遞(詳見下文)刪除不必要的變量和程序如果使用中斷,則將中斷向量表設(shè)置挪至sect30.inc最后以.end結(jié)束文件C和匯編子程序之間的參數(shù)傳遞參數(shù)規(guī)則(從C到匯編)參數(shù)規(guī)則(從匯編返回到C)函數(shù)名定義規(guī)則參數(shù)規(guī)則(從C到匯編)采用#pragmaPARAMETER參數(shù)規(guī)則(從匯編到C)函數(shù)名定義規(guī)則最后結(jié)果C程序部分:externcharIR_RECV(char,char*);#pragmaPARAMETERIR_RECV(R0L,A0)匯編語(yǔ)言部分: .glb_IR_RECV ;全局調(diào)用聲明_IR_RECV: mov.bR0L,N_CSTM ;參數(shù)傳遞:用戶碼

mov.wA0,SAVE_ADDR ;參數(shù)傳遞:接收結(jié)果地址…………

mov.b#1,R0L ;返回1,如果收到了數(shù)據(jù)改寫匯編程序小結(jié)看懂源程序在明白自己所需要的功能后,再進(jìn)行修改有的時(shí)候還是需要改多一些地方。該例子存放到在C程序中如何做一些底層操作特殊寄存器的操作BIT操作特殊寄存器的操作方法1:使用#pragmaADDRESS #pragmaADDRESSTA0 0386H#pragmaADDRESSTABSR 0380H……建議將所有SFR地址聲明放在一個(gè)文件里#include“mcu16c62.h”定義類型(根據(jù)其所占的內(nèi)存大小)charTA0MR,TA0IC,TABSR;unsignedintTA0;特殊寄存器的操作方法2:嵌入?yún)R編語(yǔ)句asm()

尤其是一些系統(tǒng)寄存器R0,FLG 方法3:定義成匯編子函數(shù) 另寫一個(gè)as30文件,將相關(guān)的操作封裝成函數(shù),供C程序調(diào)用 方法4:直接定義指針,并對(duì)該指針賦初值 BIT操作使用位域BIT操作使用宏#defineSET_BIT(n,byteA){byteA|=(0x01<<n);}/*SetBit=1*/ #defineCLR_BIT(n,byteA){byteA&=(~(0x01<<n));}/*SetBit=0*/ #defineTST_BIT(n,byteA)(byteA&(0x01<<n))==0/*Bit=0

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論