独望枫

人在尘世间,有缘自相见,变化千千万,未开窍,已迷恋
posts - 45, comments - 0, trackbacks - 0, articles - 1
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

FreeRTOS 入门体验

Posted on 2021-07-14 01:41 小菜枫 阅读(1082) 评论(0)  编辑 收藏 引用 所属分类: 学习笔记
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、额外创建多一个静态线程,动态静态一起创建任务,多任务跑起来



编译烧写运行:

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理