查看: 5120  |  回复: 4
立创梁山派F r e e R T O S 移植
老怪鸽但不鸽
6
主题
22
回复
发表于2023-07-21 10:34:34 | ip属地:广东 | 只看该作者
1# 电梯直达

准备工作

  1. 准备一块立创梁山派开发板。
  2.  准备一个可以跑起来的例程(最好有点灯)。如果没有,可以使用立创梁山派官方的例程。
  3. F r e e R T O S 源码版本202212.01--------点击【链接】跳转到官网查看:
  • 说明:F r e e R T O S 的官网下载速度很慢,这里我提供我下载好的,里面还有移植前的例程和移植成功之后的例程,链接 提取码:1234


移植环境

电脑是W I N 1 0系统。运行与编译环境是使用K e i l 5 . 3 7。


移植步骤

  • 裁剪文件 

        将下载下来的F r e e R T O S 源码进行解压,并删除我们不需要的文件。(只删除【Source】文件夹下的其余文件!)




  • 工程移植
    在我们的项目工程里面新建个文件夹【M i d d l e w a r e s】,在【M i d d l e w a r e s】文件夹里再新建一个文件夹【F r e e R T O S】,将我们剪裁后的F r e e R T O S源码的复制到【F r e e R T O S】文件夹下。
  • 文件修改
    下图的【portable】文件夹中只留下我们需要的两个文件【M e m M a n g】【R V D S】,【portable】文件夹下的其余文件夹全部删除。


删除完成之后,剩下的文件。



  • 导入工程文件

        打开我们的工程


        新增一个工程目录




      添加F r e e R T O S文件夹下的.c文件。



添加heap_4.c文件,具体路径:【F r e e R T O S】->【portable】->【M e m M a n g】-> heap_4.c



添加port.c文件,具体路径:【F r e e R T O S】->【portable】->【R V D S】->【A R M_C  M 4 F】-> port.c



全部添加完成之后,是下图中展示的样子。



  • 添加源码缺少的文件

    工程还缺少一个F r e e R T O S C o n f i g.h文件,因为Cortex_S T M 3 2 f 4系列和G D 3 2 f 4用的是同一个内核,配置文件可以通用,所以去到F r e e R T O S源码中的【Demo】文件夹下复制。

具体路径:【F r e e R T O S】->【Demo】-> 【CORTEX_M 4 F_S T M 3 2 F 4 0 7 Z G-SK】-> F r e e R T O SC o n f i g.h




将F r e e R T O S C o n f i g.h(配置文件)复制到我们工程文件夹下。

具体路径:【005串口打印信息】->【M i d d l e w a r e s】->【F r e e R T O S】->【include】




  • 导入文件路径
        将F r e e R T O S的.h路径导入到我们的工程。

       


最终导入的两个路径。



操作到这里,文件的移植就完成了。



  • 修改报错

       尝试编译。出现以下这个报错。(如果有其他的错误,请看帖子一楼的说明)



双击问题,一路追下去追到了c o n f i g文件,很明显是因为宏定义没有被开启。(如果有其他的错误,请看帖子一楼的说明)



添加下面的代码。




重新编译,出现3个错误。是因为F r e e R T O S的port文件和库文件的配置文件重复定义。(如果有其他的错误,请看帖子一楼的说明)



打开g d 3 2 f 4 x x_it.c文件,注释重复定义的三个函数,分别是【P e n d S V_Handler】、【S V C_Handler】、【S y s T i c k_Handler】。



重新编译,出现4个错误。(如果有其他的错误,请看帖子一楼的说明)



上面的4个错误是因为在F r e e R T O S C o n f i g文件中宏定义的问题。按照下图在【F r e e R T O S C o n f i g.h】中修改四个宏定义。



再编译没有报错啦。(如果有其他的错误,请看帖子一楼的说明)



老怪鸽但不鸽
6
主题
22
回复
发表于2023-07-21 10:59:25   |  ip属地:广东  |  只看该作者
2#

移植验证

直接将main.c替换如下:


#include "gd32f4xx.h"
#include "systick.h"
#include <stdio.h>
#include "main.h"
#include "bsp_led.h"
#include "sys.h"
#include "bsp_usart.h"

#include "FreeRTOS.h"
#include "task.h"


TaskHandle_t StartTask_Handler;

void LED_Init(void);
void CrateTask(void *pvParameters);
void task_led2(void *pvParameters);
void task_led4(void *pvParameters);


int main(void)
{	
    systick_config();
	
    LED_Init();  // led初始化
    usart_gpio_config(9600U);
	
    xTaskCreate(CrateTask ,"CrateTask" , 128, NULL, 1, &StartTask_Handler);
		
    vTaskStartScheduler();          //开启任务调度
	
    while(1) 
    {
	;
    }
}

void LED_Init(void)
{
	//LED2
	rcu_periph_clock_enable(RCU_GPIOD);
	gpio_mode_set(GPIOD,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,GPIO_PIN_7);
	gpio_output_options_set(GPIOD,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_7);
	
	//LED4
	rcu_periph_clock_enable(RCU_GPIOA);
	gpio_mode_set(GPIOA,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,GPIO_PIN_5);
	gpio_output_options_set(GPIOA,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_5);
}

 void CrateTask(void *pvParameters){
	
	taskENTER_CRITICAL();
	
	xTaskCreate(task_led2 , "task_led2" ,50 ,NULL , 2 ,0);
	
	xTaskCreate(task_led4 , "task_led4" ,50 ,NULL , 2 ,0);
	
	vTaskDelete(StartTask_Handler);
	
	taskEXIT_CRITICAL(); 
	
}

void task_led2(void *pvParameters)
{  
	while(1)
	{		
		gpio_bit_write(GPIOD, GPIO_PIN_7, SET);
		vTaskDelay(300);
		gpio_bit_write(GPIOD, GPIO_PIN_7, RESET);
		vTaskDelay(300);
	}
}   

void task_led4(void *pvParameters)
{
	while(1)
	{
		gpio_bit_write(GPIOA, GPIO_PIN_5, SET);
		vTaskDelay(200);
		gpio_bit_write(GPIOA, GPIO_PIN_5, RESET);
		vTaskDelay(200);
		
	}
}

我这里的实验现象是两个灯以不同的频率闪烁。

说明
工程的配置请尽量和我一样。

 
 




老怪鸽但不鸽
6
主题
22
回复
发表于2023-07-21 11:01:28   |  ip属地:广东  |  只看该作者
3#

说明:FreeRTOS的官网下载速度很慢,这里我提供我下载好的,里面还有移植前的例程和移植成功之后的例程,链接:https://pan.baidu.com/s/1jFZoOJyp2BnUMQsScmFKvQ?pwd=1234

提取码:1234

ToDo
2
主题
4
回复
发表于2023-08-12 08:53:27   |  ip属地:广东  |  只看该作者
4#
为楼主的用心发帖点赞!
无所屌谓
0
主题
2
回复
发表于2024-01-08 18:57:33   |  ip属地:安徽  |  只看该作者
5#
点赞,很好的例子

主题

回复
  • 温馨提示: 标题不合格、重复发帖、发布广告贴,将会被删除帖子或禁止发言。 详情请参考: 社区发帖规则
  • 您当前输入了 0 个文字。还可以输入 8000 个文字。 已添加复制上传图片功能,该功能目前仅支持chrome和火狐

禁言/删除

X
请选择禁言时长:
是否清除头像:
禁言/删除备注:
昵 称:
 
温馨提示:昵称只能设置一次,设置后无法修改。
只支持中文、英文和数字。

举报

X
请选择举报类型:
请输入详细内容:

顶部