STM32开发环境配置记录——关于PlatformIO + VSCode + CubeMX的集成环境配置
STM32开发环境配置记录——关于PlatformIO + VSCode + CubeMX的集成环境配置前言 为什么配置这样的一个环境呢?鄙人受够了Keil5那个简陋的工作环境了,实在是用不下去,调试上很容易跟CubeMX的代码产生不协调导致调试——发布代码不一致造成的一系列问题。CubeIDE虽说不错,但是它的代码辅助功能和构建系统实在不敢恭维,经常出现Makefile未同步导致符号定义冲突,亦或者是埋下了潜在的程序bug。
也有人尝试使用Keil Assistance + VSCode + Keil分工写代码与烧录,这听起来不错,但是调试并不方便,常常要来回奔波,实在是有些麻烦。这里我们尝试新兴的PlatformIO来辅助我们进行嵌入式的开发。
介绍PlatformIO
Your Gateway to Embedded Software Development Excellence — PlatformIO latest documentation
Platform是基于VScode文本编辑器,使用了vscode强大的扩展extension功能,使得开 ...
QEMU + Vscode + Arm Arch‘s Linux调试小记
QEMU + Vscode + Arm Arch‘s Linux调试小记前几天看到了一篇讲授如何调试ARM Linux内核的文章,这里现在记录一下调试ARM Linux内核的办法
下载QEMU对于Arch Linux用户而言,没有必要自己编译,直接上AUR源下载就行。我自己有打算研究和调试多个架构,所以我自己下载了:
yay -S qemu-full
关于什么是QEMU:QEMU - ArchWiki
AUR源:Arch Linux - qemu-full 9.0.1-1 (x86_64)
如果只是想要调试ARM64位linux,需要下载的是aarch版本的。
下载完成之后,可以看看自己是否可以正常启动:
qemu-system-aarch64 --version
QEMU emulator version 9.0.1
Copyright (c) 2003-2024 Fabrice Bellard and the QEMU Project developers
下载aarch64-gccyay -S aarch64-linux-gnu-gcc
aarch64-linux-gnu-gc ...
Linux Coding:小写一个debugfs
Linux Coding:小写一个debugfs上一次整活还是在上一个月,写了一个简单的module并且熟悉了module的挂载查看和卸载。这一次我们自然玩一个大的,就是利用linux的debugfs API写一个调试文件系统。
事实上,底层的API全写好了,我们就是简单的调调API就成的事情!
事先检查第一步是检查我们当前的内核是否支持debugfs调试:
zcat /proc/config.gz | grep DEBUG_FS
# CONFIG_XEN_DEBUG_FS is not set
CONFIG_BLK_DEBUG_FS=y
CONFIG_BLK_DEBUG_FS_ZONED=y
# CONFIG_SCSI_SNIC_DEBUG_FS is not set
# CONFIG_SCSI_LPFC_DEBUG_FS is not set
# CONFIG_USB_GADGET_DEBUG_FS is not set
# CONFIG_OCFS2_DEBUG_FS is not set
CONFIG_DEBUG_FS=y
CON ...
关于如何在Arch Linux上编写自己的第一个module
关于如何在Arch Linux上编写自己的第一个module 前一段时间一直想深入学习编写一个module插入到自己的内核当中,但是网上的资料基本上全都针对的Ubuntu和Debian等流行的Linux发行版,这里打算简单的记录一波博客。
啥是Module?(着急可不看) 众所周知:现代宏内核架构的操作系统都会借鉴微内核当中比较有价值的设计思想,这里的modules正是“模块”的意思,模块模块,可载可拆。他的加载和卸载是动态的,我们并不需要重新编译内核,只需要使用insmod和rmmod指令,就可以加载或者卸载自己的module。
模块的文件后缀是.ko文件,也是我们编程到最后生成的目标文件,挂载与卸载的就是.ko文件。(熟悉Linux内核编程的同志可以一眼认出这是kernel object的缩写)
正题:如何编写自己的kernel module 模块的编写方式同一般的写法有些区别,作为对比,我们给出一个例子:
// 我们编写基础的模块需要这三位兄第
#include <linux/module.h>
#include <linux ...
深入研究Qt Meta - Object System
深入研究Qt Meta - Object System这篇文章我打算研究一下QMetaObject System,也就是Qt自己构建起来的元对象系统。
先说RTTI啥是RTTI?这是C++编程里的一个常见术语,全称是:运行阶段类型识别(Runtime Type Identification),关于RTTI如何在原生C++中使用不是我们这里的重点,但是可以明确的一点是——跟编译器实现密切相关,意味着可移植性略差。很多类库已经为其类对象提供了实现这种功能的方式,但由于C++内部并不支持,因此各个厂商的机制通常互不兼容
即使编译器支持RTTI,就目前而言,原生的支持仍然十分的不足。我们没有办法完全知道例如类的名字、有哪些父类、有哪些成员变量、有哪些成员函数、哪些是public的、哪些是private的、哪些是protected的等等。
有时候一个工程项目可能包含成千上万个类,完整的保存这些信息将会消耗大量的内存资源。为了节省内存,C++标准约定typeid只能返回类名。因此,仅靠dynamic_cast和typeid两个关键字提供的类型信息实在有限。更何况,他还会造成大量的系统开销,这也是为 ...
How My Arch Linux StartUp
How Linux Works I - How Linux Start Up
写在前面:上一个专栏中我写完了内核源码层面看Linux,我们把抽象层拉高一点,看看Linux是如何工作的!
Linux如何启动?
BIOS(Basic Input Output System)或者启动固件加载并运行引导装载程序(告知OS在哪里)
引导装载程序在磁盘上找到内核的位置,载入RAM中启动
初始化设备与驱动程序
挂载root文件系统
内核使用swapper进程(0号进程,PID = 1)来允许一个init进程,从这里开始,我们的程序将会被下放到用户态
init继续启动其他进程
最后的尾声就是启动一个登陆进程!是的,就是那个让你输入用户密码的那个界面就是登录进程完成的
启动信息 Linux内核启动信息去这里看:
sudo dmesg > demo.txt
这条指令可以将输出的信息发送到demo.txt文件当中,或者你想要在控制台上看
sudo dmesg | less
将会调度less程序使得日志分页。一些启动日志将会保存在/var/log/下面,不同的发行版 ...
虚拟机Arch Linux With KDE6(x11)安装小记
虚拟机Arch Linux With KDE6(x11)安装小记写在前言 此篇博客记载了笔者安装ArchLinux的基础步骤和安装教程,供各位看官参考和评判。
环境:Windows11下的VMWare虚拟机安装2024年3月初发行的Linux 6.8.1Kernel,安装的固件类型是UEFI安装而不是BIOS安装
配置导向:
分区简单:UEFI分区(300M) + Swap(4G) + FileSystem(Btrfs)(75.6G)
BaseI. 开始 在安装结束VMWare虚拟机之后,诸位如果想要下载Arch Linux ISO,可以前往:
Arch Linux - Downloads
下的中国源:
aliyun.com
…
进行下载
下载结束之后,记住自己存放的ISO的位置,随后打开VMWare WorkStation,走过一次典型的虚拟机安装教程。这里给出笔者的配置:
值得注意的是,请务必保证自己的内存不要小于1GB,否则Arch Linux Installer将会无法装进内存导致无法安装!
请设置 ...
Opencv490+MSVC_Mingw+WITHQT+OpencvContrib4_x编译教程
OpenCV4.9.0 + 扩展 + WITH_QT(Qt6)模块编译教程(Windows) 本篇教程是Opencv4.9.0 和 扩展Opencv Contrib4.x以及带上了WITH_QT选项的CMake编译环境配置和编译教程。注意到环境是Window11(10应该仍可以使用)。本篇教程将会导出Mingw版本的,和MSVC19版本的Debug和Release四套Opencv库的编译教程。各位读者可以根据自己的需求进行编译,或者是在本文最后的部分前往本人开设的Github仓库处下载已经编译好的资源和库直接进行使用。
前置的能力要求与说明
本教程要求自己至少会翻墙,不会翻墙的话就不建议费心自己编译了,文章的最后有仓库直接嫖,当然如果是的确需要存在自己的编译需求的话,可以查询如何瞒过CMake的下载步骤(也就是贴MD5码瞒天过海),替换自己的下载的资源从而使得CMake正确的生成MakeFile。
以及本教程需要提示您:本教程不生成opencvWorld这个巨无霸,因为他跟Contrib库的cvv可视化相互冲突,会存在依赖错配的问题导致大量的undefined referenc ...
Visual Studio编译静,动态链接库指南备忘
Visual Studio编译与使用静,动态链接库指南备忘 跟Microsoft的Visual Studio接触了这么久,第一次打算写点备忘在这里,这篇博客是记录在VS下如何编译与使用静,动态链接库的指南。
最近,我封装了基于Opencv的基础图像操作,打算让Tesseract提高准确识别从而对Opencv进行简单的套壳封装。方便起见,我打算采用低耦合的动态链接库的方式处理。
首先,这是我的工程文件下的含有目录:
我的目标是
只使得ImgProcessor这个类在动态库中是可见的,其他的符号并不可见(换而言之,无法直接使用,只可通过本人设计的Impl隔离层访问),我应该怎么做呢?
首先,给欲导出符号上buff: __dllexport 这招只适合在MSVC编译器底下玩,为了通用性,还需要判定这是否为MSVC编译器
#ifdef _MSV_VER
是一个微软预定义的宏,如果追求极强的通用性,用它来操作!这里我只是在玩自己的toys,没有必要给自己上难度(跑。
#define CC ...
操作系统还原真相(超长记录版)
操作系统学习记录1. 导论硬件输入输出 分为两类,串行和并行,所以,我们相应的接口就是串行接口和并行接口。串行接口跟CPU通信,反过来,CPU通过串行接口跟串行设备进行数据传输。并行接口工作原理如法炮制。
访问外部硬件的方式有两种:
把外设的内存映射到一定的地址内存中去,比如说显卡
通过IO接口访问
啥是应用程序 我们把应用软件和操作系统解构,本质上就是一串命令和数据。我们使用编译器来讲代码翻译成机器语言。加上操作系统的一些现成的配合。程序才可以很快的运行。
用户态和内核态
内核态(Kernel Mode):运行操作系统程序,操作硬件
用户态(User Mode):运行用户程序
一般而言,用户态需要陷入到内核态发生在下面三种情形:
请求系统调用
这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作。比如前例中fork()实际上就是执行了一个创建新进程的系统调用。系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的in ...