在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于STM32F103系統(tǒng)的FreeRTOS程序移植

冬至子 ? 來源:月月望歸鳥 ? 作者:K.Fire ? 2023-11-10 11:03 ? 次閱讀

1

FreeRTOS移植及配置

在程序中,移植了正點原子的基于STM32的FreeRTOS程序,編寫了自己的內存管理程序malloc.c,程序主要結構如下:

圖片

FreeRTOS_CORE中是FreeRTOS的核心文件,包括與協(xié)程有關的croutine.c,與事件組有關的event_groups.c,與列表有關的list.c,與隊列有關的queue.c,與任務有關的tasks.c,與定時器時鐘有關的timers.c。

FreeRTOS_PORTABLE中是與FreeRTOS內存管理有關的文件,包括port.c和heap_4.c,port.c中主要包含一些與中斷有關的函數(shù),heap_4.c上一篇文章有詳細介紹,與內存分配釋放有關。

在FreeRTOSConfig.h文件中,對FreeRTOS的很多參數(shù)進行了配置,用戶可以修改其中的文件對程序參量進行配置并對程序功能進行選擇使用。

先聲明了一個斷言,方便提示用戶,當程序出錯時在FreeRTOS的那個程序哪一行出錯。

//斷言
#define vAssertCalled(char,int) printf("Error:%s,%drn",char,int)
#define configASSERT(x) if((x)==0) vAssertCalled(__FILE__,__LINE__)

然后是與任務調度算法相關的配置選項,主要的是configUSE_PREEMPTION和configUSE_TIME_SLICING,不過一般都開啟,置1就行。

/***************************************************************************************************************/
/*                                           調度算法配置選項                                                  */
/***************************************************************************************************************/
#define configUSE_PREEMPTION          1                       //1使用搶占式內核,0使用協(xié)程
#define configUSE_TIME_SLICING          1            //1使能時間片調度(默認是使能的),同等優(yōu)先級是否交替執(zhí)行
#define configUSE_PORT_OPTIMISED_TASK_SELECTION  1                       //1啟用特殊方法(使用硬件方法)來選擇下一個要運行的任務
                                                                        //一般是硬件計算前導零指令,如果所使用的
                                                                        //MCU沒有這些硬件指令的話此宏應該設置為0!
#define configUSE_TICKLESS_IDLE          0                       //1啟用低功耗tickless模式

然后是基礎配置選項,重要的幾個是configUSE_QUEUE_SETS、configCPU_CLOCK_HZ、configTICK_RATE_HZ、configMAX_TASK_NAME_LEN、configUSE_16_BIT_TICKS,其他保持默認,configCPU_CLOCK_HZ要改成我們單片機的時鐘頻率,這里使用了代碼定義的量SystemCoreClock,configTICK_RATE_HZ時鐘節(jié)拍頻率設置為1000,也就是周期為1ms,任務名字字符串長度configMAX_TASK_NAME_LEN如果你創(chuàng)建任務時的命名很長,需要改一下,configUSE_16_BIT_TICKS使用的時鐘位數(shù),需要和單片機一致,STM32為32位,這里需要將這個宏定義為0。

/***************************************************************************************************************/
/*                                        FreeRTOS基礎配置配置選項                                               */
/***************************************************************************************************************/
#define configUSE_QUEUE_SETS          1                       //為1時啟用隊列
#define configCPU_CLOCK_HZ            (SystemCoreClock)       //CPU頻率
#define configTICK_RATE_HZ            (1000)                  //時鐘節(jié)拍頻率,這里設置為1000,周期就是1ms
#define configMAX_PRIORITIES          (32)                    //可使用的最大優(yōu)先級
#define configMINIMAL_STACK_SIZE        ((unsigned short)130)   //空閑任務使用的堆棧大小
#define configMAX_TASK_NAME_LEN          (20)                    //任務名字字符串長度

#define configUSE_16_BIT_TICKS          0                       //系統(tǒng)節(jié)拍計數(shù)器變量數(shù)據(jù)類型,
                                                                        //1表示為16位無符號整形,0表示為32位無符號整形
#define configIDLE_SHOULD_YIELD          1                       //為1時空閑任務放棄CPU使用權給其他同優(yōu)先級的用戶任務
#define configUSE_TASK_NOTIFICATIONS            1                       //為1時開啟任務通知功能,默認開啟
#define configUSE_MUTEXES            1                       //為1時使用互斥信號量
#define configQUEUE_REGISTRY_SIZE        8                       //不為0時表示啟用隊列記錄,具體的值是可以
                                                                        //記錄的隊列和信號量最大數(shù)目。
#define configCHECK_FOR_STACK_OVERFLOW      0                       //大于0時啟用堆棧溢出檢測功能,如果使用此功能
                                                                        //用戶必須提供一個棧溢出鉤子函數(shù),如果使用的話
                                                                        //此值可以為1或者2,因為有兩種棧溢出檢測方法。
#define configUSE_RECURSIVE_MUTEXES        1                       //為1時使用遞歸互斥信號量
#define configUSE_MALLOC_FAILED_HOOK      0                       //1使用內存申請失敗鉤子函數(shù)
#define configUSE_APPLICATION_TASK_TAG      0                       //1為每個任務分配一個“標簽”值,標簽鉤子函數(shù)
#define configUSE_COUNTING_SEMAPHORES      1                       //為1時使用計數(shù)信號量

然后是與內存申請有關配置選項,一般保持默認就行,系統(tǒng)總堆大小可能需要微調。

/***************************************************************************************************************/
#define configSUPPORT_DYNAMIC_ALLOCATION        1                       //支持動態(tài)內存申請
#define configTOTAL_HEAP_SIZE          ((size_t)(20*1024))     //系統(tǒng)所有總的堆大小

然后是與鉤子函數(shù)有關的配置選項,我們不需要使用鉤子函數(shù),也不建議初學者用,因為空閑任務的鉤子函數(shù)需要寫的很高效率盡量不阻塞。

#define configUSE_IDLE_HOOK            0                       //1,使用空閑鉤子;0,不使用
#define configUSE_TICK_HOOK            0                       //1,使用時間片鉤子;0,不使用

與運行時間和任務狀態(tài)收集有關的配置選項 ,這部分主要與調試代碼有關,測一下代碼運行時間,觀察效率等。

/***************************************************************************************************************/
/*                                FreeRTOS與運行時間和任務狀態(tài)收集有關的配置選項                                 */
/***************************************************************************************************************/
#define configGENERATE_RUN_TIME_STATS                  0                               //為1時啟用運行時間統(tǒng)計功能
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()        ConfigureTimeForRunTimeStats()  //定時器3提供時間統(tǒng)計的時基,頻率為10K,即周期為100us
#define portGET_RUN_TIME_COUNTER_VALUE()            FreeRTOSRunTimeTicks          //獲取時間統(tǒng)計時間值

#define configUSE_TRACE_FACILITY                1                       //為1啟用可視化跟蹤調試
#define configUSE_STATS_FORMATTING_FUNCTIONS          1                       //與宏configUSE_TRACE_FACILITY同時為1時會編譯下面3個函數(shù)

與協(xié)程有關的配置選項,保持默認,我們用不到協(xié)程。

/***************************************************************************************************************/
/*                                FreeRTOS與協(xié)程有關的配置選項                                                  */
/***************************************************************************************************************/
#define configUSE_CO_ROUTINES               0                       //為1時啟用協(xié)程,啟用協(xié)程以后必須添加文件croutine.c
#define configMAX_CO_ROUTINE_PRIORITIES         ( 2 )                   //協(xié)程的有效優(yōu)先級數(shù)目

與軟件定時器有關的配置選項,F(xiàn)reeRTOS自帶軟件定時器,但是我們一般也用不到,STM32中有硬件定時器-滴答定時器,用這個就行。

/***************************************************************************************************************/
/*                                FreeRTOS與軟件定時器有關的配置選項                                            */
/***************************************************************************************************************/
#define configUSE_TIMERS                1                               //為1時啟用軟件定時器
#define configTIMER_TASK_PRIORITY            (configMAX_PRIORITIES-1)        //軟件定時器優(yōu)先級
#define configTIMER_QUEUE_LENGTH            5                               //軟件定時器隊列長度
#define configTIMER_TASK_STACK_DEPTH          (configMINIMAL_STACK_SIZE*2)    //軟件定時器任務堆棧大小

FreeRTOS可選函數(shù)配置選項,這些以INCLUDE_開頭的宏定義,主要是一些函數(shù)的開關,比如第一個INCLUDE_xTaskGetSchedulerState,設置為1意味著,使用TaskGetSchedulerState這個函數(shù)。

/***************************************************************************************************************/
/*                                FreeRTOS可選函數(shù)配置選項                                                      */
/***************************************************************************************************************/
#define INCLUDE_xTaskGetSchedulerState          1           //獲取任務調度狀態(tài)           
#define INCLUDE_vTaskPrioritySet            1      //任務優(yōu)先級設置
#define INCLUDE_uxTaskPriorityGet            1      //獲取任務優(yōu)先級
#define INCLUDE_vTaskDelete                1      //刪除任務
#define INCLUDE_vTaskCleanUpResources          1      //清理任務占用資源
#define INCLUDE_vTaskSuspend              1      //暫停任務
#define INCLUDE_vTaskDelayUntil              1      //掛起任務,固定時間周期
#define INCLUDE_vTaskDelay                1      //掛起任務,延時一段時間
#define INCLUDE_eTaskGetState              1      //獲取任務狀態(tài)
#define INCLUDE_xTimerPendFunctionCall          1      //暫停狀態(tài)喚起

FreeRTOS與中斷有關的配置選項,用不著,也不用深究。

/***************************************************************************************************************/
/*                                FreeRTOS與中斷有關的配置選項                                                  */
/***************************************************************************************************************/
#ifdef __NVIC_PRIO_BITS
  #define configPRIO_BITS           __NVIC_PRIO_BITS
#else
  #define configPRIO_BITS           4                  
#endif

#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY      15                      //中斷最低優(yōu)先級
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY  5                       //系統(tǒng)可管理的最高中斷優(yōu)先級
#define configKERNEL_INTERRUPT_PRIORITY     ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY < < (8 - configPRIO_BITS) )
#define configMAX_SYSCALL_INTERRUPT_PRIORITY   ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY < < (8 - configPRIO_BITS) )

最后是與中斷服務函數(shù)有關的配置選項,只不過做了兩個重命名。

/***************************************************************************************************************/
/*                                FreeRTOS與中斷服務函數(shù)有關的配置選項                                          */
/***************************************************************************************************************/
#define xPortPendSVHandler   PendSV_Handler
#define vPortSVCHandler   SVC_Handler

2

使用隊列進行任務間的同步與互斥

原來的程序是STM32裸機開發(fā),程序是順序執(zhí)行,可能使用中斷,對于電池電量收集、IMU數(shù)據(jù)采集、超聲波檢測等功能都是順序執(zhí)行,采用頻率控制各個“進程”,即在while循環(huán)中使用函數(shù)獲取程序當前時間,減去上一時刻時間,當差值大于某一值時,運行相應函數(shù),如下圖所示。

圖片

而在改進后的程序中,采用實時系統(tǒng),使用多線程的方式管理這些功能,為每個功能創(chuàng)建一個任務(線程),根據(jù)任務調度機制運行,如下圖所示。

圖片

并為各個任務設置優(yōu)先級,move_base是最基本的移動任務優(yōu)先級最高。

圖片

各個任務之間通過隊列進行溝通,不然move_base任務的優(yōu)先級最高,則會一直執(zhí)行,其他任務得不到執(zhí)行時間。

圖片

在move_base任務中以電池電量采集任務的執(zhí)行為例:

圖片

代碼邏輯:當執(zhí)行到這部分代碼時,判斷電池隊列的句柄是否為NULL(之前創(chuàng)建了,所以不為空),然后使用xQueueReceive函數(shù)進行隊列數(shù)據(jù)采集,從Battery_Queue隊列中將數(shù)據(jù)采集到Receive_vattery_volt變量中,剛開始采集時,隊列中肯定是沒數(shù)據(jù)的,這是就會進入隊列阻塞,阻塞時間為portMAX_DELAY直到隊列中有數(shù)據(jù),這時move_base任務則會掛起,低優(yōu)先級的任務會執(zhí)行,當執(zhí)行到電池電量采集任務時,向隊列中放入了數(shù)據(jù),move_base任務則會搶占,繼續(xù)執(zhí)行,然后將采集到的數(shù)據(jù)發(fā)給上位機

其他任務都是這個邏輯,使用這種方法的好處就是提高了我們程序的效率,使得STM32程序多線程執(zhí)行,并且提供了很多接口,方便用戶修改和閱讀。

3

總結

FreeRTOS在STM32F103上的移植完結,整理來說FreeRTOS還是挺簡單的,不過很多知識沒用到我也就沒仔細學,任務之間的同步互斥與溝通有很多方式,除了隊列還有信號量、互斥量等等,我只是選擇了最常用的一種。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 定時器
    +關注

    關注

    23

    文章

    3289

    瀏覽量

    117345
  • FreeRTOS
    +關注

    關注

    12

    文章

    492

    瀏覽量

    63826
  • 上位機
    +關注

    關注

    27

    文章

    961

    瀏覽量

    55630
  • STM32F103
    +關注

    關注

    33

    文章

    482

    瀏覽量

    65132
  • 定時中斷
    +關注

    關注

    0

    文章

    19

    瀏覽量

    8681
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    STM32F103控制ad7606采集程序分享

    本文首先分析了了stm32f103系列的性能如何,其次介紹了ad7606特性,最后介紹了STM32F103控制ad7606采集程序。
    的頭像 發(fā)表于 05-21 11:31 ?3.1w次閱讀

    FreeRTOS移植STM32F103中的步驟

    目錄一、FreeRTOS的介紹二、將FreeRTOS移植STM32F103中的步驟1.前期準備2.在MDK下移植
    發(fā)表于 08-24 07:26

    如何去完成STM32F103FreeRTOS操作系統(tǒng)移植

    如何去完成STM32F103FreeRTOS操作系統(tǒng)移植呢?有哪些操作步驟?
    發(fā)表于 11-26 06:40

    基于STM32F103FreeRTOS移植其代碼該如何去實現(xiàn)呢

    怎樣去移植基于STM32F103FreeRTOS系統(tǒng)呢?基于STM32F103FreeRTOS
    發(fā)表于 12-14 06:58

    基于STM32F103的振動監(jiān)測系統(tǒng)設計

    基于STM32F103的振動監(jiān)測系統(tǒng)設計。
    發(fā)表于 11-09 17:49 ?46次下載

    STM32F103芯片F(xiàn)FT程序

    STM32F103芯片使用DSP庫進行FFT運算的資料與程序
    發(fā)表于 06-07 16:30 ?110次下載

    STM32F103的振動監(jiān)測系統(tǒng)設計

    STM32F103的振動監(jiān)測系統(tǒng)設計
    發(fā)表于 09-28 14:45 ?49次下載
    <b class='flag-5'>STM32F103</b>的振動監(jiān)測<b class='flag-5'>系統(tǒng)</b>設計

    盤古STM32F103開發(fā)板移植uCGUI教程

    盤古STM32F103開發(fā)板移植uCGUI教程
    發(fā)表于 09-29 09:21 ?21次下載
    盤古<b class='flag-5'>STM32F103</b>開發(fā)板<b class='flag-5'>移植</b>uCGUI教程

    stm32f103移植

    stm32f103移植
    發(fā)表于 10-27 09:03 ?43次下載
    <b class='flag-5'>stm32f103</b><b class='flag-5'>移植</b>

    STM32F103 CAN模板程序

    STM32F103 CAN模板程序
    發(fā)表于 11-09 11:08 ?85次下載
    <b class='flag-5'>STM32F103</b> CAN模板<b class='flag-5'>程序</b>

    基于STM32f103的FFT頻率測試程序下載

    基于STM32f103的FFT頻率測試程序下載
    發(fā)表于 08-02 10:07 ?169次下載

    在GD32F103移植STM32F103代碼

    在GD32F103移植STM32F103代碼使用相同F(xiàn)LASH和管腳數(shù)量相同的芯片,例如GDF103C8T6移植
    發(fā)表于 12-02 15:21 ?23次下載
    在GD32<b class='flag-5'>F103</b><b class='flag-5'>移植</b><b class='flag-5'>STM32F103</b>代碼

    華為LiteOS系統(tǒng)移植STM32F103開發(fā)板(基于MDK環(huán)境)

    華為LiteOS系統(tǒng)移植STM32F103開發(fā)板(基于MDK環(huán)境)
    發(fā)表于 12-08 14:21 ?48次下載
    華為LiteOS<b class='flag-5'>系統(tǒng)</b><b class='flag-5'>移植</b>到<b class='flag-5'>STM32F103</b>開發(fā)板(基于MDK環(huán)境)

    RT-Thread系統(tǒng)移植STM32f103

    RT-Thread系統(tǒng)移植STM32f103
    發(fā)表于 12-09 12:51 ?26次下載
    RT-Thread<b class='flag-5'>系統(tǒng)</b><b class='flag-5'>移植</b>到<b class='flag-5'>STM32f103</b>

    FreeRTOS移植STM32F103步驟與注意事項

    FreeRTOS的研究并在公司產品中應用,多少有些心得,接下來就由小燈以最新版的FreeRTOS為例一步一步移植STM32F103上,并提醒大家某些需要注意的事項。本文檔為非正式技
    發(fā)表于 12-27 18:39 ?7次下載
    <b class='flag-5'>FreeRTOS</b><b class='flag-5'>移植</b>到<b class='flag-5'>STM32F103</b>步驟與注意事項
    主站蜘蛛池模板: 亚洲一区二区三区网站 | 高清不卡毛片免费观看 | 手机毛片在线 | 国产色产综合色产在线观看视频 | 天堂影院在线 | 高清一级毛片一本到免费观看 | 日本三级带日本三级带黄首页 | 日韩三级在线观看视频 | 亚洲综合色站 | 天天看人体| 午夜在线免费视频 | 高清配种视频xxxxx | hs网站在线观看 | 欧美黄色免费大片 | 操操片 | 国产一级淫 | 国产综合久久久久影院 | 性喷潮久久久久久久久 | 卡一卡二卡三国色天香永不失联 | 在线免费观看h视频 | 午夜网站免费版在线观看 | 男女视频在线播放 | 亚洲乱亚洲乱妇41p 亚洲乱亚洲乱妇41p国产成人 | 黄色网址播放 | 亚洲伊人成综合成人网 | 很黄的网站在线观看 | 中文日产国产精品久久 | 我把美女日出白浆 | 看黄网站免费 | 手机在线电影你懂的 | 性午夜影院| 午夜在线视频国产 | 欧美yw193.c㎝在线观看 | 萌白酱白丝护士服喷水铁牛tv | 站长工具天天爽视频 | 欧美色爱综合网 | 四虎成人精品在永久在线观看 | 亚洲国产精品久久网午夜 | 午夜影院免费观看视频 | 国产特黄一级毛片特黄 | 午夜黄色影院 |