GD32F303移植FreeRTOS
移植RTOS总共需要完成三件事:
- 提供系统心跳
- 任务切换
- 启动首个任务
对应到ARM架构,就是如下
- 在SysTickHandler中断里面累加计时
- 在PendSVHandler中断里面切换任务
- 在SVCHandler中断里面启动首个任务
至于为什么是这个三个中断,请自行百度,有更详细的说明。
FreeRTOS接口做的很完善,仅需要做小部分的改动,下面以V9.0.0为例说明,相关代码可以直接去官网下载
新建两个分组
- 将source里面的的所有c文件放到freertos_src分组
- 因为GD32F303属于CORTEX-M4内核,将对应的port.c文件加入到freertos_port分组
- 选择移植内存分配策略,这里选择heap_4.c,放入到freertos_port分组
- 添加FreeRTOSConfig.h到freertos_port分组,别忘了把所有头文件路径都加到keil里面
至此,需要添加的文件全部添加完毕了
FreeRTOSConfig.h里面把三个中断服务函数都进行了重定义,帮助我们都实现了关键功能
我们需要做的就是把原工程里面的三个中断服务函数注释掉,是不是非常简单
但我们还需要进行一些简单的配置
- 系统时钟
- 编译出现缺少某HOOK错误
下面需要做一个测试,先创建任务
点击查看代码
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);