GD32F103移植FreeRTOS

开发环境

C编辑器:    Keil MDK-ARM Plus V5.21a

开发板:       GD32103E-EVAL 

固件库:       V2.1.0 firmware for GD32F10x

FreeRTOS: V202104.00

 

1. FreeRTOS官网下载 FreeRTOS

      从 https://www.freertos.org/ 下载,当前版本为FreeRTOS 202104.00

 

2. 拷贝文件

      解压下载的文件后,如下图所示。我们只要 FreeRTOS\Source 中的内容。

      在GD32F103的工程目录中,添加一个FreeRTOS的文件夹,本人将其放置在GD的库目录下。

      然后将上面下载的Source目录中的文件全部拷贝到刚建立的FreeRTOS目录中。

      打开portable文件夹,删除除了MemMang和RVDS的所有内容。

      将下载的FreeRTOS中Demo\CORTEX_STM32F103_Keil\FreeRTOSConfig.h拷贝到上面的include目录下,用于配置FreeRTOS。

      打开FreeRTOSConfig.h 在合适的地方加上下面这句。

#define INCLUDE_xTaskGetCurrentTaskHandle   1

      再找到宏定义 configCPU_CLOCK_HZ,将主频从72000000修改为10800000,这个文件原来是给STM32F103写的,GD32F103的主频为108000000。

 

3. 在Keil中添加FreeRTOS系统文件

      Keil中打开工程文件管理,添加两个目录FreeRTOS_src和FreeRTOS_port

      然后将刚才拷贝到FreeRTOS目录中的C文件添加到FreeRTOS_src中。再把刚才拷到include目录下的FreeRTOSConfig.h也添加到FreeRTOS_src中,主要是为了后续打开方便。

      将portable\RVDS\ARM_CM3\port.c和portable\MemMang\heap_4.c添加到FreeRTOS_port中。

 

4. SVC_Handler、PendSV_Handler和SysTick_Handler处理

      打开gd32f10x_it.c, 找到void SVC_Handler(void)和void PendSV_Handler(void)两个函数,将它们注释掉,在freeRTOS中重新定义。

      打开FreeRTOS.h文件,添加下列两行,将上面注释的两个函数重新定位到FreeRTOS中的函数。

#define vPortSVCHandler          SVC_Handler
#define xPortPendSVHandler       PendSV_Handler

      在gd32f10x_it.c头部添加函数声明。

void xPortSysTickHandler( void );

      然后在void SysTick_Handler(void)中进行调用。之所以SysTick_Handler没有像上面两个一样用宏定义直接转向,是为了还可以在SysTick_Handler中添加一些自己的代码,可以在SysTick中断时执行。

void SysTick_Handler(void)
{
    xPortSysTickHandler();
}

5. 添加include目录

      打开Target的Option窗口,选择C/C++选项卡,在include paths中添加FreeRTOS\include目录和FreeRTOS\portable\RVDS\ARM_CM3目录。

 

      至此移植结束,下面我们来写个简单的代码测试。SysTick不需要手动初始化,FreeRTOS中有做初始化。包含头文件要添加 FreeRTOS.h 和 Task.h。

void Task_Led1(void * pvParameters)
{
	while(1)
	{
		LED_Off(0);	vTaskDelay(500);
		LED_On(0);	vTaskDelay(500);
	}
}



void Task_Led2(void * pvParameters)
{
	while(1)
	{
		LED_On(1);	vTaskDelay(500);
		LED_Off(1);	vTaskDelay(500);
	}	
}



int main(void)
{
	nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);	
    LED_Init();

	xTaskCreate(Task_Led1,"TaskLed1",configMINIMAL_STACK_SIZE,NULL,2,NULL);	
	xTaskCreate(Task_Led2,"TaskLed2",configMINIMAL_STACK_SIZE,NULL,2,NULL);
	vTaskStartScheduler();
    
    while(1){}
}

 

版权声明:本文为CSDN博主「mjwang」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/mjwang/article/details/117629672

生成海报
点赞 0

mjwang

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

RT-Thread Studio移植LAN8720A驱动

RTT网络协议栈驱动移植(霸天虎) 1、新建工程 ​ 工程路径不含中文路径名,工程名用纯英文不含任何符号。 2、用CubeMx配置板子外设 2.1、配置时钟 ​ 按照自己板子配置相应时钟。

ESP8266 无限重启踩坑

最近做了一个电子墨水屏万年历,在移植屏幕代码时遇到了esp8266无限软复位的问题,如果你的串口打印是以下图片所示,那么恭喜你问题解决了。 造成软复位的原因是因为,程序里有死循环&#xf

Renode应用:在RISC-V核上运行FreeRTOS

本篇记录通过Renode在RISC-V核上运行FreeRTOS demo的情况。本来不准备写这一篇,但是发现近期工作学习密度实在太大,上周工作的中间结果这周竟然完全想不起来了,不得不又花了一些时间从头摸

Lin总线通信在STM32作为主机代码以及从机程序

距离上次做资料准备已经过去六天了。最近在学车,上周末就没有开电脑。这周开始进行了Lin通信的代码整理,目前是可以正常通信的了,采用的是增强型校验方式。后期再进一步跟进研究。。。更新一博,留