迪文科技论坛

 找回密码
 立即注册
搜索
查看: 360|回复: 1

【分享】T5L开发xdata变量初始化

[复制链接]

12

主题

20

回帖

181

积分

注册会员

Rank: 2

积分
181
发表于 2022-5-29 08:49:49 | 显示全部楼层 |阅读模式
T5L的51核可以在Keil环境下沿用标准C51的开发流程。如果系统变量较多,我们往往会在keil中选择xdata模式,如下图所示:

对于追求速度的关键代码段,可以人工指定变量为data变量,这样能显著提高代码的执行速度。

变量存储在xdata存储器时,需要留意变量的初始化问题。
1 - 变量定义时直接赋值,如:static        uint32_t value = 123;
2 - 变量定义时不赋值,   如static        uint32_t value ;

由此产生一个问题,若xdata变量初始化不赋值,那么系统复位后该变量初始值是多少?
答案是或许是0,或许不是0。这跟启动文件STARTUP.A51的设置有关。

假如我们把xdata空间长度设为0,则系统启动后不会对xdata做清0处理;反之,如果正确设置了xdata
的起始地址和长度的话,系统启动时会把xdata空间清0。

具体应用时有以下几种可能:
1 - xdata不清0:在做变量定义时需赋值,或在初始化时赋值。
2 - xdata清0:如果变量默认值希望是0,则定义时可以不用赋值。

系统复位可简单区分为上电复位(冷复位)和看门狗复位(热复位)。对于热复位,有时候我们希望能保留复位前
的变量值作为参考。编程时可做如下考虑。
1 - 启动文件对xdata不清0;
2 - 设置复位标志变量,复位后判断属于冷复位或热复位;
3 - 如果是热复位,则变量值有效。

示例:
xdata uint32_t powerWord;
void job_sys_init (void) _task_ 0  
{
        sys_init();                                                                                        // 系统初始化        
        io_init();                                                                                        // IO引脚初始化               
        uart2_init(115200);                                                                        // UART2初始化,printf重定义        
       // 复位类型
        if(powerWord!=0x5AA5)
        {
             printf("上电复位\r\n");
             value=0x5AA5;
        }
        else printf("热复位\r\n");
        ...    ...
}

更严谨一些,可以设置一个复位标志数组,该数组包含CRC校验。




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0

主题

751

回帖

8370

积分

论坛元老

Rank: 8Rank: 8

积分
8370
发表于 2022-5-29 14:35:40 | 显示全部楼层
感谢分享
回复

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2025-4-6 11:43 , Processed in 0.050971 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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