HC32F460 freeRTOS移植
参考链接
超详细的FreeRTOS移植全教程——基于srm32 - 杰杰IoT - 博客园 (cnblogs.com)
源码下载
FreeRTOS - Free RTOS Source Code Downloads, the official FreeRTOS zip file release download
复制源文件
在工程文件夹下新建文件夹命名为freeRTOS,在FreeRTOSv202112.00\FreeRTOS\Source
文件夹中复制 .c 文件到src中,复制include文件夹到freeRTOS
文件夹下。
portable
文件夹主要存放不同架构特定的代码。这里使用keil
,因此复制RVDS
文件夹及其中的ARM_CM4F
文件夹。MemMang
是内存管理,也要复制进去。
完成后文件架构如下。
└───freeRTOS
├───include
├───port
│ ├───MemMang
│ └───RVDS
│ ├───ARM_CM4F
└───src
新建工程
如图,将.c文件加入工程,这里使用heap_4
管理内存。相关文件在MemMang
中。
FreeRTOSConfig.h
是自己新建的配置文件,可以从demo里复制。这里是我使用的相关配置
FreeRTOSConfig.h
#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H
/* Ensure definitions are only used by the compiler, and not by the assembler. */
#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
#include
extern uint32_t SystemCoreClock;
#endif
#define configENABLE_FPU 0
#define configENABLE_MPU 0
#define configUSE_PREEMPTION 1
#define configSUPPORT_STATIC_ALLOCATION 0
#define configSUPPORT_DYNAMIC_ALLOCATION 1
#define configUSE_IDLE_HOOK 0 //空闲钩子函数,勾选后必须定义void vApplicationIdleHook( void )
#define configUSE_TICK_HOOK 0
#define configCPU_CLOCK_HZ ( SystemCoreClock )//系统主频。一般SystemCoreClock会和系统主频相等。不同时直接设置主频数,单位Hz
#define configTICK_RATE_HZ ((TickType_t)1000)//嘀嗒计时频率,
#define configMAX_PRIORITIES ( 7 )//最大优先级,-1,0为最低优先级
#define configMINIMAL_STACK_SIZE ((uint16_t)128)//idle堆栈大小
#define configTOTAL_HEAP_SIZE ((size_t)15360)//栈空间大小
#define configMAX_TASK_NAME_LEN ( 16 ) //任务名称最大长度
#define configUSE_16_BIT_TICKS 0
#define configUSE_MUTEXES 1
#define configQUEUE_REGISTRY_SIZE 8
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 //架构优化
#define configMESSAGE_BUFFER_LENGTH_TYPE size_t
#define configUSE_CO_ROUTINES 0
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
#define INCLUDE_vTaskPrioritySet 1
#define INCLUDE_uxTaskPriorityGet 1
#define INCLUDE_vTaskDelete 1
#define INCLUDE_vTaskCleanUpResources 0
#define INCLUDE_vTaskSuspend 1
#define INCLUDE_vTaskDelayUntil 1
#define INCLUDE_vTaskDelay 1
#define INCLUDE_xTaskGetSchedulerState 1
/* Cortex-M specific definitions. */
#ifdef __NVIC_PRIO_BITS
/* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */
#define configPRIO_BITS __NVIC_PRIO_BITS
#else
#define configPRIO_BITS 4
#endif
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5
#define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
/* USER CODE BEGIN 1 */
#define configASSERT( x ) if ((x) == 0) {taskDISABLE_INTERRUPTS(); for( ;; );}
/* USER CODE END 1 */
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler
/* USER CODE END Defines */
#endif
然后引入相关文件
修改中断
freeRTOS接管了如下三个关键中断
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler
因此需要在hc32f46x_interrupts.c
中注释掉这三个中断。
新建任务
在main中引入rtos
/*******************************************************************************
* Include FreeRTOS files
******************************************************************************/
#include "FreeRTOS.h"
#include "task.h"
然后新建一个任务,在主函数中启动
/* 创建任务句柄 */
static TaskHandle_t 测试rtos = NULL;
static void 测试rtos(void* pvParameters)
{
while (1)
{
DEBUG("测试RTOS\r\n");
vTaskDelay(1000);
// vTaskDelete(AppTask2_Handle);
}
}
/**
*******************************************************************************
** \brief Main function of project
**
** \param None
**
** \retval int32_t return value, if needed
**
******************************************************************************/
int32_t main(void)
{
ClkInit();
CLK_GetClockFreq(&stcClkFreq);
UsartInit();
SysvarInit();
/* Initialize Clock */
BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为pdPASS */
/* 创建AppTaskCreate任务 */
xReturn = xTaskCreate((TaskFunction_t )测试rtos, /* 任务入口函数 */
(const char* )"测试rtos",/* 任务名字 */
(uint16_t )512, /* 任务栈大小 */
(void* )NULL,/* 任务入口函数参数 */
(UBaseType_t )1, /* 任务的优先级 */
(TaskHandle_t* )&AppTask_Handle);/* 任务控制块指针 */
if(pdPASS == xReturn)
vTaskStartScheduler(); /* 启动任务,开启调度 */
else
return -1;
while (1)
{
}
}