久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 11354|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

合泰單片機(jī)Holtek C Compiler V3編譯器使用手冊(cè)與FAQ資料下載

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:223582 發(fā)表于 2018-10-13 22:41 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
合泰單片機(jī)編譯器和Touch MCU Workshop v3.0使用手冊(cè)資料分享給大家學(xué)習(xí)

本手冊(cè)主要講述了 C語言的基礎(chǔ)語言,再以此為基礎(chǔ),進(jìn)而講述 C compiler V3的語法結(jié)構(gòu)和其優(yōu)化功能,幫助程序員快速使用 C compiler V3 開發(fā)應(yīng)用程序。C compiler V3 是由 GCC 4.6.2 以上版本移植過來的,除后端輸出,其余部份都可參考GCC 與機(jī)器無關(guān)的相關(guān)使用手冊(cè)。
這里假定讀者已具備如下基本素質(zhì):
  ● 知道如何編寫 C 程序
  ● 已經(jīng)閱讀并理解所使用單片機(jī)的數(shù)據(jù)手冊(cè)

第一章 C 語言基礎(chǔ)知識(shí)
本章將由淺到深的概括 C 語言的基礎(chǔ)語法及結(jié)構(gòu)特點(diǎn),方便后面學(xué)習(xí) C compiler V3,由于受限于單片機(jī)的硬件結(jié)構(gòu),因此本章的描述基于標(biāo)準(zhǔn) C 語言( 這里指 C99 標(biāo)準(zhǔn) ),兼容 C compiler V3 之語法。
主要包含如下內(nèi)容:
  ● 數(shù)據(jù)類型、運(yùn)算符與表達(dá)式
  ● 函數(shù)
  ● 數(shù)組與指針
  ● 結(jié)構(gòu)體、聯(lián)合體與枚舉
  ● 預(yù)處理
  ● 流程控制
  ● 作用域
1.1 數(shù)據(jù)類型、運(yùn)算符與表達(dá)式
1.1.1 C的數(shù)據(jù)類型
數(shù)據(jù)類型確定了變量在內(nèi)存中占用的存儲(chǔ)單元,所以在聲明變量時(shí)首先必須要確定變量的類型,數(shù)據(jù)類型可以分為基本數(shù)據(jù)類型、構(gòu)造數(shù)據(jù)類型、指針類型(Pointer) 和空類型 (void),基本數(shù)據(jù)類型有整型、字符型、浮點(diǎn)型,構(gòu)造類型則有數(shù)組、結(jié)構(gòu)體、共享體和枚舉,利用這些構(gòu)造類型可以構(gòu)造出所需要的數(shù)據(jù)結(jié)構(gòu)。
列舉基本數(shù)據(jù)類型 (C compiler V3) 如表 1-1-1:


1.1.2.2 變量及其定義
變量是在程序運(yùn)行時(shí),其值可以變化的,每個(gè)變量都應(yīng)該有一個(gè)名字,以便被引用,并區(qū)分大小寫,C 語言規(guī)定,所有的變量都必須先宣告,后使用,變量在定義時(shí)必指定數(shù)據(jù)類型,這樣編譯時(shí)才可為其分配對(duì)應(yīng)的存儲(chǔ)單元。如int a;。標(biāo)識(shí)符是用來標(biāo)識(shí)變量、常量、函數(shù)、類型等的字符系列,C 語言規(guī)定標(biāo)識(shí)符只能由字母、數(shù)字、下劃線構(gòu)成,且必須以字母和下劃線作為起始符。
1.1.2.3 變量的存儲(chǔ)方式
在 C 語言中每個(gè)變量和函數(shù)都有兩個(gè)屬性:數(shù)據(jù)類型和數(shù)據(jù)的存儲(chǔ)方式,存儲(chǔ)方式可分為 2 種,靜態(tài)存儲(chǔ)和動(dòng)態(tài)存儲(chǔ),具體又包含 4 種,自動(dòng)的 (auto)、靜態(tài)的(static)、寄存器的(register)、外部的(extern)。
1、auto:函數(shù)中的局部變量,如果不專門聲明為 static 的存儲(chǔ)方式,則默認(rèn)為auto,所以在函數(shù)內(nèi) auto char a與 char a是等價(jià)的。
2、static:可分為全局靜態(tài)存儲(chǔ)和局部靜態(tài)存儲(chǔ),全局變量加了 static 后,變量只能在本文件中引用,局部靜態(tài)存儲(chǔ)則是局部變量的值在函數(shù)調(diào)用結(jié)束后不消失而保留原值,在下一次調(diào)用該函數(shù)時(shí),該變量已經(jīng)有值了。
3、register:上述兩種變量是存放在內(nèi)存中的,而 register 則是把變量存放在寄存器中,基于單片機(jī)的特殊情況,這里不展開敘述。
4、extern:使用另一個(gè)檔中定義的變量,表示該變量是一個(gè)已經(jīng)在外部定義過的變量,只要加上extern 就可以使用該變量了,后面有專門的講述。

5、volatile:一個(gè)類型修飾符 (type specifier)。它是被設(shè)計(jì)用來修飾被不同程序
訪問和修改的變量,使用 volatile 修飾的變量,不會(huì)因編譯程序的優(yōu)化而被省去。
建議定義成 volatile 的變量:特殊寄存器,中斷函數(shù)使用到的變量,為某些特殊用途的代碼定義的變量 ( 比如 delay 功能 )。
其它一般變量不建議定義成volatile,這樣會(huì)大大降低編譯程序的優(yōu)化功能。

1.1.3 C語言運(yùn)算簡(jiǎn)介
C 語言的運(yùn)算十分豐富,主要包括算術(shù)運(yùn)算,邏輯運(yùn)算、位運(yùn)算、賦值運(yùn)算、條件運(yùn)算、逗號(hào)運(yùn)算等,各種運(yùn)算及其之間的優(yōu)先級(jí)見附錄 B。
1.1.3.1 類型轉(zhuǎn)換
類型轉(zhuǎn)換規(guī)則:
  ● 混合類型的算術(shù)運(yùn)算
  ♦ 小于int類型的轉(zhuǎn)換為 int 類型
  ♦ 小類型向大類型轉(zhuǎn)換(轉(zhuǎn)換過程見圖 2_1_1)
  ● 不同類型之間的賦值
  ♦ 以賦值語句左邊的類型為轉(zhuǎn)換后類型
  ● 函數(shù)參數(shù) / 返回值的傳遞
  ♦ 以參數(shù)/ 返回值的類型為轉(zhuǎn)換后類型


FAQ目錄:
目錄

Part I V3 基本介紹  5
11 V3 的版本歷程 ? 5
12 新版改進(jìn)的功能  5
13 V3 的使用手冊(cè)有哪些 ? 6
14 V3 不支持的 MCU 有哪些 ?  6
15 什么是長(zhǎng)指令架構(gòu) MCU?  7
Part II V3 與 V2 的不同  8
21 V3 與 V2 語法有何不同 ? 與 V1, V2,標(biāo)準(zhǔn) C 的比較 ? 8
22 V3 對(duì) V2 改進(jìn)的功能  8
23 將 V2 程序改至 V3 常見的錯(cuò)誤  8
231 ISR warning  8
232 內(nèi)嵌匯編 error  9
233 bit 變數(shù) error  9
234 標(biāo)志位 error  9
235 內(nèi)部函數(shù) error  9
236 絕對(duì)地址變數(shù) error  10
237 函式指標(biāo) error  10
Part III V3 的特殊語法及用法  11
31 如何將一個(gè)變量定義于指定 bank? 11
32 如何將函數(shù)定義于指定地址 ?  11
33 如何在 V3 中使用混合語言 (mixed language)?  11
34 V3 代碼生成器  11
Part IV V3 常見的 error, warning 及其解決方式 13
41 error“multi-ram-bank should be equipped with mp1” 13
42 error“internal compiler error:xxxx”  13
43 error (L1038)“RAM (bank0) overflow, memory allocation fails for section …” 13
44 error (L1038)“ROM/RAM (bank*) overflow, memory allocation fails for section …”
13
45 warning (L3010) (absolute address: xxh, length: x) is overlay with (absolute address: xxh, length: x) 13
46 warning (L3009): Same sub function exists between ISR(04H) CMG and MAIN CMG:
_func  13
Part V V3 常見的問題及其解決方式  14
51 如何在 V3 使用 bit 變量 ?  14
52 如何在 V3 使用外部定義 bit 變量 ?  14
53 程序 reset 后,變量被清 0 的解決方式 ?  14
54 指定地址的變量,其他文件如何引用 ?  15
55 對(duì)于寫 EEPROM 有限制的 MCU( 需連續(xù) set wren, wr, flag),如何使用 V3 寫
EEPROM?  15
56 使用 V3 給 bit flag 賦值變量的注意事項(xiàng)  17
57 在 V3 使用 ROM BP 的注意事項(xiàng)  18



58 混合語言使用 ROM BP 的注意事項(xiàng)  18
59 如何使用 CMD 命令編譯 C 工程?  19
510  混合語言工程在 asm 文件中使用 table read 的注意事項(xiàng)  19
511  中斷函數(shù)中使用 inline assembly 注意事項(xiàng)  19
512 用其它方式修改 const 變量值 ( 比如燒錄時(shí)修改 ROM),compiler 執(zhí)行結(jié)果不變, 如何解決 ?  20
513 使用內(nèi)嵌匯編語言的注意事項(xiàng)  20
Part VI V3 常見的優(yōu)化問題 21
61 使用 V3 優(yōu)化參數(shù)后,在 watch window 上看不到某些變數(shù)的 debug 信息 ?  21
62 中斷與一般函數(shù)訪問同一個(gè)全局變量,此全局變量的相關(guān)語句被優(yōu)化掉 ?  21
63 V3 的優(yōu)化功能及其對(duì) debug 的影響 ?  21
64 使用 V3 compiler, debug 時(shí)行號(hào)出錯(cuò) ? 21
65 使用 V3 compiler,用于延時(shí)的循環(huán)代碼被優(yōu)化,怎么解決 ?  22
66 使用內(nèi)嵌匯編,被優(yōu)化掉 ?  23
67 選擇優(yōu)化參數(shù)后,延時(shí)函數(shù)時(shí)間發(fā)生變化。  23

1.5 什么是長(zhǎng)指令架構(gòu) MCU?
A:具有 LMOV,LSET 等長(zhǎng)指令(長(zhǎng)度為 2word)的 MCU,如 HT66F70A,一顆 MCU 是否有長(zhǎng)指令,可以查看它的 datasheet,是否有 LMOV 等長(zhǎng)指令,每條 長(zhǎng)指令比對(duì)應(yīng)的普通指令增加 1 個(gè)指令周期。

2.3 將 V2 程序改至 V3 常見的錯(cuò)誤

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 使用手冊(cè)》2.2.1 節(jié)
注意:
i:因?yàn)槭?warning,如果不修改也可以編譯通過,只是編譯程序會(huì)將它當(dāng)一般 函式處理,而不是中斷函式
ii:#pragma 的其他關(guān)鍵詞 rambank/function 等,也會(huì)報(bào)此 warning,表示在 V3
版此功能無效。

2.3.2 內(nèi)嵌匯編 error
e.g.
#asm nop
#endasm
error: invalid preprocessing directive #asm error: invalid preprocessing directive #endasm 解決方式:
選擇參數(shù)“兼容 Holtek C V2 內(nèi)嵌匯編語言”
詳見語法書《 C Compiler V3 使用手冊(cè)》2.2.5 節(jié)
2.3.3 bit 變數(shù) error
e.g.bit a;
error: unknown type name 'bit'
解決方式:使用 HT-IDE3000 V7.93 以上版本
2.3.4 標(biāo)志位 error
e.g. _40_1 = 1;
error: '_40_1' undeclared (first use in this function)
解決方式:
1. 用結(jié)構(gòu)體位域定義 bit flag:
bit_type bit_var  attribute  ((at(0x40)));
#define _40_1 bit_var.bit1
詳見《C Compiler V3 使用手冊(cè)》2.2.3 節(jié)
2. 使用 bit 定義:
static volatile bit flag1  attribute  ((at(0x40),bitoffset(1)));
詳見《C Compiler V3 使用手冊(cè)》2.2.11 節(jié)
2.3.5 內(nèi)部函數(shù) error
e.g. _delay(2);
Error(L2001): Unresolved external symbol '    delay' in file
解決方式:
改成:
#include “ht66f50.h”
GCC_DELAY(2);
詳見《C Compiler V3 使用手冊(cè)》2.2.3 節(jié)



2.3.6 絕對(duì)地址變數(shù) 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 使用手冊(cè)》2.2.2 節(jié)
2.3.7 函式指標(biāo) 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

Part III V3 的特殊語法及用法
3.1 如何將一個(gè)變量定義于指定 bank?
A:若是無長(zhǎng)指令架構(gòu)的 MCU,只能將變量定義在指定地址,如:
volatile static unsigned char var_name    attribute    ((at(0x140)));
詳見《C Compiler V3 使用手冊(cè)》2.2.2 節(jié)
若 是 長(zhǎng) 指 令 架 構(gòu) 的 MCU, 無 需 特 別 指 定,linker 會(huì) 自 動(dòng) 分 配 變 量 到 任 意
bank。
3.2 如何將函數(shù)定義于指定地址 ?
A:IDE 7.8 以上版本才支持此功能,語法:
char  attribute ((at(0x373))) foo (char parm)
{}
表示將函數(shù) foo 指定在地址 0x373. 詳見《C Compiler V3 使用手冊(cè)》2.2.6 節(jié)
3.3 如何在 V3 中使用混合語言 (mixed language)?
A:參考《C Compiler V3 使用手冊(cè)》第 2.5 節(jié)
3.4 V3 代碼生成器
為協(xié)助用戶更好的使用 V3 專用語法,IDE3000 7.83 以上版本增加工具“V3 代 碼生成器”,位于菜單欄 → 工具 → V3 代碼生成器。它可以成生 bit 變量,中 斷語法,絕對(duì)地址變量,內(nèi)嵌匯編,delay 函數(shù)及指定其它 bank 的變量等語法, 具體可查看 HT-IDE3000 使用手冊(cè)第三章“V3 代碼生成器”部份。


Part IV V3 常見的 error, warning 及其解決方式
4.1 error“multi-ram-bank should be equipped with mp1”
A:請(qǐng)確認(rèn) MCU 是否為長(zhǎng)指令架構(gòu),若是,請(qǐng)使用 IDE7.8 以上版本
4.2 error“internal compiler error:xxxx”
A:compiler 內(nèi)部錯(cuò)誤,請(qǐng)與 Holtek 公司返饋

4.3 error (L1038)“RAM (bank0) overflow, memory allocation fails for section ….”
A:對(duì)于短指令架構(gòu)的 MCU,C Compiler 會(huì)默認(rèn)把變量配置到 RAM bank0( 長(zhǎng)指 令的 MCU 可以自動(dòng)配置到任意 bank),當(dāng) bank0 滿了之后,會(huì)報(bào) RAM bank 0 overflow 出現(xiàn)此信息后,做法如下:
● 確認(rèn) unsigned int/long 類型的大小 ( 特別是從 V1 C Compiler 移植過來的程序 )
● 若為 multi RAM bank MCU,可手動(dòng)將全局變量調(diào)到其它 bank,參考 3.1

4.4 error (L1038)“ROM/RAM (bank*) overflow, memory allocation fails for section ….”
A:ROM 或 RAM 空間不夠出現(xiàn)此信息后,做法如下:
● 檢查是否打開優(yōu)化參數(shù) -Os,參考《C Compiler V3 使用手冊(cè)》2.1.4 節(jié)
● 刪減不必要的程序

4.5 warning (L3010) (absolute address: xxh, length: x) is overlay with (absolute address: xxh, length: x)
A:出現(xiàn)此 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:中斷服務(wù)程序(04H)與主函數(shù)共同調(diào)用子函數(shù) func,解決方式:
● 避免共同調(diào)用
詳見《C Compiler V3 使用手冊(cè)》2.2.1 節(jié)

Part V V3 常見的問題及其解決方式
5.1 如何在 V3 使用 bit 變量 ?
A:bit flag1; 詳見《C Compiler V3 使用手冊(cè)》2.2.11 節(jié)。
5.2 如何在 V3 使用外部定義 bit 變量 ?
A:extern bit flag1;
5.3 程序 reset 后,變量被清 0 的解決方式 ?
A:IDE7.8 版本將提供選擇不初始化的方式:不選擇下面選項(xiàng)“將未初始化的…”
即可。


5.4 指定地址的變量,其他文件如何引用 ?
A:因指定地址的變量 ( 非 const) 需定義成 static,其它作用域只在本文件,所以可 以將其定義在頭文件里面,若有其它文件需要用到,直接 include 這個(gè)頭文件 即可,例:
//Define_var.h
static volatile unsigned var1  attribute  ((at(0x180)));
//test1.c
#include “Define_var.h”
void foo1()
{


}
//test2.c

var1 = 1;

#include “Define_var.h”
void foo2()
{
var1 = 2;
}
注:若是 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 對(duì)于寫 EEPROM 有限制的 MCU( 需連續(xù) set wren, wr, flag),如何使用
V3 寫 EEPROM?
A:
i:在 V3 中,因?yàn)?_rden 與 _rd 是在 bank1,使用長(zhǎng)指令,與 datasheet 所規(guī)定的 指定不同。
ii:這種對(duì)指令有嚴(yán)格要求的功能,建議使用內(nèi)嵌匯編達(dá)成,因?yàn)?C 不敢保證 按特定的方式翻譯。
iii:若要產(chǎn)出與 datasheet 中的連續(xù)指令,V3 需改成如下寫法:


5.6 使用 V3 給 bit flag 賦值變量的注意事項(xiàng)
范例:
unsigned char flag;
_pa2=flag;

說明:
編譯程序只關(guān)心計(jì)算的結(jié)果,而不管計(jì)算過程,為減少 CODE 的指令輸出,編 譯程序會(huì)翻譯左邊的指令。
C 語言與匯編不同的是,一條語句不只翻譯出一條指令,所以在語句執(zhí)行結(jié)束 前,計(jì)算未完成。
影響:
不管 flag 值為多少,PA2 都會(huì)被先 CLR,如果在此時(shí)進(jìn)入中斷,而中斷中有用 到 PA,則會(huì)影響到執(zhí)行結(jié)果。
解決方式:
● 在 bit 賦值前先把中斷關(guān)掉,等計(jì)算完后再打開 總結(jié): 多字節(jié)變量的計(jì)算,如果中斷中有判斷此變量,在計(jì)算未完成前,都不可進(jìn)入
中斷。

5.7 在 V3 使用 ROM BP 的注意事項(xiàng)
對(duì)于多 ROM BANK MCU,若整個(gè)工程都用 C 語言寫,那么,任何時(shí)候,用戶 都不需要設(shè)定 ROM BP,Linker 會(huì)自動(dòng)設(shè)置 ROM BP,特別注意,若用戶在程 序中改動(dòng)到 ROM BP,那么程序?qū)⒂锌赡芘茱w,用戶需特別小心,在設(shè)置 RAM BP 時(shí),也應(yīng)注意不要用到 ROM BP。若工程使用混合語言編程,用 C 函數(shù) call 匯編 section 時(shí),應(yīng)使用 C 語言或 fcall,在匯編 section call C 函數(shù)時(shí),需在 CALL 前設(shè) BP,前在 CALL 之后恢復(fù) BP。
范例:
;;Test1.asm
extern _fun2:near public _fun1
_fun1 .section ‘code’
_fun1 proc
mov a, bank _fun2
mov [04H],a ;; 假設(shè) 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()
{}
5.8 混合語言使用 ROM BP 的注意事項(xiàng)
參考 5.7 節(jié)
5.9 如何使用 CMD 命令編譯 C 工程?
compiler,assembler,linker 的參數(shù)詳見《V3 C Compiler 使用手冊(cè)》附錄 C
例:
a. 設(shè)置環(huán)境變量:
set HTCFG=C:\Program Files\Holtek MCU Development Tools\HT-IDE3000V7.x\MCU set HTBIN=C:\Program Files\Holtek MCU Development Tools\HT-IDE3000V7.x\BIN set HTINCLUDE=C:\Program Files\Holtek MCU Development Tools\HT-IDE3000V7. x\INCLUDE_V3
set HTLIB=C:\Program Files\Holtek MCU Development Tools\HT-IDE3000V7.x\LIB

b. 編譯 .c 文件
…\hgcc32.exe  t1.c –g –Os –I “%HTINCLUDE%” -o t1.asm
…\hgcc32.exe  t2.c –g –Os –I “%HTINCLUDE%” –o t2.asm

c. 編譯 .asm 文件
…\hasmgcc32.exe /hide=12345678 /chip=HT66F50 /case /z “t1.asm”
…\hasmgcc32.exe /hide=12345678 /chip=HT66F50 /case /z “t2.asm”

d. link 所有 obj,lib 產(chǎn)生 .tsk 文件
…\hlinker32.exe /MCU=HT66F50 @ “C:\link-test.bat”
link-test.bat 內(nèi)容:
“t1.obj”+ “t2.obj”, “test.tsk”, “test.map”, “test.dbg”, “l(fā)ibholtekgcc.lib”;

5.10  混合語言工程在 asm 文件中使用 table read 的注意事項(xiàng) 如果一個(gè)工程即有 .c 又有 .asm 文件,那么在 .asm 文件中使用 table read 應(yīng)注意 , 先將中斷關(guān)掉,執(zhí)行完后再打開。比如:
clr emi tabrd r0 inc tblp mov a,tblh

set emi

5.11  中斷函數(shù)中使用 inline assembly 注意事項(xiàng) 在中斷及其調(diào)用的函數(shù)中如果有使用 inline assembly,且 inline assembly 有使用 到特殊寄存器 ( 如 MP, TBLP, TBHP, TBLH 等 ),則用戶需要自己保存這些寄存
器,如下語句:
DEFINE_ISR(isr04,0x04)
{
asm(“mov a,[01h]”); // mp0 = [01h]
asm(“mov temp_mp0,a”); asm(“mov a,80h”); asm(“mov [01h],a ”); asm(“mov a,[00h]”); asm(“mov a,temp_mp0”); asm(“mov [01h],a”);
}

5.12 用其它方式修改 const 變量值 ( 比如燒錄時(shí)修改 ROM),compiler 執(zhí)行 結(jié)果不變,如何解決 ?
比如:定義
  attribut ((at(0x400)))
const unsigned char array[] = {0,1,2,3,4,5,6,7};
燒錄時(shí)把 ROM 的 400H~410H 清 0,執(zhí)行 temp = array[7]; 時(shí),temp 值仍為 7。
解決方式:
把 array[] 定義在與 temp = array[7]; 不同的 C 文件。
5.13 使用內(nèi)嵌匯編語言的注意事項(xiàng)
匯編語言中使用到的變量、函數(shù)名、寄存器、標(biāo)志位應(yīng)遵循匯編語言的定義。
1. 如果全局變量 / 函數(shù)本文件只在內(nèi)嵌匯編語言中使用,應(yīng)增加匯編語言聲明, 比如:
asm(“extern _a:byte”); asm(“extern _func:near”); void main()
{
asm(“clr _a”);
asm(“call _func”);
}
2. 寄存器 / 標(biāo)志位應(yīng)先定義后使用,可 include INC 文件,比如:
asm(“#include HT66F60.INC”)
void main()
{
asm(“CLR ACC”); asm(“MOV TBHP,A”); asm(“CLR C”);
}
3. 匯編語言中的名字要區(qū)分大小寫。
Part VI V3 常見的優(yōu)化問題
6.1 使用 V3 優(yōu)化參數(shù)后,在 watch window 上看不到某些變數(shù)的 debug 信息 ?
A:因啟用優(yōu)化參數(shù),變量有可能被優(yōu)化刪除,故沒有 debug 信息,若要在 debug
時(shí)觀察變量值,可以將此變量暫時(shí)定義為 volatile,debug 結(jié)束后再刪去,比如:
volatile int i, j, k;
6.2 中斷與一般函數(shù)訪問同一個(gè)全局變量,此全局變量的相關(guān)語句被優(yōu)化掉 ?
A:一般函數(shù)與中斷沒有調(diào)用關(guān)系,compiler 不知中斷何時(shí)發(fā)生,會(huì)影響到一般函 數(shù)中的變量,因此,建議將此變量用 volatile 修飾,比如:
flag 在中斷 ISR_INT0 中使用到,又在 main 函數(shù)中用到,則應(yīng)定義成 volatile:
volatile unsigned char flag;

說明:volatile:一個(gè)類型修飾符(type specifier)。它是被設(shè)計(jì)用來修飾被不同 函數(shù)訪問和修改的變數(shù),使用 volatile 修飾的變量,不會(huì)因編譯程序的優(yōu) 化而被省去。
建議定義成 volatile 的變量:特殊寄存器,中斷函式使用到的變量,為某些特殊 用途的代碼定義的變量 ( 比如 delay 功能 )。
6.3 V3 的優(yōu)化功能及其對(duì) debug 的影響 ?
A:詳見《C Compiler V3 使用手冊(cè)》第 3 章
6.4 使用 V3 compiler, debug 時(shí)行號(hào)出錯(cuò) ?
A:可能出現(xiàn)的情況:
a. 某些語句被優(yōu)化掉而不譯出 code,自然也沒有 debug 信息。

b. 幾條語句翻譯出同一堆的 code,只顯示一條 line number。

這些情況會(huì)可能會(huì)影響 debug,但執(zhí)行結(jié)果不會(huì)出錯(cuò),若不是這兩種情況,請(qǐng)回報(bào)。


6.5 使用 V3 compiler,用于延時(shí)的循環(huán)代碼被優(yōu)化,怎么解決 ?
A:如下:

解決方法:將變量定義為 volatile,如下:

6.6 使用內(nèi)嵌匯編,被優(yōu)化掉 ?
如下:
asm(“mov %0,a”:”=m”(i));// 表示把 ACC 的值賦給 i,
因?yàn)橹笞兞?i 沒有被用到,所以這條語句被編譯程序優(yōu)化掉,

如果要保留,可以改成:
asm volatile (“mov %0,a”:”=m”(i));
防止被優(yōu)化

6.7 選擇優(yōu)化參數(shù)后,延時(shí)函數(shù)時(shí)間發(fā)生變化。
A:延時(shí)函數(shù)的延時(shí)時(shí)間通常依賴于執(zhí)行的指令數(shù),選擇優(yōu)化參數(shù)后,compiler 編 譯出的指令更精簡(jiǎn),從而影響延時(shí)時(shí)間,程序開發(fā)者應(yīng)注意這點(diǎn),在選擇優(yōu)化 參數(shù)后,調(diào)整延時(shí)函數(shù)或使用 compiler 自帶的延時(shí)函數(shù) GCC_DELAY(n)。

全部資料51hei下載地址:
合泰.pdf (2.21 MB, 下載次數(shù): 81)
合泰2.pdf (7.59 MB, 下載次數(shù): 55)
合泰3.pdf (6.46 MB, 下載次數(shù): 53)

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:17771 發(fā)表于 2019-5-10 15:29 | 只看該作者
剛想用HT單片機(jī),請(qǐng)幫助
回復(fù)

使用道具 舉報(bào)

板凳
ID:529540 發(fā)表于 2019-5-11 11:44 | 只看該作者
ysy6450 發(fā)表于 2019-5-10 15:29
剛想用HT單片機(jī),請(qǐng)幫助

同樣在學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

地板
ID:342848 發(fā)表于 2019-8-28 11:05 | 只看該作者
合泰單片機(jī)性價(jià)比高,學(xué)習(xí)中
回復(fù)

使用道具 舉報(bào)

5#
ID:342848 發(fā)表于 2019-8-28 11:07 | 只看該作者
正在學(xué)習(xí)合泰觸摸單片機(jī)
回復(fù)

使用道具 舉報(bào)

6#
ID:721169 發(fā)表于 2020-4-3 12:48 來自手機(jī) | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

7#
ID:465596 發(fā)表于 2023-9-22 17:32 | 只看該作者
下載文件是 Touch MCU Workshop v3.0
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久久av一区 | 中文日本在线 | 国产精品久久久久久久久久了 | 色综合久 | 精久久| 国产亚洲欧美另类一区二区三区 | 日韩精品成人免费观看视频 | 色一级片| 欧美日韩一区精品 | 国产在线a| 久久久一区二区三区 | 一区二区三区四区在线免费观看 | 521av网站 | 操操网站 | 欧美成人精品在线观看 | 国产免费看 | 久久综合av | 久久久999免费视频 999久久久久久久久6666 | 国产成人精品久久二区二区91 | 国产午夜精品一区二区三区嫩草 | 午夜一区| 久久黄视频 | 日韩和的一区二区 | 国产精品18hdxxxⅹ在线 | 免费在线看黄 | 中文字幕av一区二区三区 | 新超碰97 | 黄色片av| 天堂资源 | 成人国产精品免费观看 | 久草视频2 | 国际精品鲁一鲁一区二区小说 | 91大神xh98xh系列全部 | 天堂一区在线 | 91精品国产综合久久久久 | 亚洲欧美一区二区三区国产精品 | 欧美成人精品一区二区男人看 | 一区二区免费看 | 日韩一二区在线 | 亚洲一二视频 | 日韩激情免费 |