[MCU] 【极海APM32F407 Tiny Board】移植FreeRTOS系统

TL-LED   2023-5-25 21:00 楼主

这篇来学习下freeRTOS系统在开发板下的移植。

 

一、源码下载

源码下载地址:https://www.freertos.org/zh-cn-cmn-s/a00104.html

下载最新源码

001.png

二、添加文件

在上篇创建的工程项目中增加freeRTOS相关的文件

2.1、freeRTOS源码复制到项目文件夹下

003.png

004.png

2.2、项目中添加 freeRTOS源码

项目中添加源码C文件

005.png

项目中添加硬件接口文件

006.png

项目中添加内存管理文件

007.png

三、修改和配置文件

3.1、上面步骤文件添加完成后,指定头文件位置

008.png

3.2、编译工程

修改完成后,执行下编译,有下面报错,这是配置文件是复制例程板子的文件,需要根据开发板的硬件进行修改。

009.png

3.3、移植过程中的报错

报错内容:

010.png

修改方法:

将中断函数中的下面函数注释掉

freeRTOS系统中已经定义了SVC和PendSV中断函数,需要在中断函数中注释掉

011.png

012.png

屏蔽freeRTOS配置文件中的定义,使用SDK中断里面的systick 中断函数。

013.png 修改下面文件

014.png 015.png

再次编译工程

016.png 正常没有报错,上面就是移植freeRTOS的过程。

 

四、创建任务

4.1、main.c

#include "main.h"
#include "usart.h"

#include "FreeRTOS.h"
#include "task.h"  
     
#define TASK1_PRIO      2                   
#define TASK1_STK_SIZE  128                 
static TaskHandle_t            Task1Task_Handler = NULL;  
           
#define TASK2_PRIO      3                   
#define TASK2_STK_SIZE  128                 
static TaskHandle_t            Task2Task_Handler = NULL;  
 
void start_task(void *pvParameters); 
void task1(void *pvParameters);  
void task2(void *pvParameters);

int main(void)
{
	SysTick_Init();
	init_usart(115200);
	printf("apm32f407-freeRTOS-test\r\n");
	init_led();
	led2_off();
	led3_on();

//task1
	xTaskCreate((TaskFunction_t )task1,                  
							(const char*    )"task1",                
							(uint16_t       )TASK1_STK_SIZE,         
							(void*          )NULL,                   
							(UBaseType_t    )TASK1_PRIO,             
							(TaskHandle_t*  )&Task1Task_Handler);    
	//task2
	xTaskCreate((TaskFunction_t )task2,                  
							(const char*    )"task2",                
							(uint16_t       )TASK2_STK_SIZE,        
							(void*          )NULL,                  
							(UBaseType_t    )TASK2_PRIO,             
							(TaskHandle_t*  )&Task2Task_Handler); 	
	
	vTaskStartScheduler();
  while(1);
}

//task1
void task1(void *pvParameters)
{ 
    while (1)
    {
        printf("task1 run ...\r\n");
        led2_tog();
        vTaskDelay(500);
    }
}

//task2
void task2(void *pvParameters)
{ 
    while (1)
    {	
				led3_tog();
        printf("task2 run ...\r\n");
        vTaskDelay(100);
    }
}

五、硬件连接

板子上link带的串口不能用,使用串口模块连接到J3和J5

100.png

六、程序运行

6.1、串口输出内容

101.png

6.2、运行视频

320

 

七、程序源码

apm32f407i_freeRTOS.rar (7.78 MB)
(下载次数: 6, 2023-5-26 11:48 上传)
本帖最后由 TL-LED 于 2023-5-26 11:49 编辑

回复评论 (6)

看着好顺利,厉害了,移植成功的代码是不是可以分享一下?

点赞  2023-5-26 10:04

@caizhiwei 可以参考这个试试

点赞  2023-5-26 10:05
引用: nmg 发表于 2023-5-26 10:04 看着好顺利,厉害了,移植成功的代码是不是可以分享一下?

可以的

点赞  2023-5-26 11:40
	/** Enable USART1 RXBNE interrput */
    //USART_EnableInterrupt(TINY_COM1, USART_INT_RXBNE);
    //USART_ClearStatusFlag(TINY_COM1, USART_FLAG_RXBNE);
    //NVIC_EnableIRQRequest(TINY_COM1_IRQn,1,0);

只要加入uart中断配置,FreeRTOS就卡死,不知道楼主遇到过没有?

gitee/casy
点赞  2023-5-28 09:14
引用: caizhiwei 发表于 2023-5-28 09:14 /** Enable USART1 RXBNE interrput */ //USART_EnableInterrupt(TINY_COM1, USART_INT_RXBNE); ...

这个没有测试,我这里串口只发送不接收,就把接收中断屏蔽掉了。

点赞  2023-5-28 15:46

cortex就是这点好,把系统相关的都统一到硬件支持,移植就太方便了。

默认摸鱼,再摸鱼。2022、9、28
点赞  2023-5-29 17:48
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复