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.c
和FreeRTOS\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
}