【嵌入式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软件

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

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

通过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…

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

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

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

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

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

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

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

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

共模和差模的基本概念

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

c++类成员指针用法

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

Meven

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

鸿蒙项目实战-月木学途:1.编写首页,包括搜索栏、轮播图、宫格

效果展示 搜索栏制作 相关知识回顾 输入框组件TextInput 单行输入框类型.type(InputType.Normal)//基本输入框.type(InputType.Password)//密码.type(InputType.Email)//邮箱.type(InputType.Number)//数字.type(InputType.PhoneNumber)//电话号.type(InputType.Normal).type…

地图初始化-多视图几何基础

在ORB-SLAM2中初始化和使用的传感器类型有关,其中单目相机模式初始化相对复杂,需要运行一段时间才能成功初始化。而双目相机、 RGB-D相机模式下比较简单,一般从第一帧开始就可以完成初始化。 为什么不同传感器类型初始化差别这么大呢&#x…

spring-security安全框架(超精细版附带流程讲解图)

目录 一、回顾一下 二、security使用 2.1 覆盖掉默认配置「自定义配置」 2.2 如何自定义认证 2.3 纯纯自定义 2.4 jwt 2.5 官网认证流程 2.6 RBAC模型 4.1. 创建表结构 2.7 如何实现权限流程 一、回顾一下 security干啥的? 认证和授权 使用方式 引入依赖, 基于spri…

算法力扣刷题 二十五【28.找出字符串中第一个匹配项的下标】

前言 字符串篇,继续。 记录 二十五【28.找出字符串中第一个匹配项的下标】 一、题目阅读 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不…

C语言中的基础指针操作

在C语言中,指针是一个非常重要的概念,它提供了直接访问内存地址的能力。指针变量用于存储内存地址,而不是数据值,在某种意义上和门牌号具有相似含义:指针是一个变量,其存储的是另一个变量的内存地址&#x…

java之动态代理

1 代理模式 代理模式提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。简言之,代理模式就是设置一个中间代理来控制访问原目标…

网络io与select,poll,epoll

前言 网络 IO,会涉及到两个系统对象,一个是用户空间调用 IO 的进程或者线程,另一个是内核空间的内核系统,比如发生 IO 操作 read 时,它会经历两个阶段: 1. 等待数据准备就绪 2. 将数据从内核拷贝到进程或…