GD32F303移植FreeRTOS

一、下载FreeRTOS源文件

打开FreeRTOS官网 FreeRTOS官网
在这里插入图片描述
https://www.freertos.org/zh-cn-cmn-s/a00104.html
在这里插入图片描述
在此页面下面可以看到内核版本之间的修改点
在这里插入图片描述
注意在10.4.0以后的版本将使用日期戳版本,而不是内核版本

二、将FreeRTOS源码文件添加到GD32F303工程

1、将FreeRTOSv202212.01\FreeRTOSv202212.01\FreeRTOS\Source下C文件添加到GD32F303工程
在这里插入图片描述
2、FreeRTOSv202212.01\FreeRTOSv202212.01\FreeRTOS\Source\include下头文件添加到GD32F303工程
在这里插入图片描述
3、在FreeRTOSv202212.01\FreeRTOSv202212.01\FreeRTOS\Source\portable目录下,根据编译环境,选择port接口文件,这里使用的Keil下的配置,保留Common文件夹、MemMang文件夹,RVDS文件夹(Keil也是使用此目录下文件),将Common文件下文件添加到工程,将其余文件夹删除
4、选择内存管理的文件,一般使用heap4.c文件,将其添加到工程
5、在RVDS文件夹下选择内核文件,GD32F303为M4内核,选择ARM_CM4F文件夹,将其文件添加到工程
6、添加FreeRTOSConfig.h 文件。可以从FreeRTOSv202212.01\FreeRTOS\Demo\CORTEX_STM32F103_Keil下拷贝过去,之后根据实际需求进行修改。将原本工程中的SVC_Handler、PendSV_Handler、SysTick_Handler中的中断服务函数注释掉,使用宏定义替换。

#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler

在systickhandler中,判断是否开启调度


void xPortSysTickHandler( void )
{
    /* The SysTick runs at the lowest interrupt priority, so when this interrupt
     * executes all interrupts must be unmasked.  There is therefore no need to
     * save and then restore the interrupt mask value as its value is already
     * known - therefore the slightly faster vPortRaiseBASEPRI() function is used
     * in place of portSET_INTERRUPT_MASK_FROM_ISR(). */
    if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) {
        vPortRaiseBASEPRI();
        {
            /* Increment the RTOS tick. */
            if( xTaskIncrementTick() != pdFALSE ) {
                /* A context switch is required.  Context switching is performed in
                 * the PendSV interrupt.  Pend the PendSV interrupt. */
                portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
            }
        }

        vPortClearBASEPRIFromISR();
    }

}

7、在工程中,中断优先级分组设置全部为抢占优先级,便于FreeRTOS管理中断,这一步需要 在启动 RTOS 前完成。
http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html

nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);

自己工程修改配置如下

/*
 * FreeRTOS V202212.01
 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 *
 * https://www.FreeRTOS.org
 * https://github.com/FreeRTOS
 *
 */


#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H

/*-----------------------------------------------------------
 * Application specific definitions.
 *
 * These definitions should be adjusted for your particular hardware and
 * application requirements.
 *
 * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
 * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
 *
 * See http://www.freertos.org/a00110.html
 *----------------------------------------------------------*/

/* Ensure stdint is only used by the compiler, and not the assembler. */
#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
extern uint32_t SystemCoreClock;
#endif

#define configUSE_PREEMPTION                1
#define configUSE_IDLE_HOOK                 0
#define configUSE_TICK_HOOK                 0
#define configCPU_CLOCK_HZ                  ( SystemCoreClock )
#define configTICK_RATE_HZ                  ( ( TickType_t ) 1000 )
#define configMAX_PRIORITIES                ( 16 )
#define configMINIMAL_STACK_SIZE            ( ( unsigned short ) 128 )
#define configTOTAL_HEAP_SIZE               ( ( size_t ) ( 30 * 1024 ) )
#define configMAX_TASK_NAME_LEN             ( 20 )
#define configUSE_TRACE_FACILITY            1
#define configUSE_16_BIT_TICKS              0
#define configIDLE_SHOULD_YIELD             1
#define configUSE_MUTEXES                   1
#define configQUEUE_REGISTRY_SIZE           8
#define configCHECK_FOR_STACK_OVERFLOW      0
#define configUSE_RECURSIVE_MUTEXES         1
#define configUSE_MALLOC_FAILED_HOOK        0
#define configUSE_APPLICATION_TASK_TAG      0
#define configUSE_COUNTING_SEMAPHORES       1
#define configGENERATE_RUN_TIME_STATS       0
#define configSUPPORT_DYNAMIC_ALLOCATION    1


/* Software timer definitions. */
#define configUSE_TIMERS                1
#define configTIMER_TASK_PRIORITY       ( 2 )
#define configTIMER_QUEUE_LENGTH        10
#define configTIMER_TASK_STACK_DEPTH    ( configMINIMAL_STACK_SIZE * 2 )



/* Set the following definitions to 1 to include the API function, or zero
to exclude the API function. */
#define INCLUDE_vTaskPrioritySet        1
#define INCLUDE_uxTaskPriorityGet       1
#define INCLUDE_vTaskDelete             1
#define INCLUDE_vTaskCleanUpResources   1
#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        /* 15 priority levels */
#endif

/* The lowest interrupt priority that can be used in a call to a "set priority"
function. */
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY         0xf

/* The highest interrupt priority that can be used by any interrupt service
routine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL
INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER
PRIORITY THAN THIS! (higher priorities are lower numeric values. */
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY    5

/* Interrupt priorities used by the kernel port layer itself.  These are generic
to all Cortex-M ports, and do not rely on any particular library functions. */
#define configKERNEL_INTERRUPT_PRIORITY         ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
#define configMAX_SYSCALL_INTERRUPT_PRIORITY    ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )

/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS
standard names. */
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler

#endif /* FREERTOS_CONFIG_H */


三、创建任务,验证是否移植成功

实现功能:1s打印一次hello world。
首先实现printf 功能,初始化串口,在MDK配置中勾选MicroLIB,实现fputc。

int fputc(int ch, FILE *f)
{
	usart_data_transmit(USART0, (uint8_t)ch);
	while (RESET == usart_flag_get(USART0, USART_FLAG_TBE));
	return ch;
}
#include <stdio.h>
#include "gd32f30x.h"
#include "drv_uart.h"
#include "FreeRTOS.h"
#include "task.h"

TaskHandle_t test_task_handle = NULL;

void test_task(void *param)
{
    while(1)
    {
        printf("hello world\r\n");
        vTaskDelay(1000);
    }
}

int main(void)
{	
    nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);
    
    UartInit();
    
    BaseType_t ret = xTaskCreate(test_task, "test_task", 200, NULL, 15, &test_task_handle);
    if(ret != pdPASS)
    {
        printf("create test_task fail\r\n");
    }
    
    vTaskStartScheduler();
	while (1)
	{

	}
}

通过串口助手查看是否打印成功。判断FreeRTOS是否运行起来

在这里插入图片描述

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值