查看:
6418
|
回复:
4
|
立创梁山派F r e e R T O S 移植
|
老怪鸽但不鸽
6
主题
22
回复 |
1#
电梯直达
准备工作
移植环境 电脑是W I N 1 0系统。运行与编译环境是使用K e i l 5 . 3 7。
移植步骤
将下载下来的F r e e R T O S 源码进行解压,并删除我们不需要的文件。(只删除【Source】文件夹下的其余文件!)
删除完成之后,剩下的文件。
打开我们的工程
新增一个工程目录
添加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
回复 |
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
回复 |
3#
说明:FreeRTOS的官网下载速度很慢,这里我提供我下载好的,里面还有移植前的例程和移植成功之后的例程,链接:https://pan.baidu.com/s/1jFZoOJyp2BnUMQsScmFKvQ?pwd=1234 提取码:1234 |
ToDo
2
主题
4
回复 |
4#
为楼主的用心发帖点赞!
|
无所屌谓
0
主题
2
回复 |
5#
点赞,很好的例子
|
|