Re: HI-TECH C Compiler Lite and PRO 轉換異常問題
|
||||
---|---|---|---|---|
版主
|
變數要不要賦予初始值是要看你的程式需求,如果是當旗號一般是要的,如果是當資料的 Buffer 那就不一定要給初始值。
當然對變數一開始就賦予初始值是比較好的作法而且是建議的。 有關 Hi-Tech PICC 對位元的宣告有三種方法,如想知道可以看一下 Hi-Tech PICC 的教育訓練教材。裡面有提到:
1. 與絕對位址變數共用
發表於: 2010/1/29 10:33
|
|||
|
Re: HI-TECH C Compiler Lite and PRO 轉換異常問題
|
||||
---|---|---|---|---|
中級會員
|
除了記憶體外,記得把bit宣告的記憶體空間也要設定初始值,我就是那邊沒初始才錯亂的
例1 bit _AC_fault; void main(void) { _AC_fault = 0; . . } 例2 union { unsigned ALL; struct { unsigned : 1; unsigned : 1; unsigned CHG1_AC_fault : 1; unsigned CHG1_Vtemp_bat_hi : 1; unsigned CHG1_Vtemp_hi : 1; unsigned CHG1_Vbat_hi : 1; unsigned CHG1_Run_order : 1; unsigned CHG1_Run_command : 1; }; }FLAGE_CHG; #define CHG_Errorbits FLAGE_CHG.ALL #define _AC_fault FLAGE_CHG.AC_fault #define _Vtemp_bat_hi FLAGE_CHG.Vtemp_bat_hi #define _Vtemp_hi FLAGE_CHG.Vtemp_hi #define _Vbat_hi FLAGE_CHG.Vbat_hi #define _Run_order FLAGE_CHG.Run_order #define _Run_command FLAGE_CHG.Run_command void main(void) { CHG_Errorbits = 0; . . }
發表於: 2010/1/29 10:10
|
|||
|
Re: HI-TECH C Compiler Lite and PRO 轉換異常問題
|
||||
---|---|---|---|---|
初級會員
|
參照:
感謝提供經驗,嚐試了一下,還是異常
發表於: 2010/1/29 9:13
|
|||
|
Re: HI-TECH C Compiler Lite and PRO 轉換異常問題
|
||||
---|---|---|---|---|
中級會員
|
我的也會出現異常
但只要再主程式最前面把所有變數再給初始值一次就OK了 假設主程式前的宣告 unsigned char MAIN_acc = 0; 在lite版本時都會自動幫我清為0 但我剛灌PRO版本時,也出現動作異常 我以為此變數為0了,但是我一開始去讀取的時候卻不為0,是亂碼 因此我改寫成 unsigned char MAIN_acc; void main(void) { MAIN_acc = 0; . . } 我把所有變數再給一次初始值就OK了,雖然麻煩但不這麼做好像感覺隨時產品出貨會有不踏實的感覺 我去年下載的時候是9.65版
發表於: 2010/1/29 8:11
|
|||
|
Re: HI-TECH C Compiler Lite and PRO 轉換異常問題
|
||||
---|---|---|---|---|
版主
|
好像 static 只對函數內產生的變數有用!?
ans: static 為靜態變數的宣告,僅用於函數內的變數宣告。 靜態變數的視野與區域變數是一樣的,只能在函數內部;但生命週期並不會隨函數執行結束而消失(保留下來)。 靜態變數的值存在於固定的記憶位址。 當該函數再次執行時,上次保留之變數值會繼續使用。 而 暫存器讀寫和中斷最好一定要用 volatile ? ans: volatile 所宣告的變數值不一定要經由程式來改變,變數本身會自行或隨外在因素而改變。尤其像是周邊湛存器及中斷所使用到的變數。 這樣是否只要把全域變數宣告成 => volatile unsigned cahr X; 就都能適用? ans: 是的,為避免變數被最佳化功能刪掉建議加上volatile 的宣告。
發表於: 2010/1/26 10:39
|
|||
|
Re: HI-TECH C Compiler Lite and PRO 轉換異常問題
|
||||
---|---|---|---|---|
初級會員
|
參照:
我原本只要是全域宣告都用 "static volatile unsigned" + 資料型態 但是我嘗試著把所有全域宣告都去掉 static volatile 發現執行狀況確實不一樣,不過動作還是不正確 是不是有的地方一定要用 static volatile 或是擇其一 是不是有的地方一定 static volatile 兩種都不能 + 請問對於同一變數 X 在全域宣告的時候以下四種有差別? unsigned cahr X; static unsigned cahr X; volatile unsigned cahr X; static volatile unsigned cahr X; 好像 static 只對函數內產生的變數有用!? 而 暫存器讀寫和中斷最好一定要用 volatile ? 這樣是否只要把全域變數宣告成 => volatile unsigned cahr X; 就都能適用?
發表於: 2010/1/25 16:09
Edited by picer999 on 2010年01月25日 19:53:43
|
|||
|
Re: HI-TECH C Compiler Lite and PRO 轉換異常問題
|
||||
---|---|---|---|---|
版主
|
Lite 版本不會對程式做最佳化的縮減,而 OCG 卻有全域性的最佳化功能。
所以在對變數宣告時要了解一下變數的性質,使用 Volatile 的宣告是有需要的尤其是對中斷裡所使用的變數。
發表於: 2010/1/25 11:46
|
|||
|
HI-TECH C Compiler Lite and PRO 轉換異常問題
|
||||
---|---|---|---|---|
初級會員
|
為了免除 (1273) Omniscient Code Generation not available in Lite mode (warning) 這個警告
於是移除 HI-TECH C Compiler for PIC10-12-16 MCUs V9.70 重新安裝選擇 45 天 PRO 模式試用 結果卻發生燒錄原本程式(設定也都沒變),但是所有動作都異常 再次移除 HI-TECH C Compiler ... 再次安裝回 Lite 同樣再燒錄原本程式,動作又都正常了 反覆再一次測試,也都是這樣的狀況 ... 一頭霧水 ... 請問我有哪邊疏失導致的嗎?
發表於: 2010/1/25 10:48
|
|||
|