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

Rss & SiteMap

曙海教育集團論壇 http://www.bjzhda.cn

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

標題:在Linux下用Gcc 4.3.1進行STM32開發入門

1樓
wangxinxin 發表于:2010-11-25 10:10:27
今天,嘗試了在我使用的Gentoo系統上位Cortex-m3構建GNU工具鏈,沒想到如此簡單。
以超級用戶權限運行如下命令:
crossdev --g 4.3.1-r1 -t arm-elf
因為官方的gcc在4.3版本下加入了對cortex-m3的支持,所以上面的命令用 --g 4.3.1-r1參數,指定了4.3.1-r1版的GCC。整個編譯過程非常順利,編譯成功后得到了:arm-elf-gcc,arm-elf- ld,arm-elf-objcopy等命令,這些就是所需要的工具。

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

2、大俠bluelucky翻譯的《Cortex-M3權威指南》中有關用gcc進行開發的章節。

寫了一個簡單的程序,經測試成功的點亮了LED。

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

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

一、安裝GNU工具鏈
因為在Gentoo Linux下有crossdev這個非常強大的構建交叉編譯工具鏈的工具,安裝Cortex-m3的交叉工具鏈非常簡單,方法前以述及,這里不贅述。

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

《Cortex-M3權威指南》一書中有如下這個開發流程圖:

由圖可知,用C語言進行stm32的程序開發,仍然是:寫代碼--->編譯、連接--->下載到flash這樣一個過程。只不過除此以外,我認為比較重要的還需要知道這樣幾點:
1、如何訪問此種單片機的外圍設備寄存器;
2、如何書寫此種單片機的中斷服務程序;
3、此種單片機復位后,從什么地址處開始執行代碼;然后我們如何告訴編譯工具把代碼按照這個入口地址開始安排我們的代碼。
4、需不需要為構建C語言的運行環境作一些工作,也就是啟動代碼。
5、通過命令行選項通知編譯器為特定的單片機生成代碼。

三、編寫一個最精簡的代碼

1、一個main函數就足夠了嗎?

先讓我們簡單回顧一下在PC機,一個程序的執行過程大概是怎樣的。因為程序是在操作系統的管理下運行的,過程大概為:

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

然而在裸奔的單片機上,操作系統沒有了,所以原來由操作系統和編譯器作的事情,現在需要我們手工DIY了(如果交叉編譯工具沒有為我們做好這些事情的話,因為我也不知道gcc現在有沒有為stm32做好這一切,所以我暫時假定什么都得靠自己)。

2、C程序的典型內存布局

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

上圖中,正文對應的是可執行代碼.text和常量表格數據等.rodata,.data對應初始化了的全局變量,編譯后將位于可執行文件中,由啟動代碼負責加載到數據區中(在單片機中這部分數據會存于flash中,需要有啟動代碼把這部分內容拷貝到sram中),.bss段是沒有初始值的全局變量,由啟動代碼把這部分內容全初始化為0;為了保證C程序的執行,還需要設置好程序運行時的堆棧區。

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


3、設置堆棧區和啟動代碼

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

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

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
};

定義了一個數組VectorTable,作為向量表,定位于.isr_vector段中。通過鏈接腳本的控制這個表將放在正文區的最開始,正文區又將從flash的最開始存放,這樣這個向量表就會起到相當于存放在0x0000 0000開始的地址空間的效果。
向量表的第0個單元是((unsigned long)pulStack + sizeof(pulStack)),這是數組的最后一個元素,因為Cortex-m3的堆棧是向下增長的。
向量表的第1個單元是ResetISR,它指向復位處理的代碼,也是整個程序的入口。本程序用它來實現啟動代碼的功能。

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();
}
這段代碼用到了通過連接器賦值的幾個變量值。_etext的值為正文段結尾處的地址,這之后的flash空間是初始化的數據值,應該復制到sram中去,
_data、_edata的值分別為數據段的開始和結尾處的地址,這部分應該是sram的地址。

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

Copyright © 2000 - 2009 曙海教育集團
Powered By 曙海教育集團 Version 2.2
Processed in .03125 s, 2 queries.
久久精品在这里_成人99免费视频_国产激情视频一区二区在线观看_国产伦精品一区二区三区免费 _亚洲午夜免费福利视频_色狠狠色狠狠综合_av在线综合网_91毛片在线观看_欧美视频一区二区在线观看_极品美女销魂一区二区三区免费_国产亚洲欧美激情_在线免费观看不卡av_日韩不卡一区二区三区_91精品国产麻豆国产自产在线_亚洲国产精品一区二区久久恐怖片_a4yy欧美一区二区三区
18成人免费观看网站下载| 国产欧美一区二区精品性| 中文字幕国产一区| 99久久99久久精品免费观看 | 美脚の诱脚舐め脚责91| 日本高清不卡一区| 六月丁香婷婷久久| 欧美日韩精品一区二区三区蜜桃| 精品中文字幕一区二区| 欧美精品高清视频| 国产成人鲁色资源国产91色综| 欧美丰满高潮xxxx喷水动漫| 国产精品 欧美精品| 日韩欧美三级在线| av电影天堂一区二区在线观看| 精品国产乱码久久久久久夜甘婷婷| 不卡一区二区中文字幕| 久久伊99综合婷婷久久伊| 91丨九色丨黑人外教| 久久久久久久性| 狠狠色伊人亚洲综合网站色| 一区二区三区免费观看| 亚洲一区二区在线看| 久久99国产精品免费| 欧美日韩aaaaaa| 成人av电影在线| 国产精品久久久久影视| 国产成人精品亚洲日本在线桃色| 久久97超碰色| 国产精品免费一区二区三区四区 | 欧美韩日一区二区三区四区| 国内一区二区在线视频观看| 性感美女极品91精品| 欧美男生操女生| 99久久精品免费看国产| 国产精品欧美一区喷水| 色一情一乱一伦一区二区三区| 精品一区二区综合| 久久亚洲春色中文字幕久久久| 精品国产一区二区三区麻豆免费观看完整版| 一区二区三区在线视频免费观看| 色88888久久久久久影院野外| 国产经典欧美精品| 国产欧美日韩精品a在线观看| 欧洲一区二区在线| 久久国产欧美日韩精品| 欧美精品一区二区三区蜜臀| 免费在线成人av| 国产揄拍国内精品对白| 国产女人aaa级久久久级| 亚洲国产欧美日韩| 国产精品伊人色| 国产精品麻豆久久久| 色婷婷激情久久| 一级精品视频在线观看宜春院 | 国产精品18久久久久久久网站| 久久久久9999亚洲精品| 天天综合狠狠精品| 国产风韵犹存在线视精品| 中文字幕精品综合| 色偷偷一区二区三区| 91免费在线播放| 视频一区在线视频| www激情久久| 五月天久久狠狠| 成人国产免费视频| 亚洲精品国产成人久久av盗摄| 在线精品视频免费播放| 7777精品久久久大香线蕉小说| 亚洲国产日韩a在线播放性色| 欧美一区二区三区在线| 欧美在线视频一区二区三区| 国产精品自在欧美一区| 一区2区3区在线看| 东方欧美亚洲色图在线| 天天综合狠狠精品| 综合av第一页| 产国精品偷在线| 欧美精品一区二区三区蜜臀| 日本韩国欧美三级| 国产一区 二区| 亚洲啪啪综合av一区二区三区| 6080yy午夜一二三区久久| 成人免费在线看片| 久久精品国内一区二区三区| 亚洲欧洲www| 精品毛片乱码1区2区3区 | 日本欧美久久久久免费播放网| 久久久久久麻豆| 欧美日韩国产精品自在自线| 六月婷婷久久| 99久久99久久久精品齐齐| 免费在线欧美视频| 亚洲视频免费观看| 精品久久人人做人人爽| 在线视频欧美精品| 欧美在线一二三区| 91免费版黄色| 成人综合婷婷国产精品久久蜜臀| 香蕉成人伊视频在线观看| 亚洲国产精品传媒在线观看| 欧美一级黄色片| 91免费观看| 不卡电影一区二区三区| 另类人妖一区二区av| 亚洲一区二区视频| 国产精品视频一区二区三区不卡| 日韩一区二区电影在线| 欧美性生活影院| 亚洲精品tv久久久久久久久| 国语精品中文字幕| 91手机在线视频| 成人激情开心网| 国产揄拍国内精品对白| 蜜桃免费网站一区二区三区| 亚洲电影一区二区| 一区二区三区在线免费播放| 国产精品久久久久久久裸模| xfplay精品久久| 精品黑人一区二区三区久久| 91精品一区二区三区久久久久久| 色婷婷综合中文久久一本| 四虎永久国产精品| 日韩欧美亚洲在线| 日韩欧美激情一区二区| 久久久com| 久久综合九九| 狼狼综合久久久久综合网| 国产精品麻豆欧美日韩ww| 国产精品swag| 亚洲午夜一二三区视频| 欧美男女性生活在线直播观看| 99精品久久只有精品| 亚洲欧美日韩中文字幕一区二区三区 | 色狠狠综合天天综合综合| 欧美午夜视频在线| 欧美精品尤物在线| 久久精品久久精品国产大片| 六月婷婷久久| 日本一区二区三区四区高清视频| 国产精品久久久对白| 国产精品综合久久久久久| 国产精品免费看一区二区三区| 国产精品日韩一区二区三区 | 一区二区国产盗摄色噜噜| 亚洲精品一二三区| 亚洲成人免费av| 日本午夜精品视频在线观看 | 欧美精品一区二区久久婷婷| 久久综合色婷婷| 国产日韩欧美一区二区三区乱码| 中文在线资源观看网站视频免费不卡| 欧美国产日韩精品免费观看| 综合久久久久综合| 亚洲一区二区三区爽爽爽爽爽| 婷婷开心久久网| 久久国产欧美日韩精品| 国产精品综合久久| 91在线你懂得| 九色综合日本| 亚洲国产精品久久久久婷婷老年 | 曰韩精品一区二区| 婷婷综合五月天| 久久超级碰视频| 成人app网站| 国产精品免费一区二区| 欧美精品久久久| 色婷婷综合中文久久一本| 欧美一区二区黄色| 国产夜色精品一区二区av| 亚洲精品自拍动漫在线| 日韩成人免费电影| 风间由美一区二区三区在线观看 | 日韩va亚洲va欧美va久久| 欧美xxxxxxxxx| 久久久精品免费观看| 亚洲人精品一区| 蜜桃91丨九色丨蝌蚪91桃色| 成人性生交大片| 久久精品五月婷婷| 在线视频欧美精品| 久久综合色一综合色88| 一个色在线综合| 国产一区二区三区久久悠悠色av| 91麻豆精品一区二区三区| 日本高清久久一区二区三区| 欧美视频日韩视频| 国产视频一区二区在线观看| 亚洲小说欧美激情另类| 国产精品99久久久久久久女警 | 一区二区三区91| 国模套图日韩精品一区二区| 97人人模人人爽人人喊38tv| 神马一区二区影院| 日韩三级在线免费观看| 亚洲精品高清在线| 国产精品一区二区在线观看网站| 高清国产一区| 欧美系列一区二区| 国产精品污网站|