日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 嵌入式 > 技術(shù)讓夢想更偉大
[導讀]關(guān)注、星標公眾號 ,直達精彩內(nèi)容 FreeRTOS下載包的文件結(jié)構(gòu) 在FreeRTOS官方網(wǎng)站可以下載到最新版的FreeRTOS包,我這里使用的是V8.2.3版本。 下載包內(nèi)的總文件數(shù)量多的令人生畏,但文件結(jié)構(gòu)卻很簡潔?!禙reeRTOS入門指南》一文的第3節(jié)詳細描述了下載包文件結(jié)


關(guān)注、星標公眾號 ,直達精彩內(nèi)容

FreeRTOS下載包的文件結(jié)構(gòu)

在FreeRTOS官方網(wǎng)站可以下載到最新版的FreeRTOS包,我這里使用的是V8.2.3版本。

下載包內(nèi)的總文件數(shù)量多的令人生畏,但文件結(jié)構(gòu)卻很簡潔。《FreeRTOS入門指南》一文的第3節(jié)詳細描述了下載包文件結(jié)構(gòu),我們這里只是簡單提一下。

下載包根目錄下包含兩個子目錄:FreeRTOS和FreeRTOS-Plus。其中,F(xiàn)reeRTOS-Plus文件夾中包含一些FreeRTOS+組件和演示例程(組件大都收費),我們不對這個文件夾下的內(nèi)容多做了解,重點說一下FreeRTOS文件夾。

FreeRTOS文件夾下包含兩個子目錄:Demo和Source。其中,Demo包含演示例程的工程文件,Source包含實時操作系統(tǒng)源代碼文件。

FreeRTOS實時操作系統(tǒng)內(nèi)核僅包含三個必要文件,此外還有三個可選文件。RTOS核心代碼位于三個源文件中,分別是tasks.c、queue.c和list.c。這三個文件位于FreeRTOS/Source目錄下,在同一目錄下還有3個可選的文件,叫做timers.c、event_groups.c和croutine.c,分別用于軟件定時器、事件組和協(xié)程。

對于支持的處理器架構(gòu),RTOS需要一些與處理器架構(gòu)相關(guān)的代碼??梢苑Q之為RTOS硬件接口層,它們位于FreeRTOS/Source/Portable/[相應編譯器]/[相應處理器架構(gòu)] 文件夾下。我們這次要移植到Cortex-M3微控制,使用Keil MDK編譯器,所以需要的RTOS硬件接口代碼位于:FreeRTOS\Source\portable\RVDS\ARM_CM3文件夾下。

堆棧分配也是屬于硬件接口層(移植層),在FreeRTOS/Source/portable/MemMang文件夾下具有各種類型的堆棧分配方案。這里我們使用heap_1.c提供的堆棧分配方案。關(guān)于FreeRTOS的內(nèi)存管理,后續(xù)《FreeRTOS內(nèi)存管理》一文中會詳細介紹FreeRTOS內(nèi)存管理的特性和用法,《FreeRTOS內(nèi)存管理分析》一文會從源碼級別分析FreeRTOS內(nèi)存管理的具體實現(xiàn),這里不用多糾結(jié),你也可以快速的瀏覽一下這兩篇文章,里面或許有許多不懂的,但不要著急,先放過它們。

FreeRTOS文件夾下的Demo文件夾中還包括各種演示例程,涉及多種架構(gòu)的處理器以及多種編譯器。FreeRTOS/Demo/Common/Minimal文件夾下的演示例程代碼中,絕大部分對所有移植硬件接口都是適用的。FreeRTOS/Demo/Common/Full文件夾下的代碼屬于歷史遺留代碼,僅用于PC移植層。

移植前的一些準備

一塊具有Cortex-M3微處理器的硬件板子,并且保證板子可以正常運轉(zhuǎn)。下載FreeRTOS程序包(《FreeRTOS歷史版本更新記錄》一文中有下載地址,這是我在CSDN下載頻道做的鏡像文件。如果你能忍受下載網(wǎng)速慢,也可以去官方網(wǎng)站下載。) 下載CMSIS-M3,其實主要是需要里面的core_cm3.h文件(可以去ARM官方下載,如果你安裝了keil 5或比較新的Keil 4 MDK編譯器,在目錄:Keil\ARM\CMSIS文件夾下也可以找到)

移植過程

添加RTOS核心代碼

將tasks.c、queue.c和list.c這三個內(nèi)核代碼加入工程,將port.c和heap_1.c這兩個與處理器相關(guān)代碼加入工程。port.c位于FreeRTOS\Source\portable\RVDS\ARM_CM3文件夾下,heap_1.c位于FreeRTOS/Source/portable/MemMang文件夾下。

添加頭文件路徑

  1. ...\FreeRTOS\Source\portable\RVDS\ARM_CM3
  2. ...\FreeRTOS\Source\include

編寫FreeRTOSConfig.h文件

對于剛接觸FreeRTOS的用戶來說,最簡單方法是找一個類似的Demo工程,復制該工程下的FreeRTOSConfig.h文件,在這個基礎上進行修改。詳細的配置說明將在后續(xù)《FreeRTOS內(nèi)核配置說明》一文中給出,這里依然不必糾結(jié)。

編寫一些鉤子函數(shù)

如果你在FreeRTOSConfig.h中設置了「configUSE_TICK_HOOK=1」,則必須編寫voidvApplicationTickHook( void )函數(shù)。該函數(shù)利用時間片中斷,可以很方便的實現(xiàn)一個定時器功能。詳見后續(xù)文章《FreeRTOS內(nèi)核配置說明》有關(guān)宏configUSE_TICK_HOOK一節(jié)。

如果你在FreeRTOSConfig.h中設置了「configCHECK_FOR_STACK_OVERFLOW=1或=2」,則必須編寫voidvApplicationStackOverflowHook( xTaskHandle pxTask, signed char *pcTaskName )函數(shù),該函數(shù)用于檢測堆棧溢出,詳見后續(xù)文章《FreeRTOS內(nèi)核配置說明》有關(guān)宏configCHECK_FOR_STACK_OVERFLOW一節(jié)。

檢查硬件

為了驗證你的硬件板子是否可靠的工作,首先編寫一個小程序片,比如閃爍一個LED燈或者發(fā)送一個字符等等,我們這里使用UART發(fā)送一個字符。代碼如下所示(假設你已經(jīng)配置好了啟動代碼,并正確配置了UART):

 #include"task.h"
#include"queue.h"
#include"list.h"
#include"portable.h"
#include"debug.h"

int main(void)
{
init_rtos_debug(); //初始化調(diào)試串口
MAP_UARTCharPut('A'); //發(fā)送一個字符
while(1);
}

如果硬件可以正常發(fā)送字符,說明硬件以及啟動代碼OK,可以進行下一步。

掛接中斷

在Cortex-M3硬件下,F(xiàn)reeRTOS使用SysTick作為系統(tǒng)節(jié)拍時鐘,使用SVC和PendSVC進行上下文切換。異常中斷服務代碼位于port.c文件中,F(xiàn)reeRTOS的作者已經(jīng)為各種架構(gòu)的CPU寫好了這些代碼,可以直接拿來用,需要用戶做的,僅僅是將這些異常中斷入口地址掛接到啟動代碼中。

在startup.s中,使用IMPORT關(guān)鍵字聲明要掛接的異常中斷服務函數(shù)名,然后將:

 DCD     SVC_Handler            換成:DCD     vPortSVCHandler
DCD PendSV_Handler 換成:DCD xPortPendSVHandler
DCD SysTick_Handler 換成:DCD xPortSysTickHandler

建立第一個任務Task

在步驟3.5中,我們?yōu)榱藴y試硬件是是否能夠工作,編寫了一個發(fā)送字符的小函數(shù),這里我們將把這個小函數(shù)作為我們第一個任務要執(zhí)行的主要代碼:每隔1秒鐘,發(fā)送一個字符。代碼如下所示:

voidvTask(void *pvParameters)
{
while(1)
{
MAP_UARTCharPut(0x31);
vTaskDelay(1000/portTICK_RATE_MS);
}
}

FreeRTOS的任務以及編寫格式將在后續(xù)文章《FreeRTOS任務概述》一文中詳述,這里只是一個很簡單的任務,先有有大體印象。這里面有一個API函數(shù)vTaskDelay(),這個函數(shù)用于延時,具體用法將在后續(xù)文章《FreeRTOS任務控制》一文中詳細介紹,延時函數(shù)代碼級分析將在《FreeRTOS高級篇10---系統(tǒng)節(jié)拍時鐘分析》。這里不必在意太多的未知情況,因為后面會一點點將這些未知空間探索一遍的。

設置節(jié)拍時鐘

這里我們使用SysTick定時器作為系統(tǒng)的節(jié)拍時鐘,設定每隔10ms產(chǎn)生一次節(jié)拍中斷。由于FreeRTOS對移植做了非常多的工作,以至于我們只需要在FreeRTOSConfig.h中配置好以下兩個宏定義即可:

  1. configCPU_CLOCK_HZ     (/ 你的硬件平臺CPU系統(tǒng)時鐘,F(xiàn)cclk/)
  2. configTICK_RATE_HZ       ((portTickType)100)          第一個宏定義CPU系統(tǒng)時鐘,也就是CPU執(zhí)行時的頻率。第二個宏定義FreeRTOS的時間片頻率,這里定義為100,表明RTOS一秒鐘可以切換100次任務,也就是每個時間片為10ms。

在prot.c中,函數(shù)vPortSetupTimerInterrupt()設置節(jié)拍時鐘。該函數(shù)根據(jù)上面的兩個宏定義的參數(shù),計算SysTick定時器的重裝載數(shù)值寄存器,然后設置SysTick定時器的控制及狀態(tài)寄存器,設置如下:使用內(nèi)核時鐘源、使能中斷、使能SysTick定時器。另外,函數(shù)vPortSetupTimerInterrupt()由函數(shù)vTaskStartScheduler()調(diào)用,這個函數(shù)用于啟動調(diào)度器。

設置中斷優(yōu)先級相關(guān)宏

這里特別重要,因為涉及到中斷優(yōu)先級和中斷嵌套。這里先給出基于Cortex-M3硬件(lpc177x_8x系列微控制器)的一個配置例子,在FreeRTOSConfig.h中:

#ifdef __NVIC_PRIO_BITS
#defineconfigPRIO_BITS __NVIC_PRIO_BITS
#else
#defineconfigPRIO_BITS 5 /*lpc177x_8x微處理器使用優(yōu)先級寄存器的5位*/
#endif

/*設置內(nèi)核使用的中斷優(yōu)先級*/
#define configKERNEL_INTERRUPT_PRIORITY ( 31 << (8 - configPRIO_BITS) )

/*定義RTOS可以屏蔽的最大中斷優(yōu)先級,大于這個優(yōu)先級的中斷,不受RTOS控制*/
#defineconfigMAX_SYSCALL_INTERRUPT_PRIORITY ( 5<< (8 - configPRIO_BITS) )

后續(xù)文章《FreeRTOS內(nèi)核配置說明》會詳細介紹這些宏的含義,對于Cortex-M內(nèi)核,后續(xù)文章《Cortex-M內(nèi)核使用FreeRTOS特別注意事項》一文,會講述這些宏與硬件的聯(lián)系,那個時候你一定會清楚這些宏所定義的數(shù)字會對你的硬件產(chǎn)生什么影響的?,F(xiàn)在,我們只需要知道他們很重要就足夠了,沒人能一口吃成胖子。

設置其它宏

還需要在FreeRTOSConfig.h設置一些必要的宏,這些宏如下所示:

#define configUSE_PREEMPTION 1            //配置為1使用搶占式內(nèi)核,配置為0使用時間片
#define configUSE_IDLE_HOOK 0 //設置為1使用空閑鉤子;設置為0不使用空閑鉤子
#define configMAX_PRIORITIES ( 5 ) //應用程序任務中可用優(yōu)先級數(shù)目
#define configUSE_TICK_HOOK 0 //就設置為1使用時間片鉤子,設置為0不使用
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 80 ) //最小空閑堆棧
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 5 * 1024 ) ) //內(nèi)核總共可用RAM

創(chuàng)建任務

調(diào)用FreeRTOS提供的API函數(shù)來創(chuàng)建任務,代碼如下所示:

xTaskCreate(vTask,"Task1",50,NULL,1,NULL);

關(guān)于詳細的創(chuàng)建任務API函數(shù),會在后續(xù)文章《FreeRTOS任務創(chuàng)建和刪除》一文中介紹。

開啟調(diào)度器

調(diào)用FreeRTOS提供的API函數(shù)來啟動調(diào)度器,代碼如下所示:

vTaskStartScheduler();

關(guān)于詳細的開啟調(diào)度器API函數(shù),會在后續(xù)文章《FreeRTOS內(nèi)核控制》一文中介紹。此時的main函數(shù)代碼如下所示:

int main(void)
{
init_rtos_debug(); //初始化調(diào)試串口

xTaskCreate(vTask,"Task1",50,NULL,1,NULL);
vTaskStartScheduler();
while(1);
}

小結(jié)

到這里,一個最基本的FreeRTOS應用程序就已經(jīng)運行起來,將硬件板子接到PC的RS232串口,可以觀察到每隔一秒鐘,板子都會向PC發(fā)送一個指定的字符。

回頭看一下移植過程,F(xiàn)reeRTOS移植到Cortex-M3硬件是多么的簡單,這一方面歸功于FreeRTOS的設計師已經(jīng)為移植做了大量工作,同時,新一代的Cortex-M3硬件也為操作系統(tǒng)增加了一些列便利特性,比如SysTick定時器和全新的中斷及異常。

但是移植成功也只是萬里長征的第一步,因為這只是最簡單的應用。我們還不清楚FreeRTOS背后的機理、調(diào)度算法的面貌、甚至連信號量也都沒有涉及。就本文的移植過程來看,我們也刻意忽略了很多細節(jié),比如FreeRTOSConfig.h文件中的宏都有什么意義?改動后對RTOS有何影響?比如FreeRTOS任務API的細節(jié)、調(diào)度API的細節(jié),再比如FreeRTOS的內(nèi)存如何分配?如何進行堆棧溢出檢查等等。

所以,先不要沾沾自喜,曲折的道路還遠沒到來呢。

接下來的很多篇文章會圍繞這個最簡單的移植例程做詳細的講解,要把本篇文章中刻意隱藏的細節(jié)一一拿出來。這要一直持續(xù)到我們介紹隊列、信號量、互斥量等通訊機制為止。


   

推薦閱讀

(點擊標題可跳轉(zhuǎn)閱讀)

【編程之美】用C語言實現(xiàn)狀態(tài)機(實用)

【編程之美】超時重傳,滑動窗口,可靠性傳輸原理C語言實現(xiàn)

【編程之美】論嵌入式架構(gòu)的重要性

免責聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅(qū)動電源設計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉