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

You say "shifted over by 1 byte," but it is actually only one bit, that is, the number is divided by 2.

This is usually the result of using a byte address in one context and a (2-byte) word address in another context. They probably refer to the same address.

Does this help you decipher it?

于 2013-04-08T21:14:24.790 に答える
1

HC12 ファミリの 16 ビット マイクロコントローラには CodeWarrior コンパイラを使用しています。このコンパイラを使用すると、ポインタのバイト数を変更するいくつかのメモリ モデルを選択できます。具体的には、+small+ メモリ モデルは__near16 ビット ポインタを使用しますが、+large+ モデルは__far24 ビット ポインタを使用します。

コードがサード パーティのソフトウェアとは異なるメモリ モデルでコンパイルされていて、コンパイラが警告を表示しない場合、おかしな結果になる可能性があります。

于 2013-04-10T10:37:27.800 に答える