亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

FreeRTOS操作系統怎么配置

發布時間:2022-04-06 15:04:52 來源:億速云 閱讀:278 作者:iii 欄目:開發技術

這篇“FreeRTOS操作系統怎么配置”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“FreeRTOS操作系統怎么配置”文章吧。

FreeRTOS 的系統配置文件為 FreeRTOSConfig.h,在此配置文件中可以完成 FreeRTOS 的裁剪和配置。

1. FreeRTOSConfig.h 文件

FreeRTOS 的配置基本是通過在 FreeRTOSConfig.h 中使用“#define”這樣的語句來定義宏定義實現的。在 FreeRTOS 的官方 demo 中,每個工程都有一個 FreeRTOSConfig.h 文件,我們在使用的時候可以參考這個文件,甚至直接復制粘貼使用。

2.  “INCLUDE_” 開始的宏

使用“INCLUDE_”開頭的宏用來表示使能或除能 FreeRTOS 中相應的 API 函數,作用就是用來配置 FreeRTOS 中的可選 API 函數的。比如當宏 INCLUDE_vTaskPrioritySet 設置為 0 的時候表示不能使用函數 vTaskPrioritySet(),當設置為 1 的時候就表示可以使用函數vTaskPrioritySet()。這個功能其實就是條件編譯,條件編譯的好處就是節省空間,不需要的功能就不用編譯,這樣就可以根據實際需求來減少系統占用的 ROM 和 RAM 大小,根據自己所使用的 MCU 來調整系統消耗,降低成本。

3.“config”開始的宏

“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操作系統怎么配置”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

伊宁县| 海阳市| 驻马店市| 曲阜市| 伊春市| 眉山市| 六安市| 民县| 峨边| 开平市| 海宁市| 奇台县| 钟山县| 德州市| 吉木萨尔县| 新闻| 廊坊市| 聂拉木县| 虞城县| 昭通市| 凌海市| 驻马店市| 舟曲县| 曲沃县| 江西省| 建阳市| 大新县| 增城市| 东阿县| 明水县| 长治市| 浑源县| 故城县| 新营市| 马山县| 江源县| 长春市| 尼木县| 义马市| 航空| 华蓥市|