在嵌入式系統(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 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)的資料。
上一篇:ARM開發(fā):一 ARM微處理器概述
下一篇:基于ARM的電磁流量計設(shè)計
推薦閱讀
史海拾趣
隨著公司產(chǎn)品的技術(shù)成熟和品質(zhì)提升,Esterline Power Systems開始尋求國際市場的拓展。公司高層制定了明確的國際化戰(zhàn)略,包括在歐洲和亞洲設(shè)立分支機(jī)構(gòu),與當(dāng)?shù)睾献骰锇榻⒕o密的合作關(guān)系。通過參展國際航空展、加強(qiáng)與全球航空公司的技術(shù)交流與合作,公司逐漸打開了國際市場的大門,產(chǎn)品銷售遍及全球多個國家和地區(qū)。
背景:霍尼韋爾公司的歷史可以追溯到1885年,由發(fā)明家艾伯特·布茲在美國明尼阿波利斯創(chuàng)立布茲電子溫度調(diào)節(jié)器公司。
發(fā)展:布茲成功研發(fā)出了一種名為“風(fēng)門擋板”的裝置,該裝置能夠自動調(diào)節(jié)室內(nèi)溫度,這是當(dāng)時的一大技術(shù)突破。隨著業(yè)務(wù)的不斷發(fā)展,布茲電子溫度調(diào)節(jié)器公司被統(tǒng)一溫度控制公司收購,并在1893年更名為電子供熱調(diào)節(jié)器公司。
關(guān)鍵事件:1898年,電子供熱調(diào)節(jié)器公司被W.R. Sweatt收購,并于1916年更名為明尼阿波利斯熱調(diào)節(jié)器公司。這一系列的更名和收購奠定了霍尼韋爾在恒溫器領(lǐng)域的基礎(chǔ)。
隨著國內(nèi)市場的飽和,CLANDELL公司開始尋求國際化發(fā)展。公司通過市場調(diào)研和合作伙伴的建立,逐步拓展海外市場。在國際化的過程中,CLANDELL公司不僅提升了自身的品牌影響力,也學(xué)習(xí)到了國際先進(jìn)的管理經(jīng)驗和市場策略,為公司的長遠(yuǎn)發(fā)展奠定了堅實基礎(chǔ)。
科通技術(shù)股份有限公司(簡稱科通技術(shù))成立于1995年,總部位于深圳,是中國早期知名的IC元器件分銷商。公司創(chuàng)始人憑借對電子行業(yè)的敏銳洞察力和對市場需求的深刻理解,迅速在市場中站穩(wěn)腳跟。初期,科通技術(shù)主要專注于為國內(nèi)外客戶提供高質(zhì)量的電子元器件和專業(yè)的技術(shù)支持,憑借其卓越的產(chǎn)品質(zhì)量和服務(wù)水平,贏得了客戶的廣泛認(rèn)可。
在某年第一季度,CalAmp公司發(fā)布了其財報數(shù)據(jù)。根據(jù)財報,該季度公司實現(xiàn)營收7089.1萬美元,雖然比市場預(yù)期的7566萬美元略低6.30%,但仍然展現(xiàn)了穩(wěn)健的增長態(tài)勢。同時,公司的每股收益為-0.11美元,低于預(yù)期的0.04美元,這可能與公司在研發(fā)和市場拓展方面的持續(xù)投入有關(guān)。盡管如此,CalAmp公司在無線通信解決方案應(yīng)用領(lǐng)域的廣泛布局和深厚的客戶基礎(chǔ),使得其整體業(yè)績依然保持穩(wěn)健。
經(jīng)過多年的發(fā)展,Alpha Semiconductor已經(jīng)成為一家高性能標(biāo)準(zhǔn)、半標(biāo)準(zhǔn)模擬和混合信號IC制造商。公司在這一領(lǐng)域的制造實力得到了業(yè)界的廣泛認(rèn)可。Alpha Semiconductor的產(chǎn)品廣泛應(yīng)用于通信、計算機(jī)、消費(fèi)電子等領(lǐng)域,為電子行業(yè)的發(fā)展做出了重要貢獻(xiàn)。
配合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 ...… 查看全部問答∨ |
現(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)場后頻頻出毛病。 舉幾個簡單例子: 一個電解電容 ...… 查看全部問答∨ |
|
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; ...… 查看全部問答∨ |
公司一直是基于三星6410平臺的Windows Mobile操作系統(tǒng),之前是沒有集成OpenGL的,現(xiàn)在為了顯示效果,準(zhǔn)備加上,會對目前的系統(tǒng)產(chǎn)生什么影響?… 查看全部問答∨ |
我用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ā)板 精華推薦
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹莓派進(jìn)行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲html,css,js文件,以及網(wǎng)頁和arduino的通訊
- ESP32 freeRTOS使用測試
- API調(diào)用小記(Touchdesigner和ESP32)
- 關(guān)于ESP32/8266使用async-mqtt-client庫的一些基本介紹
- 座椅、天窗、電動尾門應(yīng)用 國產(chǎn)車規(guī)級高壓霍爾效應(yīng)傳感器推薦
- 突發(fā)!又一車企車機(jī)“崩了”
- 寧德時代為陳立泉院士頒發(fā)“卓越貢獻(xiàn)獎”
- 一文速覽吉利雷神 AI 電混 2.0 發(fā)布會重點(diǎn)
- 2025年1-4月ADAS供應(yīng)商裝機(jī)量排行榜:頭部集中與國產(chǎn)突圍并存
- 國內(nèi)飛行汽車無線通信測試成功,通信安全新突破
- SPAD席卷車載激光雷達(dá)市場
- 大聯(lián)大品佳集團(tuán)推出基于Microchip和ams OSRAM產(chǎn)品的10Base-T1S萬級像素大燈方案
- 哈曼推出采用三星Neo QLED技術(shù)的全新顯示屏
- Syntiant推出超低功耗汽車AI創(chuàng)新技術(shù) 提升車輛安全性和用戶體驗
- 下資料 看視頻 抽大獎!泰克汽車電子測試解決方案
- 發(fā)帖贏好禮 | MPS 工程師為您解決DC-DC設(shè)計難題
- 免費(fèi)體驗業(yè)界最快編譯速度&最好性能 Quartus II v15.0網(wǎng)頁版下載有禮!
- 英飛凌BMS解決方案,為電動汽車和儲能系統(tǒng)保駕護(hù)航!
- 已結(jié)束|Maxim IO-Link通信協(xié)議設(shè)計方案詳解,5大優(yōu)勢助你輕松聯(lián)網(wǎng)!
- 下載有禮:數(shù)據(jù)中心養(yǎng)生秘籍《福祿克數(shù)據(jù)中心解決方案》等你帶回家!
- 閱讀并了解是德科技汽車電子、物聯(lián)網(wǎng)(IOT) 精彩專題,答題贏好禮!
- 免費(fèi)申請測評:超小型 Linux 開發(fā)套件:Quantum Tiny Linux(帶 SoM 和擴(kuò)展板)
- 路透社:中國芯片追趕之路布滿荊棘,仍需努力
- 博通Q2凈利潤暴跌81% !是何原因
- 星瀚資本楊歌:看了200/300家AI芯片公司卻難有一家能出手投資
- Silicon Labs:物聯(lián)網(wǎng)新一代無線連接的未來在哪里
- 日本專家的深刻自?。何覀兊陌雽?dǎo)體為何敗了
- 進(jìn)擊中的大陸晶圓代工,30多條產(chǎn)線驚呆世界
- 半導(dǎo)體制程日新月異 NSD成ADC選擇新指標(biāo)
- 鴻海啟動印度手機(jī)生態(tài)鏈布局,和碩、緯創(chuàng)前進(jìn)印度設(shè)廠
- 您的企業(yè)需要聊天機(jī)器人嗎?
- 供不應(yīng)求 硅晶圓現(xiàn)漲價榮景