搜索
bottom↓
回复: 7

感觉icc对指向函数的指针操作有问题啊

[复制链接]

出0入0汤圆

发表于 2009-11-6 22:11:23 | 显示全部楼层 |阅读模式
比如一个函数原型如下:
void fun1( void (*paa)(void) );

另一个函数是
void fun2()
{
。。。
}
然后执行 fun1(fun2);的时候总是会出错,用单步调试的时候发现进入fun1函数里面以后,参数值不是原来fun2的地址了。
换了个版本的icc,还是一样会传错。
很奇怪,怎么回事呢?

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2009-11-6 23:25:46 | 显示全部楼层
楼主 指向函数的指针是介个样子滴

void (*fun1) (void)

出0入0汤圆

 楼主| 发表于 2009-11-6 23:53:58 | 显示全部楼层
是啊,我觉得语法上没错吧。
我是把void (*paa)(void)这个指针当成fun1函数的参数传进去了。
我还是写完整一点吧

比如两个函数是:
void fun1( void (*paa)(void) )
{
  (*paa)();
}

void fun2()
{
....
}

然后运行 fun1(fun2);的时候,发现传到fun1函数内的不是fun2函数的地址。不知道为什么。

出0入0汤圆

发表于 2009-11-7 00:12:01 | 显示全部楼层
iar没有问题

出0入0汤圆

发表于 2009-11-7 01:10:06 | 显示全部楼层
哦,那就楼主贴出的这部分代码看是没有任何问题的,帮不上了

出0入0汤圆

 楼主| 发表于 2009-11-7 10:31:35 | 显示全部楼层
刚看了生成的汇编代码,好像是传进去一个值,然后根据这个值再去某个地方查找函数入口的。
所以用fun1(fun2);直接调用可以执行,但是传进去的不是函数的地址值。

我最近在写一个简单的任务调度的东西,需要直接得到函数的地址
不知道有没有办法可以直接获得函数的地址值呢?

出0入0汤圆

发表于 2009-11-7 11:12:08 | 显示全部楼层
期待中

出0入0汤圆

发表于 2009-11-7 11:13:49 | 显示全部楼层
我最近在写一个简单的任务调度的东西
-------------------------------------

OS建议用GCC,或IAR.

一般任务上下文初始化,需要函数地址。
个人代码:GCC



typedef struct
{
  uint8       _reserved;

  uint8       _r0;
  uint8       _r1;

  uint8       _r2;
  uint8       _r3;
  uint8       _r4;
  uint8       _r5;

  uint8       _r6;
  uint8       _r7;
  uint8       _r8;
  uint8       _r9;

  uint8       _r10;
  uint8       _r11;
  uint8       _r12;
  uint8       _r13;

  uint8       _r14;
  uint8       _r15;
  uint8       _r16;
  uint8       _r17;

  uint8       _r18;
  uint8       _r19;
  uint8       _r20;
  uint8       _r21;

  uint8       _r22;
  uint8       _r23;
  uint8       _r24;
  uint8       _r25;

  uint8       _r26;
  uint8       _r27;
  uint8       _r28;
  uint8       _r29;


  uint8       _r30;

  uint8       _sreg;

  uint8       _r31;

  uint8       _pch;
  uint8       _pcl;

}ctx_sp_t;


typedef ctx_sp_t TContext;

                 指向上下文指针的指针    函数指针,指向任务处理函数          指向任务堆栈空间
void ctx_init(  TContext **Context    ,    TTaskProc *TaskProc         ,   void *Stack1  )
{
  ctx_sp_t *ctx_sp;

  ctx_sp=(ctx_sp_t *)Stack1 - 1;
  
  ctx_sp->_pcl  = (uint16)TaskProc%256;
  ctx_sp->_pch  = (uint16)TaskProc/256;

  ctx_sp->_sreg = 0;
  
  ctx_sp->_r31 = 0x31;
  ctx_sp->_r30 = 0x30;
  ctx_sp->_r29 = 0x29;
  ctx_sp->_r28 = 0x28;
  ctx_sp->_r27 = 0x27;
  ctx_sp->_r26 = 0x26;  
  ctx_sp->_r25 = 0x25;
  ctx_sp->_r24 = 0x24;
  ctx_sp->_r23 = 0x23;
  ctx_sp->_r22 = 0x22;
  ctx_sp->_r21 = 0x21;
  ctx_sp->_r20 = 0x20;
  ctx_sp->_r19 = 0x19;
  ctx_sp->_r18 = 0x18;
  ctx_sp->_r17 = 0x17;
  ctx_sp->_r16 = 0x16;  
  ctx_sp->_r15 = 0x15;
  ctx_sp->_r14 = 0x14;  
  ctx_sp->_r13 = 0x13;
  ctx_sp->_r12 = 0x12;  
  ctx_sp->_r11 = 0x11;
  ctx_sp->_r10 = 0x10;  
  ctx_sp->_r9  = 0x09;  
  ctx_sp->_r8  = 0x08;
  ctx_sp->_r7  = 0x07;
  ctx_sp->_r6  = 0x06;  
  ctx_sp->_r5  = 0x05;
  ctx_sp->_r4  = 0x04;  
  ctx_sp->_r3  = 0x03;  
  ctx_sp->_r2  = 0x02;

  ctx_sp->_r1  = 0x00;  
  ctx_sp->_r0  = 0x00;

  *Context=ctx_sp;

}
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 18:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表