zhe! 发表于 2025-7-10 16:03:44

串口在线升级ISP例程,验证地址函数求解答 | 已理解

各位大神,求解答一下,历程中 iap.c中的一个验证地址的函数

BOOL iap_check_addr(DWORD addr)
{
    addr &= 0x1ffff;
   
    return ((addr < 0x10000) ||
            (addr >= (0x10000 + LDR_SIZE)));
}
返回0值表示地址合法。

下面向flash写数据的时候使用了这个函数
BOOL iap_write_byte(DWORD addr, BYTE dat)
{
    if (!iap_check_addr(addr))
      return 0;

    IAP_CMD = 2;
    IAP_ADDRE = BYTE2(addr) & 0x01;
    IAP_ADDRH = BYTE1(addr);
    IAP_ADDRL = BYTE0(addr);
    IAP_DATA = dat;
    IAP_TRIG = 0x5a;
    IAP_TRIG = 0xa5;
    _nop_();
    _nop_();
    _nop_();
    _nop_();

    return (iap_read_byte(addr) == dat);
}地址符合,按照例程,会直接退出吧,不明白。
求各位大神,解答。

zhe! 发表于 2025-7-10 17:00:24

国芯人工智能 发表于 2025-7-10 16:08
各位开发者,您好。关于您提到的 iapcheckaddr 函数及其实现逻辑,以下是对该函数的详细解析与说明:

一、 ...

if (!iapcheckaddr(addr)) return 0;
这个if语句在iapcheckaddr(addr)=0的时候,不是要执行return 0这个语句吗?

神农鼎 发表于 2025-7-10 18:58:39

从我们哪下载的例程,请给出链接,我们安排研发去看下,再解答

ercircle 发表于 2025-7-10 20:48:05

zhe! 发表于 2025-7-10 17:00
if (!iapcheckaddr(addr)) return 0;
这个if语句在iapcheckaddr(addr)=0的时候,不是要执行return 0这个 ...

上传下完整工程,上下文也描述完整些,比如给addr代入什么值?
只看当iapcheckaddr(addr)为0时iap_write_byte确实直接return0没毛病

zhe! 发表于 2025-7-11 08:52:06

神农鼎 发表于 2025-7-10 18:58
从我们哪下载的例程,请给出链接,我们安排研发去看下,再解答

链接是这个    https://stcai.com/zxsj

zhe! 发表于 2025-7-11 08:53:29

ercircle 发表于 2025-7-10 20:48
上传下完整工程,上下文也描述完整些,比如给addr代入什么值?
只看当iapcheckaddr(addr)为0时iap_write_ ...

下载的压缩包

ercircle 发表于 2025-7-11 08:58:25

zhe! 发表于 2025-7-11 08:53
下载的压缩包

“返回0值表示地址合法。”

这里理解错了,返回true(1)才表示合法的!

乘风飞扬 发表于 2025-7-11 09:14:45

BOOL iap_check_addr(DWORD addr)
这个函数返回1值表示地址合法。

zhe! 发表于 2025-7-11 09:34:05

ercircle 发表于 2025-7-11 08:58
“返回0值表示地址合法。”

这里理解错了,返回true(1)才表示合法的!

明白了。(addr < 0x10000) || (addr >= (0x10000 + LDR_SIZE))是判断地址在非ISP代码区。
感谢。

zhe! 发表于 2025-7-11 09:34:40

乘风飞扬 发表于 2025-7-11 09:14
BOOL iap_check_addr(DWORD addr)
这个函数返回1值表示地址合法。

感谢,现在再看就明白了。
页: [1] 2
查看完整版本: 串口在线升级ISP例程,验证地址函数求解答 | 已理解