波多在线播放_激情深爱五月_久久欧美精品_成人超碰_国产久_www.pixiv.moe


曙海教育集團論壇Linux專區(qū)Linux系統(tǒng)開發(fā) → 在Linux下用Gcc 4.3.1進行STM32開發(fā)入門


  共有7897人關注過本帖樹形打印

主題:在Linux下用Gcc 4.3.1進行STM32開發(fā)入門

美女呀,離線,留言給我吧!
wangxinxin
  1樓 個性首頁 | 博客 | 信息 | 搜索 | 郵箱 | 主頁 | UC


加好友 發(fā)短信
等級:青蜂俠 帖子:1393 積分:14038 威望:0 精華:0 注冊:2010-11-12 11:08:23
在Linux下用Gcc 4.3.1進行STM32開發(fā)入門  發(fā)帖心情 Post By:2010-11-25 10:10:27

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

參考
1、
大俠 bozai 章其波 在
[原創(chuàng)] 支持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進行開發(fā)的章節(jié)。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


3、設置堆棧區(qū)和啟動代碼

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

__attribute__ ((section(".stackarea")))
static unsigned long pulStack[STACK_SIZE];
這一句定義了一個pulStack的數(shù)組,程序把這個數(shù)組作為了堆棧區(qū)。這條語句使用了__attribute__ ((section(".stackarea"))) 把數(shù)組定位在了.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
};

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

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空間是初始化的數(shù)據(jù)值,應該復制到sram中去,
_data、_edata的值分別為數(shù)據(jù)段的開始和結尾處的地址,這部分應該是sram的地址。

        pulSrc = &_etext;
        for(pulDest = &_data; pulDest < &_edata; )
        {
                *pulDest++ = *pulSrc++;
        }
這部分代碼就是將保存于flash中的初始化數(shù)據(jù)復制到sram中。
上面代碼中的第二個循環(huán)是將.bss段清零。最后調用main進入到我們的主程序。

支持(0中立(0反對(0單帖管理 | 引用 | 回復 回到頂部

返回版面帖子列表

在Linux下用Gcc 4.3.1進行STM32開發(fā)入門








簽名
主站蜘蛛池模板: 欧美第一页草草影院浮力 | 日本高清视频免费在线观看 | 亚洲福利| 一级毛片免费不卡在线 | 国产视频在线免费观看 | 久久综合九色综合欧美狠狠 | www.99xxxx.com| 日本香港三级和澳门三级 | 天天夜夜人人 | 91久久久久久久久 | 国产视频导航 | 亚洲国内精品 | 成人午夜电影网 | 亚洲成人在线免费 | 日韩一区二区在线观看 | 婷婷在线观看网站 | 中文字幕日韩欧美一区二区三区 | 成人午夜爽爽爽免费视频 | 精品福利在线视频 | 国产亚洲成av人在线观看导航 | 国产精一区二区 | 成人国产精品免费网站 | 日本在线视频一区二区 | 日韩精品一区二区三区中文字幕 | 久久久婷| 欧美精品 在线观看 | 看中国国产一级毛片真人视频 | www.日韩av.com| 午夜色站 | 在线精品亚洲欧美日韩国产 | 国产成人不卡 | 四虎影院在线播放 | 久久久久无码国产精品一区 | 国产日韩一区 | av免费在线观看国产 | 国产成人精品日本亚洲11 | 一本一本久久α久久精品66 | 久久国产精品一区二区三区 | 国产av毛片| 精品一卡2卡三卡四卡二卡 欧美不卡一区二区三区在线观看 | 色哦色哦哦色天天综合 |