MSP430 マイクロコントローラ用の C コードを書いていて、グローバル変数を RAM の特定のアドレスにロックしたいと考えています。
その理由は、RAM アドレスの最後にスタックがあり、下位アドレスに向かって下方に成長するためです。スタックがオーバーフローすると、スタックのすぐ隣の RAM に格納されているグローバル変数が上書きされ始めます。そのため、スタックのすぐ隣に透かしを書き、オーバーフローをチェックしたいと思います。
MSP430 マイクロコントローラ用の C コードを書いていて、グローバル変数を RAM の特定のアドレスにロックしたいと考えています。
その理由は、RAM アドレスの最後にスタックがあり、下位アドレスに向かって下方に成長するためです。スタックがオーバーフローすると、スタックのすぐ隣の RAM に格納されているグローバル変数が上書きされ始めます。そのため、スタックのすぐ隣に透かしを書き、オーバーフローをチェックしたいと思います。
MSP430 デバイス上でスタックの最後がどこにある必要があるかがわかっている場合は、次のように実行できます。
int* ptr; // will point to end of stack
ptr = (int*)0x0600; // memory address of the end of the stack
*ptr = 0x1234; // value to assign to memory
TI フォーラムで同じ質問をしている方がいます...参考になれば幸いです: http://e2e.ti.com/support/development_tools/compiler/f/343/t/92002.aspx
Code Composer Studio 用の StackWatch および StackIntact MSP430 コード
#include <string.h> // C string functions
unsigned int StackWatch(unsigned char fill);//prototype
const char stackstr[]="#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=";
//^stackstr needs to have enough characters to cover the size of stack 'intactness' you desire
#pragma DATA_SECTION (_stackTAIL, ".stack");//locate this variable at the stacks end (lowest address)
const char _stackTAIL;//don't futz with this variable //DANGEROUS
unsigned int stacktail=0;
unsigned int StackWatch(unsigned char fill)
{
if (stacktail==0)
{
stacktail=(unsigned int)&_stackTAIL; //debugging
strncpy((void *)stacktail ,stackstr,fill);
}
if(fill==0)stacktail=0;//discard the pointer
return stacktail;
}//StackWatch
unsigned char StackIntact(unsigned char CHRS)
{
if (stacktail==0)return 0;
if (CHRS>strlen(stackstr))CHRS=strlen(stackstr);
return strncmp((void *)stacktail, stackstr, CHRS);
}//StackIntact
////USE IT LIKE THIS>>
//in main only once as close to the beginning as possible..
//StackWatch(20); ///Make sure you have enough chars in the stackstr const...
//in a loop somewhere>>
//if(StackIntact(20))
//.ERROR CONDITION.//blink led or something..
//if it doesn't ==0 then the stack is not intact for that many characters
//////////////
//WHEN YOU ARE DONE WITH IT>>
//StackWatch(0);//discards the pointer to the end of the stack
最初にここに投稿されましたhttp://forums.hackaday.com/viewtopic.php?f=5&t=2998
プロダクションコードに残すかどうかはわかりませんが、デバッグコードには本当に便利です
たぶん...何かがうまくいかなかった場合にリセットするのはおそらく便利ですが、それは再び起こると思うので、製品品質のコードでは本当に無意味です。はい、CCSなどを介してこれを行うことができますが、それもPITAです
また、これは CCS (Code Composer Studio) 用であることに注意してください