Skip to content

Commit 9afda4d

Browse files
committed
docs: reconcile xrobot site with libxr master
1 parent 213505b commit 9afda4d

215 files changed

Lines changed: 6204 additions & 1497 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

docs/adv_coding/middleware/linux_shared_topic_design.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ sidebar_position: 2
1010

1111
## 1. 为什么不是直接改 `Topic`
1212

13-
`LinuxSharedTopic<T>` 解决的是 Linux / Webots 主机进程间通信、大 payload 共享、零拷贝读取以及多订阅者队列策略;原始 `Topic` 更像是进程内发布订阅,语义偏 MCU 和轻量系统,用缓存、回调、同步/异步订阅者去组织数据流。这两条路径的约束根本不同,所以共享内存语义没有继续塞回 `Topic` 本体,而是单独做成 `LibXR::LinuxSharedTopic<T>`。这样 `Topic` 仍然保持轻量,Linux 主机 IPC 也可以沿着共享内存模型单独演化。
13+
`LinuxSharedTopic<T>` 解决的是 Linux / Webots 主机进程间通信、大 payload 共享、零拷贝读取以及多订阅者队列策略;原始 `Topic` 更像是进程内发布订阅,语义偏 MCU 和轻量系统,用精确类型分发、回调、同步/异步订阅者去组织数据流。这两条路径的约束根本不同,所以共享内存语义没有继续塞回 `Topic` 本体,而是单独做成 `LibXR::LinuxSharedTopic<T>`。这样 `Topic` 仍然保持轻量,Linux 主机 IPC 也可以沿着共享内存模型单独演化。
1414

1515
## 2. 数据面和控制面分离
1616

docs/adv_coding/middleware/topic_design.md

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,23 +10,29 @@ sidebar_position: 1
1010

1111
## `Topic` 解决什么问题
1212

13-
`Topic` 的目标不是做一个“什么都能承载”的消息总线,而是在尽量轻的前提下,把同一进程内最常见的几种数据交接方式统一起来:发布者写入,订阅者按自己的方式接收,必要时缓存最近一份数据,必要时再做多发布者保护。它没有引入 Linux 共享内存、进程间同步或复杂的持久队列语义,就是因为这些需求已经超出了这条轻量路径的边界。
13+
`Topic` 的目标不是做一个“什么都能承载”的消息总线,而是在尽量轻的前提下,把同一进程内最常见的几种数据交接方式统一起来:发布者写入,订阅者按自己的方式接收,必要时再做多发布者保护。它没有引入 Linux 共享内存、进程间同步或复杂的持久队列语义,就是因为这些需求已经超出了这条轻量路径的边界。
1414

1515
## `Block` 的角色
1616

17-
从源码上看,`Topic` 的中心结构是 `Block`里面放着主题当前的数据、最大长度、订阅者链表,以及控制并发访问的状态。默认情况下它优化的是单发布者路径:如果没有显式启用 `multi_publisher`,内部只用一个原子 `busy` 状态来做轻量串行化;一旦启用多发布者,才退回到 `Mutex`。这条边界很关键,因为它说明 `Topic` 首先服务的是常见的单发布者场景,而不是默认把所有发布都拖进重同步原语。
17+
从源码上看,`Topic` 的中心结构是 `Block`里面放着 payload 类型契约、名称 CRC32 键、订阅者链表,以及控制并发访问的状态。默认情况下它优化的是单发布者路径:如果没有显式启用 `multi_publisher`,内部只用一个原子 `busy` 状态来做轻量串行化;一旦启用多发布者,才退回到 `Mutex`。这条边界很关键,因为它说明 `Topic` 首先服务的是常见的单发布者场景,而不是默认把所有发布都拖进重同步原语。
1818

19-
## 缓存为什么是可选的
19+
## 为什么不再内置 latest cache
2020

21-
缓存也是同样的思路。`Topic` 并不会强制持有一份独立副本,而是允许按需启用 cache。不开 cache 时,发布路径只是把当前数据视图挂到 `Block` 上;开了 cache,才在内部保留一份稳定副本。换句话说,如果上层需要“最近一份稳定数据”的语义,就显式打开缓存;如果只想做一次轻量交接,就没有必要默认承担额外拷贝成本。
21+
当前主线里,`Topic` 已经明确退回到“发布即分发”的角色,不再在 `Block` 里保存最近一次 payload 副本。这么做的结果是边界更清楚:
22+
23+
- `Topic` 负责一次发布如何扇出到不同订阅者;
24+
- latest-value 语义如果确实需要,由上层模块自己显式维护;
25+
- packet 打包也直接针对调用者手里的 payload 做,不再绕 topic 内部缓存转一圈。
26+
27+
这条调整减少了 `Topic` 同时承担“分发总线”和“缓存容器”两种职责时的语义混杂。
2228

2329
## 订阅者为什么分类型
2430

2531
订阅者类型之所以分成同步、异步、队列和回调四类,也不是为了把接口做花,而是因为它们代表了四种完全不同的消费语义。`SyncSubscriber` 关心的是“有新数据时唤醒我”;`ASyncSubscriber` 更接近“我之后再来取最新结果”;`QueuedSubscriber` 关心的是“请把每次发布都排进队列”;回调订阅则是“发布时立即触发我”。如果把这些语义都压成一个统一订阅者接口,最后势必要么退化成最保守子集,要么把大量分支逻辑塞进运行期。
2632

2733
## 它为什么不是严格消息队列
2834

29-
从并发角度看,`Topic` 更像一套“发布时把数据分发到不同消费形态”的框架,而不是严格意义上的消息队列。同步路径里有 `Semaphore`,异步路径里有状态块,队列路径里有 `LockFreeQueue`,回调路径则挂在 `LockFreeList` 上。正因为如此,它特别适合进程内模块交接、日志分发、状态广播这类问题;但如果你需要的是进程间共享大 payload、明确的 queue-full 策略或者零拷贝共享槽位,就应该转去 `LinuxSharedTopic<T>`,而不是继续往 `Topic` 里堆系统级语义。
35+
从并发角度看,`Topic` 更像一套“发布时把数据分发到不同消费形态”的框架,而不是严格意义上的消息队列。同步路径里有 `Semaphore`,异步路径里有状态块,队列路径里有 `SPSCQueue`,回调路径则挂在 `LockFreeList` 上。正因为如此,它特别适合进程内模块交接、日志分发、状态广播这类问题;但如果你需要的是进程间共享大 payload、明确的 queue-full 策略或者零拷贝共享槽位,就应该转去 `LinuxSharedTopic<T>`,而不是继续往 `Topic` 里堆系统级语义。
3036

3137
## `WaitTopic` 和 domain
3238

docs/basic_coding/README.md

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,13 @@ sidebar_position: 6
66

77
# 基础编程(libxr)
88

9-
本章简要介绍 LibXR 的CMake配置与基础API的使用方法,包括常用工具,外设,操作系统API以及各种控制算法。
9+
本章简要介绍 LibXR 的 CMake 配置与基础 API 的使用方法,包括核心组件、数据结构、中间件、操作系统抽象、外设驱动以及数学与工具模块。
10+
11+
## 目录
12+
13+
- [核心组件](/docs/basic_coding/core)
14+
- [数据结构](/docs/basic_coding/structure)
15+
- [中间件](/docs/basic_coding/middleware)
16+
- [操作系统](/docs/basic_coding/system)
17+
- [外设驱动](/docs/basic_coding/driver)
18+
- [数学与工具](/docs/basic_coding/utils)

docs/basic_coding/core/README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,13 @@ sidebar_position: 1
1414
- [`libxr_assert`](./core-assert.md):断言机制与致命错误回调
1515
- [`libxr_cb`](./core-cb.md):类型安全的回调机制
1616
- [`libxr_type`](./core-type.md):原始数据封装与类型识别
17+
- [`libxr_mem`](./core-mem.md):内存复制、清零与比较辅助
1718
- [`libxr_string`](./core-string.md):固定长度安全字符串
1819
- [`libxr_color`](./core-color.md):终端输出格式与 ANSI 控制
20+
- [`print`](./core-print.md):编译期格式化输出与 sink / bounded-buffer 包装
1921
- [`libxr_time`](./core-time.md):微秒/毫秒级时间戳与时间差
2022
- [`libxr_rw`](./core-rw.md):通用读写接口与操作封装
23+
- [`Operation`](./core-op.md):异步完成反馈模型
24+
- [`Pipe`](./core-pipe.md):基于共享字节队列的单向管道
2125

2226
各模块将在后续页面中展开详细介绍。

docs/basic_coding/core/core-assert.md

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,44 +6,34 @@ sidebar_position: 2
66

77
# 断言与错误处理
88

9-
本模块用于运行时错误检查、致命错误处理及调试期间的尺寸校验。其核心是 `LibXR::Assert` 类及 `ASSERT` / `ASSERT_FROM_CALLBACK` 宏,常配合 `libxr_def` 使用
9+
本模块用于运行时错误检查与致命错误回调管理。当前公开接口核心是 `LibXR::Assert` 命名空间中的 fatal callback 管理函数,以及 `ASSERT` / `ASSERT_FROM_CALLBACK` 这些宏
1010

1111
## 致命错误处理接口
1212

1313
```cpp
1414
extern "C" void libxr_fatal_error(const char *file, uint32_t line, bool in_isr);
1515
```
1616
17-
该函数用于终止程序执行,可在正常或回调上下文中调用。发生断言失败时将自动调用,并可通过 `Assert` 类注册回调处理
17+
该函数用于终止程序执行,可在正常或回调上下文中调用。发生断言失败时将自动调用,并可通过 `LibXR::Assert` 命名空间中的回调注册接口处理
1818
19-
## `LibXR::Assert`
19+
## `LibXR::Assert` 命名空间
2020
21-
用于注册致命错误回调,并在调试模式下进行尺寸检查。
21+
当前公开的核心接口包括:
2222
23-
### 注册回调
24-
25-
```cpp
26-
LibXR::Assert::RegisterFatalErrorCB(cb);
27-
```
28-
29-
支持传入任意 `Callback<const char*, uint32_t>` 类型的函数或对象,用于处理致命错误事件。
23+
- `using FatalCallback = LibXR::Callback<const char*, uint32_t>`
24+
- `RegisterFatalErrorCallback(cb)`
25+
- `FatalErrorCallback()`
26+
- `RunFatalErrorCallback(in_isr, file, line)`
3027
31-
### 尺寸限制检查
32-
33-
在调试模式(定义 `LIBXR_DEBUG_BUILD`)下启用:
28+
### 注册回调
3429
3530
```cpp
36-
template <SizeLimitMode mode>
37-
static void SizeLimitCheck(size_t limit, size_t size);
31+
LibXR::Assert::RegisterFatalErrorCallback(cb);
3832
```
3933

40-
支持三种模式:
34+
支持传入 `LibXR::Assert::FatalCallback`,也就是 `LibXR::Callback<const char*, uint32_t>` 类型的回调对象,用于处理致命错误事件。
4135

42-
- `EQUAL`: 大小必须等于限制值
43-
- `MORE`: 大小必须大于等于限制值
44-
- `LESS`: 大小必须小于等于限制值
45-
46-
发布模式下此函数为空操作。
36+
说明:当前尺寸关系判断本身在 `libxr_def.hpp` 中以 `constexpr bool SizeLimitCheck(...)` 的形式公开,而不是在这里再单独定义一个调试专用静态类接口。
4737

4838
## 宏定义:断言检查
4939

@@ -55,14 +45,21 @@ static void SizeLimitCheck(size_t limit, size_t size);
5545
## 用例示例
5646

5747
```cpp
58-
auto err_cb = LibXR::Assert::Callback::Create(
48+
using Arg = int;
49+
Arg arg = 0;
50+
51+
auto err_cb = LibXR::Assert::FatalCallback::Create(
5952
[](bool in_isr, Arg arg, const char *file, uint32_t line)
6053
{
54+
(void)in_isr;
55+
(void)arg;
56+
(void)file;
57+
(void)line;
6158
// do something
6259
},
6360
arg);
6461

65-
LibXR::Assert::RegisterFatalErrorCB(err_cb);
62+
LibXR::Assert::RegisterFatalErrorCallback(err_cb);
6663

6764
ASSERT(buffer != nullptr);
6865
ASSERT_FROM_CALLBACK(buffer != nullptr, in_isr);

docs/basic_coding/core/core-cb.md

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ sidebar_position: 3
66

77
# 通用回调
88

9-
本模块提供轻量级、可嵌入中断的通用回调系统,包括 `Callback``CallbackBlock` 两个模板类,广泛用于异步通知、事件处理、错误回调等场景。
9+
本模块提供轻量级、可嵌入中断的通用回调系统,核心公开接口是 `Callback`;其底层实现由 `CallbackBlock` 与可选的 `GuardedCallbackBlock` 组成,广泛用于异步通知、事件处理、错误回调等场景。
1010

1111
## CallbackBlock
1212

@@ -15,18 +15,24 @@ template <typename ArgType, typename... Args>
1515
class CallbackBlock;
1616
```
1717

18-
用于封装一个具体的回调函数及其第一个绑定参数,并提供重入保护(reentrancy guard),可在 ISR 或任务上下文触发:
18+
用于封装一个具体的回调函数及其第一个绑定参数,并提供擦除后的统一调用入口,可在 ISR 或任务上下文触发:
1919

2020
- `FunctionType`: 回调函数签名为 `void(bool in_isr, ArgType arg, Args... args)`
2121
- 具体执行入口由内部 `InvokeThunk(...)` / `Invoke(...)` 完成。
2222

23-
构造时即完成函数与绑定参数的绑定。支持移动构造与移动赋值,禁用拷贝
23+
构造时即完成函数与绑定参数的绑定。当前实现显式禁用拷贝;文档不应把它视为一个普通可复制/可移动的小值对象
2424

25-
### 重入保护语义
25+
### `GuardedCallbackBlock` 的重入保护语义
2626

27-
重入保护用于抑制回调链形成环时的栈递归增长(例如 A → B → C → A,使同一回调在其执行期间被间接再次触发)。
27+
当前主线中的重入保护并不是 `CallbackBlock` 默认自带,而是由 `GuardedCallbackBlock` 单独实现;对应的用户入口是:
2828

29-
当同一 `CallbackBlock` 处于执行状态时再次触发:
29+
```cpp
30+
LibXR::Callback<Args...>::CreateGuarded(fun, bound_arg);
31+
```
32+
33+
它用于抑制回调链形成环时的栈递归增长(例如 A → B → C → A,使同一回调在其执行期间被间接再次触发)。
34+
35+
当同一 guarded callback 处于执行状态时再次触发:
3036

3137
- 不会形成新的嵌套调用栈帧(不递归调用);
3238
- 仅保留一次“待执行请求”(保存一份参数快照;后续重入会覆盖旧的待执行参数);
@@ -41,7 +47,7 @@ template <typename... Args>
4147
class Callback;
4248
```
4349

44-
`CallbackBlock` 的进一步封装,提供统一接口、类型擦除和创建工厂方法。
50+
对底层 callback block 的进一步封装,提供统一接口、类型擦除和创建工厂方法。
4551

4652
### 创建回调
4753

@@ -54,6 +60,14 @@ LibXR::Callback<Args...> cb = LibXR::Callback<Args...>::Create(fun, bound_arg);
5460

5561
> 注意:当前 `Create` 的实现会 `new CallbackBlock<BoundArgType, Args...>`,因此**包含动态内存分配**;同时 `Callback` 本身不管理释放。
5662
63+
如需 guarded 版本:
64+
65+
```cpp
66+
LibXR::Callback<Args...> cb = LibXR::Callback<Args...>::CreateGuarded(fun, bound_arg);
67+
```
68+
69+
该路径当前会分配 `GuardedCallbackBlock<...>`
70+
5771
### 执行回调
5872

5973
```cpp
@@ -64,7 +78,7 @@ cb.Run(in_isr, arg1, arg2, ...);
6478

6579
### 其他接口与语义
6680

67-
- `Empty()`: 判断回调是否为空(内部 `cb_block_ == nullptr`
81+
- `Empty()`: 判断回调是否为空(当前实现为 `cb_block_ == &empty_cb_block_`
6882
- 支持默认构造、拷贝构造、移动构造与赋值
6983
- 拷贝为浅拷贝:多个 `Callback` 实例会共享同一回调块指针与调用入口。
7084

@@ -87,7 +101,7 @@ ISR=0 context=42 msg=Hello
87101

88102
## 设计特点
89103

90-
- **重入保护**回调重入时不递归,缓存一次待执行请求并在当前调用点补跑(trampoline 扁平化)
104+
- **可选重入保护**只有 `CreateGuarded(...)` 路径才会启用 trampoline 扁平化的重入保护;普通 `Create(...)` 只创建基础 `CallbackBlock`
91105
- **支持 ISR 上下文**:接口显式携带 `in_isr`,可在中断中安全调用
92106
- **类型安全封装**:利用模板与类型推导实现参数绑定与调用
93107
- **轻量可嵌入**:结构简单,适用于 IO、定时器、事件发布等模块的回调传递

docs/basic_coding/core/core-color.md

Lines changed: 76 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -6,75 +6,112 @@ sidebar_position: 6
66

77
# 终端颜色与格式
88

9-
本模块定义了终端打印时常用的格式控制枚举和 ANSI 转义序列,支持文本加粗、颜色设置、背景色等,适用于串口调试终端、日志系统、彩色输出等场景
9+
本模块对应 `libxr_color.hpp`,提供当前主线里用于终端文本样式、控制序列、前景色、背景色和常用预设的枚举与 ANSI 转义字符串。它主要服务于终端输出、Logger、串口调试终端等文本界面路径
1010

11-
## 文本格式 Format
11+
## 文本样式 `TextStyle`
1212

1313
```cpp
14-
enum class Format : uint8_t {
15-
NONE = 0, RESET, BOLD, DARK, UNDERLINE, BLINK, REVERSE, CONCEALED, CLEAR_LINE, COUNT
14+
enum class TextStyle : uint8_t {
15+
NONE = 0,
16+
BOLD,
17+
DIM,
18+
UNDERLINE,
19+
BLINK,
20+
REVERSE,
21+
CONCEALED,
22+
COUNT
1623
};
1724
```
1825
19-
- `NONE`: 无格式
20-
- `RESET`: 重置所有格式
21-
- `BOLD`: 加粗
22-
- `DARK`: 暗色字体
23-
- `UNDERLINE`: 下划线
24-
- `BLINK`: 闪烁
25-
- `REVERSE`: 前景/背景反转
26-
- `CONCEALED`: 隐藏
27-
- `CLEAR_LINE`: 清除整行
26+
- `BOLD`:加粗
27+
- `DIM`:弱化/暗色
28+
- `UNDERLINE`:下划线
29+
- `BLINK`:闪烁
30+
- `REVERSE`:前景/背景反转
31+
- `CONCEALED`:隐藏文本
2832
29-
对应 ANSI 转义字符串:`LIBXR_FORMAT_STR[]`
33+
对应 ANSI 转义字符串:`LIBXR_TEXT_STYLE_STR[]`
3034
31-
## 字体颜色 Font
35+
## 终端控制 `TerminalControl`
3236
3337
```cpp
34-
enum class Font : uint8_t {
35-
NONE = 0, BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, COUNT
38+
enum class TerminalControl : uint8_t {
39+
NONE = 0,
40+
RESET,
41+
ERASE_LINE,
42+
COUNT
3643
};
3744
```
3845

39-
对应 ANSI 字符串:`LIBXR_FONT_STR[]`
46+
- `RESET`:重置当前样式
47+
- `ERASE_LINE`:清除当前行
4048

41-
## 背景颜色 Background
49+
对应 ANSI 转义字符串:`LIBXR_TERMINAL_CONTROL_STR[]`
50+
51+
## 前景色 `Foreground`
4252

4353
```cpp
44-
enum class Background : uint8_t {
45-
NONE = 0, BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, COUNT
54+
enum class Foreground : uint8_t {
55+
NONE = 0,
56+
BLACK,
57+
RED,
58+
GREEN,
59+
YELLOW,
60+
BLUE,
61+
MAGENTA,
62+
CYAN,
63+
WHITE,
64+
COUNT
4665
};
4766
```
4867
49-
对应 ANSI 字符串:`LIBXR_BACKGROUND_STR[]`
68+
对应 ANSI 转义字符串:`LIBXR_FOREGROUND_STR[]`
5069
51-
## 粗体样式 Bold
70+
## 背景色 `Background`
5271
5372
```cpp
54-
enum class Bold : uint8_t {
55-
NONE = 0, YELLOW, RED, ON_RED, COUNT
73+
enum class Background : uint8_t {
74+
NONE = 0,
75+
BLACK,
76+
RED,
77+
GREEN,
78+
YELLOW,
79+
BLUE,
80+
MAGENTA,
81+
CYAN,
82+
WHITE,
83+
COUNT
5684
};
5785
```
5886

59-
简化常用彩色粗体样式输出,例如:
87+
对应 ANSI 转义字符串:`LIBXR_BACKGROUND_STR[]`
6088

61-
- `YELLOW`: 黄色加粗
62-
- `RED`: 红色加粗
63-
- `ON_RED`: 红底白字加粗
89+
## 常用预设 `Preset`
6490

65-
对应 ANSI 字符串:`LIBXR_BOLD_STR[]`
91+
```cpp
92+
enum class Preset : uint8_t {
93+
NONE = 0,
94+
YELLOW_BOLD,
95+
RED_BOLD,
96+
BOLD_ON_RED,
97+
COUNT
98+
};
99+
```
100+
101+
- `YELLOW_BOLD`:黄色粗体
102+
- `RED_BOLD`:红色粗体
103+
- `BOLD_ON_RED`:红底粗体
104+
105+
对应 ANSI 转义字符串:`LIBXR_PRESET_STR[]`
66106
67107
## 使用示例
68108
69109
```cpp
70-
std::cout << LIBXR_FORMAT_STR[(int)Format::BOLD]
71-
<< LIBXR_FONT_STR[(int)Font::GREEN]
72-
<< "This is bold green text!"
73-
<< LIBXR_FORMAT_STR[(int)Format::RESET];
110+
std::cout
111+
<< LIBXR_TEXT_STYLE_STR[static_cast<uint8_t>(LibXR::TextStyle::BOLD)]
112+
<< LIBXR_FOREGROUND_STR[static_cast<uint8_t>(LibXR::Foreground::GREEN)]
113+
<< "This is bold green text!"
114+
<< LIBXR_TERMINAL_CONTROL_STR[static_cast<uint8_t>(LibXR::TerminalControl::RESET)];
74115
```
75116

76-
效果为绿色加粗文本。
77-
78-
---
79-
80-
本模块可配合终端类、调试输出类、日志系统使用,用于构建清晰、可读性强的彩色输出。
117+
Logger 当前也直接使用这一组常量:按日志级别从 `LIBXR_FOREGROUND_STR[]` 取前景色,再在结尾追加 `TerminalControl::RESET`

0 commit comments

Comments
 (0)