stm32f103移植freeRTOS
程序员文章站
2024-02-22 18:36:05
...
1、建立STM32工程模板,不做阐述
2、下载FreeRTOSv9.0.0
链接:https://pan.baidu.com/s/1XmwGPURgvKrg9iJn4iW-Yw
提取码:57a0
3、在工程目录下,建立FreeRTOS文件夹,下面建子目录src,inc
4、双击FreeRTOSv9.0.0.exe,解压得到FreeRTOS源文件。
4.1 复制“...\◆1.FreeRTOS SDK\FreeRTOSv9.0.0\FreeRTOS\Source”下的所有.c文件到新建的FreeRTOS文件夹下的src目录
4.2 复制“...\◆1.FreeRTOS SDK\FreeRTOSv9.0.0\FreeRTOS\Source\portable\RVDS\ARM_CM3” 目录下的“port.c”和“portmacro.h”,.c文件放在FreeRTOS文件夹的src子目录,.h放inc子目录
4.3 复制“...\◆1.FreeRTOS SDK\FreeRTOSv9.0.0\FreeRTOS\Source\portable\MemMang” 目录下的“heap_4.c”文件夹到新建的FreeRTOS文件夹 下的src子目录
4.4 复制“...\◆1.FreeRTOS SDK\FreeRTOSv9.0.0\FreeRTOS\Source\include” 目录下所有.h文件到新建的FreeRTOS文件夹下的inc子目录
4.5 复制“...\◆1.FreeRTOS SDK\FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil”目录下的“FreeRTOSConfig.h”文件到新建的FreeRTOS文件夹下的inc子目录
5、用Keil打开工程文件,包含FreeRTOS文件路径
6、在工程中添加FreeRTOS文件
7、打开stm32f10x_it.c,屏蔽void SVC_Handler(void),void PendSV_Handler(void),void SysTick_Handler(void)
8、打开.s启动文件,本例是“startup_stm32f10x_hd.s”,修改如下
往下翻,将
SVCHandler修改为vPortSVCHandler
PendSVHandler修改为xPortPendSVHandler
SysTickHandler修改为xPortSysTickHandler
修改位置如图:
9、测试代码
#include "stm32f10x.h"
#include "usart.h"
#include "sys.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 128 //任务堆栈大小
TaskHandle_t LED0Task_Handler; //任务句柄
void led0_task(void *p_arg); //任务函数
#define LED1_TASK_PRIO 3 //任务优先级
#define LED1_STK_SIZE 128 //任务堆栈大小
TaskHandle_t LED1Task_Handler; //任务句柄
void led1_task(void *p_arg); //任务函数
/*********************************************************
* @brief 主函数
* @param 无
* @retval 无
*******************************************************/
int main(void)
{
BSP_Init();//硬件初始化
//创建开始任务
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();//开启任务调度
}
/*********************************************************
* @brief 创建LED0,LED1任务
* @param 无
* @retval 无
*******************************************************/
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(); //退出临界区
}
/*********************************************************
* @brief LED0任务
* @param 无
* @retval 无
*******************************************************/
void led0_task(void *pvParameters)
{
while(1)
{
printf("led0_task\r\n");
vTaskDelay(1000);
}
}
/*********************************************************
* @brief LED1任务
* @param 无
* @retval 无
*******************************************************/
void led1_task(void *pvParameters)
{
while(1)
{
printf("led1_task\r\n");
vTaskDelay(1000);
}
}