打印
[牛人杂谈]

N76E003芯片的片上RAM和片外RAM进行安全性校验

[复制链接]
50|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xinpian101|  楼主 | 2025-2-23 15:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1. 片上RAM校验
片上RAM的地址范围是 0x0000 到 0x00FF,共256字节。其中:

低128字节(0x0000 到 0x007F)可以直接寻址。

高128字节(0x0080 到 0x00FF)需要间接寻址。

前32字节(0x0000 到 0x001F)用于寄存器组,因此校验从第33字节(0x0020)开始。

for (i = 32; i < 256; i++) {
    DBYTE[0x0000 + i] = 0xFF;  // 将当前地址写入0xFF
    if (DBYTE[0x0000 + i] != 0xFF) {  // 读取并校验是否为0xFF
        // RAM Error
    }
    DBYTE[0x0000 + i] = 0x00;  // 将当前地址写入0x00
    if (DBYTE[0x0000 + i] != 0x00) {  // 读取并校验是否为0x00
        // RAM Error
    }
}

校验逻辑:
使用 DBYTE[] 宏(定义在 <absacc.h> 中)直接访问片上RAM。

对每个地址依次写入 0xFF 和 0x00,并读取校验。

如果读取的值与写入的值不一致,说明该地址的RAM存在故障。

注意事项:
前32字节(寄存器组)未校验,因为它们是特殊用途区域。

高128字节需要间接寻址,但代码中未体现这一点,可能需要额外处理。

2. 片外RAM校验
片外RAM的地址范围是 0x0000 到 0x02FF,共768字节。片外RAM通过 MOVX 指令访问,代码中使用 XBYTE[] 宏来操作。

代码分析:
for (i = 0; i < 768; i++) {
    XBYTE[0x0000 + i] = 0xFF;  // 将当前地址写入0xFF
    if (XBYTE[0x0000 + i] != 0xFF) {  // 读取并校验是否为0xFF
        // XRAM Error
    }
    XBYTE[0x0000 + i] = 0x00;  // 将当前地址写入0x00
    if (XBYTE[0x0000 + i] != 0x00) {  // 读取并校验是否为0x00
        // XRAM Error
    }
}

校验逻辑:
使用 XBYTE[] 宏(定义在 <absacc.h> 中)访问片外RAM。

对每个地址依次写入 0xFF 和 0x00,并读取校验。

如果读取的值与写入的值不一致,说明该地址的片外RAM存在故障。

注意事项:
片外RAM的地址范围是 0x0000 到 0x02FF,共768字节。

片外RAM的访问速度通常比片上RAM慢,校验时可能需要考虑时序问题。

3. 代码的改进建议
片上RAM的高128字节处理:

高128字节需要间接寻址,代码中未体现这一点。可以增加对高128字节的间接寻址支持。

错误处理:

当前代码在检测到错误时仅注释了 // RAM Error 或 // XRAM Error,建议增加具体的错误处理逻辑,例如记录错误地址或触发系统复位。

性能优化:

如果RAM较大,校验时间可能较长。可以考虑分段校验或使用更高效的算法。

寄存器组的保护:

校验片上RAM时,前32字节是寄存器组,直接操作可能影响系统状态。建议在操作前保存寄存器状态,操作后恢复。

片外RAM的时序问题:

片外RAM的访问可能涉及外部总线时序,建议在操作前确保总线配置正确。

4. 总结
这段代码实现了对N76E003芯片的片上RAM和片外RAM的基本校验,能够检测RAM的读写故障。然而,代码在以下方面可以进一步改进:

支持高128字节的间接寻址。

增加错误处理逻辑。

优化性能并保护寄存器组。

确保片外RAM的访问时序正确。

通过这些改进,可以提高代码的鲁棒性和实用性。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

117

主题

1504

帖子

1

粉丝