keil c51函数指针

keil c51函数指针

ID:38364724

大小:71.00 KB

页数:15页

时间:2019-06-11

keil c51函数指针_第1页
keil c51函数指针_第2页
keil c51函数指针_第3页
keil c51函数指针_第4页
keil c51函数指针_第5页
资源描述:

《keil c51函数指针》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、KeilC51中的函数指针和再入函数,函数指针与overlay=====调用树的保存  C51不把函数参数压栈(除非使用再入函数)。函数参数和全局变量被存入寄存器或固定的存储空间。这样阻止函数的再入。例如,一个函数调用它自己,它将覆盖它自己的参数或存储空间。函数的再入问题通过关键字“reentrant”来解决。函数指针的非再入函数的副作用,在执行中出现问题。MAIN函数调用FUNC和FUNC_CALLER(根据调用树)。用函数的指针来传递参数,调用树往往会出错。=====转       这篇文章是由Keil

2、C51的英文文档翻译过来的,很多语句都是根据自己的理解翻译的,肯定还有许多地方需要推敲。希望读者能吸取到有用的部分,不要被误解了,自己多理解。Overlay修改用于数据覆盖的调用树。如果在用户程序里使用了函数指针,或者使用了像实时操作系统中调度器那样的跳转(k指的是指针方式的调用吗?),那么,修改程序调用树将是很有必要的。混合编程:函数名                      符号名         解释viodfunc(void)             FUNC           无参数传递,或不

3、含寄存器参数的函数名不作改变                                            转入目标文件中,名字只是简单地转为大写形式viodfunc(char)             _FUNC      带寄存器参数的函数名加入“_”字符前缀,它表明                                        这类函数包含寄存器内的参数传递viodfunc(viod)reentrant   _?FUNC         “_?”表示可重入,它表明该行数包含栈内

4、的参数传递。====将下面这篇的难点内容提到前面使用函数指针的附加说明  如果你在C51中使用函数指针编程,有几个附加的说明你必须注意。参数列表的限制  通过函数指针传递参数给函数必须把所有的参数存入寄存器。在大部分情况下,3个参数能够自动通过寄存器传递。在C51的用户手册中能找到传递参数进入寄存器的运算法则。但是并不保证,任何的3个数据类型可以传递。 因为C51在寄存器中传递3个参数,用于传递参数的存储空间是不被分配的,除非函数指向一个要求更多参数的函数。如果在那样的情况下,可以把参数混入一个结构体中,然

5、后通过一个结构体指针传递参数。如果这样不可接受,你可以使用再入函数(看下面)。 调用树的保存  C51不把函数参数压栈(除非使用再入函数)。函数参数和全局变量被存入寄存器或固定的存储空间。这样阻止函数的再入。例如,一个函数调用它自己,它将覆盖它自己的参数或存储空间。函数的再入问题通过关键字“reentrant”来解决。函数指针的非再入函数的副作用,在执行中出现问题。  为了保护尽量多的数据空间,连接器执行调用树的性能分析,决定一些存储空间被安全的覆盖。例如,如果你的应用中包含main函数,函数a,函数b,函

6、数c,并且main函数调用a,b,c,但是a,b,c之间没有互相调用。在你应用中的调用树见出现如下:MAIN   +→A   +→B   +→C这样A,B,C的存储空间可以被安全的覆盖。 当调用树不能正确的建立,函数指针将带来问题。因为连接器不能决定函数之间的引用。在这个问题上,没有自动的解决方法。 下面两个源文件将解答这个问题,使问题容易明白。第一个源文件FPCALLER.C,包括一个函数,它通过一个函数指针(fptr)调用另一个函数。 FPCALLER.C     //第一个源文件FPCALLER.C 

7、(文件名) void func_caller(long(code*fptr)(unsignedint))     //(函数名){      unsignedchari;     for(i=0;i<10;i++)       {        (*ftpr)(i);       }} 第二个源文件FPMAIN.C,包含C主函数和被func_caller调用的函数func。      注意main函数调用func_caller,把func的地址作为参数传递给func_caller。 FPMAIN.C    

8、 //第二个源文件FPMAIN.C(文件名)extern voidfunc_caller(long(code*)(unsignedint));int func(unsignedintcount)     // (函数名){    longj;    longk;    k=0;    for(j=0;j

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。