感谢大家的回复,原因找到了,关键在于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上移植也成功了,哈哈。。。。
|