- 正點(diǎn)原子戰(zhàn)艦戰(zhàn)艦開發(fā)板(STM32F103ZET6)
- FreeRTOSv10.1.0
1.下載源碼
FreeRTOS官網(wǎng):FreeRTOS
下載后是一個(gè)FreeRTOSv10.1.0.exe文件,它才是真正下載源碼的東西,雙擊以后選擇保存目錄就可以開始下載了。
2.添加源碼到STM32工程
1.復(fù)制一份庫函數(shù)版本的跑馬燈工程,新建文件夾FreeRTOS
2.復(fù)制下載的源碼中的 FreeRTOSv10.1.0\FreeRTOS\Source文件夾下的所有文件到剛才的STM32工程FreeRTOS文件夾下
3.portable文件夾下可以只保留keil下編譯STM32F1相關(guān)的文件夾
3.修改工程
工程下新建FreeRTOS目錄,添加源碼中的7個(gè).文件和FreeRTOS\portable\MenMang\heap_4.c和FreeRTOS\portable\RVDS\ARM_CM3\port.c
工程中添加頭文件:
從源碼中復(fù)制一份FreeRTOSConfig.h(
FreeRTOSv10.1.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil\FreeRTOSConfig.h),這里選擇STM32F103_keil工程下的該文件,放到工程下的FreeRTOS\include文件夾修改FreeRTOS.h下的兩個(gè)宏定義,從0改為1
現(xiàn)在編譯工程應(yīng)該
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中新建任務(wù)
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "FreeRTOS.h"
#include "task.h"
//任務(wù)優(yōu)先級
#define START_TASK_PRIO 1
//任務(wù)堆棧大小
#define START_STK_SIZE 128
//任務(wù)句柄
TaskHandle_t StartTask_Handler;
//任務(wù)函數(shù)
void start_task(void *pvParameters);
//任務(wù)優(yōu)先級
#define LED0_TASK_PRIO 2
//任務(wù)堆棧大小
#define LED0_STK_SIZE 50
//任務(wù)句柄
TaskHandle_t LED0Task_Handler;
//任務(wù)函數(shù)
void led0_task(void *pvParameters);
//任務(wù)優(yōu)先級
#define LED1_TASK_PRIO 3
//任務(wù)堆棧大小
#define LED1_STK_SIZE 50
//任務(wù)句柄
TaskHandle_t LED1Task_Handler;
//任務(wù)函數(shù)
void led1_task(void *pvParameters);
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//設(shè)置系統(tǒng)中斷優(yōu)先級分組4
LED_Init(); //初始化LED端口
//創(chuàng)建開始任務(wù)
xTaskCreate((TaskFunction_t )start_task, //任務(wù)函數(shù)
(const char* )"start_task", //任務(wù)名稱
(uint16_t )START_STK_SIZE, //任務(wù)堆棧大小
(void* )NULL, //傳遞給任務(wù)函數(shù)的參數(shù)
(UBaseType_t )START_TASK_PRIO, //任務(wù)優(yōu)先級
(TaskHandle_t* )&StartTask_Handler); //任務(wù)句柄
vTaskStartScheduler(); //開啟任務(wù)調(diào)度
}
//開始任務(wù)任務(wù)函數(shù)
void start_task(void *pvParameters)
{
taskENTER_CRITICAL(); //進(jìn)入臨界區(qū)
//創(chuàng)建LED0任務(wù)
xTaskCreate((TaskFunction_t )led0_task,
(const char* )"led0_task",
(uint16_t )LED0_STK_SIZE,
(void* )NULL,
(UBaseType_t )LED0_TASK_PRIO,
(TaskHandle_t* )&LED0Task_Handler);
//創(chuàng)建LED1任務(wù)
xTaskCreate((TaskFunction_t )led1_task,
(const char* )"led1_task",
(uint16_t )LED1_STK_SIZE,
(void* )NULL,
(UBaseType_t )LED1_TASK_PRIO,
(TaskHandle_t* )&LED1Task_Handler);
vTaskDelete(StartTask_Handler); //刪除開始任務(wù)
taskEXIT_CRITICAL(); //退出臨界區(qū)
}
//LED0任務(wù)函數(shù)
void led0_task(void *pvParameters)
{
while(1)
{
LED0=~LED0;
vTaskDelay(500);
}
}
//LED1任務(wù)函數(shù)
void led1_task(void *pvParameters)
{
while(1)
{
LED1=0;
vTaskDelay(200);
LED1=1;
vTaskDelay(800);
}
}
6.驗(yàn)證
下載代碼到戰(zhàn)艦開發(fā)板上,發(fā)現(xiàn)LED0和LED1都閃爍,一個(gè)亮0.5s滅0.5s,一個(gè)亮0.2s滅0.8s