娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

嵌入式系統(tǒng)開發(fā)中,目前使用的主要編程語言是C 和匯編,C++已經(jīng)有相應(yīng)的編譯器,但是現(xiàn)在使用還是比較少的。在稍大規(guī)模的嵌入式軟件中,例如含有OS,大部分的代碼都是用C 編寫的,主要是因為C 語言的結(jié)構(gòu)比較好,便于人的理解,而且有大量的支持庫。盡管如此,很多地方還是要用到匯編語言,例如開機(jī)時硬件系統(tǒng)的初始化,包括CPU 狀態(tài)的設(shè)定,中斷的使能,主頻的設(shè)定,以及RAM 的控制參數(shù)及初始化,一些中斷處理方面也可能涉及匯編。另外一個使用匯編的地方就是一些對性能非常敏感的代碼塊,這是不能依靠C 編譯器的生成代碼,而要手工編寫匯編,達(dá)到優(yōu)化的目的。而且,匯編語言是和CPU 的指令集緊密相連的,作為涉及底層的嵌入式系統(tǒng)開發(fā),熟練對應(yīng)匯編語言的使用也是必須的。


單純的C 或者匯編編程請參考相關(guān)的書籍或者手冊,這里主要討論C 和匯編的混合編程,包括相互之間的函數(shù)調(diào)用。下面分四種情況來進(jìn)行討論,暫不涉及C++。


1.在C 語言中內(nèi)嵌匯編


在C 中內(nèi)嵌的匯編指令包含大部分的ARM 和Thumb 指令,不過其使用與匯編文件中的指令有些不同,存在一些限制,主要有下面幾個方面:


a. 不能直接向PC 寄存器賦值,程序跳轉(zhuǎn)要使用B 或者BL 指令


b. 在使用物理寄存器時,不要使用過于復(fù)雜的C 表達(dá)式,避免物理寄存器沖突


c. R12 和R13 可能被編譯器用來存放中間編譯結(jié)果,計算表達(dá)式值時可能將R0 到R3、R12 及R14


用于子程序調(diào)用,因此要避免直接使用這些物理寄存器


d. 一般不要直接指定物理寄存器,而讓編譯器進(jìn)行分配內(nèi)嵌匯編使用的標(biāo)記是 __asm 或者asm 關(guān)鍵字,用法如下:__asm {

instruction [; instruction]

...

[instruction]

}


asm("instruction [; instruction]");

下面通過一個例子來說明如何在C 中內(nèi)嵌匯編語言,


#include

void my_strcpy(const char *src, char *dest)

{ char ch; __asm {

loop:

ldrb ch, [src], #1

strb ch, [dest], #1

cmp ch, #0

bne loop

}

}


int main()


{ char *a = "forget it and move on!"; char b[64];

my_strcpy(a, b);

printf("original: %s", a); printf("copyed: %s", b);

return 0;


}


在這里C 和匯編之間的值傳遞是用C 的指針來實現(xiàn)的,因為指針對應(yīng)的是地址,所以匯編中也可以訪問。


2.在匯編中使用C 定義的全局變量


內(nèi)嵌匯編不用單獨(dú)編輯匯編語言文件,比較簡潔,但是有諸多限制,當(dāng)匯編的代碼較多時一般放在單獨(dú)的匯編文件中。這時就需要在匯編和C 之間進(jìn)行一些數(shù)據(jù)的傳遞,最簡便的辦法就是使用全局變量。


/* cfile.c


* 定義全局變量,并作為主調(diào)程序

*/ #include int gVar_1 = 12; extern asmDouble(void);

int main()

{ printf("original value of gVar_1 is: %d", gVar_1); asmDouble();

printf(" modified value of gVar_1 is: %d", gVar_1); return 0; }

對應(yīng)的匯編語言文件


;called by main(in C),to double an integer, a global var defined in C is used.


AREA asmfile, CODE, READONLY EXPORT asmDouble

IMPORT gVar_1

asmDouble ldr r0, =gVar_1 ldr r1, [r0] mov r2, #2 mul r3, r1, r2 str r3, [r0] mov pc, lr END


3.在C 中調(diào)用匯編的函數(shù)


在 C 中調(diào)用匯編文件中的函數(shù),要做的主要工作有兩個,一是在C 中聲明函數(shù)原型,并加extern 關(guān)鍵字;二是在匯編中用EXPORT 導(dǎo)出函數(shù)名,并用該函數(shù)名作為匯編代碼段的標(biāo)識,最后用mov pc, lr 返回。然后,就可以在C 中使用該函數(shù)了。從C 的角度,并不知道該函數(shù)的實現(xiàn)是用C 還是匯編。更深的原因是因為C 的函數(shù)名起到表明函數(shù)代碼起始地址的左右,這個和匯編的label 是一致的。


/* cfile.c

*

in C,call an asm function, asm_strcpy

*

Sep 9, 2004

*/


#include

extern void asm_strcpy(const char *src, char *dest);

int main()

{ const char *s = "seasons in the sun"; char d[32];

asm_strcpy(s, d);

printf("source: %s", s);

printf(" destination: %s",d);

return 0;

}


;asm function implementation

AREA asmfile, CODE, READONLY

EXPORT asm_strcpy

asm_strcpy

loop

ldrb r4, [r0], #1 address increment after read

cmp r4, #0

beq over

strb r4, [r1], #1

b loop

over mov pc, lr

END


在這里,C 和匯編之間的參數(shù)傳遞是通過ATPCS(ARM Thumb Procedure Call Standard)的規(guī)定來進(jìn)行的。簡單的說就是如果函數(shù)有不多于四個參數(shù),對應(yīng)的用R0-R3 來進(jìn)行傳遞,多于4 個時借助棧,函數(shù)的返回值通過R0 來返回。


4.在匯編中調(diào)用C 的函數(shù)


在匯編中調(diào)用C 的函數(shù),需要在匯編中IMPORT對應(yīng)的C 函數(shù)名,然后將C 的代碼放在一個獨(dú)立的C 文件中進(jìn)行編譯,剩下的工作由連接器來處理。


;the details of parameters transfer comes from ATPCS

;if there are more than 4 args, stack will be used EXPORT asmfile AREA asmfile, CODE, READONLY IMPORT cFun ENTRY mov r0, #11 mov r1, #22 mov r2, #33 BL cFun END


/*C file, called by asmfile */


PDF created with pdfFactory trial version www.pdffactory.com

int cFun(int a, int b, int c)

{

return a + b + c; }


在匯編中調(diào)用C 的函數(shù),參數(shù)的傳遞也是通過ATPCS 來實現(xiàn)的。需要指出的是當(dāng)函數(shù)的參數(shù)個數(shù)大于4 時,要借助stack,具體見ATPCS 規(guī)范。


小結(jié)


以上通過幾個簡單的例子演示了嵌入式開發(fā)中常用的C 和匯編混合編程的一些方法和基本的思路,其實最核心的問題就是如何在C 和匯編之間傳值,剩下的問題就是各自用自己的方式來進(jìn)行處理。以上只是拋磚引玉,更詳細(xì)和復(fù)雜的使用方法要結(jié)合實際應(yīng)用并參考相關(guān)的資料。


關(guān)鍵字:ARM  匯編  混合編程 引用地址:ARM中C和匯編混合編程及示例

上一篇:ARM開發(fā):一 ARM微處理器概述
下一篇:基于ARM的電磁流量計設(shè)計

推薦閱讀

????4月9日-11日,第六屆中國電子信息博覽會(CITE)在深圳舉辦。展會上,華夏幸福集中展示了固安產(chǎn)業(yè)新城云谷科技、京東方、鼎材科技、翌光科技4家新型顯示龍頭企業(yè)的最新產(chǎn)品和技術(shù)?! ∪A夏幸福展臺工作人員介紹,作為未來世界級新型顯示產(chǎn)業(yè)高地,固安產(chǎn)業(yè)新城將以“AMOLED研發(fā)—生產(chǎn)—配套”為核心,通過圍繞云谷進(jìn)行上下游產(chǎn)業(yè)布局,形成“材料—...
TDY]公司旗下的全球視覺解決方案創(chuàng)新公司,Teledyne e2v宣布擴(kuò)充其EmeraldCMOS圖像傳感器產(chǎn)品系列,推出一款全新500萬像素設(shè)備。 EmeraldTM 5M專為機(jī)器視覺、自動光學(xué)檢測(AOI)和工廠自動化應(yīng)用而設(shè)計,這些應(yīng)用需要運(yùn)動中物體的更高分辨率圖像,沒有失真。該傳感器有單色和彩色 可供選擇,采用小型1/1.8英寸光學(xué)格式,包含2.8μm,低噪聲全局快門像...
當(dāng)前電網(wǎng)企業(yè)大數(shù)據(jù)價值變現(xiàn)交易需要解決的主要問題 2019年5月國家電網(wǎng)公司成立大數(shù)據(jù)中心后,加大了數(shù)據(jù)價值變現(xiàn)交易工作力度,已發(fā)布數(shù)據(jù)資源目錄、數(shù)據(jù)服務(wù)目錄,推出“數(shù)經(jīng)e-電力經(jīng)濟(jì)指數(shù)”等9項可變現(xiàn)交易的數(shù)據(jù)服務(wù)產(chǎn)品。但是,根據(jù)上面對大數(shù)據(jù)交易的特征分析,電網(wǎng)企業(yè)大數(shù)據(jù)價值變現(xiàn)交易是一個系統(tǒng)工程,與電力交易相比更加復(fù)雜和具有挑戰(zhàn)性,...
集微網(wǎng)消息,近日,在工業(yè)和信息化部電子第五研究所(簡稱:工信部電子五所)廣州增城總部,中興通訊與工信部電子五所正式簽署戰(zhàn)略合作協(xié)議。根據(jù)協(xié)議,雙方將本著“共同發(fā)展,合作共贏”的原則,共同探索信息技術(shù)創(chuàng)新與各主流行業(yè)的深度融合,在行業(yè)整體解決方案、標(biāo)準(zhǔn)制定、試點(diǎn)示范、市場拓展等層面全面開展合作,借助雙方在各自產(chǎn)業(yè)、技術(shù)、規(guī)劃、政策...

史海拾趣

問答坊 | AI 解惑

ULINK 制作DIY資料

配合Keil for ARM的ULINK,讓ARM開發(fā)完全擺脫ADS1.2。   Keil ULINK USB接口仿真器,一款多功能ARM調(diào)試工具,可以通過JTAG或CODS接口連接到目標(biāo)系統(tǒng)仿真或下載程序,目前已經(jīng)成為國內(nèi)主流的ARM開發(fā)工具。    Keil ULINK的軟件環(huán)境為Keil uVi ...…

查看全部問答∨

嵌入式即將成為純軟件的學(xué)科?

現(xiàn)在提及嵌入式,就談到了嵌入式操作系統(tǒng)。 難道大家不再關(guān)心下面硬件和底層的內(nèi)容了么? 如果這樣,嵌入式發(fā)展不是應(yīng)該納入軟件門類?和我們硬件有什么關(guān)系呢?…

查看全部問答∨

[ZT]送給研發(fā)弟兄們幾個總結(jié)性觀點(diǎn)

觀察了一些企業(yè)的產(chǎn)品技術(shù)情況,比較普遍的一個現(xiàn)象是:研發(fā)人員無一例外的同聲譴責(zé)采購和工藝部門,對元器件控制不嚴(yán),致使電路板入檢合格率低、到客戶現(xiàn)場后頻頻出毛病。     舉幾個簡單例子:     一個電解電容 ...…

查看全部問答∨

剛進(jìn)入初級基帶工程師,應(yīng)該學(xué)什么?

剛剛進(jìn)入基帶這個行業(yè),還有些摸不到頭腦, 請問大家應(yīng)該從哪里開始學(xué)起?…

查看全部問答∨

大家來看看晶振的兩種接法,有誰用過這種接法?

1.這種接法的優(yōu)點(diǎn)就是起振容易,適應(yīng)頻率范圍比較寬。具體頻率范圍本人不記得了。 2.這種接法的優(yōu)點(diǎn)接法簡單,缺點(diǎn)是不那么容易起振,C1,C2要合適。 …

查看全部問答∨

哪位大蝦幫忙看看這個keilC51程序,串口通訊相關(guān)的。

第一次寫keil程序,還望不吝賜教?,F(xiàn)在的問題是,仿真正常temp可以正確賦值,但是仿真到判斷temp值的時候都是直接跳過,無法識別。將判斷條件設(shè)為temp==0,可以觸發(fā)也就是說,temp的值始終是0。 燒到51里實測也是一樣一直停在 ENA=1;IN1=1;IN2=1; ...…

查看全部問答∨

關(guān)于三星6410平臺OpenGL

公司一直是基于三星6410平臺的Windows Mobile操作系統(tǒng),之前是沒有集成OpenGL的,現(xiàn)在為了顯示效果,準(zhǔn)備加上,會對目前的系統(tǒng)產(chǎn)生什么影響?…

查看全部問答∨

請問如何從U盤啟動xpe系統(tǒng)?

我用windows embedded studio制作了一個迷你型的xpe系統(tǒng),請問我如何能從U盤啟動整個系統(tǒng)呢?我在網(wǎng)絡(luò)上找過相關(guān)的一些方法,但是都不能順利的完成。…

查看全部問答∨

在DAVE中,自己建的工程能編譯、下載,但是不能單步調(diào)試,這是怎么回事?

現(xiàn)在正在學(xué)習(xí)XMC1300,使用英飛凌官方的編譯器DAVE,自己建了工程能編譯、下載,是不能單步進(jìn)行調(diào)試,這是怎么回事呢?求大神解? …

查看全部問答∨
小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 霍山县| 平陆县| 什邡市| 阿勒泰市| 九江市| 五莲县| 吉木乃县| 康乐县| 永丰县| 恩平市| 四川省| 曲松县| 巴青县| 黄龙县| 青铜峡市| 新宁县| 北碚区| 揭阳市| 祁连县| 尼勒克县| 沙坪坝区| 红安县| 莱西市| 南平市| 辽阳县| 沧州市| 景宁| 天全县| 莒南县| 盘山县| 黄陵县| 五华县| 修水县| 资讯 | 南涧| 墨玉县| 双峰县| 九江市| 两当县| 凤山县| 东阳市|