1、FreeRTOS移植


1.FreeRTOS目錄結構

FreeRTOS

  • FreeRTOS簡略目錄如下:
    ├─FreeRTOS
    │  ├─Demo               // 各種開發工具的完整Demo,開發者可以方便的以此搭建出自己的項目,甚至直接使用
    │  │  ├─Common          // 所有例程都可以使用的演示例程文件
    │  │  └─其他              // 對應平台和開發工具的項目例程(命名:平台_開發工具,例如:CORTEX_M4F_M0_LPC43xx_Keil)
    │  ├─License            // 使用修改過的GPL
    │  └─Source             // FreeRTOS的源碼
    │      ├─include        // 源碼對應的頭文件
    │      └─portable       // 每個支持的處理器架構需要一小段與處理器架構相關的RTOS代碼。該目錄下即為和開發平台相關的代碼
    │            ├─MemMang  // FreeRTOS內存管理方案(一般要根據平台來選擇以下5個之一)
    │            │     heap_1.c
    │            │     heap_2.c
    │            │     heap_3.c
    │            │     heap_4.c
    │            │     heap_5.c
    │            └─其他       // 其他開發工具相關的代碼,需要根據自己的開發工具進行選擇
    │      croutine.c       // 協線程(協程)文件,和任務類似,在系統資源比較缺乏下使用
    │      event_groups.c   // 事件標志組
    │      list.c           // 列表結構描述,在內核整體控制上都使用了列表格式數據處理,一切數據結構的基礎
    │      queue.c          // 隊列,任務和任務之間的通訊處理
    │      tasks.c          // 所有任務相關函數
    │      timers.c         // 軟件定時器,以任務形式存在
    |      stream_buffer.c  // 10.0.0 新增
    └─FreeRTOS-Plus         // FreeRTOS+組件和演示例程

2.移植

  • 建立工程添加相應的文件,工程結構如下圖所示
  • 然后編譯,報如下錯誤:
    .\Objects\freeRTOS_sCreate_task.axf: Error: L6200E: Symbol SVC_Handler multiply defined (by port.o and stm32f10x_it.o).
    .\Objects\freeRTOS_sCreate_task.axf: Error: L6200E: Symbol PendSV_Handler multiply defined (by port.o and stm32f10x_it.o).
    .\Objects\freeRTOS_sCreate_task.axf: Error: L6200E: Symbol SysTick_Handler multiply defined (by delay.o and stm32f10x_it.o).
  • 解決方法:將stm32f10x_it.h中三個函數:SVC_Handler、PendSV_Handler、SysTick_Handler注釋掉即可;
  • 然后在編譯,出現新的錯誤:
    ..\FreeRTOS\Source\include\FreeRTOS.h(98): error:  #5: cannot open source input file "FreeRTOSConfig.h": No such file or directory
      #include "FreeRTOSConfig.h"
  • 這是因為在 freeRTOS/include 中沒有FreeRTOSConfig.h這個文件,只需要從別的工程copy到include的目錄中即可;

3.FreeRTOSConfig.h 文件分析

  • freeRTOSConfig.h這個文件為FreeRTOS系統的配置文件
    #ifndef FREERTOS_CONFIG_H
    #define FREERTOS_CONFIG_H
    
    #include "sys.h"
    #include "usart.h"
    //針對不同的編譯器調用不同的stdint.h文件
    #if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
        #include <stdint.h>
        extern uint32_t SystemCoreClock;
    #endif
    
    //斷言
    #define vAssertCalled(char,int) printf("Error:%s,%d\r\n",char,int)
    #define configASSERT(x) if((x)==0) vAssertCalled(__FILE__,__LINE__)
    
    /***************************************************************************************************************/
    /*                                        FreeRTOS基礎配置配置選項                                              */
    /***************************************************************************************************************/
    #define configUSE_PREEMPTION                    1                       //1使用搶占式內核,0使用協程
    #define configUSE_TIME_SLICING                    1                        //1使能時間片調度(默認式使能的)
    #define configUSE_PORT_OPTIMISED_TASK_SELECTION    1                       //1啟用特殊方法來選擇下一個要運行的任務
                                                                            //一般是硬件計算前導零指令,如果所使用的
                                                                            //MCU沒有這些硬件指令的話此宏應該設置為0!
    #define configUSE_TICKLESS_IDLE                    0                       //1啟用低功耗tickless模式
    #define configUSE_QUEUE_SETS                    1                       //為1時啟用隊列
    #define configCPU_CLOCK_HZ                        (SystemCoreClock)       //CPU頻率
    #define configTICK_RATE_HZ                        (1000)                  //時鍾節拍頻率,這里設置為1000,周期就是1ms
    #define configMAX_PRIORITIES                    (32)                    //可使用的最大優先級
    #define configMINIMAL_STACK_SIZE                ((unsigned short)130)   //空閑任務使用的堆棧大小
    #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                       //不為0時表示啟用隊列記錄,具體的值是可以
                                                                            //記錄的隊列和信號量最大數目。
    #define configCHECK_FOR_STACK_OVERFLOW            0                       //大於0時啟用堆棧溢出檢測功能,如果使用此功能
                                                                            //用戶必須提供一個棧溢出鈎子函數,如果使用的話
                                                                            //此值可以為1或者2,因為有兩種棧溢出檢測方法。
    #define configUSE_RECURSIVE_MUTEXES                1                       //為1時使用遞歸互斥信號量
    #define configUSE_MALLOC_FAILED_HOOK            0                       //1使用內存申請失敗鈎子函數
    #define configUSE_APPLICATION_TASK_TAG            0                       
    #define configUSE_COUNTING_SEMAPHORES            1                       //為1時使用計數信號量
    
    /***************************************************************************************************************/
    /*                                FreeRTOS與內存申請有關配置選項                                                */
    /***************************************************************************************************************/
    #define configSUPPORT_DYNAMIC_ALLOCATION        1                       //支持動態內存申請
    #define configTOTAL_HEAP_SIZE                    ((size_t)(20*1024))     //系統所有總的堆大小
    
    /***************************************************************************************************************/
    /*                                FreeRTOS與鈎子函數有關的配置選項                                              */
    /***************************************************************************************************************/
    #define configUSE_IDLE_HOOK                        0                       //1,使用空閑鈎子;0,不使用
    #define configUSE_TICK_HOOK                        0                       //1,使用時間片鈎子;0,不使用
    
    /***************************************************************************************************************/
    /*                                FreeRTOS與運行時間和任務狀態收集有關的配置選項                                 */
    /***************************************************************************************************************/
    #define configGENERATE_RUN_TIME_STATS            0                       //為1時啟用運行時間統計功能
    #define configUSE_TRACE_FACILITY                1                       //為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                (configMAX_PRIORITIES-1)        //軟件定時器優先級
    #define configTIMER_QUEUE_LENGTH                5                               //軟件定時器隊列長度
    #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
    
    /***************************************************************************************************************/
    /*                                FreeRTOS與中斷有關的配置選項                                                  */
    /***************************************************************************************************************/
    #ifdef __NVIC_PRIO_BITS
        #define configPRIO_BITS               __NVIC_PRIO_BITS
    #else
        #define configPRIO_BITS               4                  
    #endif
    
    #define configLIBRARY_LOWEST_INTERRUPT_PRIORITY            15                      //中斷最低優先級
    #define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY    5                       //系統可管理的最高中斷優先級
    #define configKERNEL_INTERRUPT_PRIORITY         ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
    #define configMAX_SYSCALL_INTERRUPT_PRIORITY     ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
    
    /***************************************************************************************************************/
    /*                                FreeRTOS與中斷服務函數有關的配置選項                                          */
    /***************************************************************************************************************/
    #define xPortPendSVHandler     PendSV_Handler
    #define vPortSVCHandler     SVC_Handler
    
    #endif /* FREERTOS_CONFIG_H */

     

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM