盛群半導體股份有限公司
HOLTEK SEMICONDUCTOR INC C50 微電腦工具事業處部 文 件 編 號 撰 寫 人 : 版 別 1.20 日 期 2008/5/26 第 16 頁 共 189 頁 double
32 real -3.48e-38 ~ 3.48e+38 * * float, double 皆使用 IEEE754 32 位元的格式 4.3.3 變數的有效範圍 (scope)
根據變數定義的所在? 決定此變數的有效範圍. 可分為 → 區域變數 (local variable)
定義在程式區塊內 (program block, 例如函式)的變數皆是區域變數. 只有當此程式 區塊被執行時, 區域變數才會有效, 而在執行完畢並離開此程式區塊後, 這些區域 變數將無效. 程式區塊是指包含在左右大括號 ?{? 及 ?}? 之間的敘述行 定義在函式中的 static 變數則是全域變數, 參考 4.3.2 說明 → 全域變數 (global variable)
定義在所有函式之外的變數為全域變數. 當程式在執行時, 此變數皆有效, 任何函 式都可以存取或修改這個變數
範例
#include “ht48r50a-1.h” unsigned char flag ; void main(void) {
char type ; static status = 0 ; …… }
4.3.4 變數的資料型態 (data type)
當宣告變數時,必須指定它的資料型態, 以告知編譯器此變數所需記憶體的大小. 資料型態分為整數型(integer type)及浮點數型 (floating point type). 整數型又可區分為 有正負號 (signed) 及無正負號 (unsigned).
整數型 (integer) → char
佔用一個位元組 (byte) 的記憶體空間. 如加上 signed 則表示有正負號, 其大小
// 區域變數, 只有在此函式被執行時才有效 // static 變數, 只在第一次執行時設為 0 // 全域變數
盛群半導體股份有限公司
HOLTEK SEMICONDUCTOR INC C50 微電腦工具事業處部 文 件 編 號 撰 寫 人 : 版 別 1.20 日 期 2008/5/26 第 17 頁 共 189 頁
範圍是 –128 到 127. 若加上 unsigned, 則表示沒有正負號, 其大小範圍是 0 到 255. 如果沒有 signed 或 unsigned, 則被視為 signed. 可用此型態定義字元, 如 ?A?, ?d?, ?$?, ?3? 等 → short
佔用兩個位元組 (2 bytes) 的記憶體空間, 如加上 signed 則表示有正負號, 其大小 範圍是 –32768 到 32767. 若加上 unsigned, 則表示沒有正負號, 其大小範圍是 0 到 65535. 如果沒有 signed 或 unsigned, 則被視為 signed.
Holtek C 採用 little-endian 格式, 就是變數的低位元組 (least significant byte) 存 放在記憶體的低位址. 例如變數 count = 0x1234 是存放於記憶體 40H 的位址, 則低位元組的數值 0x34 存放於位址 40H, 高位元數值 0x12 存放於位址 41H. → int
與 short 型態相同 → long
佔用四個位元組 (4 bytes) 的記憶體空間, 如加上 signed 則表示有正負號, 其大小 範圍是 –2147483648 到 2147483647. 若加上 unsigned, 則表示沒有正負號, 其大 小範圍是 0 到 4294967295. 如果沒有 signed 或 unsigned, 則被視為 signed 在 little-endian 格式中, 32位元的變數, 則是先存低字元 (least significant word) 的 低位元組 (least significant byte)到記憶體的低位址, 再存放低字元的高位元組 (high byte), 再存放高字元 (high word)的低位元組, 最後才是高字元的高位元組
浮點型 (floating point)
Holtek C 支援 IEEE 754 32 位元的格式. 包括 float 及 double 兩個資料型態, 浮點數 值是以下表的格式儲存在記憶體
sign x biased exponent xxxx xxxx mantissa xxx xxxx xxxx xxxx xxxx xxxx IEEE 754 32 bit
與浮點數值的關係式為
number = (-1)sign x 2(exponent – 127) x 1.mantissa
例如, 浮點數為 2.77000e+37 在儲存到記憶體時換成 7DA6B69B 共佔 32 位元
盛群半導體股份有限公司
HOLTEK SEMICONDUCTOR INC C50 微電腦工具事業處部 文 件 編 號 撰 寫 人 : 版 別 1.20 日 期 2008/5/26 第 18 頁 共 189 頁
記憶體儲存值 sign Biased exponent 1.mantissa 0 1111 1011b (=251) 1.0100110101101101001101b (=1.302447676659) 十進位數值 2.77000e+37 32bit 7DA6B69Bh
4.3.5 bit 資料型態
類似整數型, 但是只有 0 或 1 兩個值, 所以只會取整數的最低位值 (LSB: least significant bit) 需要注意下列用法
→ bit 型態不可與 auto 一起使用, bit 型態的變數不可當函式的參數, 不可用於指標 (pointer) 的數據型態, 不可設定靜態初始值 (static)
→ bit 型態可以設為函式的返回型態, 它是存於累加器 (accumulator) 的相對位置 → 程式開始執行時, 不會設定 bit 型變數的初始值, 因此程式必須自行設定初始值 → 以下是合法的使用方式
static bit init_flag ; bit toggle_flag ; → 範例
int data = 0x54 ; bit flag ; flag = data ;
則 flag = 0 (取 data 的 LSB)
// 定義於函式內則被視為 區域變數
如果微控制器具有一個以上的 RAM bank, 例如 HT46R63, 在定義 bit 型態的變數時 需要使用前置處理指令 #pragma rambank0 指定在 RAM bank 0, 如下
#pragma rambank0 bit flag ;
#pragma norambank
盛群半導體股份有限公司
HOLTEK SEMICONDUCTOR INC C50 微電腦工具事業處部 文 件 編 號 撰 寫 人 : 版 別 1.20 日 期 2008/5/26 第 19 頁 共 189 頁
儲存類別 (storage class) 與修飾詞 (qualifier) 儲存類別 (storage class) 修飾詞 (qualifier) 指定詞 (specifier) auto, register, static, extern const, volatile, persistent typedef 變數於宣告或定義時必須指定其資料型態, 但是儲存類別及修飾詞是可選擇的, 可根據應用時的需要去設定或不使用.
儲存類別 (storage class)
儲存類別與區域變數 (local variable)及全域變數(global variable)有關. → 儲存類別 auto
auto 是給區域變數使用的, 沒有指定儲存類別的區域變數皆是 auto 寫與不寫 auto 都是相同效力. 區域變數是存放在 RAM bank 0 的空間 → 儲存類別 register
register 與 auto 類似, 是給區域變數用的, 當變數的存取很頻繁時, 可將之 設為 register, C 編譯器會使用暫存器而非資料記憶體空間來存放此變數, 如此 可增加存取的速度及減少編碼. 目前並未實做此功能. → 儲存類別 static
static 的變數會一直有效到整個程式結束後才失效. 它的初始值只會在程式開始 執行時被設定一次. 雖然 static 的變數在程式結束前皆有效, 但是定義在函式內的 static 變數仍然是區域變數, 必須要在它所定義的函式中才可以讀寫 → 儲存類別 extern
extern 通知 C 編譯器此變數是定義在其他的程式檔內, 需要經由連結器 (Linker) 連結定義此變數的檔案後, 才知道變數的所在.
以目前在微控制器的應用程式上, 比較需要使用 extern, 其他三種不具特別的優勢 可用定義全域變數(global variabl)的方式即可達到相同效果. 建議不要使用.
修飾詞 (qualifier) → 修飾詞 const
C 編譯器會將 const 的變數放置於程式記憶體 (PROM). 在定義 const 變數時, 必須要設定其值, 而程式在執行中不能修改此變數的值
盛群半導體股份有限公司
HOLTEK SEMICONDUCTOR INC C50 微電腦工具事業處部 文 件 編 號 撰 寫 人 : 版 別 1.20 日 期 2008/5/26 第 20 頁 共 189 頁
→ 修飾詞 constant
這個修飾詞是 Holtek C 編譯器特別提供的. 它會將 constant 的變數放置於程式記 憶體 (PROM) 的最後一頁 (last page). 定義 constant 變數時,必須要設定其值, 而 程式在執行中不能修改此變數的值. 使用此修飾詞要注意下列三點 ● 只能使用在 int 或 unsigned int 的資料型態
● 設定值必須配合微控制器程式記憶體的寬度, 例如, 若使用在 HT48R50A-1 時, 因為此微控制器的寬度為 15 個位元, 最高位元是無效的, 所以 0x9A 會被 C 編譯器改成 0x1A. 最高位元, 位元 15 被清除為 0
● 所有設定此修飾詞的變數或陣列, 總共佔用的字位元組 (word) 不可超過 256 個
指定詞 (specifier) → 指定詞 typedef
typedef 是針對資料型態做新名稱的宣告, 不是宣告資料型態的新變數, 而是宣告一 個新的名字. 例如將 UCHAR (新名字) 宣告為 unsigned char 的資料型態, 可使用
typedef unsigned char UCHAR ; UCHAR count ;
// UCHAR 為 unsigned char 的新名字
// 變數 count 的資料型態為 unsigned char // 等同於 unsigned char count ;
使用 typedef 宣告資料型態的新名字可以讓程式的可讀性更高, 更易了解. 例如,
typedef unsigned int WORD ; // 使用 WORD 代表 unsigned int, 16 bits typedef unsigned long DWORD ; // DWORD 代表 32 bit 的 double word
絕對變數 (absolute variable)
可以將全域變數或 static 變數指定一個固定的記憶體的位址, 例如
unsigned char PortA @ 0x12 ;
在變數名的後面再加上 ?@? 及位址
C 編譯器在編譯時會將程式中出現絕對變數的程式改為此位址, 但並未在記憶體中 保留位置給此變數, 所以從連結器 (Linker) 產出的對映檔 (map file)中找不到 此變數 C 編譯器會將之翻成組合語言的 EQU 指令,如下
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库合泰单片机C语言教程(4)在线全文阅读。
相关推荐: