提示:文章
文章目录
- 前言
- 一、背景
- 第6章节
- 二、
- 2.1
- 2.2
- 三、
- 3.1
- 总结
前言
前期疑问:
本文目标:
一、背景
在家里先使用野火网盘资料里的freeRTOS源码,网盘里是v9.0.0。
| J:\野火\STM32F103ZET6_霸道开发板\A盘(资料盘)\1-程序源码_教程文档\3-[野火]《FreeRTOS内核实现与应用开发实战指南》\2-FreeRTOS源码及官方参考资料\ebf_freertos_data_20211225\FreeRTOSv9.0.0\FreeRTOSv9.0.0\FreeRTOS | ![]() | |
| 新建工程 | ![]() | |
| 1、 | ![]() | 本地创建文件夹 |
| 2、 | ![]() | 创建工程后选择芯片 |
| 3、 | ![]() | 点击OK,关闭Manage Run-Time Environment 选项框之后,刚刚我们选择的CORE 和Startup 这两个文件就会添加到我们的工程组里面 |
| 4、 | ![]() | 新建组并重命名并且在user文件夹和Doc文件夹中添加文件 |
| 5、 | ![]() | 按照教程main文件中新建demo代码,编译成功 |
| 6、 | ![]() | 根据system文件中的时钟频率更改工程的频率,改成25M。还联想到protues仿真时频率设置成72M会乱码,是不是这个原因呢?看了USART代码,syste文件中设置的宏也不是36M,而是24M或者72M |
第6章节
看野火freeRTOS的资料,看到第7章 任务的定义与任务切换的实现——7.6 main 函数章节,教程写了初版最简单的多线程demo,然后想自己也照着实现工程,然后回到第3章 初识FreeRTOS——3.3 FreeRTOS 资料获取,准备通过链接(https://sourceforge.net/projects/freertos/files/FreeRTOS/)下载freeRTOS源码,但是不确定下载哪个版本,本来想下载最新版本,想了下下载BDM同版本的吧。
看BDM100的代码源码,查看下述文件:
![[图片]](https://i-blog.csdnimg.cn/direct/04d0b60b522a4daca433936bca7c4160.png)
确定是V10.2.1,所以下载对应版本。
第6 章节
这个章节在前面新建的本地工程基础上,在freertos文件夹下新建一个include文件夹,里面放list.h文件,同时freertos文件夹新建一个list.c文件。将两个文件添加到freeRTOS/Source组中,其中list.h文件还需要在头文件中设置。
我直接从野火现有工程中拷贝文件。进入freertos文件夹下,看到除了list文件还有其他很多文件,主要是include文件夹中有不少其他文件。
![[图片]](https://i-blog.csdnimg.cn/direct/4e75dea6aa874fae943e52b1069d76a9.png)
处理方法是只拷贝list文件,下面设置头文件路径。
![[图片]](https://i-blog.csdnimg.cn/direct/e01ad6f546d04669b4e29c963d6b5068.png)
添加后编译正常。
下面将野火工程中main文件代码拷贝到keil,中文会乱码,设置keil以下两个项目:
![[图片]](https://i-blog.csdnimg.cn/direct/492d67d64b1e448ea4cbfdc1d08cef84.png)
设置好后重新拷贝,中文不乱码。
重新编译后报错
![[图片]](https://i-blog.csdnimg.cn/direct/31ee620a2c0843e4b72677dbd5afac80.png)
拷贝FreeRTOS.h文件到include文件夹下,编译,报错如下
![[图片]](https://i-blog.csdnimg.cn/direct/7587af55339d41e3bd079bbb14c5967a.png)
按照错误再继续添加文件,
FreeRTOSConfig.h
portable.h
添加文件后报错
![[图片]](https://i-blog.csdnimg.cn/direct/f9a865665c0f4273b24cee3f2b551224.png)
继续添加这个文件portmacro.h,编译通过
keil警告:
![[图片]](https://i-blog.csdnimg.cn/direct/ccf0ff5ee19945bb87fda3205140610f.png)
查了下是因为版本授权过期。
报这个警告
![[图片]](https://i-blog.csdnimg.cn/direct/92ff45bba671459bba80ec745d593830.png)
遇到“no previous extern declaration for non-static variable”错误通常意味着在代码中使用了某个变量,但是在使用它之前没有正确地声明或者定义该变量。
尝试将头文件全部添加到freertos组中,该告警继续存在。忽略,仿真调试,在for语句处打断点,将List_Item、List_Item1、List_Item2、List_Item3添加到watch窗口,全速运行查看实验结果:
![[图片]](https://i-blog.csdnimg.cn/direct/f73c03624ab04598a9bb3cd01f6150ad.png)
可以看到四个变量中存储的前后节点情况。
所以这个章节应该就是尝试写了个关于freertos常用的链表的demo程序,为什么freertos常用链表呢。据我了解,任务有四个状态:就绪态,运行态,阻塞态,()。其中就绪态,任务处于就绪态的时候,就是将任务放在就绪列表中。就绪列表就是一个链表,里面存了很多任务。
继续往下看。
第7章
按照第7章教程,将第7章工程main文件代码拷贝到自己的工程main文件中,编译报错,
![[图片]](https://i-blog.csdnimg.cn/direct/646297ab4d36471bb6059f9bd3fbc3d9.png)
拷贝task.h和task.c文件。
第7章用到了程序块,按照教程在FreeRTOS.h文件中增加skTCB结构体定义。
FreeRTOS.h文件差异如下
![[图片]](https://i-blog.csdnimg.cn/direct/cd52b56ce63d419eac9a4f23aad1c727.png)
拷贝后configMAX_TASK_NAME_LEN宏定义报错,查看FreeRTOSConfig.h文件差异如下
![[图片]](https://i-blog.csdnimg.cn/direct/dbffa6c48ee24932ad9915fc18dcdafb.png)
编译报错缺少文件,拷贝文件
![[图片]](https://i-blog.csdnimg.cn/direct/66a97422b2ca4117afc67c9d60d2512e.png)
该文件中内容如下:
![[图片]](https://i-blog.csdnimg.cn/direct/3f495392b4f34134adf57781541f3022.png)
拷贝文件后编译。
编译报错,根据错误搜索,发现portable.h文件也有差异如下
![[图片]](https://i-blog.csdnimg.cn/direct/30ec54e3b3af44b199a5d9c161f2ef96.png)
最终指向涉及到这个文件,这个文件是第7章新增的文件,路径如下图所示
![[图片]](https://i-blog.csdnimg.cn/direct/8d1835455172469ea0b73dc837bf06e3.png)
添加文件后编译,port.c文件报错很多错误。如下图所示
![[图片]](https://i-blog.csdnimg.cn/direct/2884633ea3324f3b9ece5d45bd0d48d9.png)
这个问题比较奇怪,之前没有遇到过,最后查了资料,看到下面这篇文章得到答案:Keil5.37版本下,使用ARMcomplier6编译__asm 函数报错的问题,解决办法如下图
![[图片]](https://i-blog.csdnimg.cn/direct/63d1eb05966243d5a001909ef1760ce3.png)
切换成下面的版本。编译之前的报错消失了,仅剩下面的一个错误。

根据这个错误定位到portmacro.h文件有差异。修改后编译通过。
尝试虚拟调试,将flag1和flag2加入analysis,运行出现预期效果

二、
2.1
2.2
三、
3.1
总结
未完待续







