-
准备
- GD32F207例程代码,使用的是资料程序里的第一个01_GPIO_LED。
- 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灯闪烁。