【嵌入式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,现为15000Hz
    htim13.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_DebugMode
    else   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博客

用于WSL下的复制粘贴

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.mfbz.cn/a/770385.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

汇凯金业:数字货币对经济的影响有哪些

随着信息技术的飞速发展,数字货币作为一种新兴的货币形态,正逐步走进人们的视野,并对传统经济体系产生着深远影响。它不仅革新了交易方式,更在重塑金融格局、赋能经济发展等方面展现出巨大潜力。 一、交易效率的“加速器” 数字…

亚马逊跟卖选品erp采集,跟卖卖家的选品利器,提升选品效率!

今天给亚马逊跟卖卖家,分享我现在在用的两种选品方式,做个铺货或者是跟卖都可以,是不是很多卖家选品现在都是亚马逊前端页面或是新品榜单选择产品跟卖,这样找品这就相当于大海捞针,而且新品榜单的产品你能看到那其他卖…

RS232、RS485与RS422初步学习

目录 电平 传输方式 共模和差模干扰 ps:双绞线 485总线结构 ps:终端电阻 RS232接口(DB9) 优缺点 RS232优缺点 RS485较RS232的优点 为什么RS232还在使用? 电平 RS232、RS485与RS422的电平 区间逻辑备注RS232…

【技巧】ArcgisPro 字段计算器内置函数方法的调用

在arcgisPro中,内置了常用的几种函数方法,如顺序编号,重分类等;调用方法如下:

python-计算矩阵边缘元素之和(赛氪OJ)

[题目描述] 输入一个整数矩阵&#xff0c;计算位于矩阵边缘的元素之和。 所谓矩阵边缘的元素&#xff0c;就是第一行和最后一行的元素以及第一列和最后一列的元素。输入&#xff1a; 输入共 m 1 行。 第一行包含两个整数 m, n (1 < m,n < 100) &#xff0c;分别为矩阵的…

如何学习大型语言模型中的量化

前言 图片来自作者&#xff1a;Flow 展示了量化的必要性。&#xff08;笑脸和生气脸图片来自Yan Krukau) 在我解释上面的图表之前&#xff0c;让我先介绍一下您将在本文中学习的重点内容。 首先&#xff0c;您将了解量化是什么以及为什么量化。接下来&#xff0c;您将深入了解…

万亿赛道上的新星:向量数据库如何成为AI大模型的超级引擎

万亿赛道上的新星:向量数据库如何成为AI大模型的超级引擎? 在这个人工智能飞速发展的时代,向量数据库正以其独特的能力,成为AI大模型技术底座的超级引擎。从开源社区的繁荣到云计算的广泛应用,向量数据库的每一步发展都显得尤为重要。 一、初创引领,巨头跟进:向量数…

VBA 操作注册表

1. SaveSetting 1-1. 语法 SaveSetting(AppName As String, Section As String, Key As String, Setting As String) 1-2. 函数说明 在Windows注册表中创建或保存一个应用程序项。将值写入注册表中的HKEY_CURRENT_USER\Software\VBand VBA Program Settings键的子键 1-3. 参…

无人机云台类型及作用

无人机云台主要分为三种类型&#xff1a; 单轴云台&#xff1a;仅支持单向旋转&#xff0c;适合拍摄平滑的延时摄影和全景照片。 双轴云台&#xff1a;支持水平和垂直旋转&#xff0c;可用于拍摄流畅的视频和运动物体。 三轴云台&#xff1a;全面支持所有旋转轴&#xff0c;…

Centos系统迁移

目前&#xff0c;CentOS 全系列版本已经于l六月底正式停止维护&#xff0c;这意味着 CentOS 时代彻底终结&#xff0c;也意味着部署在 CentOS 7 上的业务系统将面临前所未有的安全挑战。 本文推荐由红帽衍生出来的且可以做到真正无缝替代的linux版本Open Euler 注&#xff1a…

鸿蒙应用实践:利用扣子API开发起床文案生成器

前言 扣子是一个新一代 AI 应用开发平台&#xff0c;无需编程基础即可快速搭建基于大模型的 Bot&#xff0c;并发布到各个渠道。平台优势包括无限拓展的能力集&#xff08;内置和自定义插件&#xff09;、丰富的数据源&#xff08;支持多种数据格式和上传方式&#xff09;、持…

JAVA小知识31:多线程篇2

一、等待唤醒机制 生产者和消费者&#xff0c;也叫等待唤醒机制。他是一个十分经典的多线程协作的模式。我们来讲一个小故事&#xff1a; 在一个繁忙的工厂里&#xff0c;有一个生产线&#xff0c;我们称之为“共享资源”。这个生产线一次只能生产一个产品&#xff0c;而且需要…

等保2.0 实施方案

一、引言 随着信息技术的广泛应用&#xff0c;网络安全问题日益突出&#xff0c;为确保信息系统安全、稳定、可靠运行&#xff0c;保障国家安全、公共利益和个人信息安全&#xff0c;根据《网络安全法》及《信息安全技术 网络安全等级保护基本要求》&#xff08;等保2.0&#x…

SQL Server和Oracle数据库的实时同步

数据同步在大数据应用中扮演着关键角色&#xff0c;它确保了数据的实时性和一致性&#xff0c;为数据分析和决策提供了重要支持。常见的数据同步方式包括ETL实时同步和实时ETL工具&#xff0c;后者可以基于日志追踪或触发器进行分类。不同的数据库系统针对实时同步也有各自的实…

打破数据生产力的桎梏,打造数据分析驱动的新型组织

在当前的经济环境下&#xff0c;各行业面临着前所未有的挑战&#xff0c;降本增效成为企业普遍追求的目标。数字化转型被视为实现这一目标的关键路径。通过数字化手段&#xff0c;企业能够探索新的增长机会&#xff0c;提升运营效率&#xff0c;并有效控制成本支出。在这一转型…

电影解说 剪辑实战带货全新蓝海市场,电影解说实战课程(16节)

课程目录 1-影视解说自媒体带货新玩法_1.mp4 2-影视解说选品及解说规范标准_1.mp4 3-电影解说的脚本模版及流程_1.mp4 4-电影解说编写文案及爆火规律_1.mp4 5-手把手教你影视素材哪里找_1.mp4 6-影视解说剪辑、配音及创收方式_1.mp4 7-电影解说剪辑的实操课程A_1.mp4 8…

Zabbix 配置SNMP监控

Zabbix SNMP监控介绍 Zabbix提供了强大的SNMP监控功能&#xff0c;可以用于监控网络设备、服务器和其他支持SNMP协议的设备。SNMP&#xff08;Simple Network Management Protocol&#xff0c;简单网络管理协议&#xff09;是一种广泛用于网络管理的协议。它用于监控网络设备&…

SRC通杀小技巧-巧用域名“横向移动“

文章目录 前言还是DevOps做个字典&#xff1f; 前言 周末闲暇时间无聊顺便挖挖洞,低危小子的我叒找到个低危&#xff0c;本想着一个低危实在是食之无味&#xff0c;弃之又可惜&#xff0c;打算将域名先存起来&#xff0c;等过段时间有活动一块交&#xff0c;就在复制域名的时候…

【人工智能】GPT-5的即将到来:从高中生进化到,,,博士生?

GPT-5的即将到来&#xff1a;从高中生进化到,博士生&#xff1f; 随着近月GPT-4o的出世&#xff0c;OpenAI也在进行一系列的采访和介绍接下来的展望和目标。 在6月22日的采访中&#xff0c;美国达特茅斯工程学院公布了OpenAI首席技术官米拉穆拉蒂的访谈内容。穆拉蒂确认&#…

嵌入式上gst rtsp server opencv mat

0 安装gstreamer sudo apt install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-…