GD32F450移植FreeRTOS
一、下载源码选择 FreeRTOS 的最新版本:下载FreeRTOS
二、提取文件
创建文件夹如图所示:
将以下的源码文件拷贝到其中
1)在“FreeRTOSv10.0.1\FreeRTOS\Source”目录下找到所有的‘.c 文件’,拷贝到新建的 src 文件夹下
2)在“FreeRTOSv10.0.1\FreeRTOS\Source\portable”目录下找到“MemMang”文件夹与“RVDS”文件夹,将它们拷贝到新建的port 文件夹下
3)在“FreeRTOSv10.0.1\ FreeRTOS\Source”目录下找到“include”文件夹,将它直接拷贝到新建的 FreeRTOS 文件夹中
三、向工程中添加FreeRTOS
创立如图文件夹:FreeRTOS/src、FreeRTOS/port
向工程FreeRTOS/src中添加文件
向工程FreeRTOS/port中添加文件
添加heap_4.c文件,具体路径:【FreeRTOS】->【portable】->【MemMang】-> heap_4.c
添加port.c文件,具体路径:【FreeRTOS】->【portable】->【RVDS】->【ARM_CM4F】-> port.c
找到FreeRTOSv10.0.1\FreeRTOS\Demo\CORTEX_M4F_STM32F407ZG-SK文件下的FreeRTOSConfig.h
拷贝 FreeRTOSConfig.h 文件到 我们新建的文件夹FreeRTOSv10.0.1\include下,如图
四、导入文件路径
五、完善移植
编译报错(1): 找不到FreeRTOS.h
在源码FreeRTOSv202104.00\FreeRTOSv202104.00\FreeRTOS\Demo文件夹中找到对应芯片工程的FreeRTOSConfig.h,比如STM32F407就需要找到并添加到工程的FREERTOS/include目录下。
编译报错(2):SystemCoreClock未定义将FreeRTOSConfig.h中的条件编译
#ifdef __ICCARM__
改为
#if defined(__ICCARM__)||defined(__CC_ARM)||defined(__GNU__)
编译报错(3): 提示port.o与stm32f4xx_it.o有重复定义
注释掉stm32f4xx_it.c中的SVC_Handler(),PendSV_Handler(),SysTick_Handler()即可。
编译报错(4):提示4个hook函数未定义
修改FreeRTOSConfig.h中的HOOK宏的值为0。
#define configUSE_IDLE_HOOK 0
#define configUSE_TICK_HOOK 0
#define configCHECK_FOR_STACK_OVERFLOW0
#define configUSE_MALLOC_FAILED_HOOK 0
六、创建任务
/*全局变量*/
static TaskHandle_t AppTaskCreate_Handle = NULL;
static TaskHandle_t LED1_Task_Handle = NULL;
static TaskHandle_t LED2_Task_Handle = NULL;
/**
* @brief 黄灯闪烁
*
*/
void led1_task(void *pra)
{
while (1) {
bsp_yellow_led_on();
vTaskDelay(500);
bsp_alarm_led_off();
vTaskDelay(500);
}
}
/**
* @brief 绿灯闪烁
*
* @parampra --
*/
void led2_task(void *pra)
{
while (1) {
change_battery_led_alarm();
vTaskDelay(1000);
change_battery_led_charged();
vTaskDelay(1000);
}
}
/**
* @brief 任务创建
*
*/
static void AppTaskCreate(void)
{
BaseType_t xReturn = pdPASS;
taskENTER_CRITICAL(); // 进入临界区
/* 报警灯任务 */
xReturn = xTaskCreate((TaskFunction_t)flink,
(const char *)"flink_Task",
(uint16_t)512,
(void *)NULL,
(UBaseType_t)2,
(TaskHandle_t *)&LED1_Task_Handle);
/* LED2 任务 */
xReturn = xTaskCreate((TaskFunction_t)LED2_Task,
(const char *)"LED2_Task",
(uint16_t)512,
(void *)NULL,
(UBaseType_t)3,
(TaskHandle_t *)&LED2_Task_Handle);
vTaskDelete(AppTaskCreate_Handle); // 任务调度
taskEXIT_CRITICAL(); // 退出临界区
}
/* 主函数 */
int main()
{
HardWare_Init();
BaseType_t xReturn = pdPASS;
/* 创建任务AppTaskCreate*/
xReturn = xTaskCreate((TaskFunction_t)AppTaskCreate,
(const char *)"AppTaskCreate",
(uint16_t)512,
(void *)NULL,
(UBaseType_t)1,
(TaskHandle_t *)&AppTaskCreate_Handle);
if (pdPASS == xReturn)
vTaskStartScheduler();
else
return -1;
while (1);
}
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/m0_66338176/article/details/134314216
不同的工程 都可以引用这个位置的文件吧 所有版本的freertos都可以这样移植吗
任何型号芯片的移植都可以这样操作吧
如果是从其他厂商的代码移植过来就要复杂一点 把
代码的变动并不大 关键在设置上
freertos的版本和软件版本需要进行匹配吗
在FreeRTOS中,应避免使用阻塞式的延迟函数,如delay_ms()或vTaskDelay(),因为这些函数会阻止任务切换,可能导致系统崩溃。取而代之,可以使用FreeRTOS提供的非阻塞延时函数,如vTaskDelayUntil()。 根据 GD32F450 的硬件特性,实现或修改 FreeRTOS 的端口层代码,包括任务切换、上下文保存与恢复等。 现在已经切换到RTTread了。 在移植FreeRTOS到GD32F450时,需要关注可用的硬件资源,如RAM、Flash等。确保系统有足够的硬件资源来运行FreeRTOS和应用程序。 FreeRTOS 官方通常支持 ARM Cortex-M 系列的微控制器,因此可能需要一些定制工作来适应 GD32F450 的具体硬件特性。 在GD32F450中,外设驱动通常使用寄存器级操作或HAL库。在移植FreeRTOS时,需要编写或修改相应的外设驱动程序,以支持FreeRTOS任务间的通信和数据交换。 参考FreeRTOS的官方文档和GD32F450的数据手册 根据应用需求,合理配置队列、信号量、互斥锁等各种RTOS对象 根据GD32F450的GPIO、USART、SPI、I2C等外设的特点,修改或编写对应的驱动程序以适应FreeRTOS环境下的并发访问和互斥控制。 GD32F450通常使用C语言进行编程,需要配置合适的编译环境,如Keil、IAR或GCC等。在编译环境中,需要正确设置GD32F450的芯片型号和相关参数。 GD32F450的硬件配置满足FreeRTOS的要求,例如内存分配、中断控制器、时钟系统等。 配置GD32F450的系统时钟,以便为FreeRTOS提供精确的时间基准。通常,可以使用内部或外部时钟源,并通过PLL或其他频率分频器实现所需的系统时钟频率。 确保堆的大小足够,以支持任务创建、消息队列、信号量等动态内存分配。