HRTOS Shell继续完善:优化printf缓冲区与字符串越界保护,国庆后随新版本更新

昨天对 HRTOS Shell 模块又进行了一次细节完善。

这次修改的代码量并不大,主要针对 Shell 中 printf 风格输出函数的两个细节进行优化:

  1. char buf[32] 增加 static;

  2. %s 字符串输出增加缓冲区长度检查。

这些修改不会增加新的 Shell 功能,但可以进一步提高代码运行的可靠性,并避免一些潜在的内存访问问题。

本次修改会与 HRTOS 新版本一起,在国庆假期之后正式更新。

一、Shell输出缓冲区增加static

原来的代码中,shell_printf() 使用局部数组作为格式化输出缓冲区:

复制代码
char buf[32];

这次调整为:

复制代码
static char buf[32];

主要考虑的是 8051 这类资源有限的平台。

buf 本身属于 Shell 输出过程中的固定工作缓冲区,每次调用 shell_printf() 都重新创建并不必要。

增加 static 后,这个缓冲区不再作为普通局部变量反复使用,而是固定分配一块存储空间。

这样做也可以避免局部变量放置和函数调用过程中产生的一些潜在地址/栈使用问题。

对于 HRTOS 这样的系统软件,尤其是在 8051 平台上,局部变量、栈空间以及内存布局都需要更加谨慎地处理。

因此,这次修改虽然只有一个 static,实际上也是对底层运行环境的一次针对性优化。

二、%s增加长度检查

第二处修改是在 %s 字符串处理过程中增加长度限制。

原来的逻辑主要是:

复制代码
while(*s)
{
    *p++ = *s++;
}

现在增加了:

复制代码
while(*s && (p - buf) < 31)
{
    *p++ = *s++;
}

Shell 的输出缓冲区大小为:

复制代码
static char buf[32];

因此这里最多写入 31 个字符,并预留最后一个字节用于:

复制代码
*p = '\0';

这样可以保证最终字符串仍然具有正确的结束符。

也就是说,即使用户传入的 %s 字符串非常长,也不会无限制地继续写入 buf。

三、为什么这种小修改也值得做

对于一个大型软件来说,这种修改可能很普通。

但 HRTOS 面向的是 8051 平台,系统资源本身就非常有限。

一个只有几十字节的 Shell 缓冲区,同样需要认真处理边界。

尤其是 Shell 属于开发者经常使用的调试和交互入口,输出函数又会被大量调用,因此这些基础代码的可靠性非常重要。

这次修改实际上解决的是两个不同层面的问题:

static:优化缓冲区的存储方式;

长度判断:限制字符串写入范围,避免缓冲区越界。

两者结合起来,可以让 Shell 的基础输出模块更加稳健。

四、HRTOS正在不断补齐这些工程细节

HRTOS 最近的更新并不只是增加新功能。

越来越多的工作是在已有代码基础上不断检查和完善。

例如:

  • 系统 XDATA 资源继续优化;

  • 任务删除标记重新整理;

  • DEBUG 与内核同步更新;

  • Shell 输出缓冲区优化;

  • 字符串长度边界保护;

  • 官网示例重新进行实际硬件验证。

这些修改单独来看都比较小。

但操作系统的稳定性往往就是由这些大量的小细节共同构成的。

尤其是在 8051 这种资源非常有限的环境下,很多在其他平台上可以忽略的问题,都需要认真考虑。

五、将与新版本一起更新

目前这次 Shell 修改已经完成。

接下来会继续进行测试和整理,并与近期完成的 HRTOS 系统优化一起打包。

新版本预计在国庆假期之后正式上线。

本次版本除了 Shell 的这些细节完善之外,还包括前面已经完成的系统资源优化:

XDATA:567 Bytes → 511 Bytes

同时对任务删除标记以及 HRTOS-Debug 进行了同步调整。

在正式上线之前,还会继续进行实际硬件验证。

六、持续把基础代码做好

HRTOS 目前越来越进入一个持续打磨的阶段。

相比不断增加大量新功能,现在更加重要的是把已经存在的功能继续做好。

一个 static;

一个长度判断;

一个边界检查;

一次实际硬件验证。

这些东西看起来都很小,但长期积累下来,最终形成的就是系统整体的工程质量。

HRTOS 会继续围绕 稳定性、资源占用、可维护性和实际可用性进行优化。

国庆假期之后,新版本见。

HRTOS,持续维护,持续验证,持续优化。

相关推荐
武子康3 分钟前
H3-World 为何在加载 LoRA 前,先检查导入的代码?
人工智能·深度学习·算法
江屿风5 分钟前
【Git-组件】【Git入门:从文档灾难到版本掌控】流食般投喂
运维·笔记·git·组件·版本控制
我不会起名字32221 分钟前
K8s 节点磁盘打满导致 Pod 被驱逐:4 类占用与回收顺序
运维·kubernetes·k8s·diskpressure·evicted
雪落漂泊30 分钟前
Linux进程(五):进程地址空间篇
linux·运维·服务器
瑞克-桑切斯41 分钟前
docker mail商城
运维·docker·容器
秋天的怀念_David1 小时前
算法一千零一夜 · 第二十八夜 注册
java·程序人生·算法
AR-26710-1 小时前
Linux Day32——网络,ROCE-IB与以太网
linux·运维
Good白10191 小时前
嵌入式:1.嵌入式入门|初识嵌入式、处理器、ARM与STM32
arm开发·stm32·嵌入式硬件
二本咕咕-机械转码1 小时前
FreeRTOS深入解析(八)IPC机制之FromISR详解
数据结构·单片机·链表
小李不想当小白2 小时前
HAL库之UART(STM32 HAL库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式