Holtek C Compiler V3 FAQ

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