作者:ti fae – johnson chen
在开发程序的时候,我们经常会希望某些全局变量在被使用时已经有想要的初始值,我们通常会用下面两种方法来实现变量的初始值赋值,
方法一:定义带初始值的全局变量
例如:int temp1 = 0x00;
方法二:定义不带初始值的全局变量
例如:int temp1;
在main()函数初始化时给变量写初值
例如: temp1= 0x00;
但如果很多的变量比如一个ram section都要赋同一个初值,使用上面提到的两个方法就会比较繁琐。本文介绍方法可以快速实现这个功能。
此方法有以下几个特点:
不影响这个连续的ram区间里的部分变量需要通过前面提到的方法一重新赋初值。
可以避免有时因为编程者的初心大意忘记给某些变量赋值而导致程序运行异常。
解决很多不了解c2000汇编指令用户实现此功能的困扰。
首先我们要了解c2000上电时的流程,下图为c2000 上电时从ram或者flash 引导的流程图。
对于c2000 芯片来说程序的执行入口是在cmd 文件里面“codestart”这个段定义的,而在”xxxxxx_codestartbranch.asm”里面通过“.sect codestart ”语句将相应的跳转指令分配到了这个段。
通常“xxxxxx_codestartbranch.asm”文件内容如下:
其中_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 ”下面蓝色部分位置即可。
注意事项:
1.本方法适用于所有c2000产品,不同芯片“xxxxxx_codestartbranch.asm”文件名不同,xxxxxx为芯片系列名。
2.因为c2000的看门狗上电时是默认开启的, 且溢出后会产生复位。为了确保在初始化ram时不会产生看门狗复位,我们首先要先禁止看门狗,请确保“ wd_disable .set 1 ”。
细节决定成败,PCB layout工程师的7个好习惯
场效应管的检测与测量
4美元的微控制器Pico与RP2040芯片
LCD液晶拼接与DLP背投及PDP等离子技术对比
面向制造的线束设计分析(DFM分析)
C2000芯片怎么给一个连续的RAM区间赋初值
基于RapidIO互连构架实现双主机节点通信系统的设计
越南疫情爆发,三星、英特尔、日本电产等大厂停工
深圳电信研究院WiFi联盟授权实验室正式成立
最高5588元的华为P10系列,这个价格是否是我们的心理价位
主流SSD研发中心选择PCIe Gen 4&5分析最关心哪几个点
运算放大器测试基础第1部分:电路测试主要运算放大器参数
深入读懂半导体存储技术及市场,鄙文即可!
浪潮视频转码加速方案,助力直播平台转码升级
铠侠、西部数据将共同设立一家控股公司“KIOXIA Holdings”
TCL推动Mini LED电视进入黄金发展期
CDN运作原理 CDN的特点总结
高压辅助三相电机驱动在混动/电动汽车的应用
水箱液位自动化PLC控制系统的说明
IBM 5大产品及解决方案问鼎年度至顶网凌云奖