【问题标题】:Void * parameter address shiftvoid * 参数地址移位
【发布时间】:2013-04-08 20:55:14
【问题描述】:

我正在使用 Codewarrior 8.3(IDE 版本 5.9)对 56f8367 DSC 进行编程。

我正在使用受人尊敬的第三方软件,所以我想他们知道自己在做什么,并且不想过多地弄乱他们的代码,但是他们正在玩弄传递 void * 参数,而这正是我所擅长的不是很熟悉。

所以我有这个功能:

static void T_CALLBACK _transmit(
  void *pContext,
  TX_DATA *pTxDescriptor)
{
  CONTEXT *pLinkContext = (CONTEXT *)pContext;
  ...
}

通过函数指针调用。当我在这个函数调用之前停止处理器时,我可以看到 pContext 指向的地址是 0x1000,但是在这里转换之后,pLinkContext 指向的地址是 0x0800。这显然会导致问题,因为我们从内存的不同部分开始写入和读取。

字节寻址/对齐发生了一些奇怪的事情,它被“移位”超过 1 位。我知道出了什么问题,我只是不明白为什么,或者更重要的是,如何解决问题。

我应该寻找什么?

(编辑以添加每个评论请求的调用) - 不过,考虑到所有内容都隐藏在结构中并通过函数指针调用,我不确定它会有多大帮助。我可以说“pTprtContext->tmw.pChannel->pLinkContext”与CONTEXT的类型不同,pLinkContext确实与CONTEXT的开头匹配,所以我认为他们只是试图将其插入其中。

static void T_LOCAL _transmitNextFrame(
  D_CONTEXT *pTprtContext)
{
  ...
  /* Transmit frame */
  pTprtContext->t.pChannel->pLink->pLinkTransmit(
    pTprtContext->t.pChannel->pLinkContext, &pTprtContext->linkTxDescriptor);
}

【问题讨论】:

  • 你所描述的似乎是不可能的。
  • 你能告诉我们调用_transmit的代码吗?
  • 你是什么意思你“就在”函数调用之前停止? “就在之前”函数调用pContext 不存在。
  • 当您停止处理器并查看内存中的变量时,字节宽变量看起来比其他变量多一位寻址(处理器本身是 16 位架构)。当我说“就在之前”时,我的意思是当函数被调用并且我正在查看传递给 pContext 的变量时。立即编辑以添加通话。
  • 很久以前,在一个遥远的土地上(在我使用的 C 语言中没有 void * 类型之前 - 很久以前!),我在一台机器上工作,其中 char *地址的版本与同一地址的anything_else * 版本完全不同。我几乎不愿提及这一点,但如果 DSC 是字寻址的(因为我工作的机器是字寻址的),并且每个字是 2 个字节,那么指针类型之间的切换可能是有效的。我认为这很可能吗?不,至少不是。这在很大程度上是一个外部机会。但也许,只是也许……

标签: c embedded codewarrior


【解决方案1】:

你说“移位1个字节”,但实际上只有一位,即数字除以2。

这通常是在一个上下文中使用字节地址而在另一个上下文中使用(2 字节)字地址的结果。他们可能指的是同一个地址。

这有助于你破译它吗?

【讨论】:

  • 你是对的,我的意思是移动了 1 位,而不是字节。我已经对其进行了编辑以反映这种变化。而且我确实认为问题出在您的想法上,尽管它肯定将它们视为两个不同的地址。因为当我停下来查看记忆时,我可以看到它们都指向的地方。通常,字节地址 0x00010 与字地址 0x0001 相同。 . .而且,我认为这就是问题所在。我只是不确定为什么它将它作为字节/字地址传递,然后将其解释为字/字节地址。
【解决方案2】:

我为 HC12 系列的 16 位微控制器使用 CodeWarrior 编译器。使用这个编译器,我可以选择一些内存模型来改变(以及其他几件事)指针的字节数。更具体地说,+small+ 内存模型使用__near 16 位指针,而+large+ 模型使用__far 24 位指针。

如果您的代码是使用与第三方软件不同的内存模型编译的,并且编译器没有警告您,我猜您可能会得到奇怪的结果。

【讨论】:

  • 我有他们的源代码,所以我实际上也在编译他们的代码。所以我假设他们都使用我在项目设置中使用的相同内存模型。虽然,我确实和他们一起玩但无济于事。
猜你喜欢
  • 2019-11-23
  • 1970-01-01
  • 2020-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-05
  • 1970-01-01
相关资源
最近更新 更多