92 lines
2.0 KiB
Markdown
92 lines
2.0 KiB
Markdown
# alarmtest.c 测试
|
|
|
|
## test0: 单次调用测试
|
|
|
|
**函数**: `test0()`
|
|
|
|
**目的**: 测试内核是否至少调用了一次 alarm 处理程序。
|
|
|
|
**描述**:
|
|
|
|
- 设置 alarm 每 2 个时钟周期触发一次。
|
|
|
|
- 在一个长循环中检查 `count` 是否被处理程序修改。
|
|
|
|
- 如果 `count > 0`,测试通过;否则失败。
|
|
|
|
---
|
|
|
|
## test1: 多次调用与寄存器恢复测试
|
|
|
|
**函数**: `test1()`
|
|
|
|
**目的**: 测试内核是否多次调用 alarm 处理程序,并确保处理程序返回后程序继续从中断点执行,且寄存器值未被破坏。
|
|
|
|
**描述**:
|
|
|
|
- 设置 alarm 每 2 个时钟周期触发一次。
|
|
|
|
- 在循环中调用 `foo()` 函数,同时检查 `count` 是否达到 10。
|
|
|
|
- 验证 `foo()` 的调用次数是否与循环计数一致。
|
|
|
|
- 如果 `count < 10` 或寄存器值不一致,测试失败;否则通过。
|
|
|
|
---
|
|
|
|
## test2: 防止重入调用
|
|
|
|
**函数**: `test2()`
|
|
|
|
**目的**: 测试内核是否防止 alarm 处理程序的重入调用。
|
|
|
|
**描述**:
|
|
|
|
- 设置 alarm 每 2 个时钟周期触发一次,处理程序为 `slow_handler()`。
|
|
|
|
- 在子进程中运行一个长循环,检查 `count` 是否被修改。
|
|
|
|
- 如果 `count > 1`,测试失败;否则通过。
|
|
|
|
---
|
|
|
|
## test3: 寄存器 a0 的完整性测试
|
|
|
|
**函数**: `test3()`
|
|
|
|
**目的**: 测试从 `sys_sigreturn()` 返回时,寄存器 `a0` 的值是否被修改。
|
|
|
|
**描述**:
|
|
|
|
- 设置 alarm 每 1 个时钟周期触发一次,处理程序为 `dummy_handler()`。
|
|
|
|
- 在触发 alarm 后检查寄存器 `a0` 的值是否保持为初始值 `0xac`。
|
|
|
|
- 如果 `a0` 被修改,测试失败;否则通过。
|
|
|
|
---
|
|
|
|
## 处理程序说明
|
|
|
|
### `periodic()`
|
|
|
|
- 增加 `count` 值并打印 "alarm!"。
|
|
|
|
- 调用 `sigreturn()` 返回。
|
|
|
|
### `slow_handler()`
|
|
|
|
- 增加 `count` 值并打印 "alarm!"。
|
|
|
|
- 如果 `count > 1`,测试失败并退出。
|
|
|
|
- 运行一个长循环以模拟慢速处理程序。
|
|
|
|
- 调用 `sigreturn()` 返回。
|
|
|
|
### `dummy_handler()`
|
|
|
|
- 立即卸载自身并调用 `sigreturn()` 返回。
|
|
|
|
---
|