引言
在上次的文章中我们编写了钩子函数中的代码,本次文章中我会带领大家详细来看一下这些代码,了解一下这些代码底层是如何运作的,这对我们理解FreeRTOS的底层运行原理有很大帮助,这是前两期文章的链接
CLion嵌入式基础开发——基于F570无人机(一)
CLion嵌入式基础开发——基于F570无人机(二)
代码分析
上述代码中我们都在代码块前后添加了对应的宏定义约束,确保任务能否生效都取决于宏定义的状态。我们通过userconfig_RTOS_DEBUG控制着监测任务的状态,我们先声明了任务函数,然后创建了对应的任务,我们在创建任务时将改任务的优先级设置为了osPriorityAboveNormal,这种优先级高于常规的Normal优先级,这样可以确保即便有其它的常规任务函数在运行时系统监测任务也能正常运行。
在任务函数中我们主要监测了CPU运行时间信息、任务状态与栈空间健康度以及动态内存是否泄漏
CPU运行时间统计
代码如下:
vTaskGetRunTimeStats(showbuf);printf("TaskName\tUsername\tCPU\t\n");printf("%s\r\n",showbuf);vTaskDelay(*delaytime);- 作用:监测系统中各个任务占用的
CPU时间百分比 - 底层关联:当调用
vTaskGetRunTimeStats时,FreeRTOS 内核就会去调用你之前写的那个getRunTimeCounterValue()函数,在该函数中我们会去读取硬件定时器TIM6的值 - 工作机制:系统会将每个任务的绝对运行时间换算成百分比,并格式化成一个多行字符串写入
showbuf中,然后通过串口打印。打印完成后,任务主动挂起休眠
任务状态与栈空间健康度
代码如下:
vTaskList(showbuf);printf("TaskName\tTaskState\tTaskPrio\tStackSize\tTaskNum\r\n");printf("%s\r\n",showbuf);vTaskDelay(*delaytime);作用: 监测所有任务的当前状态以及是否面临栈溢出风险。
工作机制:
vTaskList会遍历整个操作系统的任务控制块,并收集以下信息:TaskState (任务状态):
X(运行态 Running)、R(就绪态 Ready)、B(阻塞态 Blocked)、S(挂起态 Suspended)、D(被删除 Deleted)TaskPrio (任务优先级): 当前配置的任务优先级
StackSize (历史最小剩余栈空间): 在 FreeRTOS 中,这个值叫做 High Water Mark(高水位线)。它表示该任务自启动以来,栈空间最少剩下过多少。如果这个值接近 0,说明该任务随时可能发生栈溢出崩溃;如果这个值很大,说明任务创建时栈分配得过大,浪费了内存
打印完成后,任务再次进入休眠
动态内存泄漏监测
代码如下:
printf("free heap size : %d bytes\r\n\r\n",xPortGetFreeHeapSize());vTaskDelay(*delaytime);作用: 监测系统的堆内存健康状况
工作机制: 直接调用
xPortGetFreeHeapSize()获取 FreeRTOS 管理的内存堆中当前还有多少空闲字节可以被pvPortMalloc分配诊断用途: 在长时间运行测试中,如果我们观察到打印出来的
free heap size在不断变小,就说明代码中存在内存泄漏
我们编写好对应的程序之后我们可以在文件中声明宏定义并将对应的值设置为1#define userconfig_RTOS_DEBUG 1,定义完成之后我们就可以进行编译烧录的操作了
程序烧录
我们本次使用的烧录器是ST-Link,使用该烧录器在CLion中的开发体验要好于其它的烧录器,我们可以对烧录器进行快速配置,我们可以点击顶部的原生烧录选项
默认情况下大家可能没有下面的ST-LINK选项,如果没有的话可以进行快速的配置,点击下面的编辑调试服务器即可进行配置,在新界面中点击加号,然后选择ST-LINK即可
具体的参数配置可以参照图中的内容,配置完成之后即可点击绿色的下载烧录按键进行下载烧录
在下载之前我们需要选择我们配置好的ST-LINK,不要使用原生选项,点击之后即可成功烧录
结果验证
烧录完成之后我们还要验证现在MCU是否能够实时输出对应的系统信息,此时就需要用串口来进行查看了。这里就不得不提到CLion的另一个强大功能了,它内置了串口插件,我们下载之后就可以直接在软件中查看串口信息了,这样就不用在IDE和串口监测软件之间反复横跳了,我们首先点击右上角的设置图标,然后点击插件选项
在插件界面中我们在搜索框中输入serial port然后下载红色方框内的插件即可
下载完成之后我们可以点击顶部栏中的视图选项,然后选择工具视图,在工具视图中选择串行连接
在新界面中我们需要配置一下串口参数,然后点击连接
连接之后我们即可看到对应的输出参数信息
实时调试
当然我们也可以使用CLion进行便捷的实时体调试操作,具体的操作过程可以参照CLion使用教程——FreeRTOS文章中的操作流程
配置推荐
不知道大家平时的开发习惯是什么,就我个人来说我接触的一门开发语言是C语言,我们的开发习惯就是将大括号单开一行,但是CLion的默认配置是大括号不单开一行尤其是函数定义,默认的布局有点类似于Java的布局,这样的布局看起来会比较变扭,如果你和我的代码风格比较相似,或者你也不习惯官方的代码风格,那么我们就可以自己定义对应的代码格式,
我们可以在系统的设置界面中选择代码样式,然后编辑C/C++的代码延时,我们可以修改对应的代码样式,修改后可以在下面看到实时的样式预览
总结
至此我们就完整的走完了一段Clion的开发流程,我们从底层的项目配置一路到上层的代码编写,在这个过程中我们或多或少的感受到了CLion作为现代化IDE的优势,能坚持到现在已经很不容易了,前面最难的适应阶段已经过去了,后面的路就会好走很多,希望未来还能在其它地方看到你