色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何實現FreeRTOS在Cortex-M3上的移植?

安芯教育科技 ? 來源:極術社區 ? 作者:朱工 ? 2021-01-27 13:49 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1. FreeRTOS下載包的文件結構

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

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

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

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

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

對于支持的處理器架構,RTOS需要一些與處理器架構相關的代碼。可以稱之為RTOS硬件接口層,它們位于FreeRTOS/Source/Portable/[相應編譯器]/[相應處理器架構]文件夾下。我們這次要移植到Cortex-M3微控制,使用Keil MDK編譯器,所以需要的RTOS硬件接口代碼位于:FreeRTOSSourceportableRVDSARM_CM3文件夾下。

堆棧分配也是屬于硬件接口層(移植層),在FreeRTOS/Source/portable/MemMang文件夾下具有各種類型的堆棧分配方案。這里我們使用heap_1.c提供的堆棧分配方案。關于FreeRTOS的內存管理,后續《FreeRTOS內存管理》一文中會詳細介紹FreeRTOS內存管理的特性和用法,《FreeRTOS內存管理分析》一文會從源碼級別分析FreeRTOS內存管理的具體實現,不要著急,先放過它們。

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

2. 移植前的一些準備

一塊具有Cortex-M3微處理器的硬件板子,并且保證板子可以正常運轉。

下載FreeRTOS程序包

下載CMSIS-M3,其實主要是需要里面的core_cm3.h文件(可以去ARM官方下載,如果你安裝了keil 5或比較新的Keil 4 MDK編譯器,在目錄:KeilARMCMSIS文件夾下也可以找到)

3.移植過程

3.1 添加RTOS核心代碼

將tasks.c、queue.c和list.c這三個內核代碼加入工程,將port.c和heap_1.c這兩個與處理器相關代碼加入工程。port.c位于FreeRTOSSourceportableRVDSARM_CM3文件夾下,heap_1.c位于FreeRTOS/Source/portable/MemMang文件夾下。

3.2 添加頭文件路徑

。..FreeRTOSSourceportableRVDSARM_CM3

…FreeRTOSSourceinclude

3.3 編寫FreeRTOSConfig.h文件

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

3.4 編寫一些鉤子函數

如果你在FreeRTOSConfig.h中設置了configUSE_TICK_HOOK=1,則必須編寫voidvApplicationTickHook( void )函數。該函數利用時間片中斷,可以很方便的實現一個定時器功能。詳見后續文章《FreeRTOS內核配置說明》有關宏configUSE_TICK_HOOK一節。 如果你在FreeRTOSConfig.h中設置了configCHECK_FOR_STACK_OVERFLOW=1或=2,則必須編寫voidvApplicationStackOverflowHook( xTaskHandle pxTask, signed char *pcTaskName )函數,該函數用于檢測堆棧溢出,詳見后續文章《FreeRTOS內核配置說明》有關宏configCHECK_FOR_STACK_OVERFLOW一節。

3.5 檢查硬件

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

#include“task.h” #include“queue.h” #include“list.h” #include“portable.h” #include“debug.h” int main(void) { init_rtos_debug(); //初始化調試串口 MAP_UARTCharPut(‘A’); //發送一個字符 while(1); } 如果硬件可以正常發送字符,說明硬件以及啟動代碼OK,可以進行下一步。

3.6 掛接中斷

在Cortex-M3硬件下,FreeRTOS使用SysTick作為系統節拍時鐘,使用SVC和PendSVC進行上下文切換。異常中斷服務代碼位于port.c文件中,FreeRTOS的作者已經為各種架構的CPU寫好了這些代碼,可以直接拿來用,需要用戶做的,僅僅是將這些異常中斷入口地址掛接到啟動代碼中。 在startup.s中,使用IMPORT關鍵字聲明要掛接的異常中斷服務函數名,然后將:

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

3.7 建立第一個任務Task

在步驟3.5中,我們為了測試硬件是是否能夠工作,編寫了一個發送字符的小函數,這里我們將把這個小函數作為我們第一個任務要執行的主要代碼:每隔1秒鐘,發送一個字符。代碼如下所示:

voidvTask(void *pvParameters) { while(1) { MAP_UARTCharPut(0x31); vTaskDelay(1000/portTICK_RATE_MS); } } FreeRTOS的任務以及編寫格式將在后續文章《FreeRTOS任務概述》一文中詳述,這里只是一個很簡單的任務,先有有大體印象。這里面有一個API函數vTaskDelay(),這個函數用于延時,具體用法將在后續文章《FreeRTOS任務控制》一文中詳細介紹,延時函數代碼級分析將在《FreeRTOS高級篇10---系統節拍時鐘分析》。這里不必在意太多的未知情況,因為后面會一點點將這些未知空間探索一遍的。

3.8 設置節拍時鐘

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

****configCPU_CLOCK_HZ (/*你的硬件平臺CPU系統時鐘,Fcclk*/) configTICK_RATE_HZ ((portTickType)100) 第一個宏定義CPU系統時鐘,也就是CPU執行時的頻率。第二個宏定義FreeRTOS的時間片頻率,這里定義為100,表明RTOS一秒鐘可以切換100次任務,也就是每個時間片為10ms。 在prot.c中,函數vPortSetupTimerInterrupt()設置節拍時鐘。該函數根據上面的兩個宏定義的參數,計算SysTick定時器的重裝載數值寄存器,然后設置SysTick定時器的控制及狀態寄存器,設置如下:使用內核時鐘源、使能中斷、使能SysTick定時器。另外,函數vPortSetupTimerInterrupt()由函數vTaskStartScheduler()調用,這個函數用于啟動調度器。

3.9設置中斷優先級相關宏

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

#ifdef __NVIC_PRIO_BITS #defineconfigPRIO_BITS __NVIC_PRIO_BITS #else #defineconfigPRIO_BITS 5 /*lpc177x_8x微處理器使用優先級寄存器的5位*/ #endif /*設置內核使用的中斷優先級*/ #define configKERNEL_INTERRUPT_PRIORITY ( 31 《《 (8 - configPRIO_BITS) ) /*定義RTOS可以屏蔽的最大中斷優先級,大于這個優先級的中斷,不受RTOS控制*/ #defineconfigMAX_SYSCALL_INTERRUPT_PRIORITY ( 5《《 (8 - configPRIO_BITS) ) 后續文章《FreeRTOS內核配置說明》會詳細介紹這些宏的含義,對于Cortex-M內核,后續文章《Cortex-M內核使用FreeRTOS特別注意事項》一文,會講述這些宏與硬件的聯系,那個時候你一定會清楚這些宏所定義的數字會對你的硬件產生什么影響的。現在,我們只需要知道他們很重要就足夠了,沒人能一口吃成胖子。

3.10 設置其它宏

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

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

3.11 創建任務

調用FreeRTOS提供的API函數來創建任務,代碼如下所示: xTaskCreate(vTask,“Task1”,50,NULL,1,NULL);

關于詳細的創建任務API函數,會在后續文章《FreeRTOS任務創建和刪除》一文中介紹。

3.12 開啟調度器

調用FreeRTOS提供的API函數來啟動調度器,代碼如下所示: vTaskStartScheduler();

關于詳細的開啟調度器API函數,會在后續文章《FreeRTOS內核控制》一文中介紹。 此時的main函數代碼如下所示:

int main(void) { init_rtos_debug(); //初始化調試串口 xTaskCreate(vTask,“Task1”,50,NULL,1,NULL); vTaskStartScheduler(); while(1); }

4. 小結

到這里,一個最基本的FreeRTOS應用程序就已經運行起來,將硬件板子接到PC的RS232串口,可以觀察到每隔一秒鐘,板子都會向PC發送一個指定的字符。 回頭看一下移植過程,FreeRTOS移植到Cortex-M3硬件是多么的簡單,這一方面歸功于FreeRTOS的設計師已經為移植做了大量工作,同時,新一代的Cortex-M3硬件也為操作系統增加了一些列便利特性,比如SysTick定時器和全新的中斷及異常。

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

所以,先不要沾沾自喜,曲折的道路還遠沒到來呢。 接下來的很多篇文章會圍繞這個最簡單的移植例程做詳細的講解,要把本篇文章中刻意隱藏的細節一一拿出來。這要一直持續到我們介紹隊列、信號量、互斥量等通訊機制為止。

原文標題:FreeRTOS系列第5篇---FreeRTOS在Cortex-M3上的移植

文章出處:【微信公眾號:安芯教育科技】歡迎添加關注!文章轉載請注明出處。

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 處理器
    +關注

    關注

    68

    文章

    19896

    瀏覽量

    235220
  • 硬件
    +關注

    關注

    11

    文章

    3484

    瀏覽量

    67502
  • RTOS
    +關注

    關注

    24

    文章

    851

    瀏覽量

    121171
  • FreeRTOS
    +關注

    關注

    12

    文章

    493

    瀏覽量

    64353

原文標題:FreeRTOS系列第5篇---FreeRTOS在Cortex-M3上的移植

文章出處:【微信號:Ithingedu,微信公眾號:安芯教育科技】歡迎添加關注!文章轉載請注明出處。

收藏 0人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

  • jf_594216301

評論

相關推薦
熱點推薦

瑞薩RA8系列教程 | 基于e2sRA8跑RTOS實現的方法

我們今天教大家快速搭建FreeRTOS工程的方法。早期,軟件工具不那么成熟,搭建FreeRTOS工程都是需要一步一步手動移植。很多小伙伴吐槽,移植過程太繁瑣。而現在,軟件工具越來越“先
的頭像 發表于 06-11 17:22 ?1309次閱讀
瑞薩RA8系列教程 | 基于e2s<b class='flag-5'>在</b>RA8<b class='flag-5'>上</b>跑RTOS<b class='flag-5'>實現</b>的方法

詳解FreeRTOS與SAFERTOS的區別

開源免費的FreeRTOS由Richard BarryWHIS工作時創建,WHIS基于FreeRTOS的功能模型,通過完整的HAZOP分析,確定了功能模型和API中的所有的弱點,減輕所有薄弱環節,并采用IEC 61508 SI
的頭像 發表于 06-04 16:58 ?329次閱讀
詳解<b class='flag-5'>FreeRTOS</b>與SAFERTOS的區別

【RA-Eco-RA4M2開發板評測】RA-Eco-RA4M2 移植FreeRTOS

1 前言 基于瑞薩的MCU移植FreeRTOS很簡單,只需簡單配置即可生成FreeRTOS的工程。筆者這里使用Renesas RA Smart Configurator和Keil5開發。 2 新建
發表于 05-03 23:24

MAX32555 Cortex-M3閃存微控制器英文數據手冊

電子發燒友網站提供《MAX32555 Cortex-M3閃存微控制器英文數據手冊.pdf》資料免費下載
發表于 04-25 16:40 ?1次下載

如何在i.MX 8XDXL EVK的A35運行Yocto Linux,M4運行FreeRTOS?

我正在使用i.MX 8XDXL 評估套件并希望 Cortex-A35 運行 Yocto Linux 映像cores 的Cortex-M4
發表于 04-04 06:02

i.MX8MMini中的Cortex-M4不支持SDIO嗎?

我們正在嘗試使用 i.MX8MMini (Cortex-A53/-M4) 并考慮 Cortex-M4 協處理器中實現無線模塊 (SDIO
發表于 04-03 06:45

移植LWIP+FREERTOS時遇到的問題怎么解決?

固件庫,移植成功,并且跑了幾個串口通信的任務,測試大概兩三天的樣子,并沒有出現問題。 2:移植LWIP1.4.1 (從ST官網下載的那個網頁的例程,修改引腳定義后跑板子沒問題,確認
發表于 03-11 06:48

starvision2移植FreeRTOS,objdump后發現static變量的地址是0,怎么解決?

以下內容為評論 我是嵌入式的新手,目前打算將freeRTOS移植到starvision2。 但是鏈接的時候遇到一個問題。 main.c:74:(.text+0x26): rel
發表于 03-10 07:21

Cortex-M3/M4F指令集技術用戶手冊

電子發燒友網站提供《Cortex-M3/M4F指令集技術用戶手冊.pdf》資料免費下載
發表于 12-23 16:31 ?8次下載
<b class='flag-5'>Cortex-M3</b>/<b class='flag-5'>M</b>4F指令集技術用戶手冊

如何使用Ozone分析Cortex-M異常

Ozone可以幫助用戶快速分析和查找導致CPU故障的軟件bug。本文解釋如何使用Ozone的調試功能,深入了解Cortex-M架構的這些錯誤。
的頭像 發表于 11-29 11:14 ?1695次閱讀
如何使用Ozone分析<b class='flag-5'>Cortex-M</b>異常

適用于低功耗和無線通信距離要求較高應用的智能通信模組-RF-SM-1077B1

RF-SM-1077B1是RF-star推出的Sub-1G系列模塊,其芯片CC1310內置高性能的ARM Cortex-M3 + ARM Cortex-M0雙核處理器,主MCU ARM Cortex-M3的高性能能更快地處理應用
的頭像 發表于 10-24 09:37 ?578次閱讀
適用于低功耗和無線通信距離要求較高應用的智能通信模組-RF-SM-1077B1

如何在RT-thread studio的裸機例程移植freertos

如何在RT-thread studio的裸機例程移植freertos
發表于 09-13 06:32

TM4C MCUFreeRTOS開發通用應用程序應用說明

電子發燒友網站提供《TM4C MCUFreeRTOS開發通用應用程序應用說明.pdf》資料免費下載
發表于 09-11 14:15 ?0次下載
<b class='flag-5'>在</b>TM4C MCU<b class='flag-5'>上</b>用<b class='flag-5'>FreeRTOS</b>開發通用應用程序應用說明

TM4C MCU使用FreeRTOS開發高級應用

電子發燒友網站提供《TM4C MCU使用FreeRTOS開發高級應用.pdf》資料免費下載
發表于 09-06 10:17 ?2次下載
<b class='flag-5'>在</b>TM4C MCU<b class='flag-5'>上</b>使用<b class='flag-5'>FreeRTOS</b>開發高級應用

【GD32 MCU 移植教程】5、GD32E230 系列移植到 GD32F330 系列

GD32E230 系列是 GD 的 Cortex_M23 系列產品,GD32F330 系列是 GD 的 Cortex_M4 系列產品, 這兩個系列的兼容度非常高。客戶會有從 GD32E230 系列
的頭像 發表于 09-03 10:05 ?2624次閱讀
【GD32 MCU <b class='flag-5'>移植</b>教程】5、GD32E230 系列<b class='flag-5'>移植</b>到 GD32F330 系列
主站蜘蛛池模板: xiao77唯美清纯 | 无限资源在线完整高清观看1 | 久久久久毛片免费观看 | 欧美性XXXXX极品娇小 | 三级黄色视屏 | 四虎永久在线精品免费A | 人妻精品久久无码专区 | 亚洲一卡二卡三卡四卡2021麻豆 | 国产午夜人成在线视频麻豆 | 色婷婷综合久久久中文字幕 | 久久人妻无码毛片A片麻豆 久久人妻熟女中文字幕AV蜜芽 | 国家产午夜精品无人区 | 国产午夜精品久久久久九九 | 免费光看午夜请高视频 | 狠狠色综合久久丁香婷婷 | 无码一区二区在线欧洲 | 久草免费视频在线观看 | 给我免费播放片bd国语 | 午夜免费啪视频观看视频 | 最新国自产拍 高清完整版 最新国产在线视频在线 | 翁止熄痒禁伦短文合集免费视频 | 免费精品美女久久久久久久久 | 欧美videos人牛交 | 在线播放一区二区精品产 | 免费网站在线观看国产v片 免费完整版观看 | 国自精品三七区 | 幻女FREE性俄罗斯学生 | 国产精品久久久久久久久久免费 | 国产又爽又黄又不遮挡视频 | 含羞草影院AE在线观看 | 国产在线视频在线观看 | 日本久久道一区二区三区 | 在线播放毛片 | 国产精品99久久久久久AV蜜臀 | 99精品国产免费久久久久久下载 | 亚洲色婷婷久久精品AV蜜桃久久 | 福利社影院 | 精品国产自在现线拍国语 | 日本精品久久久久中文字幕 1 | 亚洲大片免费看 | 99精品久久 |

電子發燒友

中國電子工程師最喜歡的網站

  • 2931785位工程師會員交流學習
  • 獲取您個性化的科技前沿技術信息
  • 參加活動獲取豐厚的禮品