Holtek C Compiler V3 FAQ 版本 : V1.10 日期 : 2015-04-01 Holtek C Compiler V3 FAQ 用戶須知 1. 所有文檔均會過時,本文檔也不例外。Holtek 的工具和文檔將不斷演變以滿足客戶的需 求,因此實際使用中有些對話方塊和工具說明可能與本文檔所述之內容有所不同。請訪 問我們的網站(http://www.holtek.com/chinese/tech/tool/MCU_Tools_Users_Guide.htm)獲 取最新文檔。 2. 這里假定讀者已具備如下基本素質 : ● 知道如何編寫 C 程序 ● 已經閱讀并理解所使用單片機的數據手冊 Rev.1.10 2 2015-04-01 Holtek C Compiler V3 FAQ 目录 Part I V3 基本介紹 .......................................................................................................5 1.1 V3 的版本歷程 ?.............................................................................................................. 5 1.2 新版改進的功能 .............................................................................................................. 5 1.3 V3 的使用手冊有哪些 ?.................................................................................................. 5 1.4 V3 不支援的 MCU 有哪些 ? .......................................................................................... 6 1.5 什麽是長指令架構 MCU? .............................................................................................. 6 Part II V3 與 V2 的不同 ...............................................................................................7 2.1 V3 與 V2 語法有何不同 ? 與 V1,V2,標準 C 的比較 ?............................................ 7 2.2 V3 對 V2 改進的功能 ..................................................................................................... 7 2.3 將 V2 程式改至 V3 常見的錯誤 .................................................................................... 7 2.3.1 ISR warning ............................................................................................................... 7 2.3.2 內嵌彙編 error ........................................................................................................... 8 2.3.3 bit 變數 error .............................................................................................................. 8 2.3.4 標誌位元 error ........................................................................................................... 8 2.3.5 內建函式 error ........................................................................................................... 8 2.3.6 絕對位址變數 error ................................................................................................... 9 2.3.7 函式指標 error ........................................................................................................... 9 Part III V3 的特殊語法及用法 ..................................................................................10 3.1 如何將一個變數定義于指定 bank?.............................................................................. 10 3.2 如何將函式定義于指定地址 ? ..................................................................................... 10 3.3 如何在 V3 中使用混合語言 (mixed language)? .......................................................... 10 3.4 V3 代碼生成器 .............................................................................................................. 10 Part IV V3 常見的 error,warning 及其解決方式 .................................................12 4.1 error “multi-ram-bank should be equipped with mp1” .............................................. 12 4.2 error “internal compiler error:xxxx” ....................................................................... 12 4.3 error (L1038)“RAM (bank0) overflow, memory allocation fails for section ….” ..... 12 4.4 error (L1038)“ROM/RAM (bank*) overflow, memory allocation fails for section ….” .............................................................................................................................................. 12 4.5 warning (L3010) (absolute address: xxh, length: x) is overlay with (absolute address: xxh, length: x) ........................................................................................................................ 12 4.6 warning (L3009): Same sub function exists between ISR(04H) CMG and MAIN CMG: _func ................................................................................................................... 12 Part V V3 常見的問題及其解決方式 ........................................................................13 5.1 如何在 V3 使用 bit 變數 ? ............................................................................................ 13 5.2 如何在 V3 使用外部定義 bit 變數 ? ............................................................................ 13 5.3 程式 reset 后,變數被清 0 的解決方式 ? .................................................................... 13 5.4 指定位址的變量,其他文件如何引用 ? ..................................................................... 14 5.5 對于寫 EEPROM 有限制的 MCU( 需連續 set wren, wr, flag),如何使用 V3 寫 EEPROM? ..................................................................................................................... 14 5.6 使用 V3 給 bit flag 賦值變數的注意事項 .................................................................... 16 5.7 在 V3 使用 ROM BP 的注意事項 ................................................................................ 17 5.8 混合語言使用 ROM BP 的注意事項 ........................................................................... 18 Rev.1.10 3 2015-04-01 Holtek C Compiler V3 FAQ 5.9 如何使用 CMD 命令編譯 C 工程? ............................................................................ 18 Part VI V3 常見的優化問題 .......................................................................................19 6.1 使用 V3 優化參數后,在 watch window 上看不到某些變數的 debug 信息 ? ......... 19 6.2 中斷與一般函數訪問同一個全域變數,此全域變數的相關語句被優化掉 ? ......... 19 6.3 V3 的優化功能及其對 debug 的影響 ? ........................................................................ 20 6.4 使用 V3 compiler, debug 時行號出錯 ? ........................................................................ 20 6.5 使用 V3 compiler,用於延時的循環代碼被優化,怎麼解決 ? ................................ 21 6.6 使用內嵌彙編,被優化掉 ? ......................................................................................... 22 Rev.1.10 4 2015-04-01 Holtek C Compiler V3 FAQ Part I V3 基本介紹 1.1 V3 的版本歷程 ? A: Release 日期 2012/12 2013/10 2014/03 2014/09 2015/01 V3 Compiler 版本號 C Compiler V3.10 C Compiler V3.20 C Compiler V3.30 C Compiler V3.31 C Compiler V3.40 對應的 IDE 版本號 HT-IDE30007.7 HT-IDE30007.8 HT-IDE30007.82 HT-IDE30007.85 HT-IDE30007.86 1.2 新版改進的功能 A: V3.40 比 V3.31 改進的功能 ● 修改 V3.31 的所有已知 bug ● 優化長指令 MCU 的 RAM 空間分配,詳見《C Compiler V3 使用手冊》10.1 節 V3.31 比 V3.30 改進的功能 ● 支援入口函數與 main 函數不在一個檔案 ● 修改 const array 作為函數參數的 bug ● 增加 GCC_DELAY(n) 內建函數,詳見《C Compiler V3 使用手冊》2.2.3 節 V3.30 比 V3.20 改進的功能 ● 新增支援指定程式入口函數,詳見《C Compiler V3 使用手冊》2.2.9 節 ● 修改 startup 程式,避免使用 TABRD 指令 ● 當函數參數缺少類型時報錯 V3.20 比 V3.10 改進的功能 ● 支援 float/double 數據類型,以及 C Standard library ● 支援長指令架構的 MCU,如 HT66F70A ● 支援 const 變數指定地址,詳見《C Compiler V3 使用手冊》2.2.7 節 ● 支援 function 指定地址,詳見《C Compiler V3 使用手冊》2.2.8 節 ● 兼容 V2 版本的內嵌彙編語法 1.3 V3 的使用手冊有哪些 ? A:http://www.holtek.com.tw/Chinese/news/products/toolsnews.htm 《V2 轉 V3 注意事項》( 已并入本文檔 ) 《Holtek C V3 使用注意事項》( 已并入 V3 使用手冊 ) 《C Compiler V3 使用手冊》 IDE 目錄下的《標準函數庫使用手冊》(v3.20 支援 ) Rev.1.10 5 2015-04-01 Holtek C Compiler V3 FAQ 1.4 V3 不支援的 MCU 有哪些 ? A:V3 不 支 援 MP 只 有 7bit 的 MCU, 其 型 號 如 下 列 表, 長 指 令 的 MCU 只 有 V3.20 以上版本支援 HT45F2Y HT45R04 HT45R0G HT45R34 HT45R35 HT45R35V HT45R36 HT45F39 HT46C22 HT46R22 HT46C46E HT46R46E HT46C47 HT46R47 HT46C47E HT46R47E HT46C48AE HT46R48AE HT46C62 HT46R62 HT46F46E HT46F47E HT46F48E HT46R002 HT46R003 HT46R003B HT46R02 HT46R004 HT46R005 HT46R01A HT46R064 HT46R064B HT46R064D HT46R064G HT46R12A HT46R32 HT46R321 HT46R322 HT46R46 HT46R46-H HT46R47-H MCU name HT46R48A HT48R005 HT46R51 HT48R006 HT46R52 HT48R01A HT46R53 HT48R02 HT46R54 HT48R063 HT46R71D HT48R063B HT46R71D-1 HT48R064 HT46R72D-1 HT48R064B HT46R72D-1A HT48R064D HT46R73D-1 HT48R064G HT46R73D-1A HT48R07A-1 HT46R74D-1 HT48R08A-1 HT46RU22 HT48R09A-1 HT46R92 HT48R52 HT48C05 HT48R52A HT48R05A-1 HT48R53 HT48C06 HT48RA0-5 HT48R06A-1 HT48RA0-6 HT48C062 HT49C10-1 HT48R062 HT49C30-1 HT48C10-1 HT49R30A-1 HT48R10A-1 HT49C30L HT48C30-1 HT49CA0 HT48R30A-1 HT49RA0 HT48CA0 HT49RA0-6 HT48RA0A HT49R10A-1 HT48CA0-1 HT56R22 HT48RA0-1 HT56R62 HT48CA0-2 HT66F002 HT48RA0-2 HT66F003 HT48CA0-3 HT66F03 HT48RA0-3 HT66F03C HT48CA6 HT66F03M HT48E06 HT66F03T3 HT48E10 HT66F13 HT48E30 HT66F20 HT48F06E HT66F23D HT48F10E HT66F30 HT48F30E HT66FB30 HT48R002 HT66FU30 HT48R003 HT68F002 HT68F003 HT68F03 HT68F03C HT68F03M HT68F03T3 HT68F13 HT68F20 HT68F30 HT68FB30 HT68FU30 HT82J97A HT82J97E HT82K72A HT82M39 HT82M39B HT82M72A HT82M98 HT82M99A HT82M99E HT82M99AE HT82M99EE HT83020 HT83F10 HT83F20 HT83F40 HT83F60 HT83F80 HT83P00-1 HT83R00 1.5 什麽是長指令架構 MCU? A:具有 LMOV,LSET 等長指令(長度為 2word)的 MCU,如 HT66F70A,一顆 MCU 是否有長指令指令,可以查看它的 datasheet,是否有 LMOV 等長指令, 每條長指令比對應的普通指令增加 1 個指令週期。 Rev.1.10 6 2015-04-01 Holtek C Compiler V3 FAQ Part II V3 與 V2 的不同 2.1 V3 與 V2 語法有何不同 ? 與 V1,V2,標準 C 的比較 ? A:V3 與 V2 主要是絕對位址變數,中斷語法,bit 變數,內嵌彙編等語法不同, 詳見《C Compiler V3 使用手冊》第 2.2 節 V3,V2,V1 與標準 C 的比較表見《C Compiler V3 使用手冊》第四章 2.2 V3 對 V2 改進的功能 A: V3 V2 支援初始化詳 《C Compiler V3 使用手冊》2.2.4 節 支援最大 size 64page 支援 extern const const 變數 支援 const 變數指定位址,詳見 《C Compiler V3 使用手冊》2.2.7 節 陣列 支援三維以上陣列 可以調用函數,詳見 中斷向量 《C Compiler V3 使用手冊》2.2.1 節 支援設定入口函數屬性,詳見 函數 《C Compiler V3 使用手冊》2.2.9 節 全域變數 不支援初始化 size 超過 1page 有可能出錯 只支援二維以下 不能調用函數 不支援入口函數 2.3 將 V2 程式改至 V3 常見的錯誤 2.3.1 ISR warning e.g. #pragma vector Int_isr @ 0x04 void Int_isr() {} warning: ignoring #pragma vector Int_isr [-Wunknown-pragmas] 解決方式: 使用正確的中斷函式語法: void __attribute((interrupt(0x04))) Int_isr() {} 詳見《C Compiler V3 使用手冊》2.2.1 節 注意: i:因為是 warning,如果不修改也可以編譯通過,只是編譯器會將它當一般函 式處理,而不是中斷函式 ii:#pragma 的其他關鍵字 rambank/function 等,也會報此 warning,表示在 V3 版此功能無效。 Rev.1.10 7 2015-04-01 Holtek C Compiler V3 FAQ 2.3.2 內嵌彙編 error e.g. #asm nop #endasm error: invalid preprocessing directive #asm error: invalid preprocessing directive #endasm 解決方式: 選擇參數“相容 Holtek C V2 內嵌組合語言” 詳見語法書《C Compiler V3 使用手冊》2.2.5 節 2.3.3 bit 變數 error e.g.bit a; error: unknown type name 'bit' 解決方式: 用結構體位域定義 bit 變數 typedef struct { unsigned char bit0 unsigned char bit1 unsigned char bit2 unsigned char bit3 unsigned char bit4 unsigned char bit5 unsigned char bit6 unsigned char bit7 }bit_type; bit_type bit_var; #define a bit_var.bit0 : : : : : : : : 1; 1; 1; 1; 1; 1; 1; 1; 詳見《C Compiler V3 使用手冊》2.2.3 節 2.3.4 標誌位元 error e.g. _40_1 = 1; error: '_40_1' undeclared (first use in this function) 解決方式:用結構體位域定義 bit flag bit_type bit_var __attribute__ ((at(0x40))); #define _40_1 bit_var.bit1 詳見《C Compiler V3 使用手冊》2.2.3 節 2.3.5 內建函式 error e.g. _nop(); Error(L2001): Unersolved external symbol '__nop' in file 解決方式: 改成: #include “ht66f50.h” GCC_NOP(); 詳見《C Compiler V3 使用手冊》2.2.3 節 Rev.1.10 8 2015-04-01 Holtek C Compiler V3 FAQ 2.3.6 絕對位址變數 error e.g. unsigned char a @ 0x40; error: stray '@' in program error: expected '=', ',' , ';' , 'asm' or '__attribute__' before numeric constant 解決方式: 改成以下語法: volatile static unsigned char var_name __attribute__ ((at(0x40))); 詳見《C Compiler V3 使用手冊》2.2.2 節 2.3.7 函式指標 error e.g. void FileFunc(){} void EditFunc(){} void main() { typedef void (*funcp)(void); funcp pfun= FileFunc; pfun(); pfun = EditFunc; pfun(); } error: incompatible types when initializing type 'funcp' using type 'void()' error: incompatible types when assigning to type 'funcp' from type 'void()' 解決方式:目前 V3 尚不支援 function pointer Rev.1.10 9 2015-04-01 Holtek C Compiler V3 FAQ Part III V3 的特殊語法及用法 3.1 如何將一個變數定義于指定 bank? A:若是無長指令架構的 MCU,只能將變數定義在指定地址,如: volatile static unsigned char var_name __attribute__ ((at(0x140))); 詳見《C Compiler V3 使用手冊》2.2.2 節 若 是 長 指 令 架 構 的 MCU, 無 需 特 別 指 定,linker 會 自 動 分 配 變 數 到 任 意 bank。 3.2 如何將函式定義于指定地址 ? A:IDE 7.8 以上版本才支援此功能,語法: char __attribute__((at(0x373))) foo (char parm) {} 表示將函數 foo 指定在地址 0x373。詳見《C Compiler V3 使用手冊》2.2.6 節 3.3 如何在 V3 中使用混合語言 (mixed language)? A:參考《C Compiler V3 使用手冊》第 2.5 節 3.4 V3 代碼生成器 為協助用戶更好的使用 V3 專用語法,IDE3000 7.83 以上版本增加工具“V3 代 碼生成器”,位于菜單欄 → 工具 → V3 代碼生成器。它可以成生 bit 變數,中 斷語法,絕對位址變數,內嵌彙編,delay 函數及指定其它 bank 的變數等語法, 具體可查看 HT-IDE3000 使用手冊第三章“V3 代碼生成器”部份。 Rev.1.10 10 2015-04-01 Holtek C Compiler V3 FAQ Rev.1.10 11 2015-04-01 Holtek C Compiler V3 FAQ Part IV V3 常見的 error,warning 及其解決方式 4.1 error “multi-ram-bank should be equipped with mp1” A:請確認 MCU 是否為長指令架構,若是,請使用 IDE7.8 以上版本 4.2 error “internal compiler error:xxxx” A:compiler 內部錯誤,請與 Holtek 公司返饋 4.3 error (L1038)“RAM (bank0) overflow, memory allocation fails for section ….” A:對于短指令架構的 MCU,C Compiler 會默認把變數配置到 RAM bank0 ( 長指 令的 MCU 可以自動配置到任意 bank,當 bank0 滿了之后,會報 RAM bank 0 overflow 出現此信息,做法如下: ● 確認 unsigned int/long 類型的大小 ( 特別是從 V1 C Compiler 移植過來的程式 ) ● 若為 multi RAM bank MCU,可手動將全域變數調到其它 bank,參考 3.1 4.4 error (L1038)“ROM/RAM (bank*) overflow, memory allocation fails for section ….” A:ROM 或 RAM 空間不夠出現此信息后,做法如下: ● 檢查是否打開優化參數 -Os,參考《C Compiler V3 使用手冊》2.1.4 節 ● 刪減不必要的程式 4.5 warning (L3010) (absolute address: xxh, length: x) is overlay with (absolute address: xxh, length: x) A:出現此 warning 的情況: 不同變數定義的位址重疊,如下,_b 與 _a 位址重疊,需將 _b 定義在 0x0142 DEFINE_SFR(unsigned int _a, 0x0140); DEFINE_SFR(unsigned char _b, 0x0141); //error 4.6 warning (L3009): Same sub function exists between ISR(04H) CMG and MAIN CMG: _func A: 中斷服務程式(04H)與主函式共同調用子函式 func,解決方式: ● 若在子函式 func 執行過程中不會進入 04 中斷,可忽略此 warning ● 否則避免共同調用 詳見《C Compiler V3 使用手冊》2.2.1 節 Rev.1.10 12 2015-04-01 Holtek C Compiler V3 FAQ Part V V3 常見的問題及其解決方式 5.1 如何在 V3 使用 bit 變數 ? A:詳見《C Compiler V3 使用手冊》2.2.3 節標誌位的定義 5.2 如何在 V3 使用外部定義 bit 變數 ? A: i:在頭文件中定義結構體類型,及巨集定義: typedef struct { unsigned char bit0 : 1; unsigned char bit1 : 1; unsigned char bit2 : 1; unsigned char bit3 : 1; unsigned char bit4 : 1; unsigned char bit5 : 1; unsigned char bit6 : 1; unsigned char bit7 : 1; }bit_type; #define bit0 bit_var.bit0 #define bit1 bit_var.bit1 ii:在 .c 中 include 這個頭文檔,并定義結構體類型: bit_type bit_var; iii:在其他使用到此變數的 .c 文件中 Include 這個頭文檔,并聲明變數: extern bit_type bit_var; 5.3 程式 reset 后,變數被清 0 的解決方式 ? A:IDE7.8 版本將提供選擇不初始化的方式:不選擇下面選項“將未初始化的…” 即可。 Rev.1.10 13 2015-04-01 Holtek C Compiler V3 FAQ 5.4 指定位址的變量,其他文件如何引用 ? A:因指定位址的變數 ( 非 const) 需定義成 static,其它作用域只在本文件,所以可 以將其定義在頭文件裏面,若有其它文件需要用到,直接 include 這個頭文件 即可,例: //Define_var.h static volatile unsigned //test1.c #include “Define_var.h” void foo1() { var1 = 1; } //test2.c #include “Define_var.h” void foo2() { var1 = 2; } var1 __attribute__ ((at(0x180))); 注:若是 const 變數,不需要定義成 static,用 extern 即可,例: //test1.c const int __attribute__((at(0x3400))) bb[3]={1,2,3}; //test2.c extern const int bb[3]; int b; void fun() { b=bb[2]; } 5.5 對于寫 EEPROM 有限制的 MCU( 需連續 set wren, wr, flag),如何使用 V3 寫 EEPROM? A: i:在 V3 中,因為 _rden 與 _rd 是在 bank1,使用長指令,與 datasheet 所規定的 指定不同 ii:這種對指令有嚴格要求的功能,建議使用內嵌彙編達成,因為 C 不敢保證 按特定的方式翻譯。 iii:若要產出與 datasheet 中的連續指令,V3 需改成如下寫法: Rev.1.10 14 2015-04-01 Holtek C Compiler V3 FAQ Rev.1.10 15 2015-04-01 Holtek C Compiler V3 FAQ 5.6 使用 V3 給 bit flag 賦值變數的注意事項 範例: unsigned char flag; _pa2=flag; 編譯器翻譯出的 asm: CLR PA2 SZ _flag SET PA2 而不是: SZ _flag JMP L1 CLR PA2 JMP L2 L1: SET PA2 L2: 說明: 編譯器只關心計算的結果,而不管計算過程,為減少 CODE 的指令輸出,編譯 器會翻譯左邊的指令。 C 語言與彙編不同的是,一條語句不只翻譯出一條指令,所以在語句執行結束 前,計算未完成。 影響: 不管 flag 值為多少,PA2 都會被先 CLR,如果在此時進入中斷,而中斷中有用 到 PA,則會影響到执行結果。 解決方式: ● 在 bit 賦值前先把中斷關掉,等計算完后再打開 總結: 多字節變數的計算,如果中斷中有判斷此變數,在計算未完成前,都不可進入 中斷。 Rev.1.10 16 2015-04-01 Holtek C Compiler V3 FAQ 5.7 在 V3 使用 ROM BP 的注意事項 對于多 ROM BANK MCU,若整個工程都用 C 語言寫,那么,任何時候,用戶 都不需要設定 ROM BP,Linker 會自動設置 ROM BP,特別注意,若用戶在程 式中改動到 ROM BP,那么程式將有可能跑飛,用戶需特別小心,在設置 RAM BP 時,也應注意不要用到 ROM BP。若工程使用混合語言編程,用 C 函數 call 彙編 section 時,應使用 C 語言或 fcall,在彙編 section call C 函數時,需在 CALL 前設 BP,前在 CALL 之后恢復 BP。 範例: ;;Test1.asm extern _fun2:near public _fun1 _fun1 .section ‘code’ _fun1 proc mov a, bank _fun2 mov [04H],a ;; 假設 ROM BP 在 04h call _fun2 mov a,bank_fun1 mov [04H],a _fun1 endp //Test2.c extern void FUN1(); // 或者 asm(“extern _FUN1:near”); void main() { FUN1(); // 或者 asm(“fcall _FUN1”); } void fun2() {} Rev.1.10 17 2015-04-01 Holtek C Compiler V3 FAQ 5.8 混合語言使用 ROM BP 的注意事項 參考 5.7 節 5.9 如何使用 CMD 命令編譯 C 工程? Compiler,assembler,linker 的參數詳見《V3 C Compiler 使用手冊》附錄 C 例: a. 設置環境變數: set HTCFG=C:\Program Files\Holtek MCU set HTBIN=C:\Program Files\Holtek MCU set HTINCLUDE=C:\Program Files\Holtek x\INCLUDE_V3 set HTLIB=C:\Program Files\Holtek MCU b. 編譯 .c 文件 …\hgcc32.exe …\hgcc32.exe Development Tools\HT-IDE3000V7.x\MCU Development Tools\HT-IDE3000V7.x\BIN MCU Development Tools\HT-IDE3000V7. Development Tools\HT-IDE3000V7.x\LIB t1.c –g –Os –I “%HTINCLUDE%” -o t1.asm t2.c –g –Os –I “%HTINCLUDE%” –o t2.asm c. 編譯 .asm 文件 …\hasmgcc32.exe /hide=12345678 /chip=HT66F50 /z t1.asm t1.obj …\hasmgcc32.exe /hide=12345678 /chip=HT66F50 /z t2.asm t2.obj d. Link 所有 obj,lib 產生 .tsk 文件 …\hlinker32.exe /HIDE=12345678 /ERRORLOG=“C:\error.log” /m @ “C:\linktest.bat” Link-test.bat 內容: “t1.obj”+ “t2.obj”, “test.tsk”, “test.map”, “test.dbg”, “math6.lib”; Rev.1.10 18 2015-04-01 Holtek C Compiler V3 FAQ Part VI V3 常見的優化問題 6.1 使用 V3 優化參數后,在 watch window 上看不到某些變數的 debug 信息 ? A:因啟用優化參數,變數有可能被優化刪除,故沒有 debug 信息,若要在 debug 時觀察變數值,可以將此變數暫時定義為 volatile,debug 結束后再刪去,比如: volatile int I, j, k; 6.2 中斷與一般函數訪問同一個全域變數,此全域變數的相關語句被優化掉 ? A:一般函數與中斷沒有調用關係,Compiler 不知中斷何時發生,會影響到一般函 數中的變數,因此,建議將此變數用 volatile 修飾,比如: Flag 在 中 斷 ISR_INT0 中 使 用 到, 又 在 Main 函 數 中 用 到, 則 應 定 義 成 volatile: volatile unsigned char flag; 說明:volatile:一個類型修飾符(type specifier)。它是被設計用來修飾被不同 函數訪問和修改的變數,使用 volatile 修飾的變數,不會因編譯器的優化 而被省去。 建議定義成 volatile 的變數:特殊寄存器,中斷函式使用到的變數,為某些特殊 用途的代碼定義的變數 ( 比如 delay 功能 )。 其它一般變數不建議定義成 volatile,這樣會大大降低編譯器的優化功能。 Rev.1.10 19 2015-04-01 Holtek C Compiler V3 FAQ 6.3 V3 的優化功能及其對 debug 的影響 ? A:詳見《C Compiler V3 使用手冊》第 3 章 6.4 使用 V3 compiler, debug 時行號出錯 ? A:可能出現的情況: a. 某些語句被優化掉而不譯出 code,自然也沒有 debug 資訊。 b. 幾條語句翻譯出同一堆的 code,只顯示一條 line number。 這些情況會可能會影響 debug,但執行結果不會出錯,若不是這兩種情況,請 回報。 Rev.1.10 20 2015-04-01 Holtek C Compiler V3 FAQ 6.5 使用 V3 compiler,用於延時的循環代碼被優化,怎麼解決 ? A:如下: 解決方法:將變數定義為 volatile,如下: Rev.1.10 21 2015-04-01 Holtek C Compiler V3 FAQ 6.6 使用內嵌彙編,被優化掉 ? 如下: asm(“mov %0,a”:”=m”(i));// 表示把 acc 的值賦給 i, 因為之后變數 i 沒有被用到,所以這條語句被編譯器優化掉, 編譯后 如果要保留,可以改成: asm volatile (“mov %0,a”:”=m”(i)); 防止被優化 Rev.1.10 22 2015-04-01 Holtek C Compiler V3 FAQ Copyright© 2015 by HOLTEK SEMICONDUCTOR INC. 使用指南中所出現的資訊在出版當時相信是正確的,然而盛群對於說明書的使用不負任何責任。文 中提到的應用目的僅僅是用來做說明,盛群不保證或表示這些沒有進一步修改的應用將是適當的, 也不推薦它的產品使用在會由於故障或其它原因可能會對人身造成危害的地方。盛群產品不授權使 用於救生、維生從機或系統中做為關鍵從機。盛群擁有不事先通知而修改產品的權利,對於最新的 資訊,請參考我們的網址 http://www.holtek.com.tw. Rev.1.10 23 2015-04-01