<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 《Cortex-M0權威指南》之Cortex-M0編程入門(mén)

《Cortex-M0權威指南》之Cortex-M0編程入門(mén)

作者: 時(shí)間:2017-01-03 來(lái)源:網(wǎng)絡(luò ) 收藏

  嵌入式系統編程入門(mén)

本文引用地址:http://dyxdggzs.com/article/201701/342380.htm

  微控制器是如何啟動(dòng)的

  為了保存編譯號的二進(jìn)制程序代碼,大多數的現代微控制器都會(huì )包含片上flash存儲器。有些微控制器還可能有一個(gè)獨立的啟動(dòng)ROM,里面裝有Bootloader程序。微控制器啟動(dòng)后,再執行flash的用戶(hù)程序前,Bootloader會(huì )首先運行。

  在復位流程中,處理器會(huì )取出MSP的初始化值和復位向量,然后開(kāi)始執行復位處理,這些信息都放在一個(gè)叫做啟動(dòng)代碼的程序文件中。啟動(dòng)代碼中的復位處理可能還會(huì )旅行初始化的職責,比如時(shí)鐘控制電路和鎖相環(huán)PLL的初始化。有些情況下,系統初始化的工作是放在C程序的main()函數中進(jìn)行的。

  對于用C開(kāi)發(fā)的應用程序,在進(jìn)入主流程之前,啟動(dòng)代碼已經(jīng)開(kāi)始執行,并且對應用程序用到的變量和內存等進(jìn)行初始化。啟動(dòng)代碼無(wú)需編程者擔心,C開(kāi)發(fā)工具會(huì )將其自動(dòng)插入程序映像中。

   

 

  執行完C啟動(dòng)代碼后,應用程序就開(kāi)始執行了,應用程序通常包含下面幾個(gè)部分:

  硬件初始化(如時(shí)鐘,PLL和外設)

  應用程序的處理部分

  中斷服務(wù)程序

  另外,應用程序可能會(huì )用到C語(yǔ)言庫,此時(shí),C編譯器/鏈接器會(huì )將所需要的庫函數加入編譯好的程序映像中。

  硬件初始化可能會(huì )涉及到一系列的外設、系統控制寄存器和中斷控制器。如果在復位處理時(shí)沒(méi)有進(jìn)行處理,系統時(shí)鐘控制和PLL此時(shí)也需要進(jìn)行初始化。外設初始化完成后,程序就可以繼續執行應用程序部分了。

  嵌入式程序設計

  應用程序處理流程的實(shí)現方式如下:

  輪詢(xún),如圖4-4

  中斷驅動(dòng),如圖4-5

  輪詢(xún)和中斷組合使用,如圖4-6

  處理并發(fā)任務(wù)(操作系統),如圖4-7

   

 

   

 

   

 

  對于復雜的應用程序,可以使用實(shí)時(shí)操作系統(RTOS)。RTOS將處理器時(shí)間劃分為多個(gè)時(shí)間片,在有多個(gè)應用進(jìn)程運行時(shí),只有一個(gè)進(jìn)程會(huì )獲得時(shí)間片。使用RTOS,需要有定時(shí)器產(chǎn)生周期性的中斷請求,當一個(gè)時(shí)間片的時(shí)間到時(shí),RTOS的任務(wù)調度器會(huì )由定時(shí)器中斷觸發(fā),調度器判斷是否需要執行上下文切換。如果需要進(jìn)行上下文切換,調度器會(huì )暫停當前執行的任務(wù),并切換到下一個(gè)準備就緒的任務(wù)。

  輸入和輸出

  在許多嵌入式系統中,輸入或輸出可能會(huì )局限與簡(jiǎn)單的電子接口,如uart、IO、LCD、SD卡等,這些接口由微控制器的外設控制。

  的寄存器映射到了系統空間,并且它們還控制這外設,外設的典型初始化步驟如下:

  配置時(shí)鐘控制回路,使能外設的時(shí)鐘信號,如果有必要的話(huà),初始化相應的引腳。在許多低功耗控制器中,時(shí)鐘信號被分為了多路,而且為了降低功耗,它們可以單獨開(kāi)關(guān)。大多數時(shí)鐘信號默認都是關(guān)閉的,配置外設前需要使能相應的時(shí)鐘。有些情況下,還可能需要使能外設總線(xiàn)系統的時(shí)鐘。

  配置IO口。大多數控制器的引腳都是復用的,需要對IO引腳進(jìn)行相應的功能配置。

  配置外設。大多數外設有自己的控制寄存器,為了確保外設工作正常,需要對寄存器進(jìn)行配置。

  配置中斷。如果外設操作需要中斷處理,需要配置中斷控制器(NVIC)。

  開(kāi)發(fā)流程

  在嵌入式開(kāi)發(fā)中,可以使用C、匯編、C和匯編混合編程。程序代碼的生成流程如下圖所示。

   

 

  C/匯編通過(guò)對應的編譯器生成相應的目標文件,鏈接器腳本加載分散的目標文件生成可執行映像。

  混合編程的實(shí)現是因為C編譯器提供了內聯(lián)匯編器,以便在C程序文件中內聯(lián)匯編代碼。

  C和匯編的選擇

   

  程序映像詳解

  的程序映像一般包括以下幾部分:

  向量表

  C啟動(dòng)代碼

  程序代碼(應用程序代碼和數據)

  C庫代碼(C庫函數的程序代碼,鏈接時(shí)插入)



關(guān)鍵詞: Cortex-M0

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>