4084|5

68

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

uC/OS-II移植中出现OSTaskStkInit redefinition错误 [复制链接]

哎,编译uC/OS-II的时候又出现了莫明的错误....

先看OS_CPU.H文件

  1. //仅贴出OSTaskStkInit函数的定义
  2. void *OSTaskStkInit (void (*task)(void *pd), void *p_data, void *ptos, INT16U opt) reentrant
  3. {   
  4.     OS_STK *stk;

  5.     p_data = p_data;
  6.     opt    = opt;                               //opt没被用到,保留此语句防止告警产生   
  7.     stk    = (OS_STK *)ptos;                    //用户堆栈最低有效地址
  8.     *stk++ = 15;                                //用户堆栈长度
  9.     *stk++ = (INT16U)task & 0xFF;               //任务地址低8位
  10.     *stk++ = (INT16U)task >> 8;                 //任务地址高8位   
  11.     *stk++ = 0x00;                              //PSW
  12.     *stk++ = 0x0A;                              //ACC
  13.     *stk++ = 0x0B;                              //B
  14.     *stk++ = 0x00;                              //DPL
  15.     *stk++ = 0x00;                              //DPH
  16.     *stk++ = 0x00;                              //R0
  17.     *stk++ = 0x01;                              //R1
  18.     *stk++ = 0x02;                              //R2
  19.     *stk++ = 0x03;                              //R3
  20.     *stk++ = 0x04;                              //R4
  21.     *stk++ = 0x05;                              //R5
  22.     *stk++ = 0x06;                              //R6
  23.     *stk++ = 0x07;                              //R7
  24.                                                 //不用保存SP,任务切换时根据用户堆栈长度计算得出。   
  25.     *stk++ = (INT16U) (ptos+MaxStkSize) >> 8;   //?C_XBP 仿真堆栈指针高8位
  26.     *stk++ = (INT16U) (ptos+MaxStkSize) & 0xFF; //?C_XBP 仿真堆栈指针低8位
  27.         
  28.     return ((void *)ptos);
  29. }
复制代码


uCOS-II.H文件(仅贴出OSTaskInit函数的声明)

  1. OS_STK       *OSTaskStkInit(void (*task)(void *pd), void *p_data, OS_STK *ptos, INT16U opt) reentrant;
复制代码


编译时出现下面的错误提示:
..\OS_CPU\OS_CPU_C.C(73): error C231: '_?OSTaskStkInit': redefinition
..\OS_CPU\OS_CPU_C.C(100): error C231: '_?OSTaskStkInit': redefinition

注:73和100行分别为OSTaskStkInit函数的第一行和最后一行

附:
  本来在uC/OS-II的源代码里是没有在函数OSTaskStkInit后面加上reentrant声明的,reentrant声明是我自己后来加上去的,(原因请参考 http://read.pudn.com/downloads102/sourcecode/embed/418121/The%20uC%20OS-II%20port%20for%20Keil%20C%20V6.20,%20V6.21%20or%20higher/os_kc51.h__.htm),但是无论是否加上reentrant声明,都会出现上面的编译错误。
  本人实在不知道错在哪里,还望高手指点,感激不尽!!

最新回复

谢谢Great_Bug和cavalier_man回复! 跟返回值还有关系,把声明和定义中返回值和ptos参数都该成完全一样的就可以了(无语,自己太水了,C语言都忘了~~) 呵呵,积分献给上面2位!   详情 回复 发表于 2009-12-19 08:47
点赞 关注

回复
举报

72

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
声明和函数的定义不完全一致....."ptos".....改成一样的试试....
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
ptos 这个参数类型不一样,被当做2个函数了,肯定重定义了撒
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用 1 楼 great_bug 的回复:
声明和函数的定义不完全一致....."ptos".....改成一样的试试....


修改1:把OSTaskStkInit定义中ptos的类型改为OS_STK * 后重新编译,问题依旧
修改2:把OSTskStkInit的定义和声明全部改为void * 后仍然没有解决问题。

 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 2 楼 cavalier_man 的回复:
ptos 这个参数类型不一样,被当做2个函数了,肯定重定义了撒


修改1:把OSTaskStkInit定义中ptos的类型改为OS_STK * 后重新编译,问题依旧
修改2:把OSTskStkInit的定义和声明全部改为void * 后仍然没有解决问题。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(中级)

6
 
谢谢Great_Bug和cavalier_man回复!
跟返回值还有关系,把声明和定义中返回值和ptos参数都该成完全一样的就可以了(无语,自己太水了,C语言都忘了~~)
呵呵,积分献给上面2位!
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表