GD32F303移植FreeRTOS

移植RTOS总共需要完成三件事:

  • 提供系统心跳
  • 任务切换
  • 启动首个任务

对应到ARM架构,就是如下

  • 在SysTickHandler中断里面累加计时
  • 在PendSVHandler中断里面切换任务
  • 在SVCHandler中断里面启动首个任务

至于为什么是这个三个中断,请自行百度,有更详细的说明。

FreeRTOS接口做的很完善,仅需要做小部分的改动,下面以V9.0.0为例说明,相关代码可以直接去官网下载
新建两个分组
image

  • 将source里面的的所有c文件放到freertos_src分组
    image
  • 因为GD32F303属于CORTEX-M4内核,将对应的port.c文件加入到freertos_port分组
    image
  • 选择移植内存分配策略,这里选择heap_4.c,放入到freertos_port分组
    image
  • 添加FreeRTOSConfig.h到freertos_port分组,别忘了把所有头文件路径都加到keil里面
    image

至此,需要添加的文件全部添加完毕了
FreeRTOSConfig.h里面把三个中断服务函数都进行了重定义,帮助我们都实现了关键功能
image
我们需要做的就是把原工程里面的三个中断服务函数注释掉,是不是非常简单

但我们还需要进行一些简单的配置

  • 系统时钟
    image
  • 编译出现缺少某HOOK错误
    image

下面需要做一个测试,先创建任务

点击查看代码
static TaskHandle_t xHandleTaskLED = NULL;

static void vTaskLED(void *pvParameters)
{
    while(1)
    {
       //周期点灯
    }
}


void AppTaskCreate (void)
{
    xTaskCreate( vTaskLED, /* 任务函数 */
            "vTaskLED", /* 任务名 */
            512, /* 任务栈大小,单位 word,也就是 4 字节 */
            NULL, /* 任务参数 */
            2, /* 任务优先级*/
            &xHandleTaskLED ); /* 任务句柄 */ 
    
}

在mian.c下如下代码

点击查看代码
/*
     在启动调度前,为了防止初始化 STM32 外设时有中断服务程序执行,这里禁止全局中断(除了 NMI 和 HardFault)。
     这样做的好处是:
     1. 防止执行的中断服务程序中有 FreeRTOS 的 API 函数。
     2. 保证系统正常启动,不受别的中断影响。
     3. 关于是否关闭全局中断,大家根据自己的实际情况设置即可。
     在移植文件 port.c 中的函数 prvStartFirstTask 中会重新开启全局中断。通过指令 cpsie i 开启,__set_PRIMASK(1)
     和 cpsie i 是等效的。
     */
    __set_PRIMASK(1); 
	
	AppTaskCreate();
	
	/* 启动调度,开始执行任务 */
    vTaskStartScheduler();
	
	while(1);

  
posted @ 2024-10-11 14:15  njit-sam  阅读(183)  评论(0编辑  收藏  举报