【发布时间】: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