2

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

2 回答 2

3

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

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

这有助于你破译它吗?

于 2013-04-08T21:14:24.790 回答
1

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

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

于 2013-04-10T10:37:27.800 回答