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文件夹下。

image
portable文件夹主要存放不同架构特定的代码。这里使用keil,因此复制RVDS文件夹及其中的ARM_CM4F文件夹。MemMang是内存管理,也要复制进去。
image
完成后文件架构如下。

└───freeRTOS
    ├───include
    ├───port
    │   ├───MemMang
    │   └───RVDS
    │       ├───ARM_CM4F
    └───src

新建工程

如图,将.c文件加入工程,这里使用heap_4管理内存。相关文件在MemMang中。
image
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

然后引入相关文件
image

修改中断

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)
    {
    }
}
posted @ 2022-04-22 18:05  USTHzhanglu  阅读(1459)  评论(0编辑  收藏  举报