FreeRTOS 之一 源码目录文件 及 移植详解
寫在前面
- 2018/1/15更新了文章中的部分錯誤。
- FreeRTOS源碼為最新版的10.0.1。FreeRTOS 10包含兩個重要的新功能:流緩沖區和消息緩沖區。
- 從10.0.0開始,FreeRTOS的開源協議改為了MIT。
源碼目錄
??首先,從官網下載最新版的源碼,目前最新版為10.0.1。下載后,解壓得到源碼,FreeRTOS的源碼包中的內容還是相當豐富的。簡略目錄如下:
├─FreeRTOS │ ├─Demo // 各種開發工具的完整Demo,開發者可以方便的以此搭建出自己的項目,甚至直接使用 │ │ ├─Common // 所有例程都可以使用的演示例程文件 │ │ └─其他 // 對應平臺和開發工具的項目例程(命名:平臺_開發工具,例如:CORTEX_M4F_M0_LPC43xx_Keil) │ ├─License // 使用修改過的GPL │ └─Source // FreeRTOS的源碼 │ ├─include // 源碼對應的頭文件 │ └─portable // 每個支持的處理器架構需要一小段與處理器架構相關的RTOS代碼。該目錄下即為和開發平臺相關的代碼 │ ├─MemMang // FreeRTOS內存管理方案(一般要根據平臺來選擇以下5個之一) │ │ heap_1.c │ │ heap_2.c │ │ heap_3.c │ │ heap_4.c │ │ heap_5.c │ └─其他 // 其他開發工具相關的代碼,需要根據自己的開發工具進行選擇 │ croutine.c // 協線程(協程)文件,和任務類似,在系統資源比較缺乏下使用 │ event_groups.c // 事件標志組 │ list.c // 列表結構描述,在內核整體控制上都使用了列表格式數據處理,一切數據結構的基礎 │ queue.c // 隊列,任務和任務之間的通訊處理 │ tasks.c // 所有任務相關函數 │ timers.c // 軟件定時器,以任務形式存在 | stream_buffer.c // 10.0.0 新增 └─FreeRTOS-Plus // FreeRTOS+組件和演示例程對于FreeRTOS的每個獨立部分,其官網均有詳細的說明。后續博文也會給出相應的介紹。
注意:
移植說明
FreeRTOS源碼整理
FreeRTOS源碼目錄中文件還是挺多的,但是真正需要使用的其實沒幾個(個人不喜歡在項目中放一堆實際不用的文件)!
-
list.c、tasks.c、queue.c必不可少,這三個文件是FreeRTOS最基本的源文件。至于同目錄下的timer.c、event_groups.c等文件,根據需要添加即可。
-
/FreeRTOS/Source/portable/MemMang下的heap_x.c也是必不可少的,根據需要選擇其中一個,STM32系列一般用heap_4.c。
-
/FreeRTOS/Source/portable/下根據開發工具選擇對應目錄下的文件。例如:若使用Keil,對應目錄下只有一個文件,讓直接用RVDS目錄下對應的文件。根據芯片選擇對應目錄下文件port.c、portmacro.h即可。
-
對應的頭文件當然也是必不可少。/FreeRTOS/Source/include下的文件可根據需要刪除不需要的文件!
-
還有一個文件FreeRTOSConfig.h,位于/FreeRTOS/Demo/對應的平臺下,這個文件其實就相當于STM32標準庫中的stm32fxx_conf.h(使用標準外設庫時,通過該文件進行配置)。對于該文件,下一節有詳細說明。
最后,去除部分不使用的文件,整理完成后的源代碼大致如下所示:
├─inc // 源碼頭文件,根據需要刪除不必要的就可以!例如,不使用事件標志組,則可刪除event_groups.h。(注意:有些頭文件為FreeRTOS內容使用) │ croutine.h │ deprecated_definitions.h │ event_groups.h │ FreeRTOS.h │ list.h │ mpu_prototypes.h │ mpu_wrappers.h │ portable.h │ portmacro.h │ projdefs.h │ queue.h │ semphr.h | stack_macros.h // V10.0.0開始為了一致性,已經重命名了StackMacros.h頭文件stack_macros.h。為了兼容這兩文件目前都在源碼中。使用時直接刪除StackMacros.h,選擇stack_macros.h即可(新的源碼不再使用StackMacros.h)。 │ StackMacros.h │ stdint.readme // 為支持C99添加,使用C99時將其改為stdint.h │ task.h │ timers.h └─src // 省略部分不使用文件heap_4.clist.cport.cqueue.ctasks.cFreeRTOS配置
??這里特別說明一下FreeRTOSConfig.h這個文件。FreeRTOS作為一個可高度配置的實時內核,其絕大多數配置都體現在在FreeRTOS.h。但是FreeRTOS.h是內核文件,難道需要直接改內核文件?當然不是,FreeRTOS.h通過檢查FreeRTOSConfig.h中對各宏值的定義來選擇功能。
??如果要了解FreeRTOS的全部配置項,可以參考** FreeRTOS之全配置項詳解、裁剪(FreeRTOSConfig.h)**。本部分主要說明在實際移植時需要特別注意的部分。
??FreeRTOS指定了用戶使用一個名為FreeRTOSConfig.h的配置文件來對FreeRTOS進行配置。這個文件是一個用戶配置文件,不是內核源碼的一部分,這個文件不再源碼目錄,而是在對應的Demo目錄下。因為,這是具體的用戶的實現。通過這個文件,用戶可以裁剪FreeRTOS,以下是一個針對STM32F4芯片的FreeRTOS的配置文件:
??無論使用什么開發環境,對于FreeRTOS的配置均在此文件中進行。例如,在使用FreeRTOS+Trace時,需要啟用一些輔助函數!當然,為了FreeRTOS能正常運行,也需要在該文件中進行配置。這里只針對FreeRTOS運行進行說明。
處理系統中斷
??在Cortex-M3硬件下,FreeRTOS使用SysTick作為系統節拍時鐘,使用SVC和PendSVC進行上下文切換。異常中斷服務代碼位于port.c文件中,FreeRTOS的作者已經為各種架構的CPU寫好了這些代碼。
/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS standard names. */ #define vPortSVCHandler SVC_Handler #define xPortPendSVHandler PendSV_Handler需要特殊注意的是SysTick中斷,該終端需要進行特殊處理,否則在啟動過程中將出現錯誤。:
void SysTick_Handler(void) {#if (INCLUDE_xTaskGetSchedulerState == 1 )if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED){#endif /* INCLUDE_xTaskGetSchedulerState */ xPortSysTickHandler();#if (INCLUDE_xTaskGetSchedulerState == 1 )}#endif /* INCLUDE_xTaskGetSchedulerState */ }需要注意的是需要合理安排FreeRTOS使用的系統中斷。例如在STM32中,有以下處理
/* FreeRTOS使用的優先級配置 */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); SysTick_Config(SystemCoreClock / 1000); NVIC_SetPriority(SVCall_IRQn, 0x0); NVIC_SetPriority(PendSV_IRQn, 15);最后,建立任務,啟動調度器,FreeRTOS就可以運行了!
void Main_task(void * pvParameters) {unsigned char buf[4] = {0};unsigned int i = 0;for( ;; ){vTaskDelay(1000);}vTaskDelete(NULL); }int main(void) { /* 省略*//* Init task */xTaskCreate(Main_task, "Main", configMINIMAL_STACK_SIZE * 2, NULL,MAIN_TASK_PRIO, NULL);/* Start scheduler */vTaskStartScheduler();/* We should never get here as control is now taken by the scheduler */for( ;; );}至于文件中的其他值,后面再詳細說明!
附件
STM32_FreeRTOS
總結
以上是生活随笔為你收集整理的FreeRTOS 之一 源码目录文件 及 移植详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STM32F2系列系统时钟默认配置
- 下一篇: FreeRTOS 之二 Tracealy