6985|5

10

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

请教IAR下函数指针的使用问题, [复制链接]

拿到了团购的板子了!!高兴下!~~嘻嘻。
刚才在跑官方的这段例程:
//   MSP430G2xx1 Demo - Reset on Invalid Address fetch, Toggle P1.0
//
//  Description: Toggle P1.0 by xor'ing P1.0 inside of a software loop that
//  ends with TAR loaded with 3FFFh - op-code for "jmp $" This simulates a code
//  error. The MSP430F21x1 will force a reset because it will not allow a fetch
//  from within the address range of the peripheral memory, as is seen by
//  return to the mainloop and LED flash.
//  In contrast, an MSP430F1xx device will "jmp $" stopping code execution with
//  no LED flash.
//  ACLK = n/a, MCLK = SMCLK = default DCO
//
//                MSP430G2xx1
//             -----------------
//         /|\|              XIN|-
//          | |                 |
//          --|RST          XOUT|-
//            |                 |
//            |             P1.0|-->LED
//
//  H. Grewal / M. Buccini
//  Texas Instruments Inc.
//  October 2010
//  Built with CCS Version 4.2.0 and IAR Embedded Workbench Version: 5.10
//******************************************************************************

#include  <msp430g2231.h>

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer
  P1DIR |= 0x01;                            // Set P1.0 to output direction
  TAR = 0x3FFF;                             // Opcode for "jmp $"

  for (;;)
  {
    volatile unsigned int i;

    P1OUT ^= 0x01;                          // Toggle P1.0 using exclusive-OR

    i = 50000;                              // Delay
    do (i--);
    while (i != 0);
    ((void (*)())0x170)();                  // Invalid fetch ("call #0170h")
  }
}

对里面的这句代码不大理解:
((void (*)())0x170)();                  // Invalid fetch ("call #0170h")


猜想这个应该是函数函数指针之类的操作。使程序跳转到0x170初,也就是中断向量处,为了验证我的想法,我
使用函数指针写了下面这段代码,

int (*funp)(void);
  funp=0x170;
  funp();
像这样的一段代码我在keil下编译是没有问题的,函数能正确跳转到0x170处执行,
但在IAR下就不行了。提示错误:

Error[Pe513]: a value of type "int" cannot be assigned to an entity of type "int (*)(void)" C:\Users\Administrator\Desktop\launchpad project\main.c 47 

请问这是什么问题呢?要怎么解决?也就是说,我要在IAR里使用函数指针应该怎么做呢?哪位大大帮我分析这例程里的那句 ((void (*)())0x170)();  

初学菜鸟什么不懂,还请指教啊!!


最新回复

嗯  真的不错,看到这个指针,呵呵 。这次可以把指针玩的透彻,玩C就是玩指针。谢谢楼上找出这资料。  详情 回复 发表于 2011-10-1 08:17
 
点赞 关注

回复
举报

10

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
没人回复么?~~~
((void (*)())0x170)();这句我是这样理解的:
void (*)() 表明的它将声明一个函数指针类型, 放在了 0x170前面使函数的执行地址为0x170。

今天又看了大半天msp的时钟系统,感觉真是很繁复难用啊! 大堆错综复杂的关系~~
 
 

回复

2751

帖子

0

TA的资源

裸片初长成(初级)

板凳
 

原帖由 sanbinabu 于 2011-9-19 20:29 发表 没人回复么?~~~ ((void (*)())0x170)();这句我是这样理解的: void (*)() 表明的它将声明一个函数指针类型, 放在了 0x170前面使函数的执行地址为0x170。 今天又看了大半天msp的时钟系统,感觉真是很繁复难用 ...

 

赞同

void (*)()声明的是一个指向函数类型的指针

((void (*)())加了一个括号是强制类型转换

((void (*)())0x170)给这个函数指针赋值0x170

((void (*)())0x170)()就是调用该地址的函数了

 

参考资料:

让你不再害怕指针

https://bbs.eeworld.com.cn/viewthread.php?tid=94348

 
 
 

回复

2751

帖子

0

TA的资源

裸片初长成(初级)

4
 

原帖由 sanbinabu 于 2011-9-18 23:56 发表 拿到了团购的板子了!!高兴下!~~嘻嘻。刚才在跑官方的这段例程://   MSP430G2xx1 Demo - Reset on Invalid Address fetch, Toggle P1.0////  Description: Toggle P1.0 by xor'ing P1.0 inside of a so ...

 

函数指针测试源码:

 

#include  <msp430g2231.h>

 

void FunTest(void)
{
  P1OUT ^= 0x01;
}

 

void main(void)
{
  void (*pFun)(void);
  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer
  pFun = FunTest;
  P1DIR |= 0x01;                            // Set P1.0 to output direction
  P1OUT = 1;
  while(1)
  {
    unsigned int i;
    i = 50000;                              // Delay
    while (i--);
    (*pFun)();
  }
}

 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

5
 

回复 4楼 David_Lee 的帖子

谢谢~~~
 
 
 

回复

133

帖子

0

TA的资源

纯净的硅(初级)

6
 
嗯  真的不错,看到这个指针,呵呵 。这次可以把指针玩的透彻,玩C就是玩指针。谢谢楼上找出这资料。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表