这篇来学习下freeRTOS系统在开发板下的移植。
一、源码下载
源码下载地址:https://www.freertos.org/zh-cn-cmn-s/a00104.html
下载最新源码
二、添加文件
在上篇创建的工程项目中增加freeRTOS相关的文件
2.1、freeRTOS源码复制到项目文件夹下
2.2、项目中添加 freeRTOS源码
项目中添加源码C文件
项目中添加硬件接口文件
项目中添加内存管理文件
三、修改和配置文件
3.1、上面步骤文件添加完成后,指定头文件位置
3.2、编译工程
修改完成后,执行下编译,有下面报错,这是配置文件是复制例程板子的文件,需要根据开发板的硬件进行修改。
3.3、移植过程中的报错
报错内容:
修改方法:
将中断函数中的下面函数注释掉
freeRTOS系统中已经定义了SVC和PendSV中断函数,需要在中断函数中注释掉
屏蔽freeRTOS配置文件中的定义,使用SDK中断里面的systick 中断函数。
再次编译工程
四、创建任务
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
六、程序运行
6.1、串口输出内容
6.2、运行视频
七、程序源码
@caizhiwei 可以参考这个试试
引用: nmg 发表于 2023-5-26 10:04 看着好顺利,厉害了,移植成功的代码是不是可以分享一下?
可以的
/** 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就卡死,不知道楼主遇到过没有?
引用: caizhiwei 发表于 2023-5-28 09:14 /** Enable USART1 RXBNE interrput */ //USART_EnableInterrupt(TINY_COM1, USART_INT_RXBNE); ...
这个没有测试,我这里串口只发送不接收,就把接收中断屏蔽掉了。