AMD架构探秘1——基本介绍
AMD架构简单读书笔记1前言 笔者打算简单的记录一下自己读AMD手册架构的书。笔者先前还记录了自己RISC-V手册的阅读笔记,RISC-V读书笔记-CSDN博客。感兴趣的朋友可以简单的翻阅一二。
AMD的所有技术文档都在Documentation for AMD Processors, Accelerators, and Graphics这里,感兴趣的朋友可以直接到这里找自己感兴趣的技术文档。
笔者阅读的文档:AMD64 Architecture Programmer’s Manual, Volumes 1-5。感兴趣的朋友可以自行下载。
关于AMD架构 好说不说,笔者现在正在工作的笔记本就是采用的AMD的架构。在2000年,伴随着软件工程的复杂度日益上升,我们对64位架构的需求呼之欲出,在2001年,AMD扩展了原先的32位架构,升级成了x86_64架构。换而言之,强大的兼容性保证了它可以迅速的占领市场。正如我们的手册的扉页所说的:
AMD64 架构是简单但功能强大的 64 位、向后兼容的行业标准(传统)x86 架构的扩展。它增加了 64 位寻址 ...
快速入门C++并发编程
高阶开发基础——快速入门C++并发编程1前言 这个部分是高阶开发的第一个基础部分,也就是并发编程。笔者需要激进的假设各位已经掌握了基本的C++语法。学习过经典的计算机四件套中的计算机组成原理,操作系统。对并发已经有了最初步的认识。这里,笔者打算做一个偏向于总结性质的博客笔记。来在后续学习更加高阶的开发的时候理解并掌握并发和异步的知识。
并发与线程 笔者先前开过一些线程部分的博客,但是遗憾的是都烂尾了。
传送门:
https://blog.csdn.net/charlie114514191/article/details/138192417
https://blog.csdn.net/charlie114514191/article/details/138243670
可以先看这两篇笔者早期的博客进行梳理,但是并不全面。主要是铺垫一下对std::thread的理解。
简单谈到并发就是——发挥机器多核的性能,让同一时间计算机做多个事情。换而言之,就跟我现在左手拿着杯子喝水,右手正在敲键盘,眼睛正在看着我的Typora编辑文档一样。这三个事情我都是在同 ...
从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架
从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架前言 笔者前段时间花费了一周,整理了一下自从TM1637开始打算的,使用OLED来搭建一个通用的显示库的一个工程。笔者的OLED库已经开源到Github上了,地址在:MCU_Libs/OLED at main · Charliechen114514/MCU_Libs (github.com)
框架目前的最终目的,是设计一个丝滑的带有动画和图标的动态多级菜单。笔者会尽可能详细的介绍自己的设计思路,供大家参考。
环境介绍 首先,笔者惯用的是PlatformIO作为嵌入式开发的IDE,CubeMx作为方便的代码生成器辅助笔者进行快速的工作。各位可能更多使用的是CubeIDE或者是MDK5,关于这个,笔者会尽可能详细的阐述一些可能异于平台操作的操作。这里需要各位自行动手做更改!
代码与动机 关于江科大的OLED代码和以KeysKing作为代码的优秀的嵌入式工程师的代码,笔者早就有所拜读,这些代码更多的是出于一种“可用的”而不是可复用的,代码风格上,笔者更青睐于KeysKing大佬的代码风格。但是笔者在 ...
关于使用GDB调试远程下位机开发板的应用层程序办法 + VSCode更好的界面调试体验提升
嵌入式Linux应用层开发——调试专篇(关于使用GDB调试远程下位机开发板的应用层程序办法 + VSCode更好的界面调试体验提升)环境预备——调试 虽说有正点原子的代码带着,但是,如果我们只是打着printf这种方式进行手动的检查代码错误,还是不太方便的,笔者这里整理了两个上位机调试路线。
路线1:使用GCC7.5,这个路线比较保守,适合对GCC, GDB等比较陌生的萌新使用,关于这个的安装,请参考笔者之前的博客进行学习安装。
路线2:使用GCC13.2,这个路线比较激进,目前笔者使用的板子上是不支持跑GCC13.2编译器编译的,笔者目前的解决方案是直接将板子上的libc.so.6拷贝下来放到我们的工程目录下,后面编译的时候使用。
路线3:直接把板子大刷新刷一个新系统用新的glibc,但是笔者认为那属于大炮打蚊子。
环境预备 笔者注意到很多博客都在用arm-linux-noneabihf-gdb来进行调试,笔者认为其实没有必要。现代的跨平台gdb调试方案是gdb-multiarch
sudo apt install gdb-multiarch
现在我们使 ...
WSL2下使用miniconda+cuda+cudnn方案进行机器/深度学习环境配置方案
WSL2下使用miniconda + cuda + cudnn方案进行机器/深度学习环境配置方案前言 笔者这几天需要使用Google的mediapipe框架进行自定义的数据训练,值得注意到的是Google家的这个方便的自定义训练只支持在Linux下完成。具体原因可以参考到
tty — Terminal control functions — Python 3.13.0 documentation
也即是google.colab库需要的环境就是Unix系的OS。。。所以没办法(耸肩),只好在WSL上完成mediapipe应用框架的搭建,刚好笔者准备尝鲜。
方案简单前置
笔者认为您的电脑已经安装好了WSL2且使用的是默认的发行版(Ubuntu)
➜ wsl --list
适用于 Linux 的 Windows 子系统分发:
Ubuntu-24.04 (默认)
您可以参考任何一篇安装WSL2的教程,笔者认为官方的最为权威:
https://learn.microsoft.com/zh-cn/windows/wsl/install
笔者认为您的电脑上有可以使用的G ...
STM32单片机之分析启动文件小论(II)
写在前面 请各位看官看本篇笔记的时候首先了解一下计算机体系架构,了解基本的arm汇编后再来阅读此教程。当然不必深入,了解即可。
对于一些弱符号含义,笔者已经放到Help当中,请酌情参考(笔者不是特别熟悉ARM汇编)!
速通:做了什么: 这个是ST公司在startup_stm32f103xe.s文件的开头所写。
初始化堆栈指针 SP = _initial_sp
初始化程序计数器指针 PC = Reset_Handler
设置堆和栈的大小
初始化中断向量表
配置外部SRAM 作为数据存储器(可选)
配置系统时钟,通过调用SystemInit 函数(可选)
调用 C 库中的 _main 函数初始化用户堆栈,最终调用 main 函数
分析I:分析2011年的startup文件所作 老一部分的分析,笔者这里推介的是自己写的:
STM32启动流程简述_defined(stm32f103xe)-CSDN博客
现在看看有点太随意了,重新阐述一下:
; Amount of memory (in bytes) allocated for S ...
STM32单片机之分析启动文件小论(I)
STM32单片机之分析启动文件小论(I)上电时我们的STM32一经上电,他会跟CPU上电的行为一致,也就是跳转到一个固定的地址。我们的STM32也是一样,对于不同的boot选择,他会跳转到不同的地址。这就跟启动模式的三种方式很有关系:
BOOT0
BOOT1
启动模式
0x00000000的映射地址
0x00000004的映射地址
0
x
内部FLASH
0x08000000
0x08000004
1
1
内部SRAM
0x20000000
0x20000004
1
0
系统存储器
0x1FFFF000
0x1FFFF004
也就是说,选择不同的boot引脚本质上就是在选择不一样的跳转地址,无论如何,我们要做的,就是在选定我们的特定的跳转地址后,在这些地址上排列我们之后的指令。
启动文件分析这一场串的文件很大,也是一份arm汇编文件,为此,为了理解这份文件,我们来看看一些简单的汇编标识符:
指令名称
作用
EQU
相当于#define给常量取名称
AREA
汇编一段全新的段
ALIGN
编译器对指令或者数据的存放地址进行对齐。一般 ...
杂谈笔记:一个debug记录之错误的ld interpreter
杂谈笔记:一个debug记录之错误的ld interpreter前因 笔者前段时间帮忙测试一位同学的校园网驱动程序的时候出现了一个非常有趣的问题:那就是这个文件被进程加载的时候出现了:
can not execuate the file, the request file is missing
的有趣错误。笔者检查了一下file命令的输出,大致格式如下:
demo: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=8233200d91ce5b352b50c14288246e5296c1749f, for GNU/Linux 3.2.0, with debug_info, not stripped
当然,这不是那份程序的输出。不过我们也是从这里的输出定位到了问题。常见的原因是ELF位数格式不匹配的问题。笔者这 ...
如何在Linux上构建Raspberry Pi虚拟环境
如何在Linux上构建Raspberry Pi虚拟环境 下面我们来讲讲如何使用QEMU来仿照树莓派环境。这里首先先分成两大类。第一类是跑比较老的,安全性较低的老树莓派,主要指代的是22年4月份发布之前的版本,这个版本当中,树莓派镜像自己内部就配置了一份默认的账户密码。对于之后的版本则不配备这种默认的账号密码。因此,我们需要区分出两种装载模式。
为了省力,我们使用人家已经配置好了的
github仓库:qemu-rpi-kernel
前置环境需求yay -S qemu-system-arm
Older Version 考虑旧的树莓派镜像,安装的方式如下
克隆仓库qemu-rpi-kernel到一个位置,取出里头的:
kernel-qemu-5.4.51-buster
versatile-pb-buster-5.4.51.dtb
这两个文件到一个自己创建的目录文件夹下。我的是oldone
下载旧树莓派镜像
https://downloads.raspberrypi.org/raspios_lite_armhf/imag ...
如何在Windows上编译可用的Tesseract OCR in C++ 并部署在Visual Studio与Qt6上
如何在Windows上编译可用的Tesseract OCR in C++ 并部署在Visual Studio与Qt6上前言 本教程是一个截止至2024年7月11日最新的,旨在编译可以运行在x86_64结构上的,其操作系统是Windows11的机器上的,谷歌著名的光学识别库Tessereact OCR。本篇教程将会编译产生:
使用msys环境下的,使用mingw64编译器编译的Tessereact OCR动态库
使用基于vcpkg的,于msvc19编译器编译的Tessereact OCR动态库
文章的最后将会放上Github仓库与自己写的极简的包装器(问就是手动释放折磨人,智能指针万岁!)
阅前提示 出于一些大家都知道的原因,使用一台没有VPN代理软件的机器编译来自国外的优秀软件是一件相当折磨人的事情,所以如果您想要按照本篇教程进行编译,请先:
机器上有足够的内存,硬存条件
有一个可用的代理软件,或者,您的网络可以流畅的使用git下载软件,或者是在vcpkg运行时补齐相关的依赖
导言
Tesseract 项目地址:tesseract-ocr/tess ...