1、新建存放rtt文件的文件夹,这里命名为rtos
2、将从freertos的github上下载下来的文件,拷贝source到rtos路径下
>include: 头文件目录
portable: 硬件接口相关文件夹(芯片接口相关/内存管理相关等)
- Keil: ARM-MDK IDE的启动文件(硬件接口)相关-->里面就一个文件说明跟RVDS一样,所以后面移植会直接移植RVDS的内容
- MemMang: 内存管理相关
- RVDS:
- GCC: GCC编译环境的启动文件相关
- ….
*.c:freertos的列表队列任务等实现源文件
3、将上述Source文件夹拷贝到rtos文件夹内,并将其添加到git版本管理
4、将非必要的IDE相关的启动文件删掉,只保留我们需要用到的keil相关的文件,精简工程rt_hw_console_getchar(void)
5、将freertos内核相关的文件修改为只读属性,避免误修改【非必要】
6、添加freertos的文件到MDK工程,点击OK
7、从demo中找到相近的工程,将其里面的FreeRTOSConfig.h头文件拷贝到MDK工程目录下
后面配置freertos的功能需要在这个配置文件进行
8、将freeRTOSConfig.h头文件添加到MDK工程
9、将freeRTOS的头文件路径添加到MDK工程
10、将PendSV_Handler/SVC_Handler两个中断服务函数修改定义向FreeRTOS提供的函数xPortPendSVHandler/vPortSVCHandler
有两种方法:
1)修改启动文件内的两个中断服务函数名为xPortPendSVHandler/vPortSVCHandler
2)将xPortPendSVHandler/vPortSVCHandler重定义为PendSV_Handler/SVC_Handler
- 如果使用2方式,并且使用CubeMx生成的工程,那么需要在stm32f10x_it.c文件内将PendSV_Handler/SVC_Handler两个中断函数注释掉,不然会报多重定义的错误
这里示例使用第2种方式:
主要是函数声明类型跟INIT_xxx_EXPORT要求的不一样,将函数返回值由void修改为int即可,当然函数内亦需要按实际情况return一个值。
11、将FreeRTOS的时钟中断服务函数xPortSysTickHandler添加到SysTick_Handler函数中,参考[链接](https://bbs.21ic.com/icview-2897082-1-1.html)
12、将FreeRTOS.h/task.h头文件添加到main.h
13、根据[API文档](https://www.freertos.org/xTaskCreateStatic.html)或者在task.h文件中找到静态创建线程(任务)的接口,创建一个任务
14、编译提示错误
查看xTaskCreateStatic函数的定义,发现函数被一个宏预编译包裹着configSUPPORT_STATIC_ALLOCATION
查看这个宏的定义,发现默认关闭
15、知道这个宏configSUPPORT_STATIC_ALLOCATION默认关闭后,重新将该宏在FreeRTOSConfig.h头文件开启
16、再次编译发现一个函数vApplicationGetIdleTaskMemory没有定义
查看一下该函数,只有个extern声明
尝试将该函数添加空实现,编译通过了
研究一下该函数的作用:通过该函数来给空闲任务的任务堆 栈及任务控制块分配内存,添加对应的实现
17、在任务内添加调试信息输出作验证
编译烧写后,每秒输出了一次调试信息
18、新建一个mythread.c,用来声明和实现动态/静态创建任务
19、在AppTasksCreate任务内创建动态线程
20、编译烧写验证,运行正常
21、额外创建多一个静态线程,动态静态一起创建任务,多任务跑起来
编译烧写运行: