chenjm 发表于 2010-7-4 16:32:03

uCOSII 编译warning: cast from pointer to integer of different size!!!!

各位大虾们,麻烦帮我看看这个警告是怎样产生的?找了很久找不到解决方法。

警告出现在OSMemCreate函数中。
具体点在(INT32U)addr这个指针上面,出现警告信息“c:79: warning: cast from pointer to integer of different size”

麻烦各位大虾指导指导!

uC版本为V2.85 。

chenjm 发表于 2010-7-4 16:55:17

麻烦各位路过的师傅指导一下。

security 发表于 2010-7-4 19:05:35

没看过ucos-ii代码,下面仅供参考:
warning: cast from pointer to integer of different size
--- 这是指针和整型类型转换,长度不一致的warning,跟你的实际平台有关,一般32位系统中,指针是32bit,整型也是32bit,所以用(INT32U)addr是可以的,但其他情况,就会有warning吧

chenjm 发表于 2010-7-5 09:20:07

谢谢,security指教。

chenjm 发表于 2010-7-5 09:22:20

我把(INT32U)addr改成(INT16U)addr就不报错了。
但函数OSMemCreate的参数都要改,这好像不正常了吧。

heisexingdong1 发表于 2013-6-17 14:36:39

这个应该是它把一个地址直接转换为32位的整数造成的:
在uCOS III上它就没有转化直接对地址加,就避开了这个问题。
voidOSMemCreate (OS_MEM      *p_mem,
                   CPU_CHAR    *p_name,
                   void      *p_addr,
                   OS_MEM_QTY   n_blks,
                   OS_MEM_SIZEblk_size,
                   OS_ERR      *p_err)
{
#if OS_CFG_ARG_CHK_EN > 0u
    CPU_DATA       align_msk;
#endif
    OS_MEM_QTY   i;
    OS_MEM_QTY   loops;
    CPU_INT08U    *p_blk;
    void         **p_link;
    CPU_SR_ALLOC();



#ifdef OS_SAFETY_CRITICAL
    if (p_err == (OS_ERR *)0) {
      OS_SAFETY_CRITICAL_EXCEPTION();
      return;
    }
#endif

#ifdef OS_SAFETY_CRITICAL_IEC61508
    if (OSSafetyCriticalStartFlag == DEF_TRUE) {
       *p_err = OS_ERR_ILLEGAL_CREATE_RUN_TIME;
      return;
    }
#endif

#if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u
    if (OSIntNestingCtr > (OS_NESTING_CTR)0) {            /* Not allowed to call from an ISR                        */
       *p_err = OS_ERR_MEM_CREATE_ISR;
      return;
    }
#endif

#if OS_CFG_ARG_CHK_EN > 0u
    if (p_addr == (void *)0) {                              /* Must pass a valid address for the memory part.         */
       *p_err   = OS_ERR_MEM_INVALID_P_ADDR;
      return;
    }
    if (((CPU_ADDR)p_addr & (sizeof(void *) - 1u)) != 0u){/* Must be pointer size aligned                           */
       *p_err = OS_ERR_MEM_INVALID_P_ADDR;
      return;
    }
    if (n_blks < (OS_MEM_QTY)2) {                           /* Must have at least 2 blocks per partition            */
       *p_err = OS_ERR_MEM_INVALID_BLKS;
      return;
    }
    if (blk_size < sizeof(void *)) {                        /* Must contain space for at least a pointer            */
       *p_err = OS_ERR_MEM_INVALID_SIZE;
      return;
    }
    align_msk = sizeof(void *) - 1u;                        /* Block size must be a multiple address size             */
    if ((blk_size & align_msk) != 0u) {
      *p_err = OS_ERR_MEM_INVALID_SIZE;
    }
#endif

    p_link = (void **)p_addr;                               /* Create linked list of free memory blocks               */
    p_blk= p_addr;
    loops= n_blks - 1u;
    for (i = 0u; i < loops; i++) {
      p_blk +=blk_size;
       *p_link = (void*)p_blk;                            /* Save pointer to NEXT block in CURRENT block            */
      p_link = (void **)(void *)p_blk;                  /* Position   to NEXT block                           */
    }
    *p_link            = (void *)0;                         /* Last memory block points to NULL                     */

    OS_CRITICAL_ENTER();
    p_mem->Type      = OS_OBJ_TYPE_MEM;                   /* Set the type of object                                 */
    p_mem->NamePtr   = p_name;                            /* Save name of memory partition                        */
    p_mem->AddrPtr   = p_addr;                            /* Store start address of memory partition                */
    p_mem->FreeListPtr = p_addr;                            /* Initialize pointer to pool of free blocks            */
    p_mem->NbrFree   = n_blks;                            /* Store number of free blocks in MCB                     */
    p_mem->NbrMax      = n_blks;
    p_mem->BlkSize   = blk_size;                        /* Store block size of each memory blocks               */

#if OS_CFG_DBG_EN > 0u
    OS_MemDbgListAdd(p_mem);
#endif

    OSMemQty++;

    OS_CRITICAL_EXIT();
   *p_err = OS_ERR_NONE;
}
这是uCOS III中的这段代码
页: [1]
查看完整版本: uCOSII 编译warning: cast from pointer to integer of different size!!!!