Void *参数地址移位

时间:2013-04-08 20:55:14

标签: c embedded codewarrior

我正在使用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);
}

2 个答案:

答案 0 :(得分:3)

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

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

这有助于你破译它吗?

答案 1 :(得分:1)

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

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