提示:文章
文章目录
- 前言
- 一、背景
- 第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的代码源码,查看下述文件:
确定是V10.2.1,所以下载对应版本。
第6 章节
这个章节在前面新建的本地工程基础上,在freertos文件夹下新建一个include文件夹,里面放list.h文件,同时freertos文件夹新建一个list.c文件。将两个文件添加到freeRTOS/Source组中,其中list.h文件还需要在头文件中设置。
我直接从野火现有工程中拷贝文件。进入freertos文件夹下,看到除了list文件还有其他很多文件,主要是include文件夹中有不少其他文件。
处理方法是只拷贝list文件,下面设置头文件路径。
添加后编译正常。
下面将野火工程中main文件代码拷贝到keil,中文会乱码,设置keil以下两个项目:
设置好后重新拷贝,中文不乱码。
重新编译后报错
拷贝FreeRTOS.h文件到include文件夹下,编译,报错如下
按照错误再继续添加文件,
FreeRTOSConfig.h
portable.h
添加文件后报错
继续添加这个文件portmacro.h,编译通过
keil警告:
查了下是因为版本授权过期。
报这个警告
遇到“no previous extern declaration for non-static variable”错误通常意味着在代码中使用了某个变量,但是在使用它之前没有正确地声明或者定义该变量。
尝试将头文件全部添加到freertos组中,该告警继续存在。忽略,仿真调试,在for语句处打断点,将List_Item、List_Item1、List_Item2、List_Item3添加到watch窗口,全速运行查看实验结果:
可以看到四个变量中存储的前后节点情况。
所以这个章节应该就是尝试写了个关于freertos常用的链表的demo程序,为什么freertos常用链表呢。据我了解,任务有四个状态:就绪态,运行态,阻塞态,()。其中就绪态,任务处于就绪态的时候,就是将任务放在就绪列表中。就绪列表就是一个链表,里面存了很多任务。
继续往下看。
第7章
按照第7章教程,将第7章工程main文件代码拷贝到自己的工程main文件中,编译报错,
拷贝task.h和task.c文件。
第7章用到了程序块,按照教程在FreeRTOS.h文件中增加skTCB结构体定义。
FreeRTOS.h文件差异如下
拷贝后configMAX_TASK_NAME_LEN宏定义报错,查看FreeRTOSConfig.h文件差异如下
编译报错缺少文件,拷贝文件
该文件中内容如下:
拷贝文件后编译。
编译报错,根据错误搜索,发现portable.h文件也有差异如下
最终指向涉及到这个文件,这个文件是第7章新增的文件,路径如下图所示
添加文件后编译,port.c文件报错很多错误。如下图所示
这个问题比较奇怪,之前没有遇到过,最后查了资料,看到下面这篇文章得到答案:Keil5.37版本下,使用ARMcomplier6编译__asm 函数报错的问题,解决办法如下图
切换成下面的版本。编译之前的报错消失了,仅剩下面的一个错误。
根据这个错误定位到portmacro.h文件有差异。修改后编译通过。
尝试虚拟调试,将flag1和flag2加入analysis,运行出现预期效果
二、
2.1
2.2
三、
3.1
总结
未完待续