avr-job 发表于 2005-1-11 11:33:11

IAR中怎样定义一个位于ROM中的函数指针数组

KEIL 中这样定义:code void (code *tt[]) ()={k1,k2。。。kn};



在IAR 中呢??(主要用于键盘散转)
-----此内容被avr-job于2005-01-12,09:29:21编辑过

surething 发表于 2005-1-11 22:23:39

const unsigned char



和iccavr一样,都用const限定数组在rom

zalin 发表于 2005-1-11 22:44:15

不是const,用__flash

jackycg 发表于 2005-1-11 23:17:28

unsigned char __flash *p,code[]={k1,k2....,kn}//*p为指向flash的指针



p=&code    //指针p指向code[]首地址

avr-job 发表于 2005-1-12 09:47:48

我可能没有说清楚:在这里k1,k2,....kn都是函数名,而要定义的数组是指针数组,指针又是函数指针。而且此数组位于ROM中。

目的是为了当调用函数k1,k2...时可以写成*tt()的形式。

按照3楼j的用法出现编译错误。提示是:

Error: a value of type "void (*)()" cannot be used to initialize an entity of type "int"



不知道在IAR和ICC中都是怎样定义的???

avr-job 发表于 2005-1-12 18:06:18

在IAR中好像这样定义可以 void (*keyproc[])()={k1,k2}

反正编译是过了,但不知道是不是在rom中?再验证一下

jackycg 发表于 2005-1-12 20:58:47

数组不在ROM中,而在SRAM中.执行程序时编译器把函数k1,k2的入口地址以int的形式存于SRAM中.调用时取出执行k1,k2程序.

avr-job 发表于 2005-1-13 13:48:25

请问J那么如果在ROM中又该怎样定义呢?ICC也是这样定义么?

jackycg 发表于 2005-1-13 14:22:59

好像不行,至少目前没找到. 编译器对__flash, const等均不理会.

avr-job 发表于 2005-1-13 14:31:27

那就在SRAM里用吧

w71057178 发表于 2013-5-28 09:43:24



关键是这个选项得勾上
Teat'const' as '_flash'

oksmn 发表于 2013-5-28 09:51:58

这样吧:const void (* const tt[]) ()={k1,k2。。。kn};

eddia2012 发表于 2014-4-10 09:31:16

{:biggrin:}void (* const tt[]) ()={k1,k2。。。kn};

huangxiaowei 发表于 2014-4-12 17:40:56

   bang ding yi xia
页: [1]
查看完整版本: IAR中怎样定义一个位于ROM中的函数指针数组