c++new时赋初值_C2000芯片如何给一个连续的RAM区间赋初值

本文介绍了如何在C2000芯片开发中,高效地为大量全局变量赋予相同的初始值,避免繁琐的手动初始化。通过理解C2000上电流程和利用_c_int00函数,可以在程序启动前批量初始化RAM区间的值,防止因忘记赋值导致的异常。这种方法还能防止看门狗复位问题,并提供了具体的汇编代码示例。
摘要由CSDN通过智能技术生成

在开发程序的时候,我们经常会希望某些全局变量在被使用时已经有想要的初始值,我们通常会用下面两种方法来实现变量的初始值赋值,

方法一:定义带初始值的全局变量

       例如:int temp1 = 0x00;

方法二:定义不带初始值的全局变量

       例如:int temp1;

       在main()函数初始化时给变量写初值

       例如:temp1= 0x00;

但如果很多的变量比如一个RAM section都要赋同一个初值,使用上面提到的两个方法就会比较繁琐。本文介绍方法可以快速实现这个功能。

此方法有以下几个特点:

  1. 不影响这个连续的RAM区间里的部分变量需要通过前面提到的方法一重新赋初值。

  2. 可以避免有时因为编程者的初心大意忘记给某些变量赋值而导致程序运行异常。

  3. 解决很多不了解C2000汇编指令用户实现此功能的困扰。

首先我们要了解C2000上电时的流程,下图为C2000 上电时从RAM或者FLASH 引导的流程图。

252a712ef51b528210e3ee99dca5a14c.png

   对于C2000 芯片来说程序的执行入口是在CMD 文件里面“codestart”这个段定义的,而在”XXXXXX_CodeStartBranch.asm”里面通过“.sect "codestart" ”语句将相应的跳转指令分配到了这个段。

通常“XXXXXX_CodeStartBranch.asm”文件内容如下:

4e3be953bf1ab7bbaf05a8289174fd7e.png

其中_c_int00 这个函数本体是在C2000编译器的RTS library里面,这个函数实现的功能是把用户定义的带初始值的全局变量的初始值的从FLASH搬运到RAM里面,从而实现初始值的传递,之后PC就会跳转到用户的main()入口。

因此我们需要在“LB _c_int00” 语句之前实现RAM section值的初始化。

假设我们需要对0x00000400为起始地址长度为0x200的RAM 区间进行初始化,初始值为0x00。

下面为具体实现代码:

   MOV       ACC, #00H                  ; initialed value

   MOVL      XAR5,  #400H                ;Dest address

   MOVL      XAR4,  #(200H-1)            ;length

RPT    @AR4   || MOV *XAR5++,      ACC

如果需初始化成其它值,将第一行 “#00H”更改为其它的值即可。

将代码放入“ XXXXXX_CodeStartBranch.asm ”下面蓝色部分位置即可。

eb94f167e8c8e009a0f8084f63a23eb2.png

注意事项:

1.本方法适用于所有C2000产品,不同芯片“ XXXXXX_CodeStartBranch.asm ”文件名不同,XXXXXX为芯片系列名。

2.因为C2000的看门狗上电时是默认开启的, 且溢出后会产生复位。为了确保在初始化RAM时不会产生看门狗复位,我们首先要先禁止看门狗,请确保“ WD_DISABLE      .set  1 ”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值