在開發程序的時候,我們經常會希望某些全局變量在被使用時已經有想要的初始值,我們通常會用下面兩種方法來實現變量的初始值賦值,
方法一:定義帶初始值的全局變量
例如: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 ”。
審核編輯:郭婷
-
芯片
+關注
關注
455文章
50812瀏覽量
423583 -
看門狗
+關注
關注
10文章
562瀏覽量
70807 -
編譯器
+關注
關注
1文章
1634瀏覽量
49129
發布評論請先 登錄
相關推薦
評論