0

XC32コンパイラを使用してMPLABでコーディングし、動的メモリを使用するコツをつかもうとしているので、基本的なサンプルプログラムを作成しました。

#include <stdlib.h>
#include <plib.h>

char x;
char y;



char main(void)
{
    Nop();
    char *pLocation = (char *)malloc(16);
    if(pLocation == 0x00)
    {
        return 0;
    }

    for(x = 0;x<=7;x++)
    {
        *pLocation = x;
        pLocation++;

    }
    while(1)
    {

        Nop();
    }
}

問題:

  • ポインターがmalloc呼び出し行に到達すると、の値はpLocation0x00に強制されます。これは、ヒープからポインター情報を渡せなかったことを意味します。
  • xポインタがポインタの場所に値を割り当てるようpLocationになると、バス例外が発生し、 「未実装のRAMメモリアクセス」と表示されます。これは、0x00に書き込もうとしたためだと思います。

コードで何か間違ったことをしていますか?

追加情報:

  • すでに16バイトのヒープを割り当てています。
  • サイズ2のメモリリクエストでも同じエラーが発生します。
  • MPLABSIMデバッガを使用しています。
  • MPLABバージョン8.87.00.00。
  • XC32コンパイラを使用してビルドします。
4

2 に答える 2

3

私はすでに16のヒープを割り当てています

これは、16 バイトの割り当てをサポートするには不十分なヒープ領域です。ヒープ管理にはある程度のスペースが必要であり、各割り当てでは、64 ビット データ型のアライメントを確保するために、通常は 8 バイトのアライメントが保証されます。

必要以上に多くのヒープを割り当てる必要があり、確実に 16 バイト以上を割り当てる必要があります。そのためには、スタックまたは静的割り当てを使用することもできます。

通常、他の目的 (スタックスペース、スタティック、DMA プールなど) で使用されていない使用可能なすべてのメモリをヒープに割り当てます。割り当てでは、ヒープ サイズを変更する必要はありません) ; しかし、たとえば、ヒープ割り当てを 1024 バイトに増やすだけで、私の仮説をテストできます。十分な空き容量がない場合、システムはヒープのサポートにまったく適していない可能性があります。

于 2013-01-10T13:51:00.167 に答える
0

ヒープ サイズを >=32 にすることでこの問題は解決しますが、その理由は説明できません。それはおそらく何らかの形で32ビットの写真であるという事実に関連しています.

誰かができるなら、私は感謝します。

- - -編集 - - -

さらに詳しい情報があります。新しいポインターに対して新しい malloc 呼び出しを行うたびに、ヒープをすべて使用していない場合でも、ヒープを 32 増やす必要があります。アドレスでも、これらのポインターは最小値 23 で区切られています。malloc リクエストが 1 から 8 の間であったとしても、さらに多くの場所が必要な場合にのみ使用できます。もちろん、注意しないと、一方のポインタがもう一方の範囲に問題なく入ります

于 2013-01-10T13:07:02.963 に答える