- 博客(43)
- 收藏
- 关注
原创 Verilog 实现 i2c 协议
应答,当 IIC 主机(不一定是发送端还是接受端)将 8 位数据或命令传出后,会将数据总线(SDA)释放,即设置为输入,然后等待从机应答(低电平 0 表示应答,1 表示非应答),此时的时钟仍然是主机提供的。在时钟(SCL)为高电平的时候,数据总线(SDA)由高到低的跳变为总线起始信号,在时钟(SCL)为高电平的时候,数据总线(SDA)由低到高的跳变为总线停止信号。在时钟(SCL)为高电平的时候,数据总线(SDA)必须保持稳定,所以数据总线(SDA)在时钟(SCL)为低电平的时候才能改变。
2024-05-16 10:35:09
1192
1
原创 AOSP 编译
最新的安卓构建系统是由 Google 开发的 Soong,,用于替代之前的Make构建系统。内存太小导致编译失败,这里通过删除原来的 swap 然后创建更大的 swap 来解决。
2024-01-13 11:17:06
588
原创 Rust 宏的使用
两种宏的实现方式宏的分析工具通过 macro_rules! 实现宏参数可重复性 任意次 一次或者多次 零次或者一次递归调用添加了更多的匹配规则第一个模式匹配规则是 ,表示没有传入任何参数时,返回值为0第二个模式匹配规则是 ,表示只传入一个表达式时,返回该表达式的值第三个模式匹配规则是 ,表示传入多个表达式时,将第一个表达式与剩余的表达式进行相加操作过程宏格式为如下: 定义过程宏的函数将 TokenStream 作为输入 并产生 TokenStream 作为输出分为三类函数式宏
2024-01-12 15:26:32
1134
原创 基于 Docker 搭建交叉编译环境
本文主要介绍如何使用 Docker 搭建交叉编译环境more关于 docker 交叉编译环境,已经有人做成开源了。我们只需使用即可搞了半天发现不支持直接安装 arm64 的包, 麻烦的地方不在于交叉编译一个简单的hllo world 而是编译需要依赖各种 qt, opencv, ssl 等库,手动编译这些库比较麻烦。而这个 docker 环境也只是简单地安装了一下交叉编译器,既然如此那我为何不直接使用 vm 虚拟机或 WSL 里交叉编译。
2024-01-04 09:13:13
3000
1
原创 设备树的解析 LibFDT
本文主要介绍 libfdt 以及使用 libfdt 来解析设备树libfdt 可通过安装,但是从内核的中直接提取也是可以直接使用的。因为libfdt不依赖任何 IO 相关的内容。
2024-01-04 09:09:22
2310
原创 设备树入门
设备树是一种树形数据结构,其节点描述系统中的设备。每个节点都有描述所表示设备的特征的属性/值对。每个节点只有一个父节点,但根节点除外,根节点没有父节点。符合 DTSpec 的设备树描述了系统中不一定能被客户端程序动态检测到的设备信息。例如,PCI 的体系结构使客户端能够探测和检测连接的设备,因此可能不需要描述 PCI 设备的设备树节点。但是,如果无法通过探测检测到,则需要一个设备节点来描述系统中的 PCI 主桥设备。
2024-01-04 09:06:57
1660
原创 基于 Makefile 的 FPGA 构建系统
构建 FPGA 时通常依赖 FPGA 提供商提供的开发环境和一系列工具,虽然每个厂商提供的集成开发环境不尽相同,但是基本原理都是给定 HDL 设计源文件, 仿真文件,以及约束文件,然后根据这些文件进行仿真或综合约束,最终输出可用于烧录的比特文件.bit。一般来说集成开发环境 (IDE) 都由前端 GUI 编辑器以及后端的代码编译器以及代码分析等各种命令行工具组成,FPGA 的集成开发环境也不例外。
2024-01-04 08:48:44
2676
3
原创 Rust 嵌入式开发
Rust 进行嵌入式开发:link.x 由 cortex-m-rt 提供, 不需要创建和设置, 这时只需设置 MEMORY 即可qemu 中似乎无法使用 FLASH?0x00000000 应该是一个内存区域, 模拟 flash如果硬写 stm32 的 flash 0x08000000 实际地址, qemu 运行会报错当要调试时可以添加-S -s到 Qemu,然后使用 VSCode + gdb 对生成的 elf 进行调试即可。
2023-12-18 12:58:01
519
原创 05 Rust 结构体
Rust 中的结构体(Struct)与元组(Tuple)都可以将若干个类型不一定相同的数据捆绑在一起形成整体,但结构体的每个成员和其本身都有一个名字,这样访问它成员的时候就不用记住下标了。结构体必须掌握字段值所有权,因为结构体失效的时候会释放所有字段。这就是为什么本章的案例中使用了 String 类型而不使用 &str 的原因。但这不意味着结构体中不能定义引用型字段,这需要通过"生命周期"机制来实现。元组常用于非定义的多值传递,而结构体用于规范常用的数据结构。结构体的每个成员叫做"字段"。
2023-12-17 11:32:10
342
原创 Rust 基础
是一种将多个值分组在一起的通用方法, 将多种类型合并为一个复合类型。元组有一个固定的长度:一次声明,他们不能增长或缩小的大小。Rust 中的变量默认是不可变的, 要定义可变化的变量, 需要添加 mut 显式说明。另一种拥有多个值的集合的方法是使用数组。不像元组,数组的每个元素必须具有相同的类型。标量类型表示单个值, Rust有四种主要的标量类型: 整数、浮点数、布尔值和字符。数组是一个已知的、固定大小的内存块,在栈上分配, 因此数组必须长度必须是固定的。在 C 是成立的, 但是 Rust 会认为。
2023-12-16 15:33:17
201
原创 快速搭建 linux 源码调试环境
本文主要介绍如何快速搭建 linux 源码调试环境moreMakefile直接执行 make debug然后配置 vscode。
2023-08-26 21:25:36
147
原创 ARM 出现 hardfault 如何利用栈回溯代码
基本原理是每次调用函数时,ARM cpu 都会将函数返回地址放入 LR 寄存器中,多层调用时,C 编译器会自动将 LR寄存器内容push到栈空间。这样一来,随着函数调用的不断深入,栈中保存着整个调用链的返回地址。我们假设数据是真的返回地址,那么其前面一条代码必然是 BL 或 BLX 指令,通过检查该地址出的前一条代码,我们就可筛选出真的返回地址,从而得到整个函数的调用链。我们通过获取出错时的栈地址,遍历栈空间,由于这些数据除了返回地址,还可能是局部变量,也可能是寄存器值。因此需要进一步筛选。
2023-08-08 18:42:46
503
原创 C 内存泄漏检测 Demo
当需要调试时只需在 #include 前加入 #include “memdebug.h”,不影响原始代码。在自己的 malloc 中在用户申请的内存基础上多出一个自己管理的结构体,位于最前面。思路:通过宏,将 malloc 进行替换,并封装成自己的malloc。释放时通过偏移量获取结构体,然后从链表中删除。
2023-08-08 15:28:36
117
原创 __attribute( (section(x)) ) 在 GCC 和 ARMCC (Keil MDK) 中的使用
然而上述功能只能对 GCC 平台有效, 如果是 ARMCC 或是其他平台, 因为编译器不同, 方法可能不一样, 为了跨平台, 就不得不添加平台检测的宏, 比如将下面的代码替换获取 myfun_section 所在的内存区间部分即可支持 ARMCC 平台。有了上面的基础, 就可以尝试写快速测试的代码了,一般来说我们希望测试快速测试一个函数, 编写完后在函数下面通过一个宏定义 TEST_FUNC_ADD 就可以将函数插入到测试代码的行列。可以访问变量所在的地址, 所以访问段的的起始地址为。
2023-01-11 18:10:32
1169
原创 计算两个日期相差多少天
/** * 思路是循环累加两个相差的年份, 然后再减去较小年份的日期走过多少天, 加上较大年份的日期走过多少天 * * 比如 2000/04/05-2002/05/02 * * |----------+---/--------------------------------------|----------+---/ * 2000 4 5 2002 5 2 * * [---------
2022-04-28 09:24:26
430
原创 QEMU 模拟器(一)
安装安装 比较简单, 有几种方案.远程仓库安装官网下载可执行文件(Windows 平台适用)通过源码自己编译apt-get install qemu # Debian/Ubuntupacman -S qemu # Archpacman -S mingw-w64-x86_64-qemu # MSYS2可只装指定平台, 如 ARM: sudo apt-get install qemu-system
2022-04-10 15:58:14
2305
原创 ssh 通过密钥连接
ssh-keygenssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.235.22上面ssh-copy-id将数据写入到服务器的 ~/.ssh/authorized_keys 里面, 当然也可以手动拷贝.客户端: cat ~/.ssh/id_rsa.pub 复制服务端: vim ~/.ssh/authorized_keys 粘贴...
2022-04-04 00:12:28
1361
原创 ARM GNU 编译与链接01: 工程创建, 程序烧写和调试
基于 STM32 平台, 对编译与链接原理进行探究,以及学习 ARM 汇编指令集, GNU 的汇编语法。
2022-03-20 16:18:18
711
原创 GNU 内嵌汇编入门
基本结构asm ( 汇编语句部分 :输出部分 :输入部分 :寄存器破坏描述符)其中, 汇编语句部分必不可少, 其他三部分可选,但是如果使用了后面的部分,而前面部分为空,也需要用 : 格开,相应部分内容为空。汇编语句部分为一整个字符串, 使用 ; 或 \n 或 \n\t 对每一行进行分隔。例如:#include <stdio.h>int main(int argc, char const *argv[]){ int input = 12, re..
2022-01-13 22:19:34
418
原创 组件和碰撞
学习利用组件将Pawn与物理交互、使用粒子效果等方法。创建 Pawn 子类为了能对 Actor 进行控制, 创建 Pawn 子类并命名为 CollidingPawn添加粒子系统组件创建组件为了实现碰撞, 需要创建具有物理碰撞性质的组件, 球体组件是一种可与游戏场景交互并碰撞的物理实体, 本例子使用球体组件。同时本例子还需要负责显示形态的静态网格体组件, 可附加的摄像机组件, 控制游戏视角的弹簧臂组件以及可控制的粒子系统组件. 有些组件需要包含头文件才能编译成功:#include "UObject
2021-07-18 22:21:01
221
1
原创 在汇编语言中使用C库函数
在 GNU 汇编: 第一个汇编程序 中, 利用Linux 系统调用将读到的 cpuid 显示到控制台上, 还有不使用系统调用的其他方法, 其中一种就是使用 C 库函数.实例demo.s.section .dataoutput: .asciz "The processor Vender ID is '%s'\n".section .bss .lcomm buffer, 12.section .text.globl _start_start: // 获取 CPU
2021-07-17 22:09:03
885
原创 MSYS 下winsocket 简单使用
server.cpp#include <iostream> #include <winsock2.h> using namespace std;int main(int argc, char* argv[]){ //初始化WSA WORD sockVersion = MAKEWORD(2, 2); WSADATA wsaData; if (WSAStartup(sockVersion, &wsaData) != 0) { ..
2021-05-04 17:01:23
492
原创 Qt 中使用 opencv 库
在MSYS2 下使用QT5 和 MSYS2 下使用 opencv 中介绍了如何在 MSYS 中使用 opencv 和 QT, 下面将它们结合起来, 在QT 中使用 MSYS 中的 opencv 库, 其他C/C++库可以以此作为参考.新建 qt 项目, 比较简单, 跳过在 .pro 文件中加入 opencv 库信息, 主要提供头文件信息和链接信息INCLUDEPATH += C:/Library/win64/msys64/mingw64/include/opencv4LIBS += C:/L
2021-05-04 13:44:38
896
原创 MSYS2 下使用QT5
参考官方安装 qtcreator$ pacman -S mingw-w64-x86_64-qt-creator如果需要生成 32 位, 可以安装 mingw-w64-i686-qt-creator, 两个可以同时安装如果需要静态编译, 安装静态库$ mingw-w64-x86_64-qt5-static 静态库会比较大, 同样 32 位为 pacman -S mingw-w64-i686-qt5-static使用 qtcreator在MSYS环境终端输入 qt..
2021-05-04 11:31:55
813
1
原创 MSYS2 下使用 opencv
安装 opencv$ pacman -S mingw-w64-x86_64-opencv查看是否安装成功$ pkg-config --cflags opencv4这里需要带版本 4, 因为安装时 MSYS 仓库上最新版就是 opencv4写个 demo 验证一下:demo.cpp#include <opencv2/opencv.hpp> using namespace cv;int main(){ Mat image = imread("i..
2021-05-04 11:31:13
2273
6
原创 MSYS2 介绍与使用
MSYS2MSYS2 的前世今生Cygwin这一切得从源头说起, 1995年Cygnus的一位工程师Steve Chamberlain, 他观察到Windows 系统使用COFF作为目标文件 (即可执行文件) 格式,与此同时GNU的工具链已经支持x86和COFF的目标文件,并提供C语言库newlib (Newlib 是嵌入式系统上的C标准库的实现) 。他认为既然GNU的工具链已经能够编译生成x86指令集的机器码并可链接生成COFF格式的目标文件, 而且还提供了可移植到任意平台的C标准库newlib,
2021-03-28 13:12:32
33146
5
原创 SDL 播放PCM音频
生成 pcm 音频mp3 截取$ ffmpeg -i test.mp3 -ss 00:00:10 -t 00:00:30 -acodec copy cut.mp3-acodec copy 编码格式复制mp3 转 pcm$ ffmpeg -i cut.mp3 -acodec pcm_s16le -f s16le -ac 2 -ar 44100 test.pcm-f 强制文件格式 -ac 通道数 -ar 采用率源代码demo.c#include <SDL2/SDL.h
2021-03-28 13:01:49
156
1
原创 C 动态与静态链接库
一、动态库纯 C 情况下add.c 文件/* add.c */#include "add.h"int add(int a, int b){ return a + b;}add.h 文件/* add.h */#pragma onceint add(int a, int b);main.c 文件/* main.c */#include <stdio.h>#include "add.h"int main(){ printf
2020-12-18 16:13:53
120
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人