これは、XC16 コンパイラで dsPIC33EP512MU810 に使用したコードです。自動変数を作成することで、スタックの最上部近くにアクセスし、数バイト ( STACK_VAR_PAD
) をインクリメントして、残りのスタックをガード バイトで埋めます。
#define STACK_VAR_PAD 0x0020
#define TOP_OF_STACK_ADDR 0x4000
#define STACK_GUARD_BYTE 0xEE
void WriteStackGuardBytes(void)
{
static __eds__ char * ptr;
static unsigned int start_addr;
static unsigned int addr;
//Use a variable on the stack
char stack_var;
ptr = &stack_var;
//Casting to 32-bit first supresses complier warning
//This chip uses a 16-bit address space
start_addr = (unsigned long int)ptr + STACK_VAR_PAD;
for (addr = start_addr; addr < TOP_OF_STACK_ADDR; addr++)
{
*((unsigned int *)(addr)) = STACK_GUARD_BYTE;
}
}
unsigned int ReadStackGuardBytes(void)
{
static __eds__ char * ptr;
static unsigned int start_addr;
static unsigned int addr;
static unsigned int top_addr;
//Use a variable on the stack here
char stack_var;
ptr = &stack_var;
//Casting to 32-bit first supresses complier warning
//This chip uses a 16-bit address space
start_addr = (unsigned long int)ptr;
top_addr = start_addr;
for (addr = start_addr; addr < TOP_OF_STACK_ADDR; addr++)
{
if (*((unsigned int *)(addr)) != STACK_GUARD_BYTE)
{
top_addr = addr;
}
}
return TOP_OF_STACK_ADDR - top_addr;
}
リンカは、スタックが で停止すると主張します0x8000
(マップ ファイルを生成するように設定しました) が、それまではゼロが表示され0x4000
、それ以降はガベージ データが表示されます。スタックの内容が未定であることは十分に理解していますが、この方法では、スタックがそれ以上に大きくなることはないと判断した0x1500
ため、チェックするだけで0x4000
機能します。