--> --> >-->

Hello World!

  • Hello World!

  • Hello World!

  • Hello World!

  • Hello World!

  • Hello World!

  • Hello World!

  • Hello World!

  • Hello World!

  • Hello World!

嵌入式Linux-应用开发笔记

进程 常用命令 pstree # 查看进程树状图 ps -aux # 查看所有用户的进程,-ux查看当前用户进程 进程状态 状态 说明 R 运行状态。严格来说,应该是"可运行状态",即表示进程在运行队列中,处于正在执行或即将运行状态,只有在该状态的进程才可能在 CPU 上运行,而同一时刻可能有多个进程处于可运行状态。 S 可中断的睡眠状态。处于这个状态的进程因为等待某种事件的发生而被挂起,比如进程在等待信号。 D 不可中断的睡眠状态。通常是在等待输入或输出(I/O)完成,处于这种状态的进程不能响应异步信号。 T 停止状态。通常是被shell的工作信号控制,或因为它被追踪,进程正处于调试器的控制之下。 Z 退出状态。进程成为僵尸进程。 X 退出状态。进程即将被回收。 s 进程是会话其首进程。 l 进程是多线程的。 + 进程属于前台进程组。 < 高优先级任务。 创建进程 所有进程都基于一个父进程分叉出来,最初始的父进程为init。 system() system()用于在程序中调用 shell 执行一条命令,内部通常会通过 fork() 创建子进程,再由子进程调用 exec() 执行 /bin/sh -c command。调用者会等待命令执行结束,并获得其退出状态。 #include <sys/types.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> int main(void) { pid_t result; printf("This is a system demo!\n\n"); /*调用 system()函数*/ result = system("ls -l"); printf("Done!...

June 2, 2026 · 24 min

移植FreeRTOS到我的SoC(一)基本移植

硬件准备 一、实现一个mtime外设作为RISC-V标准机器定时器中断源 src/rtl/peripheral/mtime_mmio.sv `include "../lib/soc_pkg.sv" `include "../lib/bus_if.sv" module mtime_mmio ( input logic clk, input logic rst_n, output logic timer_irq, simple_bus_if.slave bus ); import soc_pkg::*; logic sel_mtime_lo, sel_mtime_hi, sel_mtimecmp_lo, sel_mtimecmp_hi; always_comb begin sel_mtime_lo = (align_word(bus.addr) == IO_MTIME_LO_ADDR); sel_mtime_hi = (align_word(bus.addr) == IO_MTIME_HI_ADDR); sel_mtimecmp_lo = (align_word(bus.addr) == IO_MTIMECMP_LO_ADDR); sel_mtimecmp_hi = (align_word(bus.addr) == IO_MTIMECMP_HI_ADDR); end logic [63:0] mtime; logic [63:0] mtimecmp; always_ff @(posedge clk or negedge rst_n) begin if (!rst_n) begin mtime <= 64'd0; mtimecmp <= 64'hFFFF_FFFF_FFFF_FFFF; end else begin mtime <= mtime + 64'd1; if (bus....

March 25, 2026 · 5 min

tmux笔记

前言 tmux(Terminal Multiplexer)是一款功能强大的终端复用器。简单来说,它能让你在同一个屏幕上管理多个终端会话。除非手动终止tmux session,否则它会在SSH断开连接后继续运行。 安装 sudo apt install tmux -y 基本操作 Session操作 tmux # 创建新Session并进入 tmux new -s <name> # 创建具有名称 tmux rename-session <session name> <new name> # 更名session tmux ls # 查看正在运行的ession tmux attach -t <session name> # 重连seesion tmux kill-session -t <session name> # 使后台session停止活动 视窗操作 Ctrl+B D — 断开当前session Ctrl+B % — 水平分割视窗 Ctrl+B “ — 垂直分割视窗 Ctrl+B 方向键 — 在视窗之间移动 Ctrl+B X — 关闭当前视窗 Ctrl+B C — 创建新视窗 Ctrl+B N or P — 在前/后一个视窗切换 Ctrl+B Q — 按下后再点击每个视窗上显示的数字对应按键即可跳转到视窗 Ctrl+B : — 输入指令 Ctrl+B ?...

December 25, 2025 · 2 min

CS61C笔记

前言 CS61C的笔记。以下描述的所有内容基于RV32(RISC-V的32位变体)。 CS61C的视频:Youtube 寄存器 RISC-V中有32个寄存器,每个寄存器的位宽为32。命名为x0-x31,其中x0永远存储0值(通过硬连线到地)。其中x10-x17又被命名为a0-a7,作为函数调用的参数寄存器。 汇编 关于RISC-V指令我发现一个很实用的项目,他将RV32I的指令和汇编伪指令做成了tldr库。安装后可以方便的查询指令的用法。 加减法 add 加法。 示例: add x1,x2,x3 (in RISC-V) 等同于:a = b + c (in C) sub 减法。 示例:sub x3,x4,x5 (in RISC-V) 等同于:d = e - f (in C) addi 立即数加法。 示例:addi x3,x4,10 (in RISC-V) 等同于: f = g + 10 (in C) 不存在立即数减法指令,将立即数设置为负数即可实现减法。 它可以用内存操作指令配合加法指令来替代,但我们仍然需要它。因为立即数加法非常常用。 内存操作 内存 内存按照字(words,4 bytes = 1 words)组织。数据遵循小端模式,高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。 lw 从内存读取一个字到寄存器。 示例: int A[100]; g = h + A[3]; lw x10, 12(x15) add x11, x12, x10 其中x15表示A所在的地址,12(字节)为偏移量。由于内存按照字(4字节)组织,故A[3]便是由A的地址偏移3个字得到的。偏移量必须是4的倍数。...

May 10, 2025 · 5 min

简单了解向量搜索

前言 最近看了篇文章,了解到了Vector Search。什么是Vector Search?来看看GPT的解释: 向量搜索是一种利用向量表示数据,并基于向量之间的相似性进行搜索的技术。它不同于传统的基于关键词的搜索,能够捕捉数据之间更深层次的语义关系,从而提高搜索的准确性和效率。 相较于基于关键词的搜索,将文本、图片等非数值型数据转换为向量形式,更能发现数据的特征,并发现数据之间的相似性。 至于如何将非数值型数据转换为向量,来开下面这个例子: 用“1”表示“是”,用“0”表示“否” 交通工具 轮子数量 有引擎吗 陆地上运动吗 最大承载人数 汽车 $4$ $1$ $1$ $4$ 自行车 $2$ $0$ $1$ $1$ 三轮车 $3$ $0$ $1$ $1$ 摩托车 $2$ $1$ $1$ $1$ 帆船 $0$ $0$ $0$ $20$ 轮船 $0$ $0$ $0$ $1000$ 把非数值型数据转换为向量,实际上就是把这些数据的特征用数值表示。比如对于汽车来说,它在这个例子中对应的向量就是$(4,1,1,4)$。 基础理论 向量之间的相似性 观察向量$\vec{a}$,$\vec{b}$和$\vec{p}$,哪个向量与$\vec{p}$更“相似”?向量$\vec{a}$与$\vec{p}$有着相同的方向,但模长更小;而$\vec{b}$与$\vec{p}$有着相同的模长,但方向只是相近。如果相似指的是方向上的相似,那么$\vec{a}$与$\vec{p}$更相似。而如果相似指的是模长,那么$\vec{b}$与$\vec{p}$更相似。 在矢量搜索中,很少单独根据模长来判断两个向量是否相似。相似性通常取决于方向,或者方向和模长。 相似性的评估方法 评估两个向量是否相似,通常有四种数学方法: 欧式距离:直接计算两个向量“箭头”的直线距离。 $d(\vec{a}, \vec{p}) = \sqrt{\sum_{i=1}^{n} (a_i - p_i)^2}$ $a_i$表示$\vec{a}$的第$i$个分量 曼哈顿距离:计算两个点之间沿着坐标轴行走的距离。 $d_1(\vec{a}, \vec{p}) = \sum_{i=1}^{n} |a_i - p_i|$ $a_i$表示$\vec{a}$的第$i$个分量 点积:将相同维度的分量相乘再相加。 $\vec{a} \cdot \vec{p} = \sum_{i=1}^{n}(a_i b_i)$ 余弦值:两个向量夹角的、余弦值。 $\cos(\theta) = \frac{\vec{a} \cdot \vec{b}}{|\vec{a}| |\vec{b}|}$ 这四种方法中,欧氏距离是最常用的,而曼哈顿距离与欧氏距离相似,应用这两种方法得到的结果通常也相似。而当需要评估相似性的向量模长一致时,使用余弦值是更好的方法,因为它只与夹角相关。点积与余弦值类似,但在需要大量计算的情况下,点积通常有着更好的性能。 简单的例子 由于在屏幕上呈现二维向量较为方便,因此选取前言中的“轮子数量”与“有引擎吗”作为特征。得到4个向量,分别是$(4,1),(2,0),(3,0),(2,1)$,它们在图上呈现为: 随后分别计算摩托车与自行车、三轮车、汽车的相似性:...

September 8, 2024 · 2 min