1
FreeRTOS移植及配置
在程序中,移植了正點(diǎn)原子的基于STM32的FreeRTOS程序,編寫了自己的內(nèi)存管理程序malloc.c,程序主要結(jié)構(gòu)如下:
FreeRTOS_CORE中是FreeRTOS的核心文件,包括與協(xié)程有關(guān)的croutine.c,與事件組有關(guān)的event_groups.c,與列表有關(guān)的list.c,與隊(duì)列有關(guān)的queue.c,與任務(wù)有關(guān)的tasks.c,與定時(shí)器時(shí)鐘有關(guān)的timers.c。
FreeRTOS_PORTABLE中是與FreeRTOS內(nèi)存管理有關(guān)的文件,包括port.c和heap_4.c,port.c中主要包含一些與中斷有關(guān)的函數(shù),heap_4.c上一篇文章有詳細(xì)介紹,與內(nèi)存分配釋放有關(guān)。
在FreeRTOSConfig.h文件中,對FreeRTOS的很多參數(shù)進(jìn)行了配置,用戶可以修改其中的文件對程序參量進(jìn)行配置并對程序功能進(jìn)行選擇使用。
先聲明了一個(gè)斷言,方便提示用戶,當(dāng)程序出錯(cuò)時(shí)在FreeRTOS的那個(gè)程序哪一行出錯(cuò)。
//斷言
#define vAssertCalled(char,int) printf('Error:%s,%drn',char,int)
#define configASSERT(x) if((x)==0) vAssertCalled(__FILE__,__LINE__)
然后是與任務(wù)調(diào)度算法相關(guān)的配置選項(xiàng),主要的是configUSE_PREEMPTION和configUSE_TIME_SLICING,不過一般都開啟,置1就行。
/***************************************************************************************************************/
/* 調(diào)度算法配置選項(xiàng) */
/***************************************************************************************************************/
#define configUSE_PREEMPTION 1 //1使用搶占式內(nèi)核,0使用協(xié)程
#define configUSE_TIME_SLICING 1 //1使能時(shí)間片調(diào)度(默認(rèn)是使能的),同等優(yōu)先級是否交替執(zhí)行
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 //1啟用特殊方法(使用硬件方法)來選擇下一個(gè)要運(yùn)行的任務(wù)
//一般是硬件計(jì)算前導(dǎo)零指令,如果所使用的
//MCU沒有這些硬件指令的話此宏應(yīng)該設(shè)置為0!
#define configUSE_TICKLESS_IDLE 0 //1啟用低功耗tickless模式
然后是基礎(chǔ)配置選項(xiàng),重要的幾個(gè)是configUSE_QUEUE_SETS、configCPU_CLOCK_HZ、configTICK_RATE_HZ、configMAX_TASK_NAME_LEN、configUSE_16_BIT_TICKS,其他保持默認(rèn),configCPU_CLOCK_HZ要改成我們單片機(jī)的時(shí)鐘頻率,這里使用了代碼定義的量SystemCoreClock,configTICK_RATE_HZ時(shí)鐘節(jié)拍頻率設(shè)置為1000,也就是周期為1ms,任務(wù)名字字符串長度configMAX_TASK_NAME_LEN如果你創(chuàng)建任務(wù)時(shí)的命名很長,需要改一下,configUSE_16_BIT_TICKS使用的時(shí)鐘位數(shù),需要和單片機(jī)一致,STM32為32位,這里需要將這個(gè)宏定義為0。
/***************************************************************************************************************/
/* FreeRTOS基礎(chǔ)配置配置選項(xiàng) */
/***************************************************************************************************************/
#define configUSE_QUEUE_SETS 1 //為1時(shí)啟用隊(duì)列
#define configCPU_CLOCK_HZ (SystemCoreClock) //CPU頻率
#define configTICK_RATE_HZ (1000) //時(shí)鐘節(jié)拍頻率,這里設(shè)置為1000,周期就是1ms
#define configMAX_PRIORITIES (32) //可使用的最大優(yōu)先級
#define configMINIMAL_STACK_SIZE ((unsigned short)130) //空閑任務(wù)使用的堆棧大小
#define configMAX_TASK_NAME_LEN (20) //任務(wù)名字字符串長度
#define configUSE_16_BIT_TICKS 0 //系統(tǒng)節(jié)拍計(jì)數(shù)器變量數(shù)據(jù)類型,
//1表示為16位無符號整形,0表示為32位無符號整形
#define configIDLE_SHOULD_YIELD 1 //為1時(shí)空閑任務(wù)放棄CPU使用權(quán)給其他同優(yōu)先級的用戶任務(wù)
#define configUSE_TASK_NOTIFICATIONS 1 //為1時(shí)開啟任務(wù)通知功能,默認(rèn)開啟
#define configUSE_MUTEXES 1 //為1時(shí)使用互斥信號量
#define configQUEUE_REGISTRY_SIZE 8 //不為0時(shí)表示啟用隊(duì)列記錄,具體的值是可以
//記錄的隊(duì)列和信號量最大數(shù)目。
#define configCHECK_FOR_STACK_OVERFLOW 0 //大于0時(shí)啟用堆棧溢出檢測功能,如果使用此功能
//用戶必須提供一個(gè)棧溢出鉤子函數(shù),如果使用的話
//此值可以為1或者2,因?yàn)橛袃煞N棧溢出檢測方法。
#define configUSE_RECURSIVE_MUTEXES 1 //為1時(shí)使用遞歸互斥信號量
#define configUSE_MALLOC_FAILED_HOOK 0 //1使用內(nèi)存申請失敗鉤子函數(shù)
#define configUSE_APPLICATION_TASK_TAG 0 //1為每個(gè)任務(wù)分配一個(gè)“標(biāo)簽”值,標(biāo)簽鉤子函數(shù)
#define configUSE_COUNTING_SEMAPHORES 1 //為1時(shí)使用計(jì)數(shù)信號量
然后是與內(nèi)存申請有關(guān)配置選項(xiàng),一般保持默認(rèn)就行,系統(tǒng)總堆大小可能需要微調(diào)。
/***************************************************************************************************************/
#define configSUPPORT_DYNAMIC_ALLOCATION 1 //支持動(dòng)態(tài)內(nèi)存申請
#define configTOTAL_HEAP_SIZE ((size_t)(20*1024)) //系統(tǒng)所有總的堆大小
然后是與鉤子函數(shù)有關(guān)的配置選項(xiàng),我們不需要使用鉤子函數(shù),也不建議初學(xué)者用,因?yàn)榭臻e任務(wù)的鉤子函數(shù)需要寫的很高效率盡量不阻塞。
#define configUSE_IDLE_HOOK 0 //1,使用空閑鉤子;0,不使用
#define configUSE_TICK_HOOK 0 //1,使用時(shí)間片鉤子;0,不使用
與運(yùn)行時(shí)間和任務(wù)狀態(tài)收集有關(guān)的配置選項(xiàng) ,這部分主要與調(diào)試代碼有關(guān),測一下代碼運(yùn)行時(shí)間,觀察效率等。
/***************************************************************************************************************/
/* FreeRTOS與運(yùn)行時(shí)間和任務(wù)狀態(tài)收集有關(guān)的配置選項(xiàng) */
/***************************************************************************************************************/
#define configGENERATE_RUN_TIME_STATS 0 //為1時(shí)啟用運(yùn)行時(shí)間統(tǒng)計(jì)功能
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() ConfigureTimeForRunTimeStats() //定時(shí)器3提供時(shí)間統(tǒng)計(jì)的時(shí)基,頻率為10K,即周期為100us
#define portGET_RUN_TIME_COUNTER_VALUE() FreeRTOSRunTimeTicks //獲取時(shí)間統(tǒng)計(jì)時(shí)間值
#define configUSE_TRACE_FACILITY 1 //為1啟用可視化跟蹤調(diào)試
#define configUSE_STATS_FORMATTING_FUNCTIONS 1 //與宏configUSE_TRACE_FACILITY同時(shí)為1時(shí)會(huì)編譯下面3個(gè)函數(shù)
與協(xié)程有關(guān)的配置選項(xiàng),保持默認(rèn),我們用不到協(xié)程。
/***************************************************************************************************************/
/* FreeRTOS與協(xié)程有關(guān)的配置選項(xiàng) */
/***************************************************************************************************************/
#define configUSE_CO_ROUTINES 0 //為1時(shí)啟用協(xié)程,啟用協(xié)程以后必須添加文件croutine.c
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) //協(xié)程的有效優(yōu)先級數(shù)目
上一篇:利用STM32CubeMX解讀時(shí)鐘樹
下一篇:STM32單片機(jī)中的C語言基礎(chǔ)知識
推薦閱讀最新更新時(shí)間:2025-04-06 23:24






設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 迅為imx6ull開發(fā)板使用c語言調(diào)用shell命令控制led燈
- 迅為IMX8MM開發(fā)板Android編譯環(huán)境搭建
- 迅為IMX6ULL開發(fā)板NFS服務(wù)器的使用
- 迅為ITOP4412開發(fā)板Qt界面添加圖片
- 迅為IMX6開發(fā)板OTA遠(yuǎn)程升級-SWUpdata概述和使用
- 迅為IMX6ULL開發(fā)板NFS服務(wù)器的搭建
- 迅為IMX6開發(fā)板Buildroot文件系統(tǒng)4G撥號上網(wǎng)工具測試
- 實(shí)驗(yàn)分享丨迅為IMX6ULL開發(fā)板點(diǎn)亮第一個(gè)led燈
- 迅為-IMX6Q開發(fā)板Buildroot文件系統(tǒng)nfs測試
- LT8610AC 的典型應(yīng)用 - 具有 2.5 uA 靜態(tài)電流的 42V、3.5A 同步降壓型穩(wěn)壓器
- 半導(dǎo)體冰箱溫控板
- FEBFAN23SV60_LVA,基于 FAN23SV60 10A 同步降壓穩(wěn)壓器的評估板,具有超聲波模式、內(nèi)部線性穩(wěn)壓器和寬輸入范圍
- 基于esp32c3的有線HID轉(zhuǎn)藍(lán)牙 & 鼠鍵宏
- LTC3806 的典型應(yīng)用 - 同步反激式 DC/DC 控制器
- OP495GPZ 4 mA 至 20 mA 電流回路變送器的典型應(yīng)用
- NCP380LMU15AGEVB:高側(cè)配電開關(guān)評估板
- TAR5S31 點(diǎn)穩(wěn)壓器(低壓降穩(wěn)壓器)的典型應(yīng)用
- STEVAL-IDS001V4,基于 SPIRIT1 的演示板 868-MHz 頻段低成本、低數(shù)據(jù)速率、短距離 USB 加密狗收發(fā)器
- LTC3723EGN-1 隔離式推挽式轉(zhuǎn)換器的典型應(yīng)用電路
- 迅為IMX6開發(fā)板OTA遠(yuǎn)程升級-SWUpdata概述和使用
- 迅為IMX6ULL開發(fā)板NFS服務(wù)器的搭建
- 迅為IMX6開發(fā)板Buildroot文件系統(tǒng)4G撥號上網(wǎng)工具測試
- 實(shí)驗(yàn)分享丨迅為IMX6ULL開發(fā)板點(diǎn)亮第一個(gè)led燈
- 迅為-IMX6Q開發(fā)板Buildroot文件系統(tǒng)nfs測試
- 進(jìn)步一點(diǎn)點(diǎn)丨迅為4412開發(fā)板Linux內(nèi)核開發(fā)基礎(chǔ)
- 每天學(xué)習(xí)一點(diǎn)丨借助U盤或TF卡拷貝程序到迅為IMX6ULL開發(fā)板上(二)
- iTOP4412開發(fā)板-Qt初探及Qtopia2.2.0系統(tǒng)開發(fā)
- 每天學(xué)習(xí)一點(diǎn)丨借助U盤或TF卡拷貝程序到迅為IMX6ULL開發(fā)板上(一)每天學(xué)習(xí)一點(diǎn)丨借助U盤
- 迅為i.MX8MM開發(fā)板ARM嵌入式Linux安卓9.0工業(yè)核心板iMX8M Mini板
- Littelfuse第2期 | 符合AEC-Q200 車規(guī)的保險(xiǎn)絲/熔斷器
- 【看電源研討會(huì),瓜分3000元紅包】 如何正確完成模塊化DC-DC系統(tǒng)設(shè)計(jì)
- 下載有禮:一起初探5G,贏氮化鎵(GaN)充電器、柔性墨水屏等精美禮品
- 是德科技第二屆示波器感恩月之買一送一
- 直播已結(jié)束|如何通過【TI MSPM0 固件示例】及【常用電機(jī)驅(qū)動(dòng)器方案和拓?fù)洹浚?0分鐘內(nèi)旋轉(zhuǎn)電機(jī)
- 免費(fèi)申請 | DFRobot蓋革計(jì)數(shù)器模塊
- 2023 DigiKey KOL 系列——將TinyML融入IoT物聯(lián)網(wǎng)應(yīng)用中
- RightHand推出第二代拾取機(jī)器人系統(tǒng)
- 三星和LG隨汽車電子市場呈現(xiàn)高速發(fā)展趨勢而受益?
- Wayve憑借機(jī)器學(xué)習(xí)算法就可以實(shí)現(xiàn)自動(dòng)駕駛汽車上路行駛
- 英特爾用1300萬美元投資Untether AI
- 無人駕駛汽車大規(guī)模應(yīng)用的確能拯救生命,但仍需時(shí)日。
- 大族激光擬8000萬向智人團(tuán)轉(zhuǎn)讓大族機(jī)器人50%股權(quán)
- OnRobot參展第22屆工博會(huì) 展示一站式協(xié)作應(yīng)用產(chǎn)品和解決方案
- 大型服務(wù)機(jī)器人優(yōu)友的優(yōu)勢有哪些
- 緯湃科技宣布最新成果,高壓電機(jī)技術(shù)突破,2023年投入量產(chǎn)
- 中航鋰電發(fā)布新電池技術(shù):無模組、成本降低10%!
- 集成溫度傳感器AD590及其應(yīng)用
- 求助,關(guān)于μc/osII在ARM9 S3c2410x上的中斷延遲時(shí)間的問題。
- 升降壓超級電容充電方案
- iso 14230
- IC行業(yè)的寒冷冬季里,同志們來曬曬自己的薪水吧!讓這個(gè)冬季來點(diǎn)兒溫暖
- 【CN0134】寬帶低EVM直接變頻發(fā)射機(jī)
- 【GD32L233C-START評測】19、低功耗串口(深度休眠喚醒、空閑中斷不定長數(shù)據(jù)接收)
- 如何實(shí)現(xiàn)1拖N的多線程ISP編程?
- 再次求助:Z-stack運(yùn)行受阻
- 選擇空調(diào)器應(yīng)注意些什么