久久精品在这里_成人99免费视频_国产激情视频一区二区在线观看_国产伦精品一区二区三区免费 _亚洲午夜免费福利视频_色狠狠色狠狠综合_av在线综合网_91毛片在线观看_欧美视频一区二区在线观看_极品美女销魂一区二区三区免费_国产亚洲欧美激情_在线免费观看不卡av_日韩不卡一区二区三区_91精品国产麻豆国产自产在线_亚洲国产精品一区二区久久恐怖片_a4yy欧美一区二区三区

Rss & SiteMap

曙海教育集團(tuán)論壇 http://www.bjzhda.cn

曙海教育集團(tuán)論壇
共1 條記錄, 每頁(yè)顯示 10 條, 頁(yè)簽: [1]
[瀏覽完整版]

標(biāo)題:在Linux下用Gcc 4.3.1進(jìn)行STM32開(kāi)發(fā)入門

1樓
wangxinxin 發(fā)表于:2010-11-25 10:10:27
今天,嘗試了在我使用的Gentoo系統(tǒng)上位Cortex-m3構(gòu)建GNU工具鏈,沒(méi)想到如此簡(jiǎn)單。
以超級(jí)用戶權(quán)限運(yùn)行如下命令:
crossdev --g 4.3.1-r1 -t arm-elf
因?yàn)楣俜降膅cc在4.3版本下加入了對(duì)cortex-m3的支持,所以上面的命令用 --g 4.3.1-r1參數(shù),指定了4.3.1-r1版的GCC。整個(gè)編譯過(guò)程非常順利,編譯成功后得到了:arm-elf-gcc,arm-elf- ld,arm-elf-objcopy等命令,這些就是所需要的工具。

參考
1、
大俠 bozai 章其波 在
[原創(chuàng)] 支持cortex-M3 的GNU ARM編譯器 CodeSourcery 上的第一個(gè)STM32F10x例子
http://www.ouravr.com/bbs/bbs_li ... 1&bbs_page_no=2
一帖中給出的工程(makefile和ldscripts)

2、大俠bluelucky翻譯的《Cortex-M3權(quán)威指南》中有關(guān)用gcc進(jìn)行開(kāi)發(fā)的章節(jié)。

寫(xiě)了一個(gè)簡(jiǎn)單的程序,經(jīng)測(cè)試成功的點(diǎn)亮了LED。

所有心得不敢獨(dú)享,在這里與大家分享一下,一并謝謝bluelucky和章其波的辛勤勞作。

-------------------------------------------------------------------------------------------------------------------------------------

一、安裝GNU工具鏈
因?yàn)樵贕entoo Linux下有crossdev這個(gè)非常強(qiáng)大的構(gòu)建交叉編譯工具鏈的工具,安裝Cortex-m3的交叉工具鏈非常簡(jiǎn)單,方法前以述及,這里不贅述。

二、STM32F10x(Cortex-m3)基于GNU工具鏈的開(kāi)發(fā)流程

《Cortex-M3權(quán)威指南》一書(shū)中有如下這個(gè)開(kāi)發(fā)流程圖:

由圖可知,用C語(yǔ)言進(jìn)行stm32的程序開(kāi)發(fā),仍然是:寫(xiě)代碼--->編譯、連接--->下載到flash這樣一個(gè)過(guò)程。只不過(guò)除此以外,我認(rèn)為比較重要的還需要知道這樣幾點(diǎn):
1、如何訪問(wèn)此種單片機(jī)的外圍設(shè)備寄存器;
2、如何書(shū)寫(xiě)此種單片機(jī)的中斷服務(wù)程序;
3、此種單片機(jī)復(fù)位后,從什么地址處開(kāi)始執(zhí)行代碼;然后我們?nèi)绾胃嬖V編譯工具把代碼按照這個(gè)入口地址開(kāi)始安排我們的代碼。
4、需不需要為構(gòu)建C語(yǔ)言的運(yùn)行環(huán)境作一些工作,也就是啟動(dòng)代碼。
5、通過(guò)命令行選項(xiàng)通知編譯器為特定的單片機(jī)生成代碼。

三、編寫(xiě)一個(gè)最精簡(jiǎn)的代碼

1、一個(gè)main函數(shù)就足夠了嗎?

先讓我們簡(jiǎn)單回顧一下在PC機(jī),一個(gè)程序的執(zhí)行過(guò)程大概是怎樣的。因?yàn)槌绦蚴窃诓僮飨到y(tǒng)的管理下運(yùn)行的,過(guò)程大概為:

操作系統(tǒng)----------> 啟動(dòng)代碼(編譯器自動(dòng)加入,做一些堆棧、全局變量的初始化工作)-----------> main

然而在裸奔的單片機(jī)上,操作系統(tǒng)沒(méi)有了,所以原來(lái)由操作系統(tǒng)和編譯器作的事情,現(xiàn)在需要我們手工DIY了(如果交叉編譯工具沒(méi)有為我們做好這些事情的話,因?yàn)槲乙膊恢纆cc現(xiàn)在有沒(méi)有為stm32做好這一切,所以我暫時(shí)假定什么都得靠自己)。

2、C程序的典型內(nèi)存布局

            +-------------------------------+
            |                               |
            |            堆棧               |
            |                               |
            + - - - - - - - - - - - - - - - +
            |                               |
            |                               |
            |                               |
            |                               |
            |                               |
            |                               |
            |                               |
            |                               |
            |                               |
            + - - - - - - - - - - - - - - - +
            |                               |
            |             堆                |
            |                               |
            +-------------------------------+
            |                               |
            |        未初始化的數(shù)據(jù)         |
            |           .bss段              |
            |                               |
            +-------------------------------+
            |                               |
            |         初始化的數(shù)據(jù)          |
            |           .data段             |
            |                               |
            +-------------------------------+
            |                               |
            |            正文               |           
            |           .text段             |
            |          .rodata段            |
            |                               |
            +-------------------------------+

上圖中,正文對(duì)應(yīng)的是可執(zhí)行代碼.text和常量表格數(shù)據(jù)等.rodata,.data對(duì)應(yīng)初始化了的全局變量,編譯后將位于可執(zhí)行文件中,由啟動(dòng)代碼負(fù)責(zé)加載到數(shù)據(jù)區(qū)中(在單片機(jī)中這部分?jǐn)?shù)據(jù)會(huì)存于flash中,需要有啟動(dòng)代碼把這部分內(nèi)容拷貝到sram中),.bss段是沒(méi)有初始值的全局變量,由啟動(dòng)代碼把這部分內(nèi)容全初始化為0;為了保證C程序的執(zhí)行,還需要設(shè)置好程序運(yùn)行時(shí)的堆棧區(qū)。

在有了這些基礎(chǔ)知識(shí)后,除了main以外,我們還需要做些什么就比較清楚了:設(shè)置堆棧區(qū),把編譯好的內(nèi)容放到單片機(jī)中正確的地方中去。


3、設(shè)置堆棧區(qū)和啟動(dòng)代碼

Cortex-m3內(nèi)核在地址0x0000 0000處存放一個(gè)向量表,向量表的第0個(gè)單元,也即地址0x0000 0000處存放的是堆棧頂?shù)牡刂罚珻ortex-m3復(fù)位后即從該處取出數(shù)據(jù)用以初始化MSP寄存器。向量表中的內(nèi)容是32位的地址,這些地址是中斷異常服務(wù)程序的入口地址,其中向量表的第一個(gè)單元,即地址0x0000 0004處存放的是復(fù)位向量,也就是說(shuō)Cortex-m3復(fù)位后,執(zhí)行該向量(可理解為函數(shù)指針)指向的復(fù)位代碼。看看代碼吧:

__attribute__ ((section(".stackarea")))
static unsigned long pulStack[STACK_SIZE];
這一句定義了一個(gè)pulStack的數(shù)組,程序把這個(gè)數(shù)組作為了堆棧區(qū)。這條語(yǔ)句使用了__attribute__ ((section(".stackarea"))) 把數(shù)組定位在了.stackarea這個(gè)段中。

typedef void (* pfnISR)(void);

__attribute__ ((section(".isr_vector")))
pfnISR        VectorTable[] =  
{

        (pfnISR)((unsigned long)pulStack + sizeof(pulStack)),        // The initial stack pointer
        ResetISR,                                               // The reset handler
        NMIException,
        HardFaultException
};

定義了一個(gè)數(shù)組VectorTable,作為向量表,定位于.isr_vector段中。通過(guò)鏈接腳本的控制這個(gè)表將放在正文區(qū)的最開(kāi)始,正文區(qū)又將從flash的最開(kāi)始存放,這樣這個(gè)向量表就會(huì)起到相當(dāng)于存放在0x0000 0000開(kāi)始的地址空間的效果。
向量表的第0個(gè)單元是((unsigned long)pulStack + sizeof(pulStack)),這是數(shù)組的最后一個(gè)元素,因?yàn)镃ortex-m3的堆棧是向下增長(zhǎng)的。
向量表的第1個(gè)單元是ResetISR,它指向復(fù)位處理的代碼,也是整個(gè)程序的入口。本程序用它來(lái)實(shí)現(xiàn)啟動(dòng)代碼的功能。

extern unsigned long _etext;
extern unsigned long _data;
extern unsigned long _edata;
extern unsigned long _bss;
extern unsigned long _ebss;

void ResetISR(void)
{
        unsigned long *pulSrc, *pulDest;

        //
        // Copy the data segment initializers from flash to SRAM.
        //
        pulSrc = &_etext;
        for(pulDest = &_data; pulDest < &_edata; )
        {
                *pulDest++ = *pulSrc++;
        }

        //
        // Zero fill the bss segment.
        //
        for(pulDest = &_bss; pulDest < &_ebss; )
        {
                *pulDest++ = 0;
        }

        //
        // Call the application's entry point.
        //
        main();
}
這段代碼用到了通過(guò)連接器賦值的幾個(gè)變量值。_etext的值為正文段結(jié)尾處的地址,這之后的flash空間是初始化的數(shù)據(jù)值,應(yīng)該復(fù)制到sram中去,
_data、_edata的值分別為數(shù)據(jù)段的開(kāi)始和結(jié)尾處的地址,這部分應(yīng)該是sram的地址。

        pulSrc = &_etext;
        for(pulDest = &_data; pulDest < &_edata; )
        {
                *pulDest++ = *pulSrc++;
        }
這部分代碼就是將保存于flash中的初始化數(shù)據(jù)復(fù)制到sram中。
上面代碼中的第二個(gè)循環(huán)是將.bss段清零。最后調(diào)用main進(jìn)入到我們的主程序。
共1 條記錄, 每頁(yè)顯示 10 條, 頁(yè)簽: [1]

Copyright © 2000 - 2009 曙海教育集團(tuán)
Powered By 曙海教育集團(tuán) Version 2.2
Processed in .01563 s, 2 queries.
久久精品在这里_成人99免费视频_国产激情视频一区二区在线观看_国产伦精品一区二区三区免费 _亚洲午夜免费福利视频_色狠狠色狠狠综合_av在线综合网_91毛片在线观看_欧美视频一区二区在线观看_极品美女销魂一区二区三区免费_国产亚洲欧美激情_在线免费观看不卡av_日韩不卡一区二区三区_91精品国产麻豆国产自产在线_亚洲国产精品一区二区久久恐怖片_a4yy欧美一区二区三区
中文字幕欧美日本乱码一线二线 | 国产精品视频麻豆| 欧美精品一区二区不卡| 久久人人97超碰com| 国产精品第五页| 一区二区三区不卡在线观看| 日韩制服丝袜av| 福利一区二区在线观看| 91久久国产综合久久蜜月精品| 精品91免费| 最新精品视频| 精品国产凹凸成av人导航| 国产精品毛片高清在线完整版| 亚洲午夜日本在线观看| 麻豆中文一区二区| 99精品国产视频| 欧美一区观看| 宅男噜噜噜66一区二区66| 国产精品欧美一级免费| 日韩av电影免费观看高清完整版在线观看| 国产一区二区三区免费在线观看| 91在线精品秘密一区二区| 日韩高清av| 91精品国产福利| 亚洲三级视频在线观看| 麻豆国产精品视频| 成人看片在线| 91福利社在线观看| 国产日韩精品一区二区三区| 午夜影视日本亚洲欧洲精品| 成人av资源在线观看| 亚洲精品成人a8198a| 精品久久久久久中文字幕动漫| 久久亚洲精华国产精华液| 色屁屁一区二区| 精品欧美久久久| 一区二区三区在线高清| 国产69精品久久777的优势| 国产精品对白一区二区三区| 91高清视频免费看| 中文字幕第一区综合| 美美哒免费高清在线观看视频一区二区 | 欧美一区二区三区视频| 一区二区三区成人| 91丨九色porny丨蝌蚪| 色综合 综合色| 亚洲色欲色欲www| 成人美女在线视频| 在线观看国产日韩| 亚洲色图欧美在线| 99精品国产热久久91蜜凸| 色国产精品一区在线观看| 国产精品传媒在线| 懂色av一区二区在线播放| 色偷偷久久人人79超碰人人澡| 中文字幕一区二区三区在线观看| 盗摄精品av一区二区三区| 色又黄又爽网站www久久| 亚洲美女淫视频| 国产激情一区二区三区在线观看| 日韩一区二区三区四区五区六区 | 日本特黄久久久高潮| 国产日本一区二区三区| 精品福利视频一区二区三区| 国产一本一道久久香蕉| 色偷偷久久人人79超碰人人澡| 亚洲乱码精品一二三四区日韩在线| www.欧美色图| 日韩三级在线观看| 黄色日韩网站视频| 91黄色激情网站| 婷婷综合五月天| 香蕉久久夜色| 亚洲一区二区三区在线看| 久久久精品动漫| 国产精品二三区| 国产日韩精品推荐| 中文在线一区二区| 99久久一区三区四区免费| 精品久久人人做人人爰| 国产成人激情av| 日韩丝袜美女视频| 福利91精品一区二区三区| 91麻豆精品国产91久久久| 国产一区美女在线| 91精品国产全国免费观看| 国产高清精品在线| 精品久久国产97色综合| 成人av影院在线| 久久网站最新地址| 91美女福利视频| 日本一区二区三区电影| 国产原创精品| 一级女性全黄久久生活片免费| 日韩精彩视频| 免费在线一区观看| 69久久夜色精品国产69蝌蚪网| 国产一区不卡在线| 日韩一区二区三区免费看| www.色综合.com| 欧美国产一区视频在线观看| 国产91色在线|亚洲| 亚洲人成网站精品片在线观看| 欧美精品一区二区视频| 亚洲国产欧美一区二区三区丁香婷| 亚洲国产日韩综合一区| 久久99久久99| 精品国产区一区| 国内精品二区| 五月开心婷婷久久| 正在播放亚洲一区| 国产精品一区二区三区不卡 | 亚洲小说欧美激情另类| 伊人久久青草| 国产精品一区免费在线观看| 久久综合九色综合欧美98| 波多野结衣久草一区| 亚洲欧美综合另类在线卡通| 亚洲春色在线视频| 久草中文综合在线| 精品久久人人做人人爰| 国产精品免费在线播放| 亚洲国产日产av| 91精品欧美一区二区三区综合在 | 中文字幕中文字幕在线中一区高清| 免费xxxx性欧美18vr| 日韩女优av电影在线观看| 99精彩视频| 亚洲美女一区二区三区| 欧美日韩一区小说| 成人在线免费观看一区| 午夜精品久久久久久久99樱桃| 欧美日本韩国一区二区三区视频| 99在线高清视频在线播放| 亚洲aⅴ怡春院| 3d成人h动漫网站入口| 成人av片网址| 视频一区二区国产| 久久久亚洲精华液精华液精华液 | 亚洲精品无人区| 久久精品久久99精品久久| 久久久久久夜精品精品免费| 欧洲一区二区在线观看| 国产成人啪免费观看软件 | 日韩专区欧美专区| 欧美精品在线观看一区二区| 91蜜桃传媒精品久久久一区二区| 亚洲制服丝袜av| 久久久一区二区三区| 一区二区三区四区不卡| 91成人伦理在线电影| 丝袜亚洲精品中文字幕一区| 日韩免费电影一区| 色呦呦一区二区三区| 国产精品嫩草在线观看| 久久99国产乱子伦精品免费| 亚洲精品一卡二卡| 日韩视频一区二区| 亚洲免费精品视频| av午夜一区麻豆| 麻豆成人av在线| 夜夜爽夜夜爽精品视频| 久久久不卡网国产精品一区| 欧美综合欧美视频| 狠狠久久综合婷婷不卡| 成人性生交大片免费看在线播放| 亚洲午夜视频在线| 国产欧美日产一区| 日韩一卡二卡三卡国产欧美| 深夜福利成人| 国产精品久久国产三级国电话系列| 青娱乐精品在线视频| 亚洲欧美国产高清| 久久久久久99久久久精品网站| 欧美色网站导航| 欧美午夜欧美| 2019国产精品视频| 成人午夜电影网站| 韩国女主播成人在线| 午夜电影久久久| 亚洲成人你懂的| 中文字幕在线一区二区三区| 日韩亚洲欧美成人一区| 午夜欧美性电影| 免费久久久一本精品久久区| 97人人做人人人难人人做| 高清国产一区二区三区| 视频一区免费在线观看| 亚洲欧洲国产专区| 欧美国产欧美亚州国产日韩mv天天看完整| 在线不卡的av| 91黄色在线观看| 色综合久久久网| 亚洲一区二区四区| 欧美在线播放一区| 久久天堂国产精品| 国产视频在线观看一区| 国产99在线免费| 动漫精品视频| 国产成人看片|