fanpu 发表于 2025-7-30 09:10:16

关于SIP中 DfuFlag变量 写入读取的问题




这是自己AP中的代码

voidDATA_UP() //固件升级
{
        unsigned long xdata DfuFlag _at_ 0xFF10;// DfuFlag地址
        DfuFlag = 0x12abcd34 ; //当需要执行用户ISP代码时,将强制执行标志赋值
      IAP_CONTR = 0x20;   //然后执行软复位
        while(1);
}



这是SIP中的
unsigned long xdata DfuFlag _at_ 0xFF10;// DfuFlag地址


void dfu_check()//检查是否更新固件
{
    delay();
   
    if((DfuFlag != 0x12abcd34) &&( (*(unsigned char code *)(0x1000) == 0x02) && (*(unsigned int code *)(0x1000 + 1) >= 0x1000 + 3) ))
    {

      ((void (far *)())(0xff0000 + 0x1000))(); //进入用户AP程序
    }

    DfuFlag = 0;
}



目前的问题是 执行DATA_UP()后设备重启,但无法执行SIP代码,直接跳转到用户AP代码了,

国芯人工智能 发表于 2025-7-30 09:12:00

根据您提供的代码和问题描述,以下是针对SIP中DfuFlag变量写入与读取问题的专业分析及建议:

一、问题概述

在当前系统中,DATAUP()函数用于触发固件升级流程,其通过将DfuFlag(位于地址0xFF10)赋值为特定值(0x12abcd34),并执行软复位,以引导设备进入用户AP程序。然而,实际运行过程中,设备重启后未按预期执行SIP中的dfucheck()逻辑,而是直接跳转至用户AP代码,导致SIP代码未被正确执行。

二、代码结构分析

1. DATAUP()函数(AP侧)

c
void DATAUP() //固件升级
{
    unsigned long xdata DfuFlag at 0xFF10;// DfuFlag地址
    DfuFlag = 0x12abcd34 ; // 设置DFU标志
    IAPCONTR = 0x20;   // 执行软复位
    while(1);
}
此函数将DfuFlag定义为位于0xFF10的变量,并赋值为0x12abcd34。
然后设置IAP控制寄存器,触发软复位。
复位后,应从SIP启动,但实际结果却跳转到用户AP。

2. dfucheck()函数(SIP侧)

c
unsigned long xdata DfuFlag at 0xFF10;// DfuFlag地址

void dfucheck()//检查是否更新固件
{
    delay();
   
    if((DfuFlag != 0x12abcd34) &&( ((unsigned char code )(0x1000) == 0x02) && ((unsigned int code )(0x1000 + 1) >= 0x1000 + 3) ))
    {
      ((void (far )())(0xff0000 + 0x1000))(); //进入用户AP程序
    }

    DfuFlag = 0;
}
在SIP中也定义了DfuFlag于相同地址0xFF10。
检查条件包括:
DfuFlag != 0x12abcd34
用户AP代码段地址0x1000处的内容符合特定格式
若条件满足,则跳转至用户AP代码。

三、潜在问题分析

1. 地址映射或内存覆盖问题
DfuFlag在AP和SIP中均定义于0xFF10,可能存在内存覆盖或访问冲突。
若AP和SIP共用同一物理地址空间,且在复位后未正确初始化内存,可能导致SIP无法正确读取DfuFlag的值。

2. 软复位机制不规范
IAPCONTR = 0x20可能仅触发IAP模式下的复位,而非完整的系统复位。
如果系统未完全重置,SIP可能未被重新加载,导致直接跳转至用户AP。

3. 条件判断逻辑缺陷
if((DfuFlag != 0x12abcd34) && ...):若DfuFlag未被正确写入或读取,该条件可能始终为真,从而误触发跳转。
建议增加日志输出或调试信息,确认DfuFlag在SIP中是否成功读取。

4. 代码编译与链接配置问题
若AP和SIP分别使用不同的编译器或链接脚本,可能导致DfuFlag的实际地址不一致。
应确保AP与SIP中DfuFlag的地址一致,并在链接文件中正确指定。

四、解决方案建议

1. 验证DfuFlag地址一致性
确保AP与SIP中DfuFlag的地址均为0xFF10,且无其他变量占用该地址。
可通过反汇编工具检查实际内存布局,确认地址分配正确。

2. 规范复位流程
使用硬件复位(如外部复位信号)代替软复位,确保系统完全重启。
或在复位后明确加载SIP代码,避免AP代码优先执行。

3. 增加调试信息输出
在dfucheck()中添加调试打印,确认DfuFlag的值是否为预期。
例如:printf("DfuFlag: %08X\n", DfuFlag);

4. 优化条件判断逻辑
将DfuFlag != 0x12abcd34作为首要判断条件,避免依赖其他复杂条件。
如需验证用户AP代码,可采用独立的校验机制,而非直接依赖地址内容。

5. 检查编译器/链接器配置
确保AP和SIP项目中xdata变量的定位正确,无内存冲突。
若使用不同编译器,需统一内存模型和地址对齐方式。

五、结论

当前问题的核心在于DfuFlag的写入与读取未能正确同步,导致SIP未能按预期执行。建议从地址映射、复位机制、条件判断逻辑及编译配置四个方面进行排查与优化。通过加强调试与验证,可有效解决设备重启后跳转异常的问题。

如需进一步协助,请提供更详细的硬件平台信息及编译器版本。

[本文内容由国芯人工智能辅助生成,仅供参考]

ercircle 发表于 2025-7-30 10:13:26


使用的哪个型号呢?
先用官网例程测试,测通了再修改,差异点即问题点:


页: [1]
查看完整版本: 关于SIP中 DfuFlag变量 写入读取的问题