STM32F103移植FreeRTOSv10.1.0

1.下載源碼

 

FreeRTOS官網:FreeRTOS
下載後是一個FreeRTOSv10.1.0.exe文件,它纔是真正下載源碼的東西,雙擊以後選擇保存目錄就可以開始下載了。

2.添加源碼到STM32工程

1.複製一份庫函數版本的跑馬燈工程,新建文件夾FreeRTOS

 

2.複製下載的源碼中的 FreeRTOSv10.1.0\FreeRTOS\Source文件夾下的所有文件到剛纔的STM32工程FreeRTOS文件夾下

 

3.portable文件夾下可以只保留keil下編譯STM32F1相關的文件夾

 

3.修改工程

工程下新建FreeRTOS目錄,添加源碼中的7個.文件和FreeRTOS\portable\MenMang\heap_4.cFreeRTOS\portable\RVDS\ARM_CM3\port.c


工程中添加頭文件:


從源碼中複製一份FreeRTOSConfig.h(FreeRTOSv10.1.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil\FreeRTOSConfig.h),這裏選擇STM32F103_keil工程下的該文件,放到工程下的FreeRTOS\include文件夾


修改FreeRTOS.h下的兩個宏定義,從0改爲1


現在編譯工程應該0 Error(s), 0 Warning(s)

 

4.修改startup_stm32f10x_hd.s

在第56行開始的地方

; Vector Table Mapped to Address 0 at Reset
                AREA    RESET, DATA, READONLY
                EXPORT  __Vectors
                EXPORT  __Vectors_End
                EXPORT  __Vectors_Size
/******************************change****************************/
                IMPORT  vPortSVCHandler
                IMPORT  xPortPendSVHandler
                IMPORT  xPortSysTickHandler
/****************************************************************/

__Vectors       DCD     __initial_sp               ; Top of Stack
                DCD     Reset_Handler              ; Reset Handler
                DCD     NMI_Handler                ; NMI Handler
                DCD     HardFault_Handler          ; Hard Fault Handler
                DCD     MemManage_Handler          ; MPU Fault Handler
                DCD     BusFault_Handler           ; Bus Fault Handler
                DCD     UsageFault_Handler         ; Usage Fault Handler
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
/**************************************change****************************************/
;                DCD     SVC_Handler                ; SVCall Handler
                DCD     vPortSVCHandler
                DCD     DebugMon_Handler           ; Debug Monitor Handler
                DCD     0                          ; Reserved
;                DCD     PendSV_Handler             ; PendSV Handler
                DCD     xPortPendSVHandler
;                DCD     SysTick_Handler            ; SysTick Handler
                DCD     xPortSysTickHandler
/**************************************************************************************/

5.main.c中新建任務

/*
*********************************************************************************************************
*                                         標準庫
*********************************************************************************************************
*/
#include  <stdarg.h>
#include  <stdio.h>
#include  <stdlib.h>
#include  <math.h>



/*
*********************************************************************************************************
*                                           OS
*********************************************************************************************************
*/

#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "croutine.h"
#include "semphr.h"
#include "event_groups.h"
#include "stm32f10x.h"
#include "bsp_usart1.h"




/* ADC 相關處理任務*/
/* 任務優先級   */
#define ADC_TASK_PRIO               6
/* 任務棧大小   */
#define ADC_STK_SIZE                512
/* 任務句柄     */
TaskHandle_t Adc_Task_Handler;  

static void Adc_Task(void *pvParameters);


/*  顯示相關處理任務  */
/* 任務優先級   */
#define DISPLAY_TASK_PRIO               5
/* 任務棧大小   */
#define DISPLAY_STK_SIZE                512
/* 任務句柄     */
TaskHandle_t Display_Task_Handler; 

static void Display_Task(void *pvParameters);

static void AppTaskCreate (void);

/******************************************************************************                  
*name:             static void Adc_Task(void *pvParameters)                
*introduce:                          
*parameter:             void         
*return:            void 
*
*author:             Love My BaoBaoGao                      
*explain:                                              
*changetime:          2018.12.15                        
*******************************************************************************/
static void Adc_Task(void *pvParameters)
{
    while(1)
    {
        printf("\r\n adc測試 \r\n");
        vTaskDelay(20);
    }

}
/******************************************************************************                  
*name:            static void Display_Task(void *pvParameters)                 
*introduce:                        
*parameter:             void         
*return:            void 
*
*author:             Love My BaoBaoGao                      
*explain:                                              
*changetime:          2018.12.15                        
*******************************************************************************/
static void Display_Task(void *pvParameters)
{
    while(1)
    {
        printf("\r\n Display測試 \r\n");
        vTaskDelay(100);
    }

}

/**
  * @brief  主函數
  * @param  無  
  * @retval 無
  */	
int main(void)
{
    USART1_Config();
    printf("\r\n 主任務開始執行 \r\n");
	/* 創建任務 */
	AppTaskCreate();

	/* 創建任務通信機制 */
	//AppObjCreate();

    /* 啓動調度,開始執行任務 */
    vTaskStartScheduler();
}
/*
*********************************************************************************************************
*	函 數 名: AppTaskCreate
*	功能說明: 創建應用任務
*	形    參:無
*	返 回 值: 無
*********************************************************************************************************
*/
static void AppTaskCreate (void)
{
      #if 1
      xTaskCreate(Adc_Task,     /* 任務函數  */
                 "Adc_Task",      /* 任務名    */
                 ADC_STK_SIZE,                 /* 任務棧大小,單位word,也就是4字節 */
                 NULL,                /* 任務參數  */
                 ADC_TASK_PRIO,                   /* 任務優先級*/
                 &Adc_Task_Handler );  /* 任務句柄  */
      #endif
      #if 1
      xTaskCreate(Display_Task,     /* 任務函數  */
                 "Display_Task",      /* 任務名    */
                 DISPLAY_STK_SIZE,                 /* 任務棧大小,單位word,也就是4字節 */
                 NULL,                /* 任務參數  */
                 DISPLAY_TASK_PRIO,                   /* 任務優先級*/
                 &Display_Task_Handler );  /* 任務句柄  */
      #endif

}

6.驗證

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章