盛群半導體股份有限公司
HOLTEK SEMICONDUCTOR INC C50 微電腦工具事業處部 文 件 編 號 撰 寫 人 : 版 別 1.20 日 期 2008/5/26 第 36 頁 共 189 頁
中斷服務函式會保存的暫存器內容包括 累加暫存器(accumulator, ACC), 狀態暫存器 (status, S), 記憶體區塊指標 (bank pointer, BP), 間接位址指標 (MP0, IAR0) 以及在算術運算 中使用的中間變數 (以 T 開頭的, 例如 T2, T3,…). 這些暫存器或中間變數將會保存於對應 的變數, V1A, V1S, V1BP, V1MP0, V1MP1, V1T2, V1T3,…(中斷向量一), V2A,V2S,V2BP, V2MP0,V2MP1,V2T2,V2T3,… (中斷向量二), 其他的累推. 如果微控制器不具有 BP, MP1的 則不需要保存這些暫存器的內容. 雖然不同的中斷事件可以重疊發生, 但是同一個中斷事件 並不可以重疊產生, 必須等候前一個發生被處理完成後, 才能認可下一個中斷事件. 可以在 中斷服務函式中將同一個中斷除能 (disable interrupt)
如果微控制器中不同類的中斷事件不可重疊發生, 則 Holtek C compiler 可以只使用一組記 憶體空間保存這些暫存器的內容, 但是必須在定義中斷服務函式的程式中指明之. (使用 #pragma novectornest) 而在中斷服務函式中要將中斷功能停止 (disable interrupt, _emi=0)
在 C 語言程式中嵌入組合語言 (in-line assembly code)
如果想要讓編譯後的程式碼更為精簡, 執行上更有效, 可以在C程式中加入組合語言的指令. 格式如下
#asm
組合語言指令 ……
組合語言指令 #endasm
#asm 與 #endasm 是前置處理指令, 指示 C 編譯器將其中的組合語言指令取出 當做輸出的執行碼
在 C 語言的條件結構中, 如 if, while, do 之類, 不要使用 #asm block 的格式去內嵌 組合語言指令.
前置處理指令 (Preprocessor)
前置處理指令是以 # 為字首的文字串, 程式中所有的前置處理指令會最先被前置處理器
盛群半導體股份有限公司
HOLTEK SEMICONDUCTOR INC C50 微電腦工具事業處部 文 件 編 號 撰 寫 人 : 版 別 1.20 日 期 2008/5/26 第 37 頁 共 189 頁
(preprocessor) 處理. 這些指令提供的功能有定義文字符號 (define), 巨集指令 (macro), 引入檔案 (include file), 條件式編譯 (conditional compiler) 與特殊選項 (pragma)
4.9.1 定義文字符號 (#define)
→ #define 語法 :
#define sym_name replaced_text
說明 : 定義 sym_name 為 replaced_text. 而 replaced_text 可以是數值, 運算式 或文
字串. 前置處理器會將程式中所有含 sym_name 的敘述, 更換成 replaced_text.
範例 :
#define TOTAL_COUNT 40 #define PA0
_12_0
→ #undef
語法:
#undef sym_name
說明 : 取消先前定義的文字符號或前置處理巨集 範例 :
#undef PA0 // 取消先前定義的 PA0
引入檔案 (#include) → #include 語法:
#include “file_name” 或 #include
說明 : 將指定檔案的內容嵌入所在的程式處.
當 file_name 以雙引號 “ 包含時, 編譯器先到工作目錄中找尋此檔, 若找不到, 則到目前的目錄找尋, 若找不到就發出錯誤訊息
當 file_name 是以角號 < > 包含時, 則只到環境參數設定的目錄中去找尋
內嵌組合語言 (inline assembly) → #asm
#endasm
盛群半導體股份有限公司
HOLTEK SEMICONDUCTOR INC C50 微電腦工具事業處部 文 件 編 號 撰 寫 人 : 版 別 1.20 日 期 2008/5/26 第 38 頁 共 189 頁
語法 :
#asm
組合語言的指令, 例如 MOV A, 1 #endasm
說明 : 在 #asm 與 #endasm 之間嵌入組合語言指令. 範例 : #asm
AND A, 0Fh SUB A, 09h #endasm
4.9.4 條件式編譯 (#if/#endif)
→ #if #else 語法:
#if expression statements1 ; [#else
statements2 ; ] #endif
說明 : 控制編譯器體有條件地編譯程式. 當 expression 為真時, statements1 的 程
式會被編譯, 否則 statements1 會被忽略, 若有 #else 部分, 則會編譯 statements2. #else 部分可有可無, 視需要
範例 :
#if MODE > 0
#define DISP_MODE MODE #else
#define DISP_MODE #endif
#endif
7
→ #ifdef
語法 :
#ifdef symbol
statements1 ; [ #else
盛群半導體股份有限公司
HOLTEK SEMICONDUCTOR INC C50 微電腦工具事業處部 文 件 編 號 撰 寫 人 : 版 別 1.20 日 期 2008/5/26 第 39 頁 共 189 頁
statements2 ; ] #endif
說明 : 如果 symbol 在前面已被定義 (用 #define ), 則 statements1 被編譯, 否則
會編譯 statements2. #else 部分可有可無
→ #ifndef
語法 :
#ifndef symbol
statements1 ; [ #else
statements2 ; ] #endif
說明 : 與 #ifdef 相反, 如果 symbol 在前面未被定義, 則 statements1 被編譯, 否則
會編譯 statements2. #else 部分可有可無
→ #elif
語法 :
#if expression1
statements1 ; #elif expression2
statements2 ; #endif
說明 : 如果 expression 為真, 則 statements1 被編譯, 否則若 expression2 為真, 則
會編譯 statements2. #elif 是 #else #if 的縮寫
前置處理指令 #asm 功能 指示在此行之後是”內嵌組合語言 的指令” (in-line assembly) #define 定義符號或前置處理的巨集指令 範例 #asm add a, 1 #endasm #define COUNT 20 #define OK #define add(a,b) ((a)+(b)) #elif 是 #else #if 的縮寫 參看 #ifdef
盛群半導體股份有限公司
HOLTEK SEMICONDUCTOR INC C50 微電腦工具事業處部 文 件 編 號 撰 寫 人 : 版 別 1.20 日 期 2008/5/26 第 40 頁 共 189 頁 #else #endasm #endif #error #if 定義 “條件不成立的”原始程式行 指示 ”內嵌組合語言指令” 的結束 參看 #if 參看 #asm 結束 “條件型的原始程式行” 的嵌入 參看 #if 產出錯誤訊息 定義 “條件成立的” 原始程式行 如果條件成立, 則將其後的原始程 式行嵌入到程式中 #error Size too big #if tick < 10 tick++ ; #else tick = 0 ; #endif 如果前置處理符號已定義, 則將其後 的原始程式行嵌入 #ifdef #ifdef COUNT delay() ; #else nothing() ; #endif #ifndef 如果前置處理符號未定義, 則將其後 的原始程式行嵌入 #ifndef COUNT nothing() ; #endif #include “ht46R23.h” 參看本節說明 #include #pragma #undef
將標頭檔的內容嵌入 編譯器的特殊選項 取消先前定義的符號或前置處理巨集 #undef COUNT 4.9.5 編譯器的特殊選項 pragma
格式
#pragma keyword [ options ]
某些 keyword 會有 options, 表格列出 pragma 的 keywords
keyword bp_free bp_nofree function nobp options 功能說明 函式中不做 BP 暫存器的改變 ? 取消函式中不做 BP 暫存器改變的功能 ? V 設定函式被安置的 ROM 位址 中斷服務函式中不儲存 BP 暫存器的內容 ?
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库合泰单片机C语言教程(8)在线全文阅读。
相关推荐: