mklink——Windows文件同步神器

Windows平台常用的快捷方式,用于快速访问某个目录或文件,类似收藏夹的书签。
除了快捷方式,Windows命令行还提供了mklink命令,用于创建链接(make link)。链接和快捷方式不同,快捷方式像书签,是一种文件的存在形式,而链接是一种关系,不存在新的文件,类似于别名。

mklink需要打开命令行使用,用法:

1
2
3
4
5
6
7
8
9
10
11
12
>mklink
Creates a symbolic link.

MKLINK [[/D] | [/H] | [/J]] Link Target

/D Creates a directory symbolic link. Default is a file
symbolic link.
/H Creates a hard link instead of a symbolic link.
/J Creates a Directory Junction.
Link Specifies the new symbolic link name.
Target Specifies the path (relative or absolute) that the new link
refers to.

有三种形式的链接:

  • /D:符号链接,用于目录,可跨本地或网络磁盘,作用不大
  • /H:硬链接,用于文件,只能同一磁盘
  • /J:联结,用于目录,可跨本地磁盘

本文要介绍的是联结——文件同步神器。

如果把目录比作一间仓库,目录内的文件是仓库中的货物,文件夹是这间仓库的大门。那么联结就是给这间仓库再开辟一个大门,而且这个门是任意门。想象一下,你可以从卧室的衣柜门进入到这间仓库,拿到里面存储的货物。

放在Windows平台说明,就是有两个路径都可以访问到同一片区域存储的文件。有什么实际的用法呢?

1. 跨仓库同步文件

例如两个仓库使用到同样的文件,比如同一批驱动文件。当驱动文件在一个仓库修改时,需要手动对比两个仓库的内容,将修改点同步到另一个仓库。而使用联结,在另一个仓库创建这个驱动目录的联结。不管在哪个仓库修改驱动文件,在另一个仓库的驱动文件也是完全实时同步修改(废话,因为两个仓库的驱动其实是同一份文件)。再也不用担心忘记同步文件。

2. 不重新安装,移动程序文件

当装在C盘的程序占用了大量空间(例如邮件/微信的存储目录),而又不好重新安装时。把存储目录移动到D盘,然后在原位置创建一个联结。对于程序来说,它感知不到任何改变。而占用空间的文件实际已存放在D盘。

除了联结的这两种用法,硬链接也可以用于类似需要使用同样文件的场景,mklink堪称Windows平台的文件同步神器。

嵌入式开发设计模式——寄存器访问

嵌入式软件和PC软件一个很大的不同就是存在寄存器访问。

从软件的视角来看,寄存器就是一个Memory地址。现在使用最多的是32位CPU,因此寄存器大多也是32位,当然32位CPU也可以按照8位或64位宽度访问寄存器,但这一点和本文讨论的重点无关。

寄存器的值会作用到硬件上,反之硬件的状态更新也会改变寄存器值,因此读写寄存器必须使用volatile关键字,保证CPU确实访问该地址了。一般会使用类型定义

1
typedef volatile unsigned int REG32;

这里不考虑寄存器读写的一般形式,此设计模式考虑的是对于重复寄存器访问的情况如何降低软件代码的复杂度。

重复寄存器来源于有的硬件存在多个实例的情况,例如一个芯片有多路串口、一个DMA有多个channel等。这些多个实例其功能是一样的,但存在不同的ID。如果对每个实例都单独实现一个软件接口,则会产生大量近似接口(其差异仅是ID或index不同)。

以下寄存器map仅为示意,非真实或完整的寄存器表。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
typedef struct {
REG32 uart0_dr; /* UART0 data register */
REG32 uart0_status; /* UART0 status register */
REG32 uart1_dr; /* UART1 data register */
REG32 uart1_status; /* UART0 status register */
REG32 uart2_dr; /* UART2 data register */
REG32 uart2_status; /* UART0 status register */
} uart_reg_t;

#define hd_uart ((uart_reg_t *)UART_ADDRESS)

void uart0_send(u32 value)
{
hd_uart->uart0_dr = value;
}

void uart1_send(u32 value)
{
hd_uart->uart1_dr = value;
}

void uart2_send(u32 value)
{
hd_uart->uart2_dr = value;
}

重新定义寄存器结构体简化接口,使用数组方式访问

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
typedef struct {
REG32 dr;
REG32 status;
} uart_inst_t;

typedef struct {
uart_inst_t inst[3];
} uart_reg_t;

static uart_reg_t *const reg_uart = (uart_reg_t *)UART_ADDRESS;

void uart_send(u8 id, u32 value)
{
reg_uart->inst[id].dr = value;
}

另一种寄存器的组织形式及重新定义结构体的方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
typedef struct {
REG32 uart0_dr; /* UART0 data register */
REG32 uart1_dr; /* UART1 data register */
REG32 uart2_dr; /* UART2 data register */
REG32 uart0_status; /* UART0 status register */
REG32 uart1_status; /* UART0 status register */
REG32 uart2_status; /* UART0 status register */
} uart_reg_t;

typedef struct {
REG32 dr[3];
REG32 status[3];
} uart_reg_t;

#define hd_uart ((uart_reg_t *)UART_ADDRESS)

void uart_send(u8 id, u32 value)
{
hd_uart->dr[id] = value;
}

以上设计的基本原则还是DRY(Don’t Repeat Yourself),提取重复代码中变化的部分作为参数传递。

记录我用的工具

开始写第一篇blog,就记录自己使用工具吧

PC(Windows)

  1. Redmine:问题解决管理、项目管理,相比其他工具的好处是开源(免费),自己服务器搭建安全可靠
  2. OneNote + OneMore:笔记。最符合纸质笔记本的使用习惯。数据可离线。永远不担心工具不提供服务
  3. VSCode + Copilot:配合扩展程序写代码、写blog
  4. Everything:文件搜索,使用正则表达式可满足任意搜索
  5. Zotero:文献管理,不多说,学术必备。
  6. Treesheets:树状结构表格工具,比Excel轻量,用于记录零散笔记或整理信息,例如读书/课程笔记
  7. USB Tree Viewer:详细显示USB设备,比自带的设备管理器更清楚
  8. Q-Dir:四格视图文件浏览器
  9. MassCode:代码片段管理工具,没怎么用起来,现在有了AI更没用了
  10. CareUEyes:屏幕护眼程序
  11. PowerToys:微软自家的系统扩展工具
  12. AdGuard:广告屏蔽,感觉用处不大,不过也不贵就一直开着吧
  13. 小鹤音形:音形输入法,告别翻页选字
  14. SQLiteStudio:使用sqlite记录个人数据
  15. SumatraPDF:轻量PDF阅读器,使用OneDrive同步实现多端阅读进度同步
  16. KeePassXC:密码管理器
  17. WinMerge:代码对比,没BeyondCompare好用,但是免费
  18. FreeFileSync:文件同步工具

Android

  1. 多邻国:学各种语言
  2. 随手记:记账软件,不如新出的软件简洁,但大公司出品,不担心不提供服务
  3. 时间日志:时间记录软件
  4. Puzzles:一些智力小游戏,如数独
  5. 白描:证件照、扫描文档

Cross

  1. 坚果云:同步文件,免费额度够用。
  2. OneDrive:同步文件和备份照片,家庭版1T空间,性价比相当高,缺点是时不时遇到网络问题,目前还可以忍受。
  3. 滴答清单:任务管理。一年139。功能包括习惯、番茄钟、日历、标签等,暂未发现其他更好用的软件。
  4. Flomo:卡片笔记、闪念,但还没用起来

后续分享日常如何使用工具