這個(gè)是全網(wǎng)最詳細(xì)最多功能的STM32項(xiàng)目教學(xué)視頻。
第一篇在這里:
視頻在這里
V3:HAL庫(kù)開發(fā)、手把手教學(xué)下面功能:PID速度控制、PID循跡、PID跟隨、遙控、避障、PID角度控制、openmv視覺控制、電磁循跡、FreeRTOS、K210視覺智能車(更新中)、K230視覺智能車(更新中)、MSPM0G3507視覺智能車(更新中)
21.4-系統(tǒng)配置(不需要都懂 有印象 會(huì)查閱用就行)
系統(tǒng)配置說(shuō)明
大部分配置選項(xiàng)在FreeRTOS.h文件中都有默認(rèn)的配置,在應(yīng)用時(shí),把需要的配置選項(xiàng)放在FreeRTOSConfig.h文件即可。
在配置這些選擇時(shí)候,盡量不要在FreeRTOSConfig.h或者FreeRTOS.h直接修改,建議在STM32CubeMX軟件中設(shè)置然后在更新過(guò)去即可。
前綴為"config"的宏表示某種參數(shù)設(shè)置,一般的,值為1表示開啟此功能,值為0表示禁用此功能。
前綴為"INCLUDE_"的宏表示是否編譯某個(gè)函數(shù)的源碼。
文件FreeRTOS.h包含系統(tǒng)默認(rèn)的一些參數(shù)的宏定義,不要直接修改此文件的內(nèi)容,用戶可以通過(guò)修改的配置文件是FreeRTOSConfig.h,這個(gè)文件中包含大量前綴為"config"和"INCLUDE_"的宏定義。
Config宏-內(nèi)核配置
在STM32CubeMX的配置會(huì)更新到FreeRTOSConfig.h文件中
1、configUSE_PREEMPTION
使用說(shuō)明:于控制任務(wù)調(diào)度的方式,一般配置-1
配置為 1 -使能搶占式調(diào)度器
配置為 0-使能合作式調(diào)度器
2、configUSE_PORT_OPTIMISED_TASK_SELECTION
使用說(shuō)明:STM32配置為1就可以了
功能: 此配置用于優(yōu)化優(yōu)先級(jí)列表中要執(zhí)行的最高優(yōu)先級(jí)任務(wù)的算法。對(duì) CM 內(nèi)核的移植文件,默認(rèn)已經(jīng)在文件 portmacro.h 文件中使能。
配置為 0-通用方式
- 所有平臺(tái)的移植文件都可以配置為 0,因?yàn)檫@是通用方式。
- 純 C 編寫,比專用方式效率低。
- 可用的優(yōu)先級(jí)數(shù)量不限制。
配置為 1-專用方式
- 部分平臺(tái)支持。
- 這些平臺(tái)架構(gòu)有專用的匯編指令,比如 CLZ(Count Leading Zeros)指令,通過(guò)這些指令可以加快算法執(zhí)行速度。
- 比通用方式高效。
- 有最大優(yōu)先級(jí)數(shù)限制,通常限制為 32 個(gè)。
3、configUSE_TICKLESS_IDLE
使用說(shuō)明:配置為0
配置為 1-使能 tickless 低功耗模式
配置為 0-禁能 tickless 低功耗模式
4、configCPU_CLOCK_HZ
使用說(shuō)明:和單片機(jī)主頻一樣就行、一般STM32CubeMX已經(jīng)給生成
此參數(shù)用于定義 CPU 的主頻,單位 Hz
5、configTICK_RATE_HZ
使用說(shuō)明:一般1Khz
此參數(shù)用于定義系統(tǒng)時(shí)鐘節(jié)拍數(shù),單位 Hz,一般取 1000Hz 即可。
比如1000HZ,就是系統(tǒng)會(huì)每1ms 進(jìn)行一次任務(wù)調(diào)度
這個(gè)參數(shù)了影響了系統(tǒng)的實(shí)時(shí)性
6、configMAX_PRIORITIES
此參數(shù)用于定義可供用戶使用的最大任務(wù)優(yōu)先級(jí)數(shù),
- 如果這個(gè)定義的是 5,那么用戶可以使用的優(yōu)先級(jí)號(hào)是 0,1,2,3,4,不包含 5。
- 優(yōu)先級(jí)號(hào)越小,優(yōu)先級(jí)就約低。
- 如果configUSE_PORT_OPTIMISED_TASK_SELECTION配置為1、configMAX_PRIORITIES就不能超過(guò)32
- 一般設(shè)置5-7左右就夠使用
7、configMINIMAL_STACK_SIZE
使用說(shuō)明:一般為128
此參數(shù)用于定義空閑任務(wù)的??臻g大小,單位字,即 4 字節(jié)。
8、configTOTAL_HEAP_SIZE
(FreeRTOS堆中可用的RAM總量)定義freeRTOS系統(tǒng)堆大小。
configTOTAL_HEAP_SIZE
設(shè)置了 FreeRTOS從芯片的SRAM分配的堆內(nèi)存的總大小,這個(gè)堆內(nèi)存用于FreeRTOS所有動(dòng)態(tài)內(nèi)存分配,具體將用于FreeRTOS的任務(wù)棧的分配,隊(duì)列、信號(hào)量等資源,內(nèi)存池或動(dòng)態(tài)內(nèi)存分配。
FreeRTOS 提供了 xPortGetFreeHeapSize()
函數(shù)來(lái)監(jiān)控當(dāng)前堆內(nèi)存的剩余空間。你可以在程序中定期調(diào)用該函數(shù),查看堆內(nèi)存的使用情況,以確保內(nèi)存不會(huì)耗盡。
size_t heapRemaining = xPortGetFreeHeapSize();
9、configMAX_TASK_NAME_LEN
如果自己的任務(wù)名16字符數(shù)一下,就不需要更改
定義任務(wù)名最大的字符數(shù),末尾的結(jié)束符 '?’也要計(jì)算在內(nèi)。
10、configUSE_16_BIT_TICKS
32位單片機(jī)配置0
16位單片機(jī)配置1
系統(tǒng)時(shí)鐘節(jié)拍計(jì)數(shù)使用 TickType_t 數(shù)據(jù)類型定義的。
配置為1-TickType_t 定義是 16 位無(wú)符號(hào)數(shù)
配置為0-TickType_t 是32位
11、configIDLE_SHOULD_YIELD
一般配置為0
此參數(shù)用于使能與空閑任務(wù)同優(yōu)先級(jí)的任務(wù),只有滿足以下兩個(gè)條件時(shí),此參數(shù)才有效果:
- 使能搶占式調(diào)度器。
- 有創(chuàng)建與空閑任務(wù)同優(yōu)先級(jí)的任務(wù)。
12、configUSE_TASK_NOTIFICATIONS
配置為 1-使能任務(wù)間直接的消息傳遞,包含信號(hào)量,事件標(biāo)志組和消息郵箱。
配置為 0-禁能此特性。
13、configUSE_MUTEXES
配置為 1-使能互斥信號(hào)量
配置為 0-禁能互斥信號(hào)量
14、configUSE_RECURSIVE_MUTEXES
配置為 1-使能遞歸互斥信號(hào)量
配置為 0-禁能遞歸互斥信號(hào)量
15、configUSE_COUNTING_SEMAPHORES
配置為 1-使能計(jì)數(shù)信號(hào)量
配置為 0-禁能計(jì)數(shù)信號(hào)量
16、configQUEUE_REGISTRY_SIZE
通過(guò)此定義來(lái)設(shè)置可以注冊(cè)的信號(hào)量和消息隊(duì)列個(gè)數(shù)。隊(duì)列注冊(cè)有兩個(gè)目的,這兩個(gè)目的都與內(nèi)核調(diào)試有關(guān):
- 注冊(cè)隊(duì)列的時(shí)候,可以給隊(duì)列起一個(gè)名字,當(dāng)使用調(diào)試組件的時(shí)候,通過(guò)名字可以很容易的區(qū)分不同隊(duì)列
- 通過(guò)隊(duì)列的相關(guān)信息,調(diào)試器可以很容易定位隊(duì)列和信號(hào)量,能夠定位信號(hào)量是因?yàn)?FreeRTOS 信號(hào)量也是基于隊(duì)列實(shí)現(xiàn)的。當(dāng)然,如果用戶沒(méi)有使用內(nèi)核方面的調(diào)試器,這個(gè)宏定義是沒(méi)有意義的。
17、configUSE_QUEUE_SETS
配置為 1-使能消息隊(duì)列。
配置為 0-禁能消息隊(duì)列。
18、configUSE_TIME_SLICING
使用:默認(rèn)使能 配置1
配置為 1-使能時(shí)間片調(diào)度。
配置為 0-禁能時(shí)間片調(diào)度。
作用:用于在一個(gè)優(yōu)先級(jí)有多個(gè)任務(wù),就會(huì)每1ms 調(diào)度一次
用戶沒(méi)有配置此選項(xiàng)如果用戶沒(méi)有配置此選項(xiàng)
默認(rèn)在 FreeRTOS.h 文件中已經(jīng)配置為 1,即使能時(shí)間片調(diào)度。
Confi開始的其他宏-其他配置
圖片是樣例 不是按照?qǐng)D片設(shè)置的意思
鉤子函數(shù)配置:1、2、3、4
鉤子函數(shù)的主要功能是用于函數(shù)的擴(kuò)展,用戶可以根據(jù)自己的需要往里面添加相關(guān)的測(cè)試函數(shù)。就不會(huì)在用更改源碼,就像回調(diào)函數(shù)一樣。
1、configUSE_IDLE_HOOK
配置為 1-使能空閑任務(wù)的鉤子函數(shù)
配置為 0-禁能空閑任務(wù)鉤子函數(shù)
2、configUSE_MALLOC_FAILED_HOOK
配置為 1-使能動(dòng)態(tài)內(nèi)存申請(qǐng)失敗時(shí)的鉤子函數(shù)
配置為 0-禁能動(dòng)態(tài)內(nèi)存申請(qǐng)失敗時(shí)的鉤子函數(shù)
當(dāng)創(chuàng)建任務(wù),信號(hào)量或者消息隊(duì)列時(shí),F(xiàn)reeRTOS 通過(guò)函數(shù) pvPortMalloc()申請(qǐng)動(dòng)態(tài)內(nèi)存。
3、configUSE_TICK_HOOK
配置為 1-使能滴答定時(shí)器中斷里面執(zhí)行的鉤子函數(shù)
配置為 0-禁能滴答定時(shí)器中斷里面執(zhí)行的鉤子函數(shù)
4、configCHECK_FOR_STACK_OVERFLOW
配置為 2-使用一種方法檢測(cè)棧溢出。
配置為 1-使用另一種方法檢測(cè)棧溢出。
配置為 0-禁止棧溢出檢測(cè)。
任務(wù)運(yùn)行信息獲取配置:5、6、7、
5、configGENERATE_RUN_TIME_STATS
配置為 1-使能任務(wù)運(yùn)行狀態(tài)參數(shù)統(tǒng)計(jì)。
配置為 0-禁止此特性。
6、configUSE_TRACE_FACILITY
配置為 1-使能此配置將添加額外的結(jié)構(gòu)體成員和函數(shù),以此來(lái)協(xié)助可視化和跟蹤。
配置為 0-禁能此特性。
7、configUSE_STATS_FORMATTING_FUNCTIONS
用戶配置宏定義 configUSE_TRACE_FACILITY 和 configUSE_STATS_FORMATTING_FUNCTIONS都為 1 的時(shí)候,將使能函數(shù) vTaskList() 和 vTaskGetRunTimeStats(),如果兩者中任何一個(gè)為 0,那么這兩個(gè)函數(shù)都將被禁能。
(不用使用)合作式任務(wù)配置:8、9
8、configUSE_CO_ROUTINES
配置為 1-使能合作式調(diào)度相關(guān)函數(shù)。
配置為 0-禁能合作式調(diào)度相關(guān)函數(shù)。
9、configMAX_CO_ROUTINE_PRIORITIES
此參數(shù)用于定義可供用戶使用的最大的合作式任務(wù)優(yōu)先級(jí)數(shù),如果這個(gè)定義的是 5,那么用戶可以使用的優(yōu)先級(jí)號(hào)是 0,1,2,3,4,不包含 5,對(duì)于這一點(diǎn),初學(xué)者要特別的注意。
軟件定時(shí)器配置:10、11、
10、configUSE_TIMERS
配置為 1-使能軟件定時(shí)器。
配置為 0-0禁能軟件定時(shí)器。
11、configTIMER_TASK_PRIORITY
配置軟件定時(shí)器任務(wù)的優(yōu)先級(jí)。
12、configTIMER_QUEUE_LENGTH
配置軟件定時(shí)器命令隊(duì)列的長(zhǎng)度。
13、configTIMER_TASK_STACK_DEPTH
配置軟件定時(shí)器任務(wù)的??臻g大小
斷言配置:
會(huì)判斷函數(shù)輸入實(shí)參是否滿足要求,方便調(diào)試代碼
STM32cubeMX生成的:
中斷配置:
configLIBRARY_LOWEST_INTERRUPT_PRIORITY:
通常15
配置中斷最低優(yōu)先級(jí),通常為15(因?yàn)镾TM32的搶占式優(yōu)先級(jí)最多設(shè)置為4bit,優(yōu)先級(jí)最低只能設(shè)置為15),此參數(shù)用于配置SysTick(滴答中斷)與PendSV(掛起中斷)。
configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY:
配置系統(tǒng)可管理的最高優(yōu)先級(jí),此參數(shù)用于配置BASEPRI寄存器。 如果設(shè)置為5,則優(yōu)先級(jí)數(shù)值為0,1,2,3,4的中斷是不受FreeRTOS管理的,不可被屏蔽,也不能調(diào)用FreeRTOS中的API接口函數(shù),而中斷優(yōu)先級(jí)在5-15的中斷受系統(tǒng)FreeRTOS管理,可以被屏蔽.(用于臨界保護(hù)、防止其他中斷打斷重要程序)
“INCLUDE_”開始的宏
以“INCLUDE”開頭的宏允許您的應(yīng)用程序將未使用的實(shí)時(shí)內(nèi)核組件從您的工程中移除(主要通過(guò)C語(yǔ)言預(yù)編譯溢出的), 這可節(jié)約嵌入式應(yīng)用程序所需的任何 ROM 或 RAM。
每個(gè)宏都采用以下形式:
INCLUDE_FunctionName
其中 FunctionName 表示可以選擇性地排除的 API 函數(shù)(或函數(shù)集)。
要包含 API 函數(shù),請(qǐng)將宏設(shè)置為 1,要排除該函數(shù),請(qǐng)將宏設(shè)置為 0。
例如:
要包含 vTaskDelete() API 函數(shù),請(qǐng)使用:
#define INCLUDE_vTaskDelete 1
要從構(gòu)建中排除 vTaskDelete(),請(qǐng)使用:
#define INCLUDE_vTaskDelete 0