STM32+FreeRTOS 使用SystemView监控系统

13 篇文章 0 订阅
2 篇文章 0 订阅

前言

本文以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,点击开始,选择对应芯片即可

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

在这里插入图片描述

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实现STM32 FreeRTOS LwIP TCP服务器需要按照以下步骤进行操作: 1. 首先,需要配置LwIP和FreeRTOS。可以在STM32CubeMX中选择配置相应的组件,生成对应的代码和初始化函数。 2. 在代码中创建任务来处理TCP服务器。通过创建一个任务,可以将其分配给特定的核心,以处理TCP请求和响应。 3. 在任务中,首先需要进行LwIP和FreeRTOS的初始化。这样可以确保网络和操作系统的适当设置。需要调用lwip_init()和vTaskStartScheduler()函数。 4. 配置和创建TCP服务器的套接字。可以通过调用lwip_socket()函数创建一个TCP套接字,并使用lwip_bind()函数将其与特定的IP地址和端口绑定。 5. 通过调用lwip_listen()函数监听TCP套接字,等待客户端的连接。 6. 使用lwip_accept()函数接受客户端的连接请求,并获得一个新的套接字来处理与该客户端之间的通信。 7. 通过调用lwip_recv()和lwip_send()函数来接收和发送数据。可以使用这些函数接收来自客户端的数据,并发送响应数据给客户端。 8. 当与客户端的通信完成后,使用lwip_close()函数关闭套接字。 9. 循环进行步骤6-8,以处理其他客户端的连接和通信请求。 需要注意的是,STM32系列芯片的内存和处理能力有限,因此在编写代码时需要谨慎处理内存和资源的分配和释放,以确保程序的稳定性和性能。 总结:通过以上步骤,可以在STM32使用FreeRTOS和LwIP实现TCP服务器,使其能够接受和处理客户端的连接和通信请求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值