January 1, 0001
# 为内核支持函数调用
这里的linker script似乎把栈空间放在了.data
和.bss
中间:
.bss: {
*(.bss.stack)
sbss = .;
// ...
}
ebss = .;
不知是何用意,不过理论上似乎并不影响程序执行。
# 练习
# 课后练习
3
$time
是一个只读寄存器,故不能采用csrw time, x0
的方法重置,只能分两拨读取偏移量(分别记作start
和current
)作比较;此外,我的这种实现精度应该也是有问题的。
# 实验练习
Log等级如果用C实现,会有一个比较漂亮的写法:
enum log_mask_e: uint8_t {
ERROR = 0x01,
WARN = 0x02,
INFO = 0x04,
DEBUG = 0x08,
TRACE = 0x10,
}
static mask_to_level(enum log_mask_e mask)
{
uint8_t level = 0;
switch (mask) {
case TRACE: level | TRACE;
case DEBUG: level | DEBUG;
case INFO: level | INFO;
case WARN: level | WARN;
case ERROR: level | ERROR;
default:
}
return level;
}
可惜Rust不支持fall-through,那还是算了。其实就这点来看,bit flags在Rust这里的应用大概只剩下省空间了。