freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

接口技術(shù)_3嵌入式程序設(shè)計(jì)語(yǔ)言-資料下載頁(yè)

2025-05-26 12:05本頁(yè)面
  

【正文】 C代碼 3. 參數(shù)傳遞 C程序和匯編程序之間的參數(shù)傳遞是通過(guò)APCS的規(guī)定來(lái)進(jìn)行的。假如函數(shù)有不多于四個(gè)參數(shù),對(duì)應(yīng)的用 R0R3來(lái)進(jìn)行傳遞,多于 4個(gè)參數(shù)時(shí)借助堆棧,函數(shù)的返回值通過(guò)R0來(lái)返回。 例如,有三個(gè)參數(shù)時(shí)的一段 C語(yǔ)言函數(shù)代碼如下。 int cFun(int a, int b, int c) { return a+b+c。 } 86 基于 ARM的嵌入式系統(tǒng)接口技術(shù) 在匯編語(yǔ)言程序中調(diào)用 C代碼 在 ARM匯編程序中調(diào)用上面的函數(shù)的代碼如下。 AREA asmfile, CODE, READONLY IMPORT cFun 。聲明引用的函數(shù)在其他源文件中定義 ENTRY mov r0, 11 mov r1, 22 mov r2, 33 BL cFun 。調(diào)用函數(shù) END 87 基于 ARM的嵌入式系統(tǒng)接口技術(shù) 匯編語(yǔ)言中的函數(shù)定義 在匯編語(yǔ)言中對(duì)函數(shù)的定義比較簡(jiǎn)單,直接用函數(shù)入口地址標(biāo)號(hào)代表函數(shù)名,不需要象 C語(yǔ)言程序中的函數(shù)一樣的形式參數(shù)和實(shí)參,如例題中的函數(shù)定義語(yǔ)句④ ⑤ 。 但在函數(shù)結(jié)束時(shí)必須顯示地恢復(fù)現(xiàn)場(chǎng),通常使用語(yǔ)句 MOV pc,lr,相當(dāng)于 C語(yǔ)言中的返回語(yǔ)句return或右括號(hào)“ }”。 asse_add ADD r0, r0, r1 。r0 = r0 + r1 MOV pc, lr 。函數(shù)返回 88 基于 ARM的嵌入式系統(tǒng)接口技術(shù) 小結(jié) 以上通過(guò)幾個(gè)簡(jiǎn)單的例子說(shuō)明了嵌入式開(kāi)發(fā)中常用的 C語(yǔ)言和匯編語(yǔ)言混合編程的一些方法和基本的思路 , 其實(shí)最核心的問(wèn)題就是如何在 C和匯編之間傳值 , 其余的問(wèn)題就是各自用自己的方式來(lái)進(jìn)行處理 。 回到工作場(chǎng)景 90 基于 ARM的嵌入式系統(tǒng)接口技術(shù) 回到工作場(chǎng)景一 初始化程序即系統(tǒng)的啟動(dòng)代碼,是系統(tǒng)在加電后運(yùn)行的第一段代碼,主要任務(wù)是初始化處理器模式,設(shè)置堆棧,初始化變量等等。由于以上的操作均與處理器體系結(jié)構(gòu)和系統(tǒng)配置密切相關(guān),所以一般是采用匯編語(yǔ)言編寫(xiě)的 不同的硬件,啟動(dòng)代碼會(huì)有差異,但基本原理是相似的,因此我們選擇了其中一種進(jìn)行簡(jiǎn)單的分析,以期了解一下匯編語(yǔ)言程序的實(shí)際應(yīng)用 91 基于 ARM的嵌入式系統(tǒng)接口技術(shù) 回到工作場(chǎng)景一 系統(tǒng)引導(dǎo)程序是在硬件上執(zhí)行的第一段程序代碼,它通常被安排在系統(tǒng)復(fù)位異常向量地址處。系統(tǒng)引導(dǎo)程序是依賴(lài)于具體硬件環(huán)境的,除了依賴(lài)于 CPU的體系結(jié)構(gòu)外,還依賴(lài)于具體的板級(jí)硬件配置。也就是說(shuō),對(duì)于兩塊不同的嵌入式系統(tǒng)板而言,即使它們采用的CPU是相同的,它們的系統(tǒng)引導(dǎo)程序也可能不同。在一塊板子上運(yùn)行正常的系統(tǒng)引導(dǎo)程序,要想移植到另一塊板子上,也必須進(jìn)行修改。 92 基于 ARM的嵌入式系統(tǒng)接口技術(shù) 工作過(guò)程一 參數(shù)初始化 通常程序的最開(kāi)始的地方做變量定義等初始化工作, ARM的啟動(dòng)代碼也不例外,在啟動(dòng)代碼最開(kāi)始的地方,對(duì)代碼中使用到的變量進(jìn)行定義。具體程序代碼略,可以參看任何一種啟動(dòng)代碼。 93 基于 ARM的嵌入式系統(tǒng)接口技術(shù) 工作過(guò)程二 異常入口 啟動(dòng)代碼從 ENTRY處開(kāi)始執(zhí)行,這里放的是異常向量表,第一個(gè)就是復(fù)位異常, b ResetHandler,跳轉(zhuǎn)到復(fù)位異常處。 b ResetHandler 。復(fù)位異常 , 跳轉(zhuǎn)到 ResetHandler標(biāo)號(hào)處 b HandlerUndef 。未定義指令異常 b HandlerSWI 。軟件中斷異常 b HandlerPabort 。指令終止異常 b HandlerDabort 。數(shù)據(jù)終止異常 b . 。保留 b HandlerIRQ 。IRQ中斷異常 b HandlerFIQ 。FIQ中斷異常 94 基于 ARM的嵌入式系統(tǒng)接口技術(shù) 工作過(guò)程三 關(guān)看門(mén)狗定時(shí)器 ResetHandler 。復(fù)位中斷時(shí)跳到這里開(kāi)始執(zhí)行 , 復(fù)位異常入口 ldr r0,=WTCON 。禁止看門(mén)狗 , 即設(shè)置看門(mén)狗控制寄存器 ldr r1,=0x0 。此三條匯編代碼使寄存器 WTCON置為 0 str r1,[r0] 95 基于 ARM的嵌入式系統(tǒng)接口技術(shù) 工作過(guò)程四 關(guān)中斷 ( 包括中斷和子中斷 ) ldr r0,=INTMSK ldr r1,=0xffffffff 。禁止所有中斷 , 即設(shè)置中斷屏蔽寄存器 str r1,[r0] ldr r0,=INTSUBMSK ldr r1,=0x3ff 。禁止所有子中斷 , 即設(shè)置子中斷屏蔽寄存器 str r1,[r0] 96 基于 ARM的嵌入式系統(tǒng)接口技術(shù) 工作過(guò)程五 設(shè)置系統(tǒng)時(shí)鐘頻率 有時(shí)需要設(shè)置系統(tǒng) CPU的速度和時(shí)鐘頻率(各寄存器意義參見(jiàn)第十章 2410時(shí)鐘設(shè)置)。 。調(diào)整 LOCKTIME 寄存器 , 首先設(shè)置鎖相環(huán)的 lock time ldr r0,=LOCKTIME ldr r1,=0xffffff str r1,[r0] 。如果啟用鎖相環(huán) , 則需要使用下面的代碼配置 MPLL IFDEF PLL_ON_START ldr r0,=MPLLCON ldr r1,=((M_MDIV12)+(M_PDIV4)+M_SDIV) 。Fin=12MHz,Fout=50MHz str r1,[r0] ENDIF 97 基于 ARM的嵌入式系統(tǒng)接口技術(shù) 工作過(guò)程六 設(shè)置隨機(jī)存儲(chǔ)器 若系統(tǒng)使用了 DRAM或其他存儲(chǔ)器外設(shè),需要設(shè)置相關(guān)寄存器,以確定其刷新頻率、總線寬度等信息。 。設(shè)置存儲(chǔ)器控制寄存器 ldr r0,=SMRDATA ldr r1,=BWSCON 。BWSCON地址 add r2, r0, 52 。SMRDATA的結(jié)束地址 , 共有 13個(gè)寄存器 0 。標(biāo)號(hào) , 循環(huán)指令跳轉(zhuǎn)到這里 ldr r3, [r0], 4 。每次在地址上加 4 str r3, [r1], 4 cmp r2, r0 bne %B0 98 基于 ARM的嵌入式系統(tǒng)接口技術(shù) 工作過(guò)程七 設(shè)置堆棧 系統(tǒng)堆棧初始化取決于用戶使用哪些異常,以及系統(tǒng)需要處理哪些錯(cuò)誤類(lèi)型。一般情況下,管理模式堆棧必須設(shè)置;若使用了 IRQ中斷,則 IRQ中斷堆棧必須設(shè)置。 子函數(shù)對(duì)各種工作模式下的堆棧都進(jìn)行了初始化,初始化堆棧段代碼中用到的常量在程序的開(kāi)始部分定義。 bl InitStacks 。跳轉(zhuǎn)到初始化堆棧子函數(shù) 99 基于 ARM的嵌入式系統(tǒng)接口技術(shù) 工作過(guò)程八 中斷處理程序 。 Setup IRQ handler ldr r0,=HandleIRQ 。This routine is needed ldr r1,=IsrIRQ 。if there isn39。t 39。subs pc,lr,439。 at 0x18, 0x1c str r1,[r0] IsrIRQ sub sp,sp,4 。reserved for PC stmfd sp!,{r8r9} ldr r9,=INTOFFSET ldr r9,[r9] 。把 INTOFFSET寄存器的值裝載到 r9 ldr r8,=HandleEINT0 。把中斷服務(wù)例程向量基地址裝載到 r8 add r8,r8,r9,lsl 2 。取得中斷服務(wù)例程向量 r8 = r8 + r9 * 4 ldr r8,[r8] 。裝載中斷服務(wù)例程地址 str r8,[sp,8] 。 store to sp, new PC ldmfd sp!,{r8r9,pc} 。跳轉(zhuǎn)到新的 PC處即中斷處理例程處 100 基于 ARM的嵌入式系統(tǒng)接口技術(shù) 工作過(guò)程九 初始化應(yīng)用程序執(zhí)行環(huán)境 ldr r0, =|Image$$RO$$Limit| 。得到 ROM只讀數(shù)據(jù)區(qū)結(jié)束地址 +1 ldr r1, =|Image$$RW$$Base| 。得到 RAM 讀寫(xiě)段起始地址 ldr r3, =|Image$$ZI$$Base| 。需要清零的區(qū)域起始地址 。 Zero init base = top of initialised data cmp r0, r1 。檢查是否不同 beq %F2 。向后跳 1 cmp r1, r3 ??截惓跏蓟臄?shù)據(jù) ldrcc r2, [r0], 4 。 LDRCC r2, [r0] + ADD r0, r0, 4 strcc r2, [r1], 4 。 STRCC r2, [r1] + ADD r1, r1, 4 bcc %B1 。向前跳 2 ldr r1, =|Image$$ZI$$Limit| 。對(duì)需要清零的區(qū)域清零 mov r2, 0 3 cmp r3, r1 。Zero init strcc r2, [r3], 4 bcc %B3 101 基于 ARM的嵌入式系統(tǒng)接口技術(shù) 工作過(guò)程十 跳轉(zhuǎn)到 C程序的入口點(diǎn) 至此,啟動(dòng)代碼執(zhí)行完畢,啟動(dòng)代碼完成了:參數(shù)初始化;設(shè)置中斷異常向量表;初始化硬件,包括鎖相環(huán)、看門(mén)狗、中斷、系統(tǒng)時(shí)鐘和主頻等;初始化 RAM;初始化堆棧;復(fù)制 RW段到 RAM,將 Zi段清零;最后跳轉(zhuǎn)到 C語(yǔ)言程序。 bl Main @ 跳轉(zhuǎn)到 C程序入口點(diǎn) ...... 102 基于 ARM的嵌入式系統(tǒng)接口技術(shù) 回到工作場(chǎng)景二 要想在六只數(shù)碼管上顯示不同的字形 , 因?yàn)榭刂谱中蔚牡刂分挥幸粋€(gè) , 因此必須用掃描顯示的方法:即在點(diǎn)亮某一只數(shù)碼管時(shí) , 字形地址里根據(jù)該數(shù)碼管的顯示內(nèi)容確定 , 接著點(diǎn)亮下一只數(shù)碼管時(shí) , 字形地址里變成下一只數(shù)碼管要顯示的內(nèi)容 , 依次使每一只數(shù)碼管點(diǎn)亮 , 字形地址也依次變成相應(yīng)的內(nèi)容 。 每只數(shù)碼管點(diǎn)亮一個(gè)短暫的時(shí)間 , 由于數(shù)碼管的余輝效應(yīng)以及人眼的視覺(jué)暫留現(xiàn)象 , 使六只數(shù)碼管看上去就象同時(shí)顯示不同的數(shù)字一樣 。 103 基于 ARM的嵌入式系統(tǒng)接口技術(shù) 工作過(guò)程一 建立字形表 用數(shù)組建立字形表。因?yàn)橹灰@示六種字形 05,因此建立的字形表只需要六個(gè)元素 define U8 unsigned char //用宏定義 , 定義 U8 U8 seg7table[6] = { //如果前面沒(méi)有定義 U8, 也可以直接使用 unsigned char /* 0 1 2 3 4 5*/ 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, }。 //只用到 05 104 基于 ARM的嵌入式系統(tǒng)接口技術(shù) 工作過(guò)程二 動(dòng)態(tài)掃描顯示 在函數(shù)中,當(dāng)點(diǎn)亮左邊第一只數(shù)碼管時(shí),字形數(shù)據(jù)為顯示“ 0”,點(diǎn)亮第二只時(shí),顯示 “ 1”,因此,可以用移位取反的方法,保證地址 0x10000006中的值只有一位為 0,當(dāng)某位為 0時(shí),相應(yīng)的字形地址 0x10000004里的值與移位的位數(shù)一致,即與所賦的值下標(biāo)一致,顯示下標(biāo)的字形。 void Main(void) {//此處 Main名稱(chēng)必須和初始化程序 int i,j。 while(1) { for(i=0。i0x6。i++) { //數(shù)碼管從 0到 5依次將字符顯示出來(lái) *((U8*) 0x10000006) = ~(0x20i)。//1右移 i位 , 取反為 0, 點(diǎn)亮一位 *((U8*) 0x10000004) = seg7table[i]。//下標(biāo)為 i的元素 , 輸出字形數(shù)據(jù) for(j=0。j0x1000。j++)。 //循環(huán)次數(shù)控制延時(shí)時(shí)間 , 可以調(diào)整 } } } 工作實(shí)訓(xùn)營(yíng) 106 基于 ARM的嵌入式系統(tǒng)接口技術(shù) 訓(xùn)練實(shí)例 1. 訓(xùn)練內(nèi)容 編寫(xiě)程序控制步進(jìn)電機(jī)的轉(zhuǎn)動(dòng)。 當(dāng)給步進(jìn)電機(jī)加一個(gè)脈沖信號(hào),電機(jī)則轉(zhuǎn)過(guò)一個(gè)步距角。電機(jī)有兩種工作模式:半步模式和整步模式。整步模式下的步距角為 180,半步模式則為 90。 假設(shè)某實(shí)驗(yàn)箱上的步進(jìn)電機(jī)由存儲(chǔ)器地址單元0x28000006的 bit3~ bit0控制,當(dāng)電機(jī)以整步模式工作時(shí),控制方法是:當(dāng)前狀態(tài)為 0101B,要想使電機(jī)正轉(zhuǎn) 180,下一個(gè)狀態(tài)應(yīng)該是 1001B,再繼續(xù)正轉(zhuǎn) 180,下面的狀態(tài)分別是 1010B, 0110B,之后回到 0101B,按如此狀態(tài)順序循環(huán)下去,每改變一個(gè)狀態(tài),電機(jī)轉(zhuǎn)動(dòng)180;反向轉(zhuǎn)動(dòng)時(shí)控制方法類(lèi)似,如下表所示。 107 基于 ARM的嵌入式系統(tǒng)接口技術(shù) 訓(xùn)練實(shí)例 2. 訓(xùn)練目的 掌握嵌入式系統(tǒng)開(kāi)發(fā)中 C語(yǔ)言的編程方法及使用技巧,掌握 ADS集成開(kāi)發(fā)環(huán)境的使用方法。 108 基于 ARM的嵌入式系統(tǒng)接口技術(shù) 訓(xùn)練實(shí)例 3. 訓(xùn)練過(guò)程 在 CodeWarrior ID
點(diǎn)擊復(fù)制文檔內(nèi)容
規(guī)章制度相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1