<dfn id="is4kg"></dfn>
  • <ul id="is4kg"></ul>
  • <abbr id="is4kg"></abbr>
  • <ul id="is4kg"></ul>
    <bdo id="is4kg"></bdo>

    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 .01563 s, 2 queries.
    主站蜘蛛池模板: 日本在线视频www色| 综合图区亚洲欧美另类图片| 少妇高潮太爽了在线观看| 亚洲人成毛片线播放| 狠狠综合久久av一区二区| 国产午夜a理论毛片在线影院 | 久久伊人五月天| 欧洲精品一区二区三区| 免费人成再在线观看网站| 色五月激情小说| 国产看午夜精品理论片| h视频在线观看免费| 性色av一区二区三区| 久青草国产手机在线观| 欧美午夜精品久久久久免费视| 免费绿巨人草莓秋葵黄瓜丝瓜芭乐| 老色鬼久久综合第一| 国产欧美精品一区二区三区四区| chinesektv直男少爷| 小小在线观看视频www软件| 久久天天躁狠狠躁夜夜不卡 | 国产在线视频一区二区三区98| 97色婷婷成人综合在线观看| 天天躁日日躁aaaaxxxx| 久久91精品综合国产首页 | 国产乱子伦露脸在线| 14又嫩又紧水又多| 国产视频一区二区在线观看| 一级毛片免费在线| 成人无遮挡毛片免费看| 久久精品国产99久久久古代| 极品性放荡的校花小说| 亚洲精品成人a在线观看| 玩弄丰满少妇视频| 四色在线精品免费观看| 胸奶好大好紧好湿好爽| 国产成人无码AⅤ片在线观看| 3344免费播放观看视频 | 国模吧双双大尺度炮交gogo| 一级毛片免费观看不收费| 成人精品一区二区久久|