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){}
}

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值