Keil头文件简介
- 格式:pdf
- 大小:310.48 KB
- 文档页数:26
Keil中INTRINS.H的作用
在C51单片机编程中,头文件INTRINS.H的函数使用起来,就会让你像在用汇编
时一样简便.
内部函数 描述
_crol_ 字符循环左移
_cror_ 字符循环右移
_irol_ 整数循环左移
_iror_ 整数循环右移
_lrol_ 长整数循环左移
_lror_ 长整数循环右移
_nop_ 空操作8051 NOP 指令
_testbit_ 测试并清零位8051 JBC 指令
函数名: _crol_,_irol_,_lrol_
原 型: unsigned char _crol_(unsigned char val,unsigned char n);
unsigned int _irol_(unsigned int val,unsigned char n);
unsigned int _lrol_(unsigned int val,unsigned char n);
举例:
_crol_,_cror_:将char型变量循环向左(右)移动指定位数后返回
_testbit_: 相当于JBC bitvar测试该位变量并跳转同时清除。
_chkfloat_: 测试并返回源点数状态。
就是汇编中的子函数。
_crol_,_cror_:如国二进制数为01010101 那么_crol_(1) 左移1位后将高位
补低位。
结果10101010。
功 能:_crol_,_irol_,_lrol_以位形式将val 左移n 位,该函数与8051“RLA”
指令相关,上面几个函数不同于参数类型。
例:
#include
main()
{
unsigned int y; C-5 1 程序设计 37
y=0x00ff;
y=_irol_(y,4);
}
函数名: _cror_,_iror_,_lror_
原 型: unsigned char _cror_(unsigned char val,unsigned char n);
unsigned int _iror_(unsigned int val,unsigned char n);
unsigned int _lror_(unsigned int val,unsigned char n);
功 能:_cror_,_iror_,_lror_以位形式将val 右移n 位,该函数与8051“RRA”
指令相关,上面几个函数不同于参数类型。
例:
#include
main()
{
unsigned int y;
y=0x0ff00;
y=_iror_(y,4);
}
函数名: _nop_
原 型: void _nop_(void);
功 能:_nop_产生一个NOP 指令,该函数可用作C 程序的时间比较。C51 编译器
在_nop_函数工作期间不产生函数调用,即在程序中直接执行了NOP 指令。
例:
P()=1;
_nop_();
P()=0;
函数名: _testbit_
原 型:bit _testbit_(bit x);
功 能:_testbit_产生一个JBC 指令,该函数测试一个位,当置位时返回1,否
则返回0。如果该位置为1,则将该位复位为0。8051 的JBC 指令即用作此目的。
_testbit_只能用于可直接寻址的位;在表达式中使用是不允许的。
Math.h库
函数:sin
功能:计算弧度的正弦值。
使用说明:sin(x),x为传入的弧度值。
函数:cos
功能:计 算弧度的余弦值。
使用说明:cos(x),x为传入的弧度值。
函数:tan
功能:计算弧度的正切值。
使用说 明:tan(x),x为传入的弧度值。
函数:sinh
功能:计算弧度的双曲正弦值。
使用说明:sinh(x),x为传入 的弧度值。
函数:cosh
功能:计算弧度的双曲余弦值。
使用说明:cosh(x),x为传入的弧度值。
函 数:tanh
功能:计算弧度的双曲正切值。
使用说明:tanh(x),x为传入的弧度值。
函数:asin
功能: 计算弧度的反正弦值。
使用说明:asin(x),x为传入的弧度值。
函数:acos
功能:计算弧度的反余弦值。
使 用说明:acos(x),x为传入的弧度值。
函数:atan
功能:计算弧度的反正切值。
使用说明:atan(x),x为 传入的弧度值。
函数:atan2
功能:计算两个浮点数类型值之比的反正切值。
使用说明:atan2(x,y),该函数会 计算出x/y的反正切值。
函数:log
功能:计算浮点数的自然对数值。
使用说明:log(x),计算以e为底的对数。
函数:log10
功能:以10为底来计算对数值。
使用说明:log10(x),计算以10为底的对数。
函 数:pow
功能:计算出某数的某次方值。
使用说明:pow(x,y),计算x的y次方。
函数:exp
功能:计算 浮点为数的指数函数值。
使用说明:exp(x),计算e的x次方。
函数:frexp
功能:调整浮点变量,将原变量的数值 部分调整到介于0.5和1之间。
使用说明:double y = frexp(double x, int *expptr),函数frexp将double
x的数值部分调整成介于0.5和1之间,将调整好的新数值部分回传给y,而指
数部分将传给指针expptr所指的位置,使x=y*(2^expptr)。 如x=10.5428,y
将为0.658925,*expptr将为4,有算式10.5428=0.658925*(2^4)。
函 数:ldexp
功能:根据所给予的数值部分x和指数部分y计算出浮点数x*(2^y)的值。
使用说明:ldexp(double x, int y),将返回x*(2^y)的值。
函数:_cabs
功能:取得复数结构的绝对值。
使用说明:double y = _cabs(struct _complex x),设复数x的实数部分为a,
虚数部分为b,则cabs将会计算x.a的平方加x.b的平方的和开根号的值。
函数:fabs
功 能:计算浮点数变量的绝对值。
使用说明:fabs(x),计算x的绝对值。
函数:hypot
功能:计算已知两边的直角三 角形的斜边长。
使用说明:hypot(x,y),计算x与y的平方和,再开根号后的值。
函数:ceil
功能:计算不小于 某浮点数的最小整数。
使用说明:ceil(x)。
函数:floor
功能:计算不大于某浮点数的最大整数。
使用说 明:floor(y)。
函数:modf
功能:求浮点数的小数部分。
使用说明:double z = modf(double x, double *y),x的整数部分会写入*y,
返回小数部分。如x为99.5,z将为0.5,*y将为99。
函 数:fmod
功能:求两浮点数相除后的余数。
使用说明:double z = fmod(double x, double y),z等于x除以y后的余数。
函数:sqrt
功能:求某非负浮点数的平方根。
使用说明:sqrt(x)。
注: 以上函数均在mingw gcc 4.5.0下用小例程测试通过。在gcc 4.5.0中,
求整数绝对值的abs函数是在stdlib.h头文件中提供。
assert的用法
assert();
当expression结果为“假”时,会在stderr中输出这条语句所在的文件名和行号,以及这条
表达式。这只在调试版本中起作用,在Release版本中不会产生任何代码。
通常当我们使用assert时,都在强烈说明一个含义:在这里必然如此。它通常用于一个函
数的先验条件和后验条件的检查。比如我写一个C风格复制字符串的函数,并且认为调用
者不应该传入NULL指针:
char * clone_string(const char * source)
{
char * result;
assert(source != NULL);
result = (char *)malloc(strlen(source) + 1);
if (result != NULL)
{
strcpy(result, source);
assert(strcmp(result, source) == 0);
}
return result;
}
注意到我对source是否为NULL是用assert检查的,但对result是不是为NULL是用if语
句判断的,这是因为在调用代码正确的情况下source必然不为NULL,如果断言失败,说明
调用代码中有错误,需要修改;但result作为malloc的返回值则不一定,在malloc代码无
误的情况下仍然可能返回NULL——当内存块不足时。最后又用assert对strcpy的结果进行
检查,因为只要代码正确,无论什么情况strcpy应该正常完成复制,它没有malloc那种异
常情况存在。
在《编程精粹》第二章(自己设计并使用断言)开始的一段话把assert的用途说的很清楚:
利用编译程序自动查错固然好,但我敢说只要你观察一下项目中那些比较明显的错误,就
会发现编译程序所查出的只是其中的一小部分。我还敢说,如果排除掉了程序中的所有错误
那么在大部分时间内程序都会正确工作。
还记得第1章中的下面代码吗?
strCopy = memcpy(malloc(length), str, length);
该语句在多数情况下都会工作得很好,除非malloc的调用产生失败。当malloc失败时,
就会给memcpy返回一个NULL指针。由于memcpy处理不了NULL指针,所以出现了错
误。如果你很走运,在交付之前这个错误导致程序的瘫痪,从而暴露出来。但是如果你不走
运,没有及时地发现这个错误,那某位顾客就一定会“走运”了。