嵌入式RTOS现代调试方法(包含UML systemview Ozone)----- 飞跃奥德赛

奥德赛时期,

指的是后20几岁,30出头的年轻人。

他们大学之后,在工作与学校之间徘徊来徘徊去:时而工作,时而上学。对于他们来说,上学已不再是22岁之前的专利,而是如同男女朋友一般,可以换来换去。他们当中的很多人在经济上还不能完全独立,还要依赖父母的支持。他们推迟工作,推迟结婚,推迟生子。总之,从大学毕业到成年阶段,这个档期被拉长了五年,七年甚至更长。

这些工具以及路线或许能帮助到迷茫的奥德赛时期的你

除了C语言书籍、c语言项目之外的最佳项目开发辅助工具,全都是由实践得出的高效总结总结

对于视觉学习者来说最重要的是直观化的图形描述抽象的逻辑,对于感兴趣的人来说,代码也太过晦涩生硬

你或许见过这样的图

UML 直观化

以kw38为例

VSCODE 使用github copliot 生成plant UML 直观化

询问github copliot直观描述代码(直接问生成plant uml去理解代码简单清晰)

在 VS Code 中可以免费使用 GitHub Copilot了! - formulahendry - 博客园

[UML] PlantUML安装使用指南 - 千千寰宇 - 博客园

@startuml
actor User

User -> main : 启动程序
main -> BOARD_InitPins : 初始化引脚
main -> BOARD_BootClockRUN : 启动时钟
main -> BOARD_InitDebugConsole : 初始化调试控制台
main -> SEGGER_SYSVIEW_Conf : 配置SEGGER SYSVIEW
main -> xTaskCreate : 创建 first_task
alt 创建成功
    main -> vTaskStartScheduler : 启动调度器
else 创建失败
    main -> PRINTF : 打印 "Task creation failed!"
    main -> vTaskDelay : 延迟
end

first_task -> xTaskCreate : 创建 second_task
alt 创建成功
    first_task -> PRINTF : 打印 RTT 块地址
    loop 无限循环
        first_task -> SEGGER_SYSVIEW_PrintfTarget : 打印计数器
        first_task -> vTaskDelay : 延迟
    end
else 创建失败
    first_task -> PRINTF : 打印 "Task creation failed!"
    first_task -> vTaskSuspend : 挂起任务
end

second_task -> SEGGER_SYSVIEW_Warn : 检查 int16 下溢并发出警告
loop 无限循环
    second_task -> __NOP : 执行 NOP
end
@enduml

systemview

使用向代码中添加RTT systemview需要的文件

freertos+systemview移植_systemview如何移植-优快云博客 这个很重要

下载systemview

What Is SystemView?

原始代码

/*
 * Copyright (c) 2013 - 2015, Freescale Semiconductor, Inc.
 * Copyright 2016-2017 NXP
 * All rights reserved.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

/* FreeRTOS kernel includes. */
#include "FreeRTOS.h"
#include "SEGGER_SYSVIEW.h"
#include "task.h"
#include "queue.h"
#include "timers.h"
#include "semphr.h"

/* Freescale includes. */
#include "fsl_device_registers.h"
#include "fsl_debug_console.h"
#include "board.h"

/* Include internal header to get SEGGER_RTT_CB */
#include "SEGGER_RTT.h"

#include "pin_mux.h"
/*******************************************************************************
 * Definitions
 ******************************************************************************/

#define SYSVIEW_DEVICE_NAME "FRDM-KW36 Cortex-M0Plus"
#define SYSVIEW_RAM_BASE (0x1FFFC000)

extern SEGGER_RTT_CB _SEGGER_RTT;
extern const SEGGER_SYSVIEW_OS_API SYSVIEW_X_OS_TraceAPI;

/* The application name to be displayed in SystemViewer */
#ifndef SYSVIEW_APP_NAME
#define SYSVIEW_APP_NAME "SDK System view example"
#endif

/* The target device name */
#ifndef SYSVIEW_DEVICE_NAME
#define SYSVIEW_DEVICE_NAME "Generic Cortex device"
#endif

/* Frequency of the timestamp. Must match SEGGER_SYSVIEW_GET_TIMESTAMP in SEGGER_SYSVIEW_Conf.h */
#define SYSVIEW_TIMESTAMP_FREQ (configCPU_CLOCK_HZ)

/* System Frequency. SystemcoreClock is used in most CMSIS compatible projects. */
#define SYSVIEW_CPU_FREQ configCPU_CLOCK_HZ

/* The lowest RAM address used for IDs (pointers) */
#ifndef SYSVIEW_RAM_BASE
#define SYSVIEW_RAM_BASE 0x20000000
#endif

/* Task priorities. */
#define FIRST_TASK_PRIORITY (configMAX_PRIORITIES - 1)
#define SECOND_TASK_PRIORITY (configMAX_PRIORITIES - 2)

/*******************************************************************************
 * Prototypes
 ******************************************************************************/
static void first_task(void *pvParameters);
static void second_task(void *pvParameters);

#define APP_DELAY 100

/*******************************************************************************
 * Code
 ******************************************************************************/

/*!
 * @brief System View callback
 */
static void _cbSendSystemDesc(void)
{
    SEGGER_SYSVIEW_SendSysDesc("N=" SYSVIEW_APP_NAME ",D=" SYSVIEW_DEVICE_NAME ",O=FreeRTOS");
    SEGGER_SYSVIEW_SendSysDesc("I#15=SysTick");
}

/*!
 * @brief System View configuration
 */
void SEGGER_SYSVIEW_Conf(void)
{
    SEGGER_SYSVIEW_Init(SYSVIEW_TIMESTAMP_FREQ, SYSVIEW_CPU_FREQ, &SYSVIEW_X_OS_TraceAPI, _cbSendSystemDesc);
    SEGGER_SYSVIEW_SetRAMBase(SYSVIEW_RAM_BASE);
}

/*!
 * @brief Main function
 */
int main(void)
{
    /* Init board hardware. */
    BOARD_InitPins();
    BOARD_BootClockRUN();
    BOARD_InitDebugConsole();

    SEGGER_SYSVIEW_Conf();

    if (xTaskCreate(first_task, "first_task", configMINIMAL_STACK_SIZE, NULL, FIRST_TASK_PRIORITY, NULL) != pdPASS)
    {
        PRINTF("Task creation failed!.\r\n");
        while (1)
            vTaskDelay(APP_DELAY);
    }

    vTaskStartScheduler();
    while (1)
        ;
}

/*!
 * @brief First task, higher priority.
 */
static void first_task(void *pvParameters)
{
    if (xTaskCreate(second_task, "second_task", configMINIMAL_STACK_SIZE, NULL, SECOND_TASK_PRIORITY, NULL) != pdPASS)
    {
        PRINTF("Task creation failed!.\r\n");
        // vTaskSuspend(NULL);
    }

    PRINTF("RTT block address is: 0x%x \r\n", &_SEGGER_RTT);

    /* dummy code, print counter and delay */
    for (int counter = 0;; counter++)
    {
        SEGGER_SYSVIEW_PrintfTarget("first task counter: %d ", counter++);
        vTaskDelay(APP_DELAY);
        // 复制1KB数据到RTT缓冲区
        SEGGER_RTT_Write(0, "1234567890", 10);
    }
}

/*!
 * @brief Second task, lower priority.
 */
static void second_task(void *pvParameters)
{
    while (1)
    {
        /* dummy code, notify HOST when int16 underflow */
        for (uint16_t j = (uint16_t)-1;; j--)
        {
            if (j == 0)
            {
                SEGGER_SYSVIEW_Warn("second task int underflow");
            }
            __NOP();
            vTaskDelay(APP_DELAY);
        }
    }
}

/*!
 * @brief Apply only for M0plus core. M4/M3 uses cycle counter.
 */
U32 SEGGER_SYSVIEW_X_GetTimestamp(void)
{
    return __get_IPSR() ? xTaskGetTickCountFromISR() : xTaskGetTickCount();
}

使用jlink调试

SystemView的使用教程(基于FreeRTOS的配置)-优快云博客

systemview的运行效果

Ozone 调试具体参数值,并用图形显示

Ozone V3.32a Jlink显示变量波形_ozone jlink-优快云博客

source insight显示代码结构

IAR 编译框架

drawio 分析时序流程

git graph commit新代码

vscode 插件 Git Graph 使用_vscode git graph-优快云博客

gitlab CI/CD

GitLab CI/CD - 废物大师兄 - 博客园

Rtos 最佳参考 zephyr 英文

中文rt-thread

Onenote笔记 --- 边调边check整理 思路

嵌入式学习地图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值