打印

指向函数的指针疑问~

[复制链接]
2367|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dudongdao|  楼主 | 2008-7-30 14:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    最近有一个问题一直想不通~ 请教一下大家~ 
    函数C调用函数B,如果C和B中都用到相同的RAM资源~  会不会产生问题呢~   下面是一个例子

void A(void)
{
//若干指令

}
void B(void)
{
//若干指令

}

void C(void (*P)(void))
{
//若干指令
P();
//若干指令

}

void main(void)
{
void (*P)(void);

P=A;
C(P);
//这里C中调用A
P=B;
C(P);
//这里C中调用B

}
上面的例子中,会不会出现所调用函数用到的RAM和自己用到的RAM相同导致
数据出错呢?  用KEILC编译了一个小函数,发现根本没有保护RAM的操作,如下面所示,
RAM的08 09 14H 是不是就被破坏了呢?如果调用函数中也用到了08 09 这样就出错了是不是这样呢?
如果是直接调用,调用函数知道具体资源可以避免,但是用指针函数如何处理呢~ 一直想不通,请大家
指点一下~
    12: void Delay(unsigned int i) 
C:0x008C    8E08     MOV      0x08,R6
C:0x008E    8F09     MOV      0x09,R7
    13: { 
    14:         unsigned char arr[10]; 
    15:  
    16:         arr[10] = i; 
    17:  
C:0x0090    850914   MOV      0x14,0x09
    18: } 
C:0x0093    22       RET      

相关帖子

沙发
dld2| | 2008-7-30 14:28 | 只看该作者

不会,由编译器保证

使用特权

评论回复
板凳
dudongdao|  楼主 | 2008-7-30 14:43 | 只看该作者

可以说下大概过程吗

能不能说一下大概原理~  函数指针指向哪个是可变的~  调用函数是固定的~
就这里想不通了~  
   可以说一下大概处理过程吗~  

使用特权

评论回复
地板
dld2| | 2008-7-30 15:12 | 只看该作者

俺错了

貌似有个reentrant机制。

使用特权

评论回复
5
dudongdao|  楼主 | 2008-7-30 15:14 | 只看该作者

如何处理这种情况~

   类似的函数调用的话,应该追寻什么样的规则呢~  
DLD2讲解一下啊~

使用特权

评论回复
6
枯竹| | 2008-7-30 15:14 | 只看该作者

KEIL C指针型函数会出问题

一般C编译器是通过压栈来保存局部变量的,但是KEIL C51编译器不是,它好像是通过函数的调用关系来确定变量保存地址的,在LZ的例子中指针函数A,和B是在子程序C中被调用的,但是KEIL C编译却把它当作是MAIN函数调用的。所以在编译连接时会出现错误,造成局部变量被莫名其妙的修改。可以通过编写连接文件改变函数调用关系来解决这个问题,但是比较麻烦。不知新版本KEIL C51是否已解决这个问题,或者还有其他更简单的方法。比如强制申明函数为可重入函数。

使用特权

评论回复
7
dudongdao|  楼主 | 2008-7-30 15:28 | 只看该作者

了解了~

    看来还是尽量避免这种应用了~   

使用特权

评论回复
8
农民讲习所| | 2008-7-30 15:44 | 只看该作者

08,09是扩展的R寄存器,你把它看做R6一样

使用特权

评论回复
9
原野之狼| | 2008-7-30 15:46 | 只看该作者

在KEIL下会出问题,在GCC下没有研究过。。。

对于这个问题,我曾经看过KEIL的资料,楼主的用法肯定会出问题。。。
当使用函数指针的时候,KEIL无法分析CALL TREE,因此采用变量覆盖技术后,函数的局部变量(参数及内部变量)有可能会得到改变。

使用特权

评论回复
10
ljxh401| | 2008-7-30 18:47 | 只看该作者

用avr了 最讨厌51的临时变量固定地址的了

使用特权

评论回复
11
农民讲习所| | 2008-7-30 19:36 | 只看该作者

不对,这里是正确的

这里是挥发性质的寄存器,用完就扔的,和ACC一样。外部都使用R6,R7做入口参数,调用也只影响R6,R7。

使用特权

评论回复
12
平常人| | 2008-7-30 21:48 | 只看该作者

看看编译器的手册,是否支持函数的可重入

如果支持函数的可重入,楼主就不必担心,否则就要小心为妙。

使用特权

评论回复
13
dudongdao|  楼主 | 2008-7-30 22:35 | 只看该作者

看了,支持可重入~ 但还是不这么用算了~

     做了个小实验~  调用函数和被调用函数都声明为可重入的~ 就没问题了~   调用函数声明为不可重入,被调用函数声明为可重入也不行。 
    看来还是不用指向函数的指针好点~   危险啊~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

90

主题

413

帖子

1

粉丝