本使用手册版权为盛群半导体股份有限公司所有, 非经盛群半导体股份有限公司书面授权同意, 不得透过任何形
式复制、 储存或传输。
C COMPILER 使用手册
March 27, 2012
Rev 1.10 | i | March 27, 2012 |
目录
目录
数据类型.................................................................................................... 1
数组........................................................................................................... 1
标识符保留字............................................................................................. 1
运算符 ....................................................................................................... 2
前置处理指令............................................................................................. 3
预处理指令 #pragma................................................................................. 3
const 变量功能 .......................................................................................... 4
预定义的头档............................................................................................. 4
main 函数 .................................................................................................. 4
中断函数.................................................................................................... 5
内建函数.................................................................................................... 5
其它的功能 ................................................................................................ 6
Rev 1.10 | 1 | March 27, 2012 |
Holtek C、 Holtek Enhance C 和 ANSI C 的比较
撰写这份档依据 | |
HOLTEK C 的版本 | Holtek (R) Cross C Compiler Version V2.04 MRSC |
HOLTEK Enhance C 的版本 | Holtek (R) Cross C Compiler Version V2.40 E-MRSC (2010/1/20) |
【注】 : 下列表格中的“Y”代表有, “N 表没有。
数据类型
Data type | Size (bit) HOLTEK C |
Size (bits) HOLTEK Enhance C |
Size(bits) ANSI C |
bit | 1 | 1 | N |
char | 8 | 8 | 8 |
signed char | 8 | 8 | 8 |
unsigned char | 8 | 8 | 8 |
short | 8 | 16 | 16 |
unsigned short | 8 | 16 | 16 |
int | 8 | 16 | 16 |
unsigned int | 8 | 16 | 16 |
long | 16 | 32 | 32 |
unsigned long | 16 | 32 | 32 |
float | N | 32 | 32 |
double | N | 32 | 64 |
long double | N | N | 128 |
float/double 皆使用 IEEE754 32 位格式
bit 型态不可用于指标 (pointer) 的数据型态, 不可定义为 const。 为局域时, 占用一个 byte(但
只有一个 bit 有效) , 为全域时, 占用一个 bit。
数组
维数 | HOLTEK C ( 最大数组长度 ) |
HOLTEK Enhance C ( 最大数组长度 ) |
ANSI C ( 最大数组长度 ) |
一维数组 | 256 | 跟空间有关① | 不限制 |
二维数组 | N | 跟空间有关① | 不限制 |
三或三以上的多维数组 | N | N | 不限制 |
指针数组 | N | 跟空间有关① | 不限制 |
函数数组 | N | 功能限制 | 不限制 |
字符串数组 | 不支持 | 不支持 | 不限制 |
【注】 : ①若長度大於 1 page, 則有功能限制, 功能限制是指使用時編譯通過, 但可能會有 bug, 使用
時要小心。
标识符保留字
保留字 | HOLTEK C | HOLTEK Enhance C | ANSI C |
auto | ● | ● | ● |
break | ● | ● | ● |
bit | ● | ● | |
case | ● | ● | ● |
char | ● | ● | ● |
const | ● | ● | ● |
constant | ● | ||
continue | ● | ● | ● |
default | ● | ● | ● |
Rev 1.10 2 March 27, 2012
Holtek C、 Holtek Enhance C 和 ANSI C 的比较
保留字 | HOLTEK C | HOLTEK Enhance C | ANSI C |
do | ● | ● | ● |
double | ● | ● | |
else | ● | ● | ● |
enum | ● | ● | ● |
extern | ● | ● | ● |
float | ● | ● | |
for | ● | ● | ● |
goto | ● | ● | ● |
if | ● | ● | ● |
int | ● | ● | ● |
long | ● | ● | ● |
register | ● | ● | |
return | ● | ● | ● |
short | ● | ● | ● |
signed | ● | ● | ● |
sizeof | ● | ● | ● |
static | ● | ● | ● |
struct | ● | ● | ● |
switch | ● | ● | ● |
typedef | ● | ● | ● |
union | ● | ● | ● |
unsigned | ● | ● | ● |
void | ● | ● | ● |
volatile | ● | ● | ● |
while | ● | ● | ● |
运算符
运算符 | HOLTEK C | HOLTEK Enhance C | ANSI C |
算术运算符 (+,-,*,/,%) | ● | ● | ● |
关系运算符 (>,<,==,>=,<=,!=) | ● | ● | ● |
逻辑运算符 (!,&&,||) | ● | ● | ● |
位运算符 (<<,>>,~,|,^,&) | ● | ● | ● |
赋值运算符 (=,+=,-=,*=,/=,%=,>>=,<<=,&=,^=,|=) |
● | ● | ● |
条件运算符(? :) | ● | ● | ● |
逗号运算符(,) | ● | ● | ● |
指针运算符(* 和 &) | ● | ● | ● |
求字节数运算符(sizeof) | ● | ● | ● |
强制类型转换运算符 (( 类型 )) | ● | ● | ● |
分量运算符(. ->) | ● | ● | ● |
下标运算符([ ]) | ● | ● | ● |
函数调用运算符(( )) | ● | ● | ● |
自增运算符(++) | ● | ● | ● |
自减运算符(--) | ● | ● | ● |
负号运算符(-) | ● | ● | ● |
正号运算符(+) | ● | ● | ● |
指定 RAM 变量地址运算符(@) | ● | ● |
Rev 1.10 3 March 27, 2012
Holtek C、 Holtek Enhance C 和 ANSI C 的比较
前置处理指令
前置处理指令 | HOLTEK C | HOLTEK Enhance C | ANSI C |
#asm | Y | Y | N |
#define | Y | Y | Y |
#elif | Y | Y | Y |
#else | Y | Y | Y |
#endif | Y | Y | Y |
#error ① | Y | Y | N |
#if | Y | Y | Y |
#ifdef | Y | Y | Y |
#ifndef | Y | Y | Y |
#include | Y | Y | Y |
#pragma | Y | Y | N |
#undef | Y | Y | Y |
【注】 : ①产出错误信息: #error Size too big
预处理指令 #pragma
格式:
#pragma keyword [option]
某些 keyword 会有 options。
Keyword | HOLTEK C | HOLTEK Enhance C | ANSI C |
bp_free | ● | ||
bp_nofree | ● | ||
function | ● | ||
nobp | ● | ||
nolocal | ● | ||
nomp0 | ● | ||
nomp1 | ● | ||
rambank0 norambank |
● | ● | |
rombank0 norombank |
● | ||
rombank | ● | ||
vector | ● | ● | |
novectornest | ● | ||
inline |
Rev 1.10 4 March 27, 2012
Holtek C、 Holtek Enhance C 和 ANSI C 的比较
const 变量功能
const 变量功能 | HOLTEK C | HOLTEK Enhance C | ANSI C |
适用的数据类型 | 除 bit | 除 bit | any |
属性 | private | private | public/private/internal |
直接被其它文件使用 | N | N | Y( 引用时, 在 const 前加修饰词 extern) |
必须宣告为全局型 | Y | N | N |
宣告时要设定初始值 | Y | Y | Y |
数组常量要指定数组的大小 | Y | Y | Y |
取址操作数① | N | N | Y |
【注】 : ①比如, 不能写:
const char a = 5;
void main()
{
char *b = &a;
}
但可以写:
const char a[1] = {5};
void main()
{
char *b = &a;
}
对于 enhanced c, 若要将 int 或 unsigned int 变量设定为常量时, 建议使用 constant 而不是 const,
这样会使程序更高效。
预定义的头档
预定义的头档 | HOLTEK C | HOLTEK Enhance C | ANSI C |
HTxxxxxx.h | Y | Y | N |
assert.h | N | N | Y |
ctype.h | N | N | Y |
errno.h | N | N | Y |
float.h | N | N | Y |
limits.h | N | N | Y |
locale.h | N | N | Y |
math.h | N | N | Y |
setjmp.h | N | N | Y |
signal.h | N | N | Y |
stdarg.h | N | N | Y |
stddef.h | N | N | Y |
stdio.h | N | N | Y |
stdlib.h | N | N | Y |
string.h | N | N | Y |
time.h | N | N | Y |
main 函数
main 函数的规定 | HOLTEK C | HOLTEK Enhance C | ANSI C |
个数(个) | 1 | 1 | 1 |
返回数据类型 | void | void | int |
参数(个) | 无 | 无 | 2(一个指针数组) |
Rev 1.10 5 March 27, 2012
Holtek C、 Holtek Enhance C 和 ANSI C 的比较
中断函数
中断函数的规定 | HOLTEK C | HOLTEK Enhance C | ANSI C |
设定中断向量值 | Y | Y | 没有中断函数 |
个数(个) | 可多个 | 可多个 | |
返回数据类型 | void | void | |
参数 | 无 | 无 | |
重复进入中断 | N | Y ① | |
在程序中调用中断 | N | N | |
中断调用汇编函数 | Y | Y | |
中断调用 C 函数 | N | Y ② |
【注】 : ①虽然不同的中断事件可以重迭发生, 但是同一个中断事件不可以重迭产生, 必须等候前一个
发生被处理完成后, 才能认可下一个中断事件。 针对不具有中断可重迭(nested) 发生的微控
制器, 则在中断服务函式内不可开启中断功能。
②必须将被调用的函数定义成 #pragma nolocal。 否则会造成 ram 空间重用, 一般不推荐使用。
内建函数
函数 | HOLTEK C ( 参数类型 ) | HOLTEK Enhance C (参数类型) | ANSI C |
_clrwdt() | Y | Y | N |
_clrwdt1() | Y | Y | N |
_clrwdt2() | Y | Y | N |
_halt() | Y | Y | N |
_nop() | Y | Y | N |
_rr(int8 *) | Y(int *) | Y(char *) | N |
_rrc(int8 *) | Y(int *) | Y(char *) | N |
_lrr(int16 *) | Y(long *) | Y(int *) | N |
_lrrc(int16 *) | Y (long*) | Y(int *) | N |
_rl(int8 *) | Y(int *) | Y(char *) | N |
_rlc(int8 *) | Y(int *) | Y(char *) | N |
_lrl(int16 *) | Y(long *) | Y(int *) | N |
_lrlc(int16 *) | Y(long *) | Y(int *) | N |
_swap(int8 *) | Y(int *) | Y(char *) | N |
_delay(unsigned long tick) | Y(tick<=65535) | Y(tick<= 263690) | N |
Rev 1.10 6 March 27, 2012
Holtek C、 Holtek Enhance C 和 ANSI C 的比较
其它的功能
功能 | HOLTEK C | HOLTEK Enhance C | ANSI C |
内嵌式汇编语言 | Y | Y | N |
静态变量 | 不支持静态变量和静态函数 | 不支持静态变量和静态函数 | 支持局部的静态变量 |
常量 | 支持二进制常量 | 支持二进制常量 | 不支持二进制常量 |
结构体和共享体 | bit field 置放于 8 位的单位 内 , 不会横跨两个 8 位的单 位, 且不能定义超过 9 位的 bit field |
bit field 会置放于 8 位的单位内 , 不 会横跨两个 8 位的单位, 且不能定 义超过 9 位的 bit field |
最大可定义 32 位的 bit field |
函数 | 不支持递归函数 | 不支持递归函数 | 支持递归函数 |
指针 | 不能用于常量与位变量, 不 支持函数指针 |
不能用于常量与位变量, 若指向函 数, 则必须是全域的, 且所指函数不 能带有参数 |
不能用于常量(没有位变 量) |
初始值 | 全局变量宣告时不可以同时 设定初始值, 但是 const 常 量在宣告时一定要设定初始 值 |
全局变量宣告时不可以同时设定初 始值, 但是 const 常量在宣告时一定 要设定初始值 |
全局变量、 局部变量在宣 告时可以设定初始值, const 常量在宣告时一定 要设定初始值 |
堆栈 | 层数有限① | 层数有限① | 层数不受限制 |
【注】: ①每个 MCU 的层数有限, HOLTEK C/Enhance C 程序中断调用函数时, 要考虑占用的堆栈层数,
一些运算符或函数在调用时所占用的堆栈层数如下:
运算符 / 函数 | 堆栈层数 | 运算符 / 函数 | 堆栈层数 |
main() | 0 | _rl(int */ char *); | 0 |
_clrwdt() | 0 | _rlc(int *); | 0 |
_clrwdt1() | 0 | _lrl(long */ int *); | 0 |
_clrwdt2() | 0 | _lrlc(long *); | 0 |
_halt() | 0 | _delay(unsigned long) | 1 |
_nop() | 0 | * | 1 |
_rr(int */ char *); | 0 | / | 1 |
_rrc(int *); | 0 | % | 1 |
_lrr(long */ int *); | 0 | Constant array | 1 |
_lrrc(long *); | 0 | 整型与浮点型转换 | 1 |
Rev 1.10 7 March 27, 2012
Holtek C、 Holtek Enhance C 和 ANSI C 的比较
盛群半导体股份有限公司 ( 总公司 )
新竹市科学工业园区研新二路 3 号
电话 : 886-3-563-1999
传真 : 886-3-563-1189
网站 : www.holtek.com
盛群半导体股份有限公司 ( 台北业务处 )
台北市南港区园区街 3 之 2 号 4 楼之 2
电话 : 886-2-2655-7070
传真 : 886-2-2655-7373
传真 : 886-2-2655-7383 (International sales hotline)
盛扬半导体有限公司 ( 深圳业务处 )
深圳市深南山区高新中二道 5 号生产力大楼 A 单元 5 楼 518057
电话 : 86-755-8616-9908
传真 : 86-755-8616-9722
Holmate Semiconductor, Inc. ( 北美业务处 )
46712 Fremont Blvd., Fremont, CA 94538
电话 : 1-510-252-9880
传真 : 1-510-252-9885
网站 : www.holmate.com
Copyright? 2012 by HOLTEK SEMICONDUCTOR INC.
使用指南中所出现的信息在出版当时相信是正确的, 然而盛群对于说明书的使用不负任何责任。 文中提到的应用
目的仅仅是用来做说明, 盛群不保证或表示这些没有进一步修改的应用将是适当的, 也不推荐它的产品使用在会
由于故障或其它原因可能会对人身造成危害的应用。 盛群产品不授权使用于救生、 维生器件或系统中做为关键组
件。 盛群拥有不事先通知而修改产品的权利, 对于最新的信息, 请参考我们的网址 http://www.holtek.com