欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

stm32f103移植freeRTOS

4、双击FreeRTOSv9.0.0.exe,解压得到FreeRTOS源文件。

4.1  复制“...\◆1.FreeRTOS SDK\FreeRTOSv9.0.0\FreeRTOS\Source”下的所有.c文件到新建的FreeRTOS文件夹下的src目录

stm32f103移植freeRTOS

4.2  复制“...\◆1.FreeRTOS SDK\FreeRTOSv9.0.0\FreeRTOS\Source\portable\RVDS\ARM_CM3” 目录下的“port.c”和“portmacro.h”,.c文件放在FreeRTOS文件夹的src子目录,.h放inc子目录

stm32f103移植freeRTOS

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子目录 

stm32f103移植freeRTOS

4.5  复制“...\◆1.FreeRTOS SDK\FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil”目录下的“FreeRTOSConfig.h”文件到新建的FreeRTOS文件夹下的inc子目录

stm32f103移植freeRTOS

5、用Keil打开工程文件,包含FreeRTOS文件路径

stm32f103移植freeRTOS

6、在工程中添加FreeRTOS文件

stm32f103移植freeRTOS

7、打开stm32f10x_it.c,屏蔽void SVC_Handler(void),void PendSV_Handler(void),void SysTick_Handler(void)

stm32f103移植freeRTOS

8、打开.s启动文件,本例是“startup_stm32f10x_hd.s”,修改如下

stm32f103移植freeRTOS

往下翻,将

SVCHandler修改为vPortSVCHandler

PendSVHandler修改为xPortPendSVHandler

SysTickHandler修改为xPortSysTickHandler

修改位置如图:

stm32f103移植freeRTOS

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);
  }
}