- 正点原子战舰战舰开发板(STM32F103ZET6)
- 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.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 "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "FreeRTOS.h"
#include "task.h"
//任务优先级
#define START_TASK_PRIO 1
//任务堆栈大小
#define START_STK_SIZE 128
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);
//任务优先级
#define LED0_TASK_PRIO 2
//任务堆栈大小
#define LED0_STK_SIZE 50
//任务句柄
TaskHandle_t LED0Task_Handler;
//任务函数
void led0_task(void *pvParameters);
//任务优先级
#define LED1_TASK_PRIO 3
//任务堆栈大小
#define LED1_STK_SIZE 50
//任务句柄
TaskHandle_t LED1Task_Handler;
//任务函数
void led1_task(void *pvParameters);
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
LED_Init(); //初始化LED端口
//创建开始任务
xTaskCreate((TaskFunction_t )start_task, //任务函数
(const char* )"start_task", //任务名称
(uint16_t )START_STK_SIZE, //任务堆栈大小
(void* )NULL, //传递给任务函数的参数
(UBaseType_t )START_TASK_PRIO, //任务优先级
(TaskHandle_t* )&StartTask_Handler); //任务句柄
vTaskStartScheduler(); //开启任务调度
}
//开始任务任务函数
void start_task(void *pvParameters)
{
taskENTER_CRITICAL(); //进入临界区
//创建LED0任务
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);
//创建LED1任务
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); //删除开始任务
taskEXIT_CRITICAL(); //退出临界区
}
//LED0任务函数
void led0_task(void *pvParameters)
{
while(1)
{
LED0=~LED0;
vTaskDelay(500);
}
}
//LED1任务函数
void led1_task(void *pvParameters)
{
while(1)
{
LED1=0;
vTaskDelay(200);
LED1=1;
vTaskDelay(800);
}
}
6.验证
下载代码到战舰开发板上,发现LED0和LED1都闪烁,一个亮0.5s灭0.5s,一个亮0.2s灭0.8s
网友评论