STM32+FreeRTOS 使用SystemView监控系统

news2024/11/27 16:30:36

前言

本文以STM32F407ZET6 + FreeRTOS V9.0作为演示,其它的Cortex M芯片同样可以参考此文,其他内核和RTOS理论上也支持,本文暂时不做研究。

所以开始阅读本文前,需要一块能运行FreeRTOS的Cortex M芯片,如果没有移植好操作系统,可以参考我的另一篇文章《STM32F103移植FreeRTOS完整过程》

本文打包提供FreeRTOS V9.0源码SystemView安装包STM32F407ZET6示例工程,在文章顶部标题下方。



SystemView简介

SystemView是嵌入式系统的实时记录和可视化工具。它揭示了应用程序的真实运行时行为,比调试器提供的系统洞察更深入。这在开发和处理由多线程和中断组成的复杂嵌入式系统时尤为有效。SystemView可确保系统按设计运行,跟踪低效情况,并发现意外的交互和资源冲突。——SEGGER官网

可以查看任务和中断运行的时序图
在这里插入图片描述

可以查看任务调度情况

在这里插入图片描述


移植源码

官网下载,本文选择的是V3.52版本,如果下载太慢可以在文章顶部标题下方下载。

在这里插入图片描述

在工程目录下新建SEGGER目录,进入SystemView安装目录,准备往SEGGER目录移入源码

SystemView\Src\SEGGER\下的所有.c .h 文件移入SEGGER目录

在这里插入图片描述

SystemView\Src\Config\下的所有.c .h 文件移入SEGGER目录
在这里插入图片描述

SystemView\Src\Sample\FreeRTOSV9\下的所有.c .h 文件移入SEGGER目录

SystemView\Src\Sample\FreeRTOSV9\Config\Cortex-M\下的所有.c .h 文件移入SEGGER目录

在这里插入图片描述

此时SEGGER目录下的内容如图所示,将此目录文件添加到工程即可

在这里插入图片描述



给FreeRTOS打补丁

这里不打补丁一样能监控系统,有知道打补丁作用的大佬可以评论区告诉大家!
这里不打补丁一样能监控系统,有知道打补丁作用的大佬可以评论区告诉大家!
这里不打补丁一样能监控系统,有知道打补丁作用的大佬可以评论区告诉大家!

SystemView\Src\Sample\FreeRTOSV9\Patch\目录下的FreeRTOSV9_Core.patch集成了对FreeRTOS的改动,可以通过git apply命令一键修改

打开文件可以看到工作路径为/libs/FreeRTOS/

在这里插入图片描述

打开FreeRTOSv9.0.0目录,新建libs\FreeRTOS\文件夹

FreeRTOSv9.0.0\FreeRTOS\Source\中所有文件移入其中

在这里插入图片描述

FreeRTOSV9_Core.patch移入到FreeRTOSv9.0.0根目录,并执行如下命令即可完成一键打补丁

git apply FreeRTOSV9_Core.patch



修改配置

FreeRTOSConfig.h中添加如下宏定义

#define INCLUDE_xTaskGetIdleTaskHandle  1
#define INCLUDE_pxTaskGetStackStart     1

FreeRTOS.h中包含如下头文件

#include "SEGGER_SYSVIEW_FreeRTOS.h"

main.c中包含如下头文件

#include "SEGGER_SYSVIEW.h"

并在系统调度开始前,调用如下函数

SEGGER_SYSVIEW_Conf();

在SYSTICK中断中添加中断进出记录traceISR_ENTERtraceISR_EXIT

void xPortSysTickHandler( void )
{
	traceISR_ENTER();

	vPortRaiseBASEPRI();
	{
		if( xTaskIncrementTick() != pdFALSE )
		{
			portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
			traceISR_EXIT_TO_SCHEDULER();
		}
		else
		{
			traceISR_EXIT();
		}
	}
	vPortClearBASEPRIFromISR();
}

其余中断,例如定时器中断、UART中断等,都需要手动加上traceISR_ENTERtraceISR_EXIT来记录中断进出,否则不会显示此中断的运行情况



开始运行

代码如下

#include "main.h"
#include "usart.h"
#include "gpio.h"
#include "FreeRTOS.h"
#include "task.h"

#include "SEGGER_SYSVIEW.h"

void SystemClock_Config(void);

static TaskHandle_t task1_handle = NULL;
static TaskHandle_t task2_handle = NULL;

void task1(void *arg)
{
	while(1)                            
	{
	}
}

void task2(void *arg)
{
	while(1)                            
	{
	}
}

int main(void)
{
	HAL_Init();
	SystemClock_Config();
	MX_GPIO_Init();
	MX_USART6_UART_Init();

	xTaskCreate(task1, "task1", 1024, NULL, 20, &task1_handle);
	xTaskCreate(task2, "task2", 1024, NULL, 20, &task2_handle);

	SEGGER_SYSVIEW_Conf();

	// 开启调度
	vTaskStartScheduler();
	while(1);
}

打开SystemView V3.52,点击开始,选择对应芯片即可

在这里插入图片描述
效果如图

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/742261.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

发一下接口自动化测试框架(python3+requests+excel)

Git: https://github.com/lilinyu861/Interface-Test 环境配置: 开发工具:pycharm2018Excel 开发框架:python3requestsexcel 接口自动化测试框架介绍: 此接口测试框架,首先由用户设计原始的测试用例并为…

webpack笔记二

文章目录 背景拆分环境清除上次构建产物插件:clean-webpack-plugin合并配置文件插件:webpack-merge实时更新和预览效果:webpack-dev-server babel配置参考 背景 webpack笔记一 在前面的学习,完成了webpack的基本配置&#xff0c…

C++教程——const修饰指针、结构体、文件操作

const修饰指针 常量指针 指针常量 const既修饰指针,又修饰常量 指针与数组 结构体 通过指针访问结构体变量中的数据 结构体中const使用场景 文件操作 写文件 读文件 读取数据的方式 二进制读写文件 写文件 读文件

master、origin master和origin/master

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

线程任务分支合并框架

1、原理 2、实用类 (1) ForkJoinPool 分支合并池 类比> 线程池 (2) ForkJoinTask ForkJoinTask 类比> FutureTask (3) RecursiveTask 递归任务:继承后可以实现递归(自己调自己)调用…

从小白到大神之路之学习运维第57天--------shell脚本实例应用3.0--以及————结合“三贱客”之“grep”的相关用法

第三阶段基础 时 间:2023年7月11日 参加人:全班人员 内 容: shell实例 目录 一、循环的基本使用 while随机循环 二、case控制服务的基本应用 1、case的语法格式 2、使用case写脚本,以以下实验为主 例1:控…

vue + Luckysheet 实现在线Excel表格操作

需求千千万,又是难熬的一天! 效果图: Luckysheet官网网站:快速上手 | Luckysheet文档 1、引入(两种) 第一种CDN引入 在项目中的 public ---> index.html 中添加代码,如下: &…

91.qt qml-圆角毛玻璃 高斯模糊

qml中使用毛玻璃,可以通过两个类型GaussianBlur或者FastBlur使用,效果如下所示: 接下来先来介绍FastBlur和GaussianBlur 1.FastBlur介绍 FastBlur提供比GaussianBlur更低的模糊质量,但渲染速度更快。FastBlur效果通过使用源内容缩小和双线性滤波的算法模糊源内容来软化源内…

【免费送书活动第一期】赠送实体图书《深入浅出Java虚拟机》JVM原理与实战

赠送实体图书四本(免费赠送) 《深入浅出JAVA虚拟机:JVM原理与实战》 内容简介: 本书主要以 Java 虚拟机的基本特性及运行原理为中心,深入浅出地分析 JVM 的组成结构和底层实现,介绍了很多性能调优的方案和…

idea编译时遇到的bug

1、 D:\workspace\spark\src\main\Scala\WordCount.scala:3:8 WordCount is already defined as object WordCount object WordCount { 解决参考博客:Error:(21, 8) FlumePushWordCount is already defined as object FlumePushWordCount object FlumePushWor_WSQ(…

Switch超频图文说明

Switch超频图文说明 有些游戏,官方锁频导致游戏卡顿,可以通过超频提升游戏体验。抽空研究了下,发现超频可以在大气层 Atmosphere 和 SX OS系统中使用。 正巧最近有同学询问,就整理个教程好了。 Switch超频图文说明 按自己的破解系…

14-Vue插槽(slot),制作可复用组件

什么是 slot ? Vue 将 <slot>元素作为承载分发内容的出口。插槽内可以包含任何模板代码&#xff0c;包括 HTML或其它组件。 在某些组件的模板中&#xff0c;有一部分区域需要父组件来指定 <!-- message组件&#xff1a;一个弹窗消息 --> <div class"mes…

【工具】浏览器自带下载加速功能

&#x1f41a;作者简介&#xff1a;花神庙码农&#xff08;专注于Linux、WLAN、TCP/IP、Python等技术方向&#xff09;&#x1f433;博客主页&#xff1a;花神庙码农 &#xff0c;地址&#xff1a;https://blog.csdn.net/qxhgd&#x1f310;系列专栏&#xff1a;善假于物&#…

srt转rtmp(mpegts -> flv)

一、使用ffmpeg拉流srt转rtmp推流过程中遇到音视频问题 1、音频 虽然从mpegts到flv都是AAC格式&#xff0c;但是mpegts多了ADTS头&#xff0c;在flvenc的时候会报错误&#xff1a; Malformed AAC bitstream detected: use the audio bitstream filter aac_adtstoasc to fix it…

JAVA克隆

更多精彩 先案例后讲解&#xff0c;这里是代码教父&#xff0c;今天讲解JAVA中的clone 目录 什么是clone如何实现clone 浅克隆深克隆小结 什么时候使用cloneclone 相关类库的实现分析 什么是clone 在Java中&#xff0c;克隆&#xff08;Clone&#xff09;指的是创建一个现有对…

linux命令与shell编程

文章目录 一、概念linux内存嵌入式嵌入式层次图判断小端和大端 二、linux系统操作命令ls查看cd 命令pwd命令touch 创建文件mkdir 创建目录chmod 修改权限man命令cp 拷贝mv 移动rm命令cat命令echo 命令tty命令->查看当前终端号clear 命令ldd命令 ->查看文件依赖哪些库prin…

make makefile

文章目录 make是一个命令makefile or Makefile是一个当前目录下的文件使用&#xff1a;生成可执行文件清理 作用依赖关系依赖方法make会自动推导makefile中的依赖关系栈式结构为什么清理的时候要make 加上clean?make后面可以直接跟要生成的可执行文件,指定名称的依赖关系和依赖…

Python第二天之容器学习

1.List 容器无非就增删改查 1.添加 name_list [aaa,bbb,ccc,ddd] name_list.append(b1) name_list.insert(1,xxx) print(name_list)append 是在后面追加 而insert是自己定义下表插入 name_list [aaa,bbb,ccc,ddd] name_list2 [qqq,222,111] name_list.extend(name_list…

python 面向对象编程

文章目录 前言如何理解面向对象编程在 python 中如何使用面向对象编程定义类创建对象self添加和获取对象属性添加属性类外添加属性类中添加属性 访问属性类外访问属性类中访问属性 魔法方法__ init __() 方法__ str __()方法__ del __() 方法 前言 大家好&#xff0c;前面我们…

吐血整理,自动化测试Yaml框架配置文件-深入详解(超细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 YAML详解 YAML它…