<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
FreeRTOS 的系統組態檔為 FreeRTOSConfig.h,在此組態檔中可以完成 FreeRTOS 的裁剪和設定。
FreeRTOS 的設定基本是通過在 FreeRTOSConfig.h 中使用“#define”這樣的語句來定義宏定義實現的。在 FreeRTOS 的官方 demo 中,每個工程都有一個 FreeRTOSConfig.h 檔案,我們在使用的時候可以參考這個檔案,甚至直接複製貼上使用。
使用“INCLUDE_”開頭的宏用來表示使能或除能 FreeRTOS 中相應的 API 函數,作用就是用來設定 FreeRTOS 中的可選 API 函數的。比如當宏 INCLUDE_vTaskPrioritySet 設定為 0 的時候表示不能使用函數 vTaskPrioritySet(),當設定為 1 的時候就表示可以使用函數vTaskPrioritySet()。這個功能其實就是條件編譯,條件編譯的好處就是節省空間,不需要的功能就不用編譯,這樣就可以根據實際需求來減少系統佔用的 ROM 和 RAM 大小,根據自己所使用的 MCU 來調整系統消耗,降低成本。
“config”開始的宏和“INCLUDE_”開始的宏一樣,都是用來完成 FreeRTOS 的設定和裁剪的。
想要充分理解FreeRTOSConfig.h檔案中的宏定義,必須要對FreeRTOS的程式碼有一定的瞭解,所以此處就不把宏定義一個一個列出來了,僅僅附上我自己用並註釋好的FreeRTOSConfig.h檔案
#ifndef FREERTOS_CONFIG_H #define FREERTOS_CONFIG_H //針對不同的編譯器呼叫不同的stdint.h檔案 //並確保stdint只被編譯器使用,不被組合器使用 #if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__) #include <stdint.h> extern uint32_t SystemCoreClock; #endif /***********************************************************************************************************************/ /* FreeRTOS基礎設定設定選項 */ /**********************************************************************************************************************/ //#define configOVERRIDE_DEFAULT_TICK_CONFIGURATION 1 //使用非systick中斷作為排程時鐘 #define configUSE_PREEMPTION 1 //置1:RTOS使用搶佔式排程器;置0:RTOS使用共同作業式排程器(時間片) /* 注: * 在多工管理機制上,作業系統可以分為搶佔式和共同作業式兩種。 * 搶佔式:根據任務的優先順序,優先順序高的任務就緒後,獲取CPU的使用權。 * 共同作業式:任務主動釋放CPU後,切換到下一個任務。 */ #define configUSE_TIME_SLICING 1 //1:使能時間片排程(預設是使能的) /* 注: * 為了實現時間片輪轉排程,系統把所有就緒程序按先入先出的原則排成一個佇列。新來的程序加到就緒佇列末尾。 * 每當執行程序排程時,程序排程程式總是選出就緒佇列的隊首程序,讓它在CPU上執行一個時間片的時間。 * 當程序用完分給它的時間片後,系統的計時器發出時鐘中斷,排程程式便停止該程序的執行,把它放入就緒佇列的末尾; * 然後,把CPU分給就緒佇列的隊首程序,同樣也讓它執行一個時間片,如此往復。 */ #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 //1:使用特殊方法選擇下一個要執行的任務(硬體支援) /* 注: * 某些執行FreeRTOS的硬體有兩種方法選擇下一個要執行的任務:通用方法和特定於硬體的方法(以下簡稱「特殊方法」)。 * 通用方法: * 1.configUSE_PORT_OPTIMISED_TASK_SELECTION 為 0 或者硬體不支援這種特殊方法。 * 2.可以用於所有FreeRTOS支援的硬體 * 3.完全用C實現,效率略低於特殊方法。 * 4.不強制要求限制最大可用優先順序數目 * 特殊方法: * 1.必須將configUSE_PORT_OPTIMISED_TASK_SELECTION設定為1。 * 2.依賴一個或多個特定架構的組合指令(一般是類似計算前導零[CLZ]指令)。 * 3.比通用方法更高效 * 4.一般強制限定最大可用優先順序數目為32 * 一般是硬體計算前導零指令,如果所使用的,MCU沒有這些硬體指令的話此宏應該設定為0! */ #define configUSE_TICKLESS_IDLE 0 //0:不啟用低功耗tickless模式 /* 注: * 置1:使能低功耗tickless模式;置0:保持系統節拍(tick)中斷一直執行 * * 假設開啟低功耗的話可能會導致下載出現問題,因為程式在睡眠中,可用以下辦法解決 * 下載方法: * 1.將開發版正常連線好 * 2.按住復位按鍵,點選下載瞬間鬆開復位按鍵 * * 1.通過跳線帽將 BOOT 0 接高電平(3.3V) * 2.重新上電,下載 * * 1.使用FlyMcu擦除一下晶片,然後進行下載 * STMISP -> 清除晶片(z) */ #define configUSE_QUEUE_SETS 1 //1:啟用佇列集合 /* 注: * 佇列集合:用於對多個佇列以及號誌進行「監聽」, * 只要其中不管哪一個有訊息到來,都可以讓任務退出阻塞狀態。 */ #define configCPU_CLOCK_HZ (SystemCoreClock) //CPU頻率 /* 注: * 寫入實際的CPU核心時脈頻率,也就是CPU指令執行頻率,通常稱為Fclk * Fclk為供給CPU核心的時鐘訊號,我們所說的cpu主頻為 XX MHz, * 就是指的這個時鐘訊號,相應的,1/Fclk即為cpu時鐘週期; */ #define configTICK_RATE_HZ (( TickType_t )1000) //時鐘節拍頻率1000HZ,週期就是1ms /* 注: * RTOS系統節拍中斷的頻率。 * 即一秒中斷的次數,每次中斷RTOS都會進行任務排程 */ #define configMAX_PRIORITIES (32) //可使用的最大優先順序 /* 注: * 設定任務優先順序時,數位越小,優先順序越高 */ #define configMINIMAL_STACK_SIZE ((unsigned short)128) //空閒任務使用的堆疊大小 /* 注: * 空閒任務就是CPU無事可做的時候,作業系統為了不讓CPU閒著,強行讓它做的一個任務 * 空閒任務是FreeRTOS不可缺少的任務,因為FreeRTOS設計要求必須至少有一個任務處於執行狀態。 */ #define configMAX_TASK_NAME_LEN (16) //任務名字字串的長度 #define configUSE_16_BIT_TICKS 0 //系統節拍計數器變數的資料型別, //1表示為16位元無符號整形,0表示為32位元無符號整形 #define configIDLE_SHOULD_YIELD 1 //1:空閒任務放棄CPU使用權給其他同優先順序的使用者任務 #define configUSE_TASK_NOTIFICATIONS 1 //1:開啟任務通知功能,預設開啟 #define configUSE_MUTEXES 1 //1:使用互斥號誌 #define configQUEUE_REGISTRY_SIZE 8 //設定可以註冊的號誌和訊息佇列個數 #define configCHECK_FOR_STACK_OVERFLOW 0 //不使用堆疊溢位檢測功能 /* 注: * 大於0時啟用堆疊溢位檢測功能,如果使用此功能 * 使用者必須提供一個棧溢位勾點函數,如果使用的話 * 此值可以為1或者2,因為有兩種棧溢位檢測方法 */ #define configUSE_RECURSIVE_MUTEXES 1 //1:使用遞迴互斥號誌 #define configUSE_COUNTING_SEMAPHORES 1 //1:使用計數號誌 #define configUSE_APPLICATION_TASK_TAG 0 //不可為任務分配標籤(預設不可) /***************************************************************** FreeRTOS與記憶體申請有關設定選項 *****************************************************************/ #define configSUPPORT_DYNAMIC_ALLOCATION 1 //支援動態記憶體申請 #define configTOTAL_HEAP_SIZE ((size_t)(32*1024)) //系統所有總的堆大小 /*************************************************************** FreeRTOS與勾點函數有關的設定選項 **************************************************************/ #define configUSE_IDLE_HOOK 0 //置1:使用空閒勾點;置0:忽略空閒勾點 /* 注: * 空閒任務勾點是一個函數,這個函數由使用者來實現, * FreeRTOS規定了函數的名字和引數:void vApplicationIdleHook(void ), * 這個函數在每個空閒任務週期都會被呼叫 * 對於已經刪除的RTOS任務,空閒任務可以釋放分配給它們的堆疊記憶體。 * 因此必須保證空閒任務可以被CPU執行 * 使用空閒勾點函數設定CPU進入省電模式是很常見的 * 不可以呼叫 會引起空閒任務阻塞 的API函數 */ #define configUSE_TICK_HOOK 0 //置1:使用時間片勾點;置0:忽略時間片勾點 /* 注: * 時間片勾點是一個函數,這個函數由使用者來實現, * FreeRTOS規定了函數的名字和引數:void vApplicationTickHook(void ) * 時間片中斷可以週期性的呼叫 * 函數必須非常短小,不能大量使用堆疊, * 不能呼叫以」FromISR" 或 "FROM_ISR」結尾的API函數 */ /*xTaskIncrementTick函數是在xPortSysTickHandler中斷函數中被呼叫的。因此,vApplicationTickHook()函數執行的時間必須很短才行*/ //使用記憶體申請失敗勾點函數 #define configUSE_MALLOC_FAILED_HOOK 0 //不使用記憶體申請失敗勾點函數 /******************************************************************** FreeRTOS與執行時間和任務狀態收集有關的設定選項 **********************************************************************/ #define configGENERATE_RUN_TIME_STATS 0 //不啟用執行時間統計功能(一般偵錯的使用用) #define configUSE_TRACE_FACILITY 1 //啟用視覺化跟蹤偵錯 #define configUSE_STATS_FORMATTING_FUNCTIONS 1 /* 與宏configUSE_TRACE_FACILITY同時為1時會編譯下面3個函數 * prvWriteNameToBuffer() * vTaskList(), * vTaskGetRunTimeStats() */ /******************************************************************** FreeRTOS與協程有關的設定選項 *********************************************************************/ #define configUSE_CO_ROUTINES 0 //1:啟用協程,啟用協程以後必須新增檔案croutine.c #define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) //協程的有效優先順序數目 /*********************************************************************** FreeRTOS與軟體定時器有關的設定選項 **********************************************************************/ #define configUSE_TIMERS 1 //1:啟用軟體定時器 #define configTIMER_TASK_PRIORITY ( 2 ) //設定軟體定時器優先順序 #define configTIMER_QUEUE_LENGTH 10 //軟體定時器佇列長度 #define configTIMER_TASK_STACK_DEPTH (configMINIMAL_STACK_SIZE*2) //軟體定時器任務堆疊大小 /************************************************************ FreeRTOS可選函數設定選項 ************************************************************/ #define INCLUDE_xTaskGetSchedulerState 1 #define INCLUDE_vTaskPrioritySet 1 #define INCLUDE_uxTaskPriorityGet 1 #define INCLUDE_vTaskDelete 1 #define INCLUDE_vTaskCleanUpResources 1 #define INCLUDE_vTaskSuspend 1 #define INCLUDE_vTaskDelayUntil 1 #define INCLUDE_vTaskDelay 1 #define INCLUDE_eTaskGetState 1 #define INCLUDE_xTimerPendFunctionCall 1 #define INCLUDE_uxTaskGetStackHighWaterMark 1 #define INCLUDE_xTaskGetHandle 1 /****************************************************************** FreeRTOS與中斷有關的設定選項 ******************************************************************/ #ifdef __NVIC_PRIO_BITS #define configPRIO_BITS __NVIC_PRIO_BITS #else #define configPRIO_BITS 4 #endif //由於STM32是4位元的中斷優先順序控制,所以此處為4(不同的MCU不同) #define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15 //中斷最低優先順序 //4位元優先順序全部分組給主優先順序,所以總共有16位元優先順序設定:0-15--優先順序最低的為15 //不同的MCU不同 #define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) ) /* 240 */ //設定核心中斷優先順序,這個宏是用來設定PendSV和滴答定時器的中斷優先順序的,port.c中使用到 //此處的左移四位的原因是:STM32採用的是從MSB開始的高四位作為優先順序設定 //其實這個宏定義可以簡化成:#define configKERNEL_INTERRUPT_PRIORITY 0xF0 #define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5 //設定系統可管理的最大優先順序 //這個就是 BASEPRI 暫存器說的那個閾值優先順序,這裡我設定為了 5。 //也就是高於 5 的優先順序(優先順序數小於 5)不歸 FreeRTOS 管理! //這個是給人看的,下面一個宏是給系統看的 #define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) ) //此處需要左移四位的原因:同上 //低於此優先順序的中斷可以安全的呼叫 FreeRTOS 的 API 函數,高於此優先順序的中斷 FreeRTOS 是不能禁止的, //中斷服務函數也不能呼叫 FreeRTOS 的 API 函數! //也就是:#define configMAX_SYSCALL_INTERRUPT_PRIORITY 0x50 /* * 以上設定的結果就是: * 優先順序為0-4的中斷 不會被FreeRTOS禁止,不會因為執行FreeRTOS核心而延時,中斷不可呼叫FreeRTOS的API函數 * 優先順序為5-15的中斷 能夠被FreeRTOS禁止,可以呼叫以 FromISR 結尾的FreeRTOS API函數,並且它們可以中斷巢狀 * 所以:不掉用任何FreeRTOS API的中斷可以使用所有的中斷優先順序,並且它們可以中斷巢狀 * 那些對實時性要求嚴格的任務就可以使用0-4的優先順序,比如四軸飛行器中的壁障檢測 */ /**************************************************************** FreeRTOS與中斷服務函數有關的設定選項 ****************************************************************/ #define xPortPendSVHandler PendSV_Handler #define vPortSVCHandler SVC_Handler //#define xPortSysTickHandler SysTickHandler 自行在delay.c函數中實現 #endif /* FREERTOS_CONFIG_H */
以上就是FreeRTOS作業系統的設定範例解析的詳細內容,更多關於FreeRTOS作業系統設定的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45