奥德赛时期,
指的是后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
原始代码
/*
* 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
Rtos 最佳参考 zephyr 英文
中文rt-thread
Onenote笔记 --- 边调边check整理 思路
嵌入式学习地图