Hello World!

Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
FreeRTOS笔记
前言 基于ESP32S+ESP-IDF的FreeRTOS笔记。 FreeRTOS 里函数名前缀通常表示返回值类型或返回值含义,属于一种命名约定,常见如下: 前缀 典型返回类型 含义 v void 无返回值 x BaseType_t 基础有符号类型,常用于返回状态、布尔值或错误码 ux UBaseType_t 无符号基础类型,常用于返回数量、索引、优先级等 ul uint32_t / unsigned long 32 位无符号整数 us uint16_t / unsigned short 16 位无符号整数 uc uint8_t / unsigned char 8 位无符号整数 c char 字符类型 pc char * 指向字符的指针,常用于字符串 puc uint8_t * 指向无符号 8 位数据的指针 pv void * 通用指针 px 指向某种结构体的指针 常用于 FreeRTOS 内部结构体指针 e 枚举类型 返回枚举值 prv 通常是 static 私有函数 FreeRTOS 内部私有函数,不强调返回值类型 系统启动流程 flowchart LR entry["ENTRY(call_start_cpu0)<br/><small>esp_system/sections....
嵌入式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!...
移植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....
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 ?...
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的倍数。...