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>© 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);
}
至此,移植结束
运行出现的问题及解决
移植参考
常见错误
1、Error[2]: Failed to open #include file ‘FreeRTOSConfig.h’
Error while running Assembler
解决方案:
在option->Assembler配置FreeRTOSConfig.h的文件路径;