凌阳教育的个人空间 https://blog.eetop.cn/204849 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

嵌入式程序设计中的函数

已有 489 次阅读| 2016-2-26 16:26

函数是C语言程序设计的核心。一个较大的C语言程序一般由一个主函数和若干个子函数组成,每个函数实现一个特定的功能。主函数可调用其他函数,其它函数之间也可相互调用。函数库为了减轻编程工作量,将一些常用功能的函数放在函数库中供公共使用。好的程序尽量使用函数和函数库。函数和函数库是基于C语言编程的基本单元。

函数的格式

下面给出了函数的定义性说明个原型说明。

1)  定义性说明格式

[存储类说明符]     类型说明符    [修饰符] 标识符 (参数表){函数体}

其中:

存储类说明符有staticextern2种。

类型说明符有charunsignedcharintunsigned longfloatdoublelong doublestructunionvoid等几种。

标识符有函数名、函数名、(函数名)、函数名)等几种。

修饰符有Interruptnearfarhuge等几种。

2)原型说明格式

Extern     类型说明符[修饰符]     标识符(参数表){函数体}

其中:

类型说明符、标识符、参数表、函数体这几项是函数定义性说明中必不可少的部分。可在程序源文件的任意处进行函数的定义说明,并被分配内存。

类型说明符部分泳衣说明函数返回值的类型。有简单类型,符合类型。为说明函数返回的是指针,在函数名前加星号

标识符部分用以说明函数名。但函数名前加分割符“*”时,说明返回值是指针。被圆括号起如(*函数名),则标识符是函数指针。如果括号外再加分割符“*”,如“**函数名)”,则标识符是函数指针,且函数的返回指针类型。

参数表是传入函数的形式参数表。形式参数表格式为:

(类型说明符       变量名 [,类型说明符 变量名]…)或(void)或()

其中(void)说明无参数传入。允许用空格代替void作为参数表,即()。

函数体部分由符合语句构成。

存储类说明符部分。

extern——C语言的函数否是全程需存在的,在不加任何存储类说明的情况下,都是全程序可见的。但是,如果程序为多源文件时,非定义函数的文件要调用该函数时,须加原型说明。另外,即使在定义函数的源文件中,如果在函数定义之前超前调用,也需要加原型说明,而且原型说明中必须加存储类说明符extern

static——为了提高函数的安全性,在进行函数的定义性说明时,加上static存储类说明符,表示在本文件定义前和非函数定义文件中,该函数将不能被调用。它可定义需要具有内部链接的全局变量或者函数,即它们应在一个单一的编译单元里是可见的,但在外部则不可见。使用static关键词限制变量的范围。

修饰符对函数起修饰作用。

interrupt——为最重要的修饰符。它将函数修饰为中断函数。中断函数的最大特点是返回类型和参数均必须为void。函数经过interrupt修饰后,程序员只编写中断服务程序的主题部分,中断服务程序中的保护现场前缀段和恢复现场的后缀段,均由编译程序完成。另外,编译程序还将ret指令改为reti指令。

 nearfarhuge——规定函数的地址类型。它将覆盖存储模式规定的函数缺省地址类型。它指明函数和被调用函数之间的距离的远近。near为近调用(16位段内地址);far为原调用(32位段间地址);huge为规范化远调用(32为段间地址规范地址)。

示例       本函数为LED灯亮、灭显示的控制程序段,是带参数的函数。

void Led_Display(int LedStatus)                 /函数定义,参数为int LedStatus,用于表示LED状态,根据参数点亮熄灭LED1LED2/

(

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

}

。代表星号

凌阳教育,专注嵌入式人才培养多年,完善的培养方案,强大的师资,合理的课程安排,成功从小白蜕变为嵌入式工程师。想了解凌阳教育,或者获得更多嵌入式学习资料的免费下载,请点击www.sunplusedu.com访问凌阳教育官网


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 1

    粉丝
  • 0

    好友
  • 1

    获赞
  • 3

    评论
  • 3815

    访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-25 16:31 , Processed in 0.045609 second(s), 13 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部