GD32F207移植freeRTOS_v9.0.0

  • 准备

  1. GD32F207例程代码,使用的是资料程序里的第一个01_GPIO_LED。
  2. FreeRTOSv9.0.0官方源码,查找网上有两个下载链接:

一个是官网:http://www.freertos.org/

另外一个是代码托管网站:
FreeRTOS Real Time Kernel (RTOS) - Browse /FreeRTOS at SourceForge.net

我用的是第二个,里面的版本选择比较清晰。

 

 

 主要使用source文件夹里面的内容。

  • 移植

1、在例程代码目录新建文件夹FreeRTOS,将source文件夹内容复制过去,其中portable取用两个文件夹即可。

RVDS文件夹里面包含了各种处理器相关的文件夹,有M0、M3、M4等各种系列;

MemMang文件夹下存放的是跟内存管理相关的源文件。

2、打开例程代码,创建工程分组FreeRTOS_CORE、FreeRTOS_PORTABLE

 

         

3、添加FreeRTOSConfig.h文件
FreeRTOSConfig.h文件是FreeRTOS的工程配置文件,可以通过修改这个FreeRTOS内核的配置头文件来裁剪FreeRTOS的功能。拷贝一份添加到根目录,工程添加到User分组下面。

                                                              

  

4、添加头文件路径

另外保证里面的路径包含FreeRTOSConfig.h所在路径。

  • 问题及处理

1、编译发现好多未定义的错误,最后对比FreeRTOSConfig.h文件,发现复制过程中内容有个乱码(由于是直接从网页复制的,有些符号显示的乱码)

2、

删除FreeRTOSConfig.h中定义的部分

3、存在大量warning

在报错的文件中增加 #include <stdio.h>即可。

最后测试编译成功

4、编写简单的任务启动函数后,运行到vTaskStartScheduler()后进入到HardFault_Handler。

代码如下:

/* Includes ------------------------------------------------------------------*/

#include "gd32f20x.h"

#include <stdio.h>

#include "systick.h"

#include "core_cm3.h"

#include "FreeRTOS.h"

#include "task.h"

#include "queue.h"

#include "croutine.h"

#include "semphr.h"

#include "croutine.h"



/* Private functions ---------------------------------------------------------*/

#define LED1(a) if (a)  \

                    GPIO_SetBits(GPIOF,GPIO_PIN_9);\

                    else    \

                    GPIO_ResetBits(GPIOF,GPIO_PIN_9)

#define LED2(a) if (a)  \

                    GPIO_SetBits(GPIOF,GPIO_PIN_10);\

                    else    \

                    GPIO_ResetBits(GPIOF,GPIO_PIN_10)



/* Private variables ---------------------------------------------------------*/

static vu32 TimingDelay = 0;



/* Private functions ---------------------------------------------------------*/

void GPIO_Configuration(void);

/**

  * @brief  Configure the GPIO ports

  * @param  None

  * @retval None

  */

void GPIO_Configuration(void)

{

    GPIO_InitPara GPIO_InitStructure;

    RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_GPIOF ,ENABLE);



    GPIO_InitStructure.GPIO_Pin = GPIO_PIN_9|GPIO_PIN_10;

    GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUT_PP;

    GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;

    GPIO_Init(GPIOF,&GPIO_InitStructure);

}

void vTaskLED1(void *pvParameters)

{

    while (1)

    {

        /* LED OFF */

        LED1(1);

        vTaskDelay(100/ portTICK_RATE_MS);

         /* LED ON */

        LED1(0);

        vTaskDelay(100/ portTICK_RATE_MS);

    }

}

/**

  * @brief  Main program

  * @param  None

  * @retval None

  */

int main(void)

{

    GPIO_Configuration();

    SysTick_Configuration();

    xTaskCreate(vTaskLED1, "Task LED1", 256, NULL, 1, NULL);

    vTaskStartScheduler();

    while (1)

    {

    }
}

通过搜素,需要修改中断名称:

用vportSVC_Handler替换掉startup_gd32f20x_cl.s里面的SVC_Handler;

用xportSysTick_Handler替换掉portSysTick_Handle;

用xportPendSV_Handlerr替换掉PendSV_Handlerr;

编译后可正常启动任务,可以看到LED灯闪烁。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值