版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、C和ASM的混合編程,jianghq 2003-5 Tsinghua DEE,單片機(jī)與嵌入式系統(tǒng),Content,程序的結(jié)構(gòu) 匯編程序 C程序 project框架 如何改寫匯編程序? 在C程序中如何做一些底層操作?,存儲(chǔ)空間結(jié)構(gòu),程序的結(jié)構(gòu),匯編程序結(jié)構(gòu),C程序結(jié)構(gòu),M30624FGFP Memory Map,幾個(gè)主要的參數(shù),RAM區(qū) ramTOP ramEND ROM區(qū) progTOP Vvector,匯編程序結(jié)構(gòu)段類型,RAM DATA ROM CODE ROMDATA,匯編程序結(jié)構(gòu) 段定義,.SECTIONmemory,DATA ; 數(shù)據(jù)段 .ORGVramTOP .SECTIONpro
2、g,CODE; 代碼段 .ORGVprogTOP .SECTIONval_vect,ROMDATA ;用戶自定義中斷向量段 .ORGVintbase .SECTIONinter,ROMDATA ;固定中斷向量段 .ORGVvector+(8*4),匯編程序中幾個(gè)主要的參數(shù),VramTOP.EQU000400H VramEND.EQU002BFFH VIstack.EQU002C00H ISP VprogTOP.EQU0F0000H Vintbase.EQU0FA000H Vvector.EQU0FFFDCH SB_base.EQU000380H SB,關(guān)于SB和FB,.SBSB_base .S
3、BSYM recv_nums 告訴編譯器使用該變量的指令尋址方式采用相對(duì)基址尋址方式,可以提高生成代碼的效率。,關(guān)于堆棧,兩種堆棧:堆棧指針I(yè)SP和USP 使用何種堆棧,由堆棧指針選擇標(biāo)志位(U標(biāo)志)選取。 U = 0 選取中斷堆棧指針I(yè)SP U = 1 選取用戶堆棧指針USP 響應(yīng)中斷后,該標(biāo)志清0,執(zhí)行中斷子程序 SP指針位置如何設(shè)定: 棧頂指針 Push : SP = SP 1 Pop : SP = SP + 1,C程序結(jié)構(gòu),RAM DATA data bss stack heap ROM CODE program ROMDATA rom vector fvector,NC編譯器對(duì)Sec
4、tion的處理,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_
5、FOI vector fvector,ROMDATA,CODE,program interrupt program_S,根據(jù)芯片修改sect30.inc,注釋掉不存在的段 最重要的三個(gè)段的位置設(shè)定 .sectiondata_SE,DATA .org400H .sectionrom_FE,ROMDATA .org0C0000H .sectionvector,ROMDATA .orgVECTOR_ADR VECTOR_ADR .equ0FA000H 其他的段就交給編譯器來處理,例子:一個(gè)Section分配的結(jié)果,C程序結(jié)構(gòu) project,可能包括多個(gè)asm文件, C文件 如何安排project的
6、結(jié)構(gòu)?,程序的入口,首先要清楚整個(gè)程序的執(zhí)行過程 從哪里開始執(zhí)行?,Startup文件,sect30.inc文件,; fixed vector section .org0fffdch NMI: .lworddummy_int RESET: .lwordstart .end,Startup文件,ncrt0.a30文件,.glbstart .sectioninterrupt start: ;- ; after reset,this program will start ;- ldc#istack_top,isp;set istack pointer,ncrt0.a30 設(shè)定單片機(jī)工作模式 RAM
7、清0 變量初值設(shè)定 堆初始化 調(diào)用全局Init子程序 調(diào)用全局Main子程序 exit循環(huán),啟動(dòng)過程,主C程序 Void Init() Void Main() ,主C文件: init() int1(); int2(); int3(); main() sub1(); sub4(); ,Project層次框架,Startup文件: ncrt0.a30,系統(tǒng)提供的庫程序: #include “stdlib.h”,ASM子程序: init1(); sub1(),C子程序1: init2(); sub2(); sub3(),C子程序2: init3(); sub4();,ASM子程序: init4();
8、 sub5(),一個(gè)project的層次圖,程序結(jié)構(gòu)小結(jié),明白各個(gè)Section的含義 根據(jù)芯片參數(shù)和自己的程序需要來修改startup程序 用層次化來保持整個(gè)組織結(jié)構(gòu)的清晰,如何改寫匯編程序?,目標(biāo): 將他人提供的匯編程序轉(zhuǎn)為可供自己在C程序中調(diào)用的子函數(shù)。 例子: 紅外接收的子程序,Step1,大致看懂原程序 完成了一個(gè)什么樣的功能。 主要的幾個(gè)變量是什么含義。,Step2,分析自己的要求 如果將該匯編程序獨(dú)立出來作為一個(gè)子函數(shù); 那么其功能是什么? 輸入?yún)?shù):有哪些 返回值: 有哪些 我希望實(shí)現(xiàn)的功能 等待接收一個(gè)字節(jié),如果收到立刻返回該字節(jié),沒收到且時(shí)間超過300ms,那么也返回,同時(shí)
9、指示狀態(tài)為未接收。 char recv_status = IR_RECV(char userID, char* pByte); 指示接收狀態(tài) 接收用戶碼 接收字節(jié)地址,Step3,對(duì)原來的程序進(jìn)行裁減 刪去原有的各個(gè)段定義 重新定義各個(gè)Section: bss_SE, rom_FE, program 定義和聲明全局子函數(shù) _IRR_INIT _IR_RECV I_timera0 涉及C和匯編子程序之間的參數(shù)傳遞(詳見下文) 刪除不必要的變量和程序 如果使用中斷,則將中斷向量表設(shè)置挪至sect30.inc 最后以.end結(jié)束文件,C和匯編子程序之間的參數(shù)傳遞,參數(shù)規(guī)則(從C到匯編) 參數(shù)規(guī)則(從
10、匯編返回到C) 函數(shù)名定義規(guī)則,參數(shù)規(guī)則(從C到匯編),采用#pragma PARAMETER,參數(shù)規(guī)則(從匯編到C),函數(shù)名定義規(guī)則,最后結(jié)果,C程序部分: extern char IR_RECV(char,char*); #pragma PARAMETER IR_RECV(R0L,A0) 匯編語言部分: .glb _IR_RECV; 全局調(diào)用聲明 _IR_RECV: mov.b R0L,N_CSTM; 參數(shù)傳遞:用戶碼 mov.w A0, SAVE_ADDR; 參數(shù)傳遞:接收結(jié)果地址 mov.b #1, R0L; 返回1,如果收到了數(shù)據(jù),改寫匯編程序小結(jié),看懂源程序 在明白自己所需要的功能
11、后,再進(jìn)行修改 有的時(shí)候還是需要改多一些地方。 該例子存放到,在C程序中如何做一些底層操作,特殊寄存器的操作 BIT操作,特殊寄存器的操作,方法1: 使用#pragma ADDRESS #pragma ADDRESS TA0 0386H #pragma ADDRESS TABSR 0380H 建議將所有SFR地址聲明放在一個(gè)文件里 #include “mcu16c62.h” 定義類型(根據(jù)其所占的內(nèi)存大?。?char TA0MR,TA0IC,TABSR; unsigned int TA0;,特殊寄存器的操作,方法2:嵌入?yún)R編語句asm() 尤其是一些系統(tǒng)寄存器R0, FLG 方法3:定義成匯編子函數(shù) 另寫一個(gè)as30文件,將相關(guān)的操作封裝成函數(shù),供C程序調(diào)用 方法4:直接定義指針,并對(duì)該指針賦初值,BIT操作,使用位域,BIT操作,使用宏 #define SET_BIT(n,byteA) byteA |= (0 x01n); /* Set Bit =1 */ #define CLR_BIT(n,byteA) byteA /* Set Bit =0 */ #define TST_BIT(n,byteA) (byteA&(0 x01n)=0 /* Bit = 0 ? *
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年高職醫(yī)學(xué)檢驗(yàn)(醫(yī)學(xué)檢驗(yàn)實(shí)操)試題及答案
- 2025年高職學(xué)前教育(幼兒教學(xué)設(shè)計(jì))試題及答案
- 2025年大學(xué)大三(生物信息學(xué))基因序列分析試題及答案
- 2025年高職安全工程技術(shù)(安全工程應(yīng)用)試題及答案
- 2025年大學(xué)微生物學(xué)與免疫學(xué)基礎(chǔ)(微生物檢測)試題及答案
- 2025年高職(旅游管理)導(dǎo)游基礎(chǔ)知識(shí)階段測試題及答案
- 2025年大學(xué)幼兒發(fā)展與健康管理(幼兒趨勢分析)試題及答案
- 近五年福建中考語文試題及答案2025
- 養(yǎng)老院老人生活照顧人員晉升制度
- 養(yǎng)老院老人健康監(jiān)測服務(wù)質(zhì)量管理制度
- 建筑結(jié)構(gòu)荷載規(guī)范DBJ-T 15-101-2022
- 中國痤瘡治療指南
- 繼電保護(hù)裝置調(diào)試作業(yè)指導(dǎo)書
- 老同學(xué)聚會(huì)群主的講話發(fā)言稿
- 天然氣輸氣管線陰極保護(hù)施工方案
- 高血壓問卷調(diào)查表
- QC成果提高花崗巖磚鋪裝質(zhì)量
- GB/T 25156-2010橡膠塑料注射成型機(jī)通用技術(shù)條件
- GB/T 20878-2007不銹鋼和耐熱鋼牌號(hào)及化學(xué)成分
- 第六章 亞洲 第一節(jié) 概述
- 第六單元作文素材:批判與觀察 高一語文作文 (統(tǒng)編版必修下冊(cè))
評(píng)論
0/150
提交評(píng)論