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);
}