【问题标题】:Don't understand conversion from integer to smaller pointer error不明白从整数到较小指针的转换错误
【发布时间】:2014-09-04 14:07:13
【问题描述】:

我正在开发一个 16 位指针宽度的 8051 平台。

我有一个处理闪存仿真的通用代码模块,并且有一个函数可以返回页面的 16 位起始地址:

volatile u16_t start_address = find_start_address_of_page( page );

我想将此“地址”传递给需要 u8_t* 作为参数的 CRC 函数,因此我将其转换为函数调用,如下所示:

(u8_t *)start_address

这会产生警告

警告[Pe1053]:从整数转换为更小的指针

这让我有点困惑,因为 u8_t* 是 16 位宽,而我的变量是 16 位变量。仅仅是编译器发出警告吗?关于一般的“整数到指针”转换?

代码运行良好,我只是想确定我没有遗漏一些愚蠢的东西......

【问题讨论】:

  • start_address 是一个 16 位的整数,而不是指向整数的指针。尝试使用 (u8_t *)(&start_address)
  • 是的,但这不是我想要实现的——这会给我 start_address 的 address。 start_address 是地址值本身,存储为整数。
  • 我明白了。您的逻辑对您的程序是正确的。但是编译器期望一个变量是指针而不是具有地址的整数值。这就是警告发生的原因。演员表已完成并按您的意愿工作,但在某些情况下这不会发生,这就是编译器向您发出此警告的原因

标签: c iar 8051


【解决方案1】:

您写道,您的 8051 平台具有 16 位指针宽度。

据我所知,8051 有不同的地址范围 - 处理器的内部 RAM(最大 256 字节) - 外部 RAM(最大 64k) - 程序内存(最大 64k)

因此,我使用过的编译器 (Keil) 至少有四种不同的指针类型。 用于内部 RAM 的 8 位宽“数据”指针。 用于外部 RAM 的 16 位宽“xdata”指针。 程序存储器的 16 位宽“代码”指针。 一个 24 位宽的通用指针,可以设置为指向三种内存类型中的任何一种。第一个字节用于选择内存类型。

警告文本可能意味着编译器希望将您的 16 位值转换为内部 RAM 中只有 8 位宽的地址。

【讨论】:

  • 好点——我从没想过。考虑到这一点,我会重新审视这一点。
【解决方案2】:

如果您想消除警告,您可以使用联合将您的信息移动到不同的类型,即

union {
   u16_t origType;
   u8_t *newtype;
} u;

u.origType = start_address;

假设它们的大小相同,您可以将 u.newtype 传递给您的函数。

【讨论】:

  • 干杯 - 遗憾的是 MISRA 不允许工会!不过没关系,我很高兴抑制警告,我只是确保我的想法是正确的。
【解决方案3】:

由于start_address是一个保存内存地址的变量,你应该这样声明和使用它,这意味着一个指针:

volatile u16_t *start_address = find_start_address_of_page( page );

当然这也意味着你的函数find_start_address_of_page();必须返回一个指针。

顺便说一句,intint * 都是 16 位宽(在您的处理器上)这一事实是不够的。例如,由于汇编指令和/或数据总线实现的限制,大多数(全部?)16 位处理器上指向 int 的指针必须与偶数(2 的倍数)地址对齐。

以同样的方式,start_address++; 之类的增量不同,具体取决于它是 int 还是 int *(甚至是 char *)。如果是int(或char *),它会加一,但如果是int *,它会加二。

由此我试图表明编译器会根据变量的类型(和处理器能力)进行大量超出位数的检查。

【讨论】:

    【解决方案4】:

    start_address 是 u16_t 类型,而不是指针。

    如果你想将他的地址传递给 CRC,那么试试这个:

    ((u8_t *)((u16_t *)start_address))
    

    【讨论】:

    • 正如变量名所暗示的,start_address 包含地址本身。
    • 在这种情况下试试这个,((u8_t *)((u16_t *)start_address))
    猜你喜欢
    • 2013-04-14
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多