找回密码
 立即注册
查看: 33|回复: 2

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

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:218
  • 最近打卡:2025-07-30 09:03:50
已绑定手机

12

主题

42

回帖

733

积分

高级会员

积分
733
发表于 前天 09:10 | 显示全部楼层 |阅读模式



这是自己AP中的代码

void  DATA_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代码了,
回复

使用道具 举报 送花

3

主题

247

回帖

-795

积分

等待验证会员

积分
-795
发表于 前天 09:12 | 显示全部楼层
根据您提供的代码和问题描述,以下是针对SIP中DfuFlag变量写入与读取问题的专业分析及建议:

一、问题概述

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

二、代码结构分析

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

2. dfucheck()函数(SIP侧)
  1. c
  2. unsigned long xdata DfuFlag at 0xFF10;  // DfuFlag地址
  3. void dfucheck()  //检查是否更新固件
  4. {
  5.     delay();
  6.    
  7.     if(  (DfuFlag != 0x12abcd34) &&  ( ((unsigned char code )(0x1000) == 0x02) && ((unsigned int code )(0x1000 + 1) >= 0x1000 + 3) )  )
  8.     {
  9.         ((void (far )())(0xff0000 + 0x1000))(); //进入用户AP程序
  10.     }
  11.     DfuFlag = 0;
  12. }
复制代码
在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未能按预期执行。建议从地址映射、复位机制、条件判断逻辑及编译配置四个方面进行排查与优化。通过加强调试与验证,可有效解决设备重启后跳转异常的问题。

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

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:253
  • 最近打卡:2025-07-31 08:55:10
已绑定手机

78

主题

2294

回帖

5226

积分

荣誉版主

无情的代码机器

积分
5226
发表于 前天 10:13 | 显示全部楼层

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

截图202507301013023588.jpg
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-8-1 01:43 , Processed in 0.124257 second(s), 62 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表