前面提到C语言对嵌入式开发的重要性,作为C语言程序设计的核心的函数,也是我们需要了解的部分。如何学习嵌入式开发程序设计中的函数?粤嵌嵌入式培训怎么做到的。
一个较大的C语言程序一般由一个主函数和若干个子函数组成,每个函数实现一个特定的功能。主函数可调用其他函数,其它函数之间也可相互调用。函数库为了减轻编程工作量,将一些常用功能的函数放在函数库中供公共使用。好的程序尽量使用函数和函数库。函数和函数库是基于C语言编程的基本单元。
函数的格式
嵌入式开发C语言课程给出了函数的定义性说明和原型说明。
1)定义性说明格式
其中:
存储类说明符有static和extern2种。
类型说明符有char、unsigned、char、int、unsigned long、float、double、long double、struct、union、void等几种。
标识符有函数名、。函数名、(。函数名)、。(。函数名)等几种。
修饰符有Interrupt、near、far、huge等几种。
2)原型说明格式
Extern 类型说明符[修饰符] 标识符(参数表){函数体}
类型说明符、标识符、参数表、函数体这几项是函数定义性说明中必不可少的部分。可在程序源文件的任意处进行函数的定义说明,并被分配内存。
有简单类型,符合类型。为说明函数返回的是指针,在函数名前加星号。
标识符部分用以说明函数名。但函数名前加分割符“*”时,说明返回值是指针。被圆括号起如(*函数名),则标识符是函数指针。如果括号外再加分割符“*”,如“*(*函数名)”,则标识符是函数指针,且函数的返回指针类型。
(类型说明符 变量名 [,类型说明符 变量名]…)或(void)或()
其中(void)说明无参数传入。允许用空格代替void作为参数表,即()。
函数体部分由符合语句构成。
存储类说明符部分。
extern——C语言的函数否是全程需存在的,在不加任何存储类说明的情况下,都是全程序可见的。但是,如果程序为多源文件时,非定义函数的文件要调用该函数时,须加原型说明。另外,即使在定义函数的源文件中,如果在函数定义之前超前调用,也需要加原型说明,而且原型说明中必须加存储类说明符extern。
static——为了提高函数的安全性,在进行函数的定义性说明时,加上static存储类说明符,表示在本文件定义前和非函数定义文件中,该函数将不能被调用。它可定义需要具有内部链接的全局变量或者函数,即它们应在一个单一的编译单元里是可见的,但在外部则不可见。使用static关键词限制变量的范围。
修饰符对函数起修饰作用。
interrupt——为重要的修饰符。它将函数修饰为中断函数。中断函数的特点是返回类型和参数均必须为void。函数经过interrupt修饰后,程序员只编写中断服务程序的主题部分,中断服务程序中的保护现场前缀段和恢复现场的后缀段,均由编译程序完成。另外,编译程序还将ret指令改为reti指令。
near、far和huge——规定函数的地址类型。它将覆盖存储模式规定的函数缺省地址类型。它指明函数和被调用函数之间的距离的远近。near为近调用(16位段内地址);far为原调用(32位段间地址);huge为规范化远调用(32为段间地址规范地址)。
示例:本函数为LED灯亮、灭显示的控制程序段,是带参数的函数。
(
led_state=LedStatus; /将传递来的参数值赋给LED状态全局变量*/
if((LedStatus&0x01)==0x01)
rPDATB=rPDATB&0x5FF; /LED1亮/
else
rPDATB=rPDATB|0x200; /LED1灭/
if((LedStatus&0x01)==0x02)
rPDATB=rPDATB&0x3FF; /LED2亮/
else
rPDATB=rPDATB|0x400; /LED2灭/
}
示例 本函数为键盘初始化程序,该函数不需要参数。
void KeyboardInt(void)
{
Int value;
rI_ISPC=BIT_EINT1 //清除中断挂起位
rEXTINTPND=0xF; //设置EXTINTPND寄存器
value=key_read();
if(value>-1)
Digit_Led_Symbol(value);
rI_ISPC=BIT_EINT1; //清除中断挂起位
rINTCON=0x1;
}