【嵌入式CLion】进阶调试——WSL下的Linux体验

说明:

1,这里所指的嵌入式其实是指嵌入式微控制器MCU,即单片机
2,万事开头难,本文目前提供了WSL工具链的搭建,后面会持续更新

一、启用RTOS集成

        在搭建WSL工具链之前,先讲一下集成的RTOS功能,可跳过

        CLion已经集成了有关RTOS的调试功能(不过下面仅以FreeRTOS为例),比如多线程查看并行堆栈等,想要启用这个功能,只需要在FreeRTOS的配置文件里添加宏定义并创建一个时基用于统计任务计时。

        详细信息,请查看官方教程有价值的非捆绑插件 |CLion 文档 (jetbrains.com)

1,启用功能

在设置中找到如下项,勾选即可

2,修改配置文件

 在FreeRTOSConfig.h文件中,添加如下定义。官方文档里有更详细的解释

//用于发布时,取消RTOS调试功能,因为该功能会占用CPU资源
//使用宏定义是为了方便统一控制这个RTOS调试功能,记得包含该宏定义的头文件
#if FreeRTOS_DebugMode   
#define configRECORD_STACK_HIGH_ADDRESS 1
#define configGENERATE_RUN_TIME_STATS 1
extern volatile uint32_t CPU_RunTime;
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() (CPU_RunTime = 0ul)
#define portGET_RUN_TIME_COUNTER_VALUE() CPU_RunTime
#endif//在合适的地方创建并启用这个宏定义
#define FreeRTOS_DebugMode  1

如果下面宏定义的值为0,那么改为1或其他非零值

#define configUSE_TRACE_FACILITY 1    //改为1即可
#define configMAX_TASK_NAME_LEN  (16)  //设置为大于零的值,以便正确显示任务名称,一般默认为16不用改

3,创建时基

        新建文件CPU_RunTime.h/.cpp        (或者.h/.c)

时基频率一般为系统节拍的10到20倍,系统节拍一般默认1000Hz,那么时基频率可设为15000Hz(根据自己需求)。下面选用的是TIM13,你可以换成其他闲置定时器。

#if FreeRTOS_DebugMode
/* 用于统计运行时间 */
volatile uint32_t CPU_RunTime = 0UL;TIM_HandleTypeDef htim13;void ConfigureTimerForRunTimeStats()
{__HAL_RCC_TIM13_CLK_ENABLE();TIM_MasterConfigTypeDef sMasterConfig = {0};htim13.Instance = TIM13;//总频84MHz,现为15000Hzhtim13.Init.Prescaler = 55;htim13.Init.CounterMode = TIM_COUNTERMODE_UP;htim13.Init.Period = 99;htim13.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;HAL_TIM_Base_Init(&htim13);sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE;HAL_TIMEx_MasterConfigSynchronization(&htim13, &sMasterConfig);HAL_NVIC_SetPriority(TIM8_UP_TIM13_IRQn, 1, 0);HAL_NVIC_EnableIRQ(TIM8_UP_TIM13_IRQn);HAL_TIM_Base_Start_IT(&htim13);//不要忘记开启中断
}//由于我是C++环境,所以使用extern "C"包含
extern "C"
{
void TIM8_UP_TIM13_IRQHandler(void)
{HAL_TIM_IRQHandler(&htim13);
}
}
#endif

在中断回调里让计时变量计数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if (htim->Instance == TIM7){HAL_IncTick();}
#if FreeRTOS_DebugModeelse   if(htim->Instance == TIM13){++CPU_RunTime;}
#endif
}

        一般来说,由于中断回调是固定的放在某个文件中,不在CPU_RunTime.cpp中,所以为了隔离起来,可以直接使用服务例程ISR,不使用HAL里的中断回调函数

extern "C"
{
void TIM8_UP_TIM13_IRQHandler(void)
{if(__HAL_TIM_GET_IT_SOURCE(&htim13, TIM_IT_UPDATE) != RESET){__HAL_TIM_CLEAR_IT(&htim13, TIM_IT_UPDATE);++CPU_RunTime;}}
}

最后,不要忘记调用void ConfigureTimerForRunTimeStats()函数来完成RTOS调试功能的初始化

接下来就可以在调试时,愉快地使用集成的RTOS功能(就在变量旁边的栏里)

二、WSL工具链及一些工具的使用

        先说明一下为什么使用这个,主要是Windows下开发不如linux方便,在linux有很多工具可用,比如分析内存泄露的valgrind,还有仿真模拟用到QEMU等等。而Windows就很苦逼了,啥都没有。

1,配置WSL

配置过程网上有教程,可跟着配置(其实是过程有些复杂,而我又没有记录下来。后面如果有空就补上,见谅见谅)

先提供一些博客参考Clion使用:在windows下结合wsl进行linux开发_clion wsl linux 源码-CSDN博客

2,搭建WSL工具链

①下载工具链

首先要下载cmake,gdb之类的,参考下面这篇博客(很重要)【安装配置】安装适用于 Linux 的 Windows 子系统 WSL

然后到官网下载工具链,由于使用的是stm32f407,没有linux操作系统,所以选用的是none类型,即裸机类型

  • arm-gnu-toolchain-13.2.rel1-x86_64-arm-none-eabi.tar.xz

 下载完成后直接把这个压缩包拖到目录/usr下

然后在WSL命令行里输入下面指令解压,这个位置自己看着移动,我这里为了方便就放在这了

tar -xvf arm-gnu-toolchain-13.2.rel1-x86_64-arm-none-eabi.tar.xz

②添加进环境变量中

图省事,我把解压后的文件夹直接改为了arm-gnu-toolchain

此时输入下面命令,把这个工具链添加进环境变量中

vim /etc/profile

 按ivim界面最下面一行输入下面语句,然后按Esc键,输入:wq保存退出

export PATH=$PATH:/usr/arm-gnu-none/bin

输入下面指令,让配置文件生效

source /etc/profile

③配置工具链

打开CLion并进入设置,找到下面C和C++编译器所在的位置。如果报错没有找到指定编译器,那么可能需要重启。

④改变配置文件

只要把下面工具链换了就行了,gdb先不管它(比较好解决)

⑤修改CMakeLists文件

#下面代码是MinGW工具链下的
#specify cross-compilers and tools
set(CMAKE_C_COMPILER arm-none-eabi-gcc)
set(CMAKE_CXX_COMPILER arm-none-eabi-g++)
set(CMAKE_ASM_COMPILER  arm-none-eabi-gcc)
set(CMAKE_AR arm-none-eabi-ar)
set(CMAKE_OBJCOPY arm-none-eabi-objcopy)
set(CMAKE_OBJDUMP arm-none-eabi-objdump)
set(SIZE arm-none-eabi-size)

 将上面这段配置改为下面这个,不然会报错找不到指定编译器,因为你是在Windows下运行CLion的,那么它会根据Windows下的环境变量去找而非WSL里的

#下面配置是WSL工具链下的
set(toolsPath /usr/arm-gnu-toolchain/bin)
set(CMAKE_C_COMPILER ${toolsPath}/arm-none-eabi-gcc)
set(CMAKE_CXX_COMPILER ${toolsPath}/arm-none-eabi-g++)
set(CMAKE_ASM_COMPILER ${toolsPath}/arm-none-eabi-gcc)
set(CMAKE_AR  ${toolsPath}/arm-none-eabi-ar)
set(CMAKE_OBJCOPY  ${toolsPath}/arm-none-eabi-objcopy)
set(CMAKE_OBJDUMP  ${toolsPath}/arm-none-eabi-objdump)#下面代码是MinGW工具链下的,先注释掉
# specify cross-compilers and tools
#set(CMAKE_C_COMPILER arm-none-eabi-gcc)
#set(CMAKE_CXX_COMPILER arm-none-eabi-g++)
#set(CMAKE_ASM_COMPILER  arm-none-eabi-gcc)
#set(CMAKE_AR arm-none-eabi-ar)
#set(CMAKE_OBJCOPY arm-none-eabi-objcopy)
#set(CMAKE_OBJDUMP arm-none-eabi-objdump)
#set(SIZE arm-none-eabi-size)

⑥构建

先CMake一下,然后构建,就会有跟之前一样的提示,只不过速度慢了很多很多

 

3,Valgrind(不可用)

        后来才知道,它是被设计成非嵌入式的,即它直接工作于可执行文件上,因此在检查前不需要重新编译、连接和修改你的程序。也就是说如果你感兴趣的话,倒可以试试,只不过得使用CMake程序而非OpenOCD。

        有空我会去试一试QEMU并在文章后面更新,这里先起个头

先在WSL里或CLion的终端里使用下面命令更新一下包,如果你初次进来的话

apt update

然后下载valgrind

apt-get install valgrind

再然后在CLion里设置里浏览它的路径,或者填入路径

\\wsl.localhost\Ubuntu-24.04\usr\bin\valgrind

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

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

相关文章

D-MAX纠偏软件Fife MAX Terminal软件MAX-Oi软件

D-MAX纠偏软件Fife MAX Terminal软件MAX-Oi软件

无理数的本质:一维无法理解更高维

无理数是那些不能表示为两个整数的比的数,其小数部分是无限不循环的,常见的无理数有 π、√2 等。 如果从更本质一点的角度来理解,无理数的出现是因为一维无法完全理解更高维。更高维的“长度”映射到一维,可能出现映射不完全的情…

python r, b, u, f 前缀详解

1、r前缀 一般来说,\n’是一个换行符,是一个字符串;而加上r为前缀后,不会以任何特殊方式处理反斜杠。因此,r"\n" 是包含 ‘\’ 和 ‘n’ 的双字符字符串;示例如下: >>> pr…

SpringBoot的自动配置核心原理及拓展点

Spring Boot 的核心原理几个关键点 约定优于配置: Spring Boot 遵循约定优于配置的理念,通过预定义的约定,大大简化了 Spring 应用程序的配置和部署。例如,它自动配置了许多常见的开发任务(如数据库连接、Web 服务器配…

8080时序驱动TFT显示屏 驱动IC GC9307

8080时序总共有控制线 CS片选线 DC(命令数据控制线) RD读控制线 WR写控制线 和N条数据线。 控制底层代码如下; 写读代码,读的代码反过来就行 inline void TFT8080WriteDat(unsigned char dat) {CS_L;//开始片选DC_H;//写数据 // RD_H;//禁止读WR_H;//禁止写WR_L;//写入…

低空经济腾飞:无人机空域申请流程及策略

一、引言 随着低空经济的快速发展,无人机已广泛应用于各个领域,包括航拍、物流、农业、科研等。为了保障飞行安全、维护空中交通秩序,各国纷纷出台了无人机飞行管理规定。本文将详细介绍无人机空域申请的流程及策略,帮助无人机运…

通过Python脚本实现字符画

效果 讲解: 用于将3D视图的帧缓冲区转换为字符画,并将字符画输出到文本编辑器中。 首先,获取当前绑定的帧缓冲区、视口信息和视图像素。 然后,将像素矩阵转化为字符串,并将字符串写入到文本编辑器中。 设置文本编辑…

bmob Harmony快速开发手机号一键登录功能

最近用Bmob的鸿蒙SDK尝试了Harmony开发,做了一个几乎每个应用都会有的功能:手机号码短信验证码一键注册登录的功能,感觉简直爽的不要不要的,ArkUI可见即可得的UI交互设计体验,配合Bmob后端云一如既往简单易用的风格&am…

使用Perplexity打造产品的27种方式

ChatGPT和Perplexity等聊天机器人正迅速成为产品经理的首选助手。以下是一份全面的指南,介绍PM如何在日常工作中使用Perplexity,该指南基于300多份回复和30次电话后的总结。 理解并制定增长战略:例如,解释增长会计的基本原理&…

【Vue】——组件之间数据的传递

💻博主现有专栏: C51单片机(STC89C516),c语言,c,离散数学,算法设计与分析,数据结构,Python,Java基础,MySQL,linux&#xf…

MySQL触发器教程(02):创建删除后触发器

文章目录 介绍语法使用场景示例创建students表创建scores表创建删除触发器 结论 介绍 MySQL 触发器是一种数据库对象,可以在特定的数据库表上自动执行一系列的操作,例如插入、更新或删除数据,当特定的事件(例如数据的插入、更新或…

ES6面试题——var,let,const的区别

它们都是用来声明变量的。 1. var具有变量提升机制&#xff0c;let和const没有 /* var有变量提升机制 */ <script> console.log(str); // 打印出undefined var str "你好"; </script>/* let没有变量提升机制 */ <script> console.log(str); // …

【proteus经典实战】16X192点阵程序

一、简介 6X192点阵程序通常用于表示高分辨率图像或文字&#xff0c;其中16X表示像素阵列的宽度&#xff0c;192表示每个像素阵列中的点阵数&#xff0c;16X192点阵程序需要一定的编程知识和技能才能编写和调试&#xff0c;同时还需要考虑硬件设备的兼容性和性能等因素。 初始…

知识不成体系?这篇Mysql数据库将成为你的解忧杂货店!(子查询)

欢迎来到一夜看尽长安花 博客&#xff0c;您的点赞和收藏是我持续发文的动力 对于文章中出现的任何错误请大家批评指出&#xff0c;一定及时修改。有任何想要讨论的问题可联系我&#xff1a;3329759426qq.com 。发布文章的风格因专栏而异&#xff0c;均自成体系&#xff0c;不足…

网线直连电脑可以上网,网线连tplink路由器上不了网

家里wifi网络连不上好几天了&#xff0c;用网线直连电脑可以上网&#xff0c;但网线连tplink路由器wan口上不了网&#xff0c;无Internet连接&#xff0c;网线连lan口可以电脑上网&#xff0c;手机上不了。 后来发现网线的主路由用的192.168.0.1&#xff0c;我的路由器wan口自…

R包的4种安装方式及常见问题解决方法

R包的4种安装方式及常见问题解决方法 R包的四种安装方式1. install.packages()2. 从Bioconductor安装3. 从本地源码安装4. 从github安装 常见问题的解决1. 版本问题2. 网络/镜像问题3.缺少Rtools R包的四种安装方式 1. install.packages() 对于R自带的包的安装一般都可以通过…

共模和差模的基本概念

电压电流在导体或导线中传播时&#xff0c;存在两种工作形态&#xff1a;共模和差模。电子设备的信号线在进行相互通信时&#xff0c;至少会存在两根导线以形成电传输回路&#xff0c;除此之外&#xff0c;通常还存在第三个导体&#xff0c;即“参考地”。当信号正常传输时&…

51单片机第18步_将TIM0用作13位定时器

本章重点学习将TIM0用作13位定时器。 #include <REG51.h> //包含头文件REG51.h,使能51内部寄存器; //定时器的方式控制寄存器TMOD: GATE1,C/T1,M1_1,M1_0,GATE0,C/T0,M0_1,M0_0 //GATE11,表示T1是受INT1脚(P3.3)控制运行; //C/T10,表示T1的时钟源为fosc/12;C/T11,表示…

c++类成员指针用法

1&#xff09;C入门级小知识&#xff0c;分享给将要学习或者正在学习C开发的同学。 2&#xff09;内容属于原创&#xff0c;若转载&#xff0c;请说明出处。 3&#xff09;提供相关问题有偿答疑和支持。 c中新增类成员指针操作&#xff0c;为了访问方便&#xff0c;他是指…

Meven

目录 1.简介2.Maven项目目录结构2.1 约定目录结构的意义2.2 约定大于配置 3. POM.XML介绍3.2 依赖引用3.3 属性管理 4 Maven生命周期4.1 经常遇到的生命周期4.1 全部生命周期 5.依赖范围&#xff08;Scope&#xff09;6. 依赖传递6.1 依赖冲突6.2 解决依赖冲突6.2.1 最近依赖者…