GD32F450快速移植FreeRTOS10.2.1


最近公司降低成本替换STM32F429,便有了这篇文档

前提条件

下载FreeRTOS源码

进入官网下载
下载完成文件目录结构
在这里插入图片描述

GD32相关BSP下载

官网下载地址
相关编译环境支持包
在这里插入图片描述
标准库
在这里插入图片描述
注意:标准库里个8.2.3版本的FreeRTOS可以用来参考配置

在这里插入图片描述

移植操作

快速移植方法

  • 使用STM32的CubeMX选择同内核的相近芯片,比如同是Cortex-M4,相近的SRAM大小即可
  • 在CubeMX中配置FreeRTOS建立相关任务,及任务堆栈设置,也可以几乎不用修改
  • 生成对应集成开发环境的项目
  • 取出相关配置文件,移植进GD32工程
    下面实际操作

打开CubeMX配置一个相近工程

这里选择STM32F429的芯片作为我的相近芯片
主修改了内存分配方式为静态,不需要考虑什么heap4等等内存碎片问题
在这里插入图片描述
选择集成开发环境在这里插入图片描述
设置C和H文件分类放置(无所谓的设置,个人喜好)
在这里插入图片描述
最后生成代码即可!
在这里插入图片描述

GD32工程建立

创建目录

在这里插入图片描述
Drivers目录包含:芯片的启动文件及标准库驱动
在这里插入图片描述
Middlewares目录包含:FreeRTOS源码文件
在这里插入图片描述
复制FreeRTOS源码以下文件,到GD32工程的FreeRTOS/src目录
在这里插入图片描述
复制FreeRTOS源码include内所有文件,到GD32工程的FreeRTOS/include目录
在这里插入图片描述
复制FreeRTOS以下目录,到GD32工程的FreeRTOS/port目录
在这里插入图片描述

利用CubeMX

复制CubeMX生成的工程代码找到,以下文件夹,复制到GD32工程的FreeRTOS/CMSIS_RTOS目录
在这里插入图片描述
Src目录下的freertos.c到GD32工程src目录
在这里插入图片描述
Inc目录的FreeRTOSConfig.h到GD32工程inc目录
在这里插入图片描述
最后建立GD32 IAR工程
注意添加汇编相关头文件路径
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

屏蔽部分中断服务

  • void SVC_Handler(void)
  • void PendSV_Handler(void)
  • void SysTick_Handler(void)
/*!
    \brief      this function handles SVC exception
    \param[in]  none
    \param[out] none
    \retval     none
*/
//void SVC_Handler(void)
//{
//}
/*!
    \brief      this function handles PendSV exception
    \param[in]  none
    \param[out] none
    \retval     none
*/
//void PendSV_Handler(void)
//{
//}

/*!
    \brief      this function handles SysTick exception
    \param[in]  none
    \param[out] none
    \retval     none
*/
//void SysTick_Handler(void)
//{    
//}

参考CubeMX建立FreeRTOS任务

main.c文件

/**
 *  @file: main.c
 *
 *  @date: 2020/5/2
 *
 *  @author: aron566
 *
 *  @brief:main func
 */
#ifdef __cplusplus ///<use C compiler
extern "C" {
#endif
/** Includes -----------------------------------------------------------------*/
#include "main.h"

/** Private macros -----------------------------------------------------------*/
/** Private constants --------------------------------------------------------*/
/** Private variables --------------------------------------------------------*/
/** Private function prototypes ----------------------------------------------*/
void MX_FREERTOS_Init(void);  
/**
  ******************************************************************
  * @brief   --main--
  * @param   NULL
  * @author  aron566
  * @version v1.0
  * @date    2020/5/2
  ******************************************************************
  */
int main(void)
{
    /* 开发板硬件初始化 */
    gd_eval_led_init(LED1);
    gd_eval_led_init(LED2);
    gd_eval_led_init(LED3);
    
    systick_config();/*1ms systick中断*/
    
    /* Call init function for freertos objects (in freertos.c) */
    MX_FREERTOS_Init(); 
 
    /* Start scheduler */
    osKernelStart();

    while(1);   /* 正常不会执行到这里 */ 
}

#ifdef __cplusplus ///end extern c
}
#endif
/******************************** End of file *********************************/

freertros.c文件

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * File Name          : freertos.c
  * Description        : Code for freertos applications
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under Ultimate Liberty license
  * SLA0044, the "License"; You may not use this file except in compliance with
  * the License. You may obtain a copy of the License at:
  *                             www.st.com/SLA0044
  *
  ******************************************************************************
  */
/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/
#include "FreeRTOS.h"
#include "task.h"
#include "main.h"
#include "cmsis_os.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */     

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN Variables */
osThreadId GUITaskHandle;
uint32_t GUITaskBuffer[ 128 ];
osStaticThreadDef_t GUITaskControlBlock;
/* USER CODE END Variables */
osThreadId defaultTaskHandle;
uint32_t defaultTaskBuffer[ 128 ];
osStaticThreadDef_t defaultTaskControlBlock;

/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN FunctionPrototypes */
void StartGUITask(void const * argument);
void AppTask(void);
/* USER CODE END FunctionPrototypes */

void StartDefaultTask(void const * argument);

void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */

/* GetIdleTaskMemory prototype (linked to static allocation support) */
void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize );

/* USER CODE BEGIN GET_IDLE_TASK_MEMORY */
static StaticTask_t xIdleTaskTCBBuffer;
static StackType_t xIdleStack[configMINIMAL_STACK_SIZE];
  
void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize )
{
  *ppxIdleTaskTCBBuffer = &xIdleTaskTCBBuffer;
  *ppxIdleTaskStackBuffer = &xIdleStack[0];
  *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
  /* place for user code */
}                   
/* USER CODE END GET_IDLE_TASK_MEMORY */

/**
  * @brief  FreeRTOS initialization
  * @param  None
  * @retval None
  */
void MX_FREERTOS_Init(void) {
  /* USER CODE BEGIN Init */
       
  /* USER CODE END Init */

  /* USER CODE BEGIN RTOS_MUTEX */
  /* add mutexes, ... */
  /* USER CODE END RTOS_MUTEX */

  /* USER CODE BEGIN RTOS_SEMAPHORES */
  /* add semaphores, ... */
  /* USER CODE END RTOS_SEMAPHORES */

  /* USER CODE BEGIN RTOS_TIMERS */
  /* start timers, add new ones, ... */
  /* USER CODE END RTOS_TIMERS */

  /* USER CODE BEGIN RTOS_QUEUES */
  /* add queues, ... */
  /* USER CODE END RTOS_QUEUES */

  /* Create the thread(s) */
  /* definition and creation of defaultTask */
  osThreadStaticDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128, defaultTaskBuffer, &defaultTaskControlBlock);
  defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);

  /* USER CODE BEGIN RTOS_THREADS */
  osThreadStaticDef(GUITask, StartGUITask, osPriorityNormal, 0, 128, GUITaskBuffer, &GUITaskControlBlock);
  GUITaskHandle = osThreadCreate(osThread(GUITask), NULL);
  /* USER CODE END RTOS_THREADS */

}

/* USER CODE BEGIN Header_StartDefaultTask */
/**
  * @brief  Function implementing the defaultTask thread.
  * @param  argument: Not used 
  * @retval None
  */
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void const * argument)
{
  /* USER CODE BEGIN StartDefaultTask */
  /* Infinite loop */
  for(;;)
  {
      AppTask();
    osDelay(1);
  }
  /* USER CODE END StartDefaultTask */
}
/**
  * @brief  Function implementing the defaultTask thread.
  * @param  argument: Not used 
  * @retval None
  */
/* USER CODE END Header_StartDefaultTask */
void StartGUITask(void const * argument)
{
  /* USER CODE BEGIN StartDefaultTask */
  /* Infinite loop */
  for(;;)
  {
    gd_eval_led_on(LED3);
    osDelay(3000);
    gd_eval_led_off(LED3);
    osDelay(1000);
  }
  /* USER CODE END StartDefaultTask */
}
/* Private application code --------------------------------------------------*/
/* USER CODE BEGIN Application */
void AppTask(void)
{	
    while (1)
    {
        
        gd_eval_led_on(LED1);
        vTaskDelay(500);   /* 延时500个tick */
        gd_eval_led_on(LED2);
        gd_eval_led_off(LED1);
        vTaskDelay(500);   /* 延时500个tick */	
        gd_eval_led_off(LED2);
    }
}     
/* USER CODE END Application */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

需关注的是,中断优先级及分组的方式设置,但是大致相同的。
参考STM32的配置

/*以下代码加入到main初始化中*/

/**
  ******************************************************************
  * @brief   NVIC 配置
  * @param   None
  * @retval  None
  * @author  aron566
  * @version v1.0
  * @date    2020/5/6
  ******************************************************************
  */
static void NVIC_Init(void)
{
     /* configure 4 bits pre-emption priority */
    nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);
}

至此,移植结束

运行出现的问题及解决

  • 使用printf进入硬件错误中断回调
    处理方法:半主机模式导致
    处理方法:屏蔽原例程中对systick的配置,由FreeRTOS自动配置问题参考

移植参考

移植参考

常见错误

1、Error[2]: Failed to open #include file ‘FreeRTOSConfig.h’
Error while running Assembler
解决方案:
在option->Assembler配置FreeRTOSConfig.h的文件路径;

参考地址

  • 10
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aron566

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值