IT技術互動交流平台

GNUFreestanding(Naked)CARM交叉開發環境建與測試

來源_|_金莎巧克力保质期:IT165收集  發布日期|-马国贤 杨秀蓉:2016-12-14 20:33:08

0 由來

在我的博文 GNU ARM交叉彙編環境的搭建與測試中_-|长安街英菲尼迪,詳細講解了GNU ARM彙編環境的創建與使用方法-__排球场地标准尺寸。實際開發中__-苏州地税局网站,直接使用彙編語言寫的代碼往往很少-|众亿大厅作弊器,盡在係統啟動和性能要求極其苛刻的時候才會用到彙編代碼_--4466kk。在可讀性__|冯绍峰qq、可移植性_-小狼狗心水论坛、邏輯表達能力方麵|_坏蛋是炼成的2,C語言的表現要比彙編強太多_诺基亚手机自带铃声,正是C語言的這種優勢造就了Unix世界|-梁笙和沈言 卫生间,造就了Linux在多種平台上順利編譯運行的活潑場麵--_众赢彩票的骗局。

所以__河南省2017年度学生参加校外培训,在嵌入式開發領域-收破烂歌词,C語言是主力語言|-_鹏程狗友。在使用開發ARM上運行的程序之前|-金香蜜瓜,必須構建一個好用的C交叉編譯環境-_一道本。在博文Freestanding C與交叉編譯器的生成原理分析中_易彩官方网下载,闡述了Freestanding C的概念和交叉編譯器構建的原理_|_永城彩票正规吗。構建一個完整的Hosted C交叉編譯器是一個相當複雜的過程--_找法网查看律师回复,尤其是對於GCC來說-400字日记,這個過程更是充滿艱難險阻-|娃独自下车被牵走。為了避免初學者受挫_设备保修卡,我們從簡單開始__触动陷阱,先構建一個Freestanding 的C交叉編譯器-易盈彩票,然後寫一個具體的C項目來測試|-大北农饲料价格。

1 Freestanding C的構建

GCC項目主要有兩大功能--温州教科研网,一是提供C_|248彩票平台安全吗,C++-_-煤气灶风门,Fortran等多種語言的前端(front end)編譯器|-_无主之地2发型不好的日子,也就是負責把高級語言代碼翻譯成彙編代碼-|电视剧下载网站;二是作為整個開發環境的總入口-_|张羽 央视,負責調用其他彙編||太子乐奶粉最新事件2013、鏈接工具__中国最大的七星彩加急版交换论坛,來控製整個編譯–>彙編–>鏈接過程_媛交女图片。可見GCC本身並不能獨立工作___1995彩票反水025,必須依賴於外部提供的彙編_工作总结结尾、鏈接等工具|-|钢之魔法师2,而提供這些外部工具的最著名軟件就是binutils|海东人事局。

雖說理論上gcc和binutils的安裝沒有先後的必要性_二手手机号码交易网,但實際上gcc編譯的過程中|__联想20003,需要運行binutils提供的工具來進行測試_-敏婷搭档,並根據測試結果來動態控製自身源碼編譯-|萌节。故binutils必須先安裝-|_打屁沟,之後才能編譯安裝gcc|-哈斯维修。

1.1 使用binutils構建交叉彙編環境

binutils的編譯安裝詳見 GNU ARM交叉彙編環境的搭建與測試__南安市委书记,本文不再重複表述-|_3218彩城彩票网。為便於參考-|-青白江攀成钢,隻給出binutils的配置命令|-阿克苏诺贝尔 待遇:

../binutils-2.27/configure --prefix=/home/smstong/ARM --target=arm-linux-gnueabihf

後麵配置GCC時-_-臭狗熊和光头强,需要提供與之完全一致的配置參數才行|-找一个身份证号码。

1.2 使用GCC構建Freestanding C交叉編譯環境

1.2.1官網下載GCC最新源碼包

GCC的官網主頁是http://www.gnu.org/software/gcc-|2019王中王平特肖图,這是GCC的大本營__小班下学期班务总结,也是整個GNU的核心部件-_阿克蒙德技能。
截至今天(2016年12月13日)GCC的官方最新版本為gcc-6.2.0-||赢彩彩票可靠吗,下載的軟件包名為gcc-6.2.0.tar.bz2_-若冬之颤。解壓後得到文件夾gcc-6.2.0-__1288彩票合法吗。
然後|-|智胜软件彩票,進入gcc-6.2.0文件夾-_为啥人们啪啪后会感到悲伤,執行./contrib/download_prerequisites腳本--|007a私募内线,這個腳本會自動下載編譯GCC必須的庫isl,mpc,gmp,mpfr等|-玛雅发信。不知道為啥GCC供下載的源碼包裏不直接附帶這幾個軟件包-|_众赢国际骗局揭秘,還非得讓用戶重新下載它|--陕西2台都市快报。

其他的常規編譯環境-__众博彩票网址导航:本地GCC|_-苏岑博客,GNU make|-佟丽娅离婚将净身出户 是真是假,perl_-|锦龙堂,awk--大中电器客服电话,bash等等|_|拱北在哪里,就不在這裏囉嗦了|_辽宁电视台都市频道,一般的用於開發的Linux主機上都已經安裝好了這些基本的開發環境-至尊彩合法吗。

1.2.2 配置安裝

GCC項目也是使用GNU autotools 管理編譯過程的|少年进化论成员,所以生成它第一步必須是執行configure命令|-_魔龙辅助。與binutils一樣_|至尊快三APP,gcc也建議把構建目錄和源碼目錄分離_柯米诺,所以新建一個目錄名為 build-gcc___亿彩彩票是什么,然後進入這個目錄進行整個構建過程-_查网时。

mkdir build-gcc
cd build-gcc
../gcc-6.2.0/configure --prefix=/home/smstong/ARM         # 要與binutils配置時相同
                         --target=arm-linux-gnueabihf     # 要與binutils配置時相同
                         --enable-languages=c             # 隻生成C編譯器
                         --without-headers                # 不使用頭文件
                         --disable-multilib               # 不生成多個庫版本
make all-gcc            # 注意此處的目標是all-gcc|-135彩票网站钱提不出来,也就是freestanding C
make install-gcc        # 相應的安裝的也隻是GCC

安裝完成以後|_gts3370,會發現新生成的交叉編譯器 /home/smstong/ARM/bin/arm-linux-gnueabihf-gcc|中国水产网,同時還有一個硬鏈接在/home/smstong/ARM/arm-linux-gnueabihf/bin/gcc___腾讯中国好声音。執行如下命令測試_|绍兴三味影院:

[smstong@centos192 bin]$ ./arm-linux-gnueabihf-gcc -v
使用內建 specs|_-碳棒生产厂家。
COLLECT_GCC=./arm-linux-gnueabihf-gcc
COLLECT_LTO_WRAPPER=/home/smstong/ARM/libexec/gcc/arm-linux-gnueabihf/6.2.0/lto-wrapper
目標__-盗情txt新浪:arm-linux-gnueabihf
配置為_--殷世航一个月赚多少钱:../gcc-6.2.0/configure --prefix=/home/smstong/ARM/ --target=arm-linux-gnueabihf --enable-languages=c --without-headers --disable-multilib
線程模型__-丁丁网 上海:posix
gcc 版本 6.2.0 (GCC)

2 測試環境

目標機器環境_纯料打包带:
(1)硬件平台TQ2440開發板|驱鬼咒语,Soc CPU為三星2440, ARM920T核心-|-小米1s锤子rom。
(2)Norflash裝有u-boot|_永州八记的作者,可以通過tfgtp下載程序到指定物理內存地址並執行
(3)Nandflash裝有Linux2.6係統|-北京466耳鼻咽喉医院,帶有tftp客戶端工具-|_郑小爽822。
開發主機-_亿彩彩票能提出来钱么:
(1)Centos 7 PC機器
(2)裝有tftp server---花神街,服務目錄為/var/www/tftpboot/_环保设备图片。

3 裸機環境下C程序測試實例

2.1 項目源碼

源碼文件結構_-英皇娱乐:

.
├── Makefile
├── test.c
├── test.lds
└── test.s

test.c

#define rGPBCON (*(volatile unsigned*)0x56000010)
#define rGPBDAT (*(volatile unsigned*)0x56000014)
#define rGPBUP  (*(volatile unsigned*)0x56000018)

void init()
{
    /* 初始化led1 */
    rGPBCON &= ~(3<<10);
    rGPBCON |= (1<<10);
    rGPBUP &= ~(1<<5);

    /* 熄滅led1 */
    rGPBDAT |= (1<<5);
    return;
}

test.lds

ENTRY(init)
SECTIONS {
    . = 0x30000000;
    .text : {
        *(.text)
        *(.rodata)
    }
    .data ALIGN(4): {
        *(.data)
    }
    .bss ALIGN(4): {
        *(.bss)
    }
}

Makefile

CC = arm-linux-gnueabihf-gcc
LD = arm-linux-gnueabihf-ld
OBJCPY = arm-linux-gnueabihf-objcopy

all: test.bin
    sudo cp test.bin /var/lib/tftpboot/
test.bin: test
    $(OBJCPY) -O binary $< $@

test: test.o
    $(LD) --script=test.lds -o $@ $<

test.o: test.c
    $(CC) -c $<
.PHONY: clean
clean:
    rm -rf *.o test test.bin

2.2 編譯鏈接說明

交叉連接器默認的入口點名稱為_start-_安溪野山谷,默認的代碼段基地址為0x00001074-|基金数米网123,生成的可執行文件格式為elf_-众乐彩票可靠吗。而我們要想讓程序在裸機上運行_郑小爽822,需要代碼段基地址為0x30000000__兔瓣影院,文件格式為純二進製鏡像_|圣元优惠多金币联盟。這都可以通過鏈接腳本輕鬆完成-_|365彩票江苏快三正规。另外我們還手動指定了程序入口點為init函數-狱霸电影。

通過Norflash裏的u-boot把生成的test.bin加載到物理內存0x30000000處並執行_苏岑博客,會發現LED1燈被熄滅_石狮海博会。而且執行完成後自動返回到了u-boot中-__第一财经视频网。因為init()函數的最後是return語句-易记彩票。

2.3 看看編譯器生成的彙編代碼

使用gcc test.c -c 時|__优信彩票注册,gcc會把中間產生的彙編代碼文件隱藏-_福益康托玛琳能量杯,為了看到這個中間文件|_晋城5个人,需要通過-S選項調用gcc來生成彙編代碼文件_-饲料上市公司。

arm-linux-gnueabihf-gcc -S test.c

上述命令會生成test.s文件如下|-_大运河开凿于:

    .eabi_attribute 18, 4
    .file   'test.c'
    .text
    .align  2
    .global init
    .syntax unified
    .arm
    .fpu softvfp
    .type   init, %function
init:
    @ args = 0, pretend = 0, frame = 0
    @ frame_needed = 1, uses_anonymous_args = 0
    @ link register save eliminated.
    str fp, [sp, #-4]!
    add fp, sp, #0
    ldr r2, .L2
    ldr r3, .L2
    ldr r3, [r3]
    bic r3, r3, #3072
    str r3, [r2]
    ldr r2, .L2
    ldr r3, .L2
    ldr r3, [r3]
    orr r3, r3, #1024
    str r3, [r2]
    ldr r2, .L2+4
    ldr r3, .L2+4
    ldr r3, [r3]
    bic r3, r3, #32
    str r3, [r2]
    ldr r2, .L2+8
    ldr r3, .L2+8
    ldr r3, [r3]
    orr r3, r3, #32
    str r3, [r2]
    nop
    sub sp, fp, #0
    @ sp needed
    ldr fp, [sp], #4
    bx  lr
.L3:
    .align  2
.L2:
    .word   1442840592
    .word   1442840600
    .word   1442840596
    .size   init, .-init
    .ident  'GCC: (GNU) 6.2.0'
    .section    .note.GNU-stack,'',%progbits

通過gcc生成的彙編代碼_|-若风从零单排闯韩服,我們也可以學習GNU ARM彙編的基本語法|--咏宁 失手死亡的视频。

4 Linux環境下Freestanding C程序測試實例

由於是Freestanding C環境_|-裤子尺寸换算,所以即使在Linux係統下--_菲丝丽妮靓丽祛斑胶囊,仍然沒有可用的標準C庫--网络电视 cctv5。而C語言又不能直接執行軟中斷指令調用Linux的係統調用_天翼3g上网卡,這就導致操作係統提供的API完全不可用|-_球衣之家!(彙編語言反而可以直接通過swi指令來調用係統API)可見在操作係統下--易彩堂跟官方合作了吗?,如果沒有C庫||-圣元优惠多金币联盟,C語言根本無法對硬件進行操作_--百里挑一于淼,也就不可能操控開發板上的LED燈|易点彩票网开机号,甚至也不能打印簡單的hello world--苏州工业园区一站式服务中心,這是何等的悲哀-|_自己人歌词!

為了便於測試_--铜皮规格,我們不得不借助彙編的幫助|双色球精准预测6十1,采用C語言和彙編語言混合編程的方式--托儿费。其中彙編語言提供一個打印字符串的函數和一個退出進程的函數__|亿彩彩票官网欢迎你,C語言調用之|-158开奖计划网。
其實這就相當於自己用彙編語言實現了一個超級簡化的POSIX係統調用C庫_|-电影节目表。
C語言和彙編進行彼此調用|智彩电子走势图11,就必須要遵守相應的函數調用規範|鞍山有线,及APCS(ARM Process Call Standard)|-锦龙股份股吧,請大家自行學習之_--红岩的主要内容。

4.1 項目源碼

項目文件結構圖||通成物流单号查询:

.
├── api.h         # api 頭文件說明
├── api.s         # api 實現
├── Makefile      
├── test.c
└── test.lds     # 鏈接腳本|_新丧尸出笼女主角,指示程序入口

文件 api.h

void print(int fd, char* msg, int len);
int exit(int code);

文件api.s

/*
   void print(int fd, char* msg, int len);
   int exit(int code);

 */

.text
.global print
.global exit
print:
    swi #0x900004
    mov pc,lr

exit:
    swi #0x900001
    mov pc,lr
~

文件test.c

#include 'api.h'

void test()
{
    char* msg = 'hello, freestanding C
';
    int i;
    for (i = 0; i < 10; i++) {
        print(1, msg, 22);
    }
    exit(0);
}

文件test.lds

ENTRY(test)

文件Makefile

CC = arm-linux-gnueabihf-gcc
AS = arm-linux-gnueabihf-as
LD = arm-linux-gnueabihf-ld
OBJCPY = arm-linux-gnueabihf-objcopy

all: test
    sudo cp test /var/lib/tftpboot/
test: test.o api.o
    $(LD) --script=test.lds -o $@ $^

test.o: test.c api.h
    $(CC) -c $<

api.o: api.s
    $(AS) -o $@ $<

.PHONY: clean
clean:
    rm -rf *.o test

4.2 編譯鏈接說明

交叉鏈接器默認生成elf格式文件|-饲料上市公司,可以直接被Linux加載執行_-跆拳道太子妃。應為是Freestanding C--啊不要太快了吴磊,需要在鏈接腳本中指定程序入口點_大连琳琳。

程序執行結果_都匀蓝宇装饰:

[root@EmbedSky /]# tftp -g -r test 172.16.35.188
[root@EmbedSky /]# ./test
hello, freestanding C
hello, freestanding C
hello, freestanding C
hello, freestanding C
hello, freestanding C
hello, freestanding C
hello, freestanding C
hello, freestanding C
hello, freestanding C
hello, freestanding C

5 對Freestanding C的思考

在裸機下-|-197彩票下载,Freetanding C尚可以通過指針的方式直接操控部分硬件資源_ilux me;在OS下|--张靓颖间歇性失聪,所有硬件資源受到操作係統的保護(通過MMU)-|译乐通,Freestanding C根本無法獨立操控任何硬件_易彩堂赢了钱敢要吗?。

所以在實際的開發中-阿诺德蓄电池:

如果是裸機項目-亿贝平台真能赚钱么,C庫本來就不可用|-野兽与乡巴佬下载,Freestanding C是唯一可選C環境-_李涵辰网站,而且能夠完美完成任務|_未成年身份证号码; 如果是基於OS的項目--易发彩票官网,那麼Freestanding C能力不足-_百度钱包借现金,必須要有完整的Hosted C環境才能勝任(當然_--军刺在线观看,也可以自己用彙編寫一個小型C庫-|永盛彩票网可以玩不,但是有現成的GLIBC-_-注册送金币,為啥要重複造輪子呢_|_蚌埠二中网站?)_-_永盛彩票导航。

6 小結

到目前為止--中国达人秀年度盛典,博文 GNU ARM交叉彙編環境的搭建與測試完成了ARM彙編環境的搭建_掌上彩票为什么没网络,本文完成了Freestanding C 編譯環境的搭建_|汾西矿业吧,並給出了詳細的步驟和應用實例-001彩票助手。

下一步-_|殷佳心,就是在這兩個環境下多多練習|-_李白的谈爱,等熟練了-|-约彩彩票qq不能登录,再開始搭建最終的Hosted C完整開發環境-_李驰新浪博客。

延伸閱讀--_松阳电大:

Tag標簽_-设备管理器没有鼠标: 環境  
  • 專題推薦

  • Directx11 遊戲編程入門教程
  • 專題主要學習DirectX的初級編程入門學習||众盈彩票投资是真的吗?,對Directx11的入門及初學者有...... 詳細
  • Javascript 麵向對象編程
  • "麵向對象的JavaScript"這一說法多少有些冗餘_||18年手机上怎么买彩票,因為JavaScript 語言本...... 詳細
  • Windows7係統入門 優化 技巧技術專題
  • Windows7係統專題 無論是升級操作係統__金贵村、資料備份||盈彩彩票可信吗?、加強資料的安全及管...... 詳細
About IT165 - 廣告服務 - 隱私聲明 - 版權申明 - 免責條款 - 網站地圖 - 網友投稿 - 聯係方式
本站內容來自於互聯網,僅供用於網絡技術學習,學習中請遵循相關法律法規
分分彩腾讯分分彩盛世彩票秒速快3天盛彩票旺旺彩票

免责声明: 本站资料及图片来源互联网文章,本网不承担任何由内容信息所引起的争议和法律责任。所有作品版权归原创作者所有,与本站立场无关,如用户分享不慎侵犯了您的权益,请联系我们告知,我们将做删除处理!