[编者按] 为使广大嵌入式系统应用技术人员系统地了解和掌握一些先进应用、开发技术,本刊从创刊号起开辟《学习园地》栏目。上半年集中介绍嵌入式C编程技术(一)~(六),内容包括单片机C语言应用程序设计中的变量定义和变量空间、C语言编程技巧、函数有效使用及混合编程技术。 嵌入式C编程技术(六) 北京理工大学马忠梅 (2)“Structure”型返回值 这部分考虑返回“Structure”型返回值的函数。例子如下所示: 1〖3〗#define BIG_DATA 5389〖1〗2〖3〗#define SMALL_DATA 145〖1〗3〖3〗#define OK 1〖1〗4〖3〗#define ERR -1〖1〗5〖1〗6〖3〗struct list{〖1〗7〖3〗int data_1;〖1〗8〖3〗int data_2;〖1〗9〖3〗long add;〖1〗10〖3〗long sub;〖1〗11〖3〗long mul;〖1〗12〖3〗long div;〖1〗13〖3〗};〖1〗14〖1〗15〖3〗int main()〖1〗16〖3〗{〖1〗17〖〗1〖〗struct list func_struct(struct list);〖1〗18〖〗1〖〗struct list before;〖1〗19〖〗1〖〗struct list after;〖1〗20〖〗1〖1〗21〖〗1〖〗before.data_1=BIG_DATA;〖1〗22〖〗1〖〗before.data_2=SMALL_DATA;〖1〗23〖〗1〖1〗24〖〗1〖〗after=func_struct(before);〖1〗25〖〗1〖〗if(after.add==before.add)〖1〗26〖〗1〖〗return(OK);〖1〗27〖〗1〖〗else〖1〗28〖〗1〖〗return(ERR);〖1〗29〖〗1〖〗}〖1〗30〖1〗31〖3〗struct list func_struct(struct list dat)〖1〗32〖3〗{〖1〗33〖〗1〖〗dat.add=dat.data_1+dat.data_2;〖1〗34〖〗1〖〗dat.sub=dat.data_1-dat.data_2;〖1〗35〖〗1〖〗dat.mul=dat.data_1*dat.data_2;〖1〗36〖〗1〖〗dat.div=dat.data_1/dat.data_2;〖1〗37〖〗1〖〗〖1〗38〖〗1〖〗return(dat);〖1〗39〖〗1〖〗}这个例子里,“func_main( )”函数调用返回“list”型结构值的“func_struct( )”函数。在程序的第24行调用“func_struct( )”函数。20字节的结构在调用“func_struct( )”函数之前拷贝到RAM中。 在这个例子中,“func_struct( )”函数的返回值结构赋给了“after”结构。像这种情况,也可以定义1个传递返回值地址的函数,然后返回值返回到那个地址。下面的例子,函数“func_p_struct( )”是“func_struct( )”函数的改进版本。函数所做的第1件事就是把保存“before”和“after”结构的地址作为参数。只要传递6个字节。 1〖3〗#define BIG_DATA 5389〖1〗2〖3〗#define SMALL_DATA 145〖1〗3〖3〗#define OK 1〖1〗4〖3〗#define ERR -1〖1〗5〖1〗6〖3〗struct list{〖1〗7〖3〗int data_1;〖1〗8〖3〗int data_2;〖1〗9〖3〗long add;〖1〗10〖3〗long sub;〖1〗11〖3〗long mul;〖1〗12〖3〗long div;〖1〗13〖3〗};〖1〗14〖1〗15〖3〗int main()〖1〗16〖3〗{〖1〗17〖〗1〖〗void func_p_struct(struct list *,struct list *);〖1〗18〖〗1〖〗struct list before;〖1〗19〖〗1〖〗struct list after;〖1〗20〖〗1〖1〗21〖〗1〖〗before.data_1=BIG_DATA;〖1〗22〖〗1〖〗before.data_2=SMALL_DATA;〖1〗23〖〗1〖1〗24〖〗1〖〗func_p_struct(&before,&after);〖1〗25〖〗1〖〗if(after.add==before.add)〖1〗26〖〗1〖〗return(OK);〖1〗27〖〗1〖〗else〖1〗28〖〗1〖〗return(ERR);〖1〗29〖〗1〖〗}〖1〗30〖1〗31〖3〗void func_p_struct(struct list *in,struct list *out)〖1〗32〖3〗{〖1〗33〖〗1〖〗int a,b;〖1〗34〖〗1〖1〗35〖〗1〖〗a=out->data_1=in->data_1;〖1〗36〖〗1〖〗b=out->data_2=in->data_2;〖1〗37〖〗1〖1〗38〖〗1〖〗out->add=a+b;〖1〗39〖〗1〖〗out->sub=a-b;〖1〗40〖〗1〖〗out->mul=a*b;〖1〗41〖〗1〖〗out->div=a/b;〖1〗42〖〗1〖〗}在这个例子里,被调用函数传递的参数由前面例子的结构变化成结构的地址。“func_struct( )”的结果直接返回到“func_main( )”定义的“after”结构中。 四、 混合编程 在用C语言开发程序的过程中,有时感到速度达不到要求,如很明显的显示内容的更新或做显示内容的移动。在这种情况下,可以找到速度的瓶颈函数:数据移动和把显示内容从内存移到显示扫描存储器的函数。见下面程序的“move( )”和“toscr( )”函数,源程序名为step.c。 #include
#include #define uchar unsigned char #define uint unsigned int #define SLAVE 0x01 #define SBUFF 0x1f #define RMOVE 0x0000 #define RBUFF 0x2000 #define GMOVE 0x4000 #define GBUFF 0x6000 #define GOFFSET GMOVE-RMOVE uchar data row,col; void move(uint src,uint dest,uint Length); void toscr(uint addr,uchar col1,uchar row1); void main() { uint data i,j,x,y,Length; uint data temp; row=2; col=8; temp=row*col*256; move(RBUFF,RMOVE,temp); move(GBUFF,GMOVE,temp); toscr(RMOVE,col,row); } void move(uint src,uint dest,uint Length) { uchar xdata *ptr1=src; uchar xdata *ptr2=dest; P1=SBUFF; while(Length--) { *ptr2++=*ptr1++; } } void toscr(uint addr,uchar col1,uchar row1) { uchar a; uint x,y,i,row16,col2; uchar xdata *ptr; uchar xdata *ptr1=addr; col2=col*2;row16=row*16; i=(32-col)*4; ptr=i+0x8000; for(y=0;y
来源:单片机与嵌入式系统应用 作者:北京理工大学 马忠梅 2006/2/12 0:00:00