[AVR单片机] 关于ICCAVR编译器中获得函数入口地址

[复制链接]
2225|7
 楼主| 游浪星 发表于 2013-10-25 14:05 | 显示全部楼层 |阅读模式
uint  temp;
temp=(uint )task;
这里temp获得函数task的入口地址,但是我在反汇编时看到函数task的入口地址并不等于tmep。下面是反汇编的图,希望大家帮我看看。
file:///C:/Documents%20and%20Settings/Administrator/Application%20Data/Tencent/Users/920356221/QQ/WinTemp/RichOle/UPHUJQ6M8G6AP%7B%7B(61V)7X6.jpg
这里看以看书temp=0x008c
file:///C:/Documents%20and%20Settings/Administrator/Application%20Data/Tencent/Users/920356221/QQ/WinTemp/RichOle/QHK$8%7BX)%25]8VAZZE$JO%60(5M.jpg
但是这里可以看到task的入口地址是0x007f,
这是什么原因?

qin552011373 发表于 2013-10-25 23:02 | 显示全部楼层
不知道为什么看不到图
cxz_00 发表于 2013-10-25 23:12 | 显示全部楼层
huangxz 发表于 2013-10-26 06:53 | 显示全部楼层
为啥一定要用iccavr呢,avr-gcc不是很好用么
 楼主| 游浪星 发表于 2013-10-26 09:30 | 显示全部楼层
qin552011373 发表于 2013-10-25 23:02
不知道为什么看不到图

看不到图?算了 我找到原因了  还是谢谢你的回复
 楼主| 游浪星 发表于 2013-10-26 09:33 | 显示全部楼层
huangxz 发表于 2013-10-26 06:53
为啥一定要用iccavr呢,avr-gcc不是很好用么

我现在想把ucos移植到mega128,网上下载的例子是用ICC的  呵呵  所以就用ICC了  现在发现两者编译器很多地方差很多
 楼主| 游浪星 发表于 2013-10-26 09:53 | 显示全部楼层
感谢大家的回复,原因找到了,关键在于const这个关键字。
在ICCAVR6.26版本中,const关键字基本上有下面五种情况(跟keil的code相似):
const int table[]={1,2,3};//table表格只分配进程序存储器中
const char string[]="iccavr";//字符串数组只分配进程序存储器中
const char *prt1 //指针prt1位于数据存储器空间指向程序存储器空间的字符型数据
char *const prt2 //指针prt2位于程序存储器空间指向数据存储器空间的字符型数据
const char *const prt3 //指针prt3位于程序存储器空间指向程序存储器空间的字符型数据
而在ICCAVR7.22中,const关键字必须选中create “const” as“_flash”才能用const实现上面五种作用。
在我的程序中出现过这样语句:
      temp=*(uint const *)task;如果没有选中create “const” as“_flash”,就不能正确得到函数入口地址了。
    还有一点要说一下,
    void  task();
     uint  temp;
    temp=(uint)task;
上面三句在gcc中tmep得到的就是函数的入口地址,但是在ICCavr中并不是函数的入口地址,而是SRAM中某个内存地址,在这个地址里面才存放着task的入口地址,所以就有temp=*(uint const *)task来获得函数的入口地址了,开始我一直以GCC编译器的想法来想temp的值,以为是函数第一条指令的值呢?呵呵  现在看来是自己不够了解编译器的原因,现在UCOS在mega128上移植也成功了,哈哈。。。。
qin552011373 发表于 2013-10-26 10:48 | 显示全部楼层
游浪星 发表于 2013-10-26 09:30
看不到图?算了 我找到原因了  还是谢谢你的回复

还是看不到图,不知道是怎么回事,找到原因就好咯

评分

参与人数 1威望 +2 收起 理由
游浪星 + 2 赞一个!

查看全部评分

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

本版积分规则

8

主题

45

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部