こんにちは、井田です。
>伊藤です。
>
>外してるかもしれませんが。
>> Section address overflowと表示されている時点で問題ありでしょうか?
>問題ありかな。
>
>スタックポインタのセクション定義おかしくないですか。
>ML6054では
>SPアドレス :0xFFFF00
>スタックサイズ:0x200
>と書いてますが、下記引用では
>> >> 0x00FFFD00 S
>となってますし。ML6054が誤記?
HEW4でセクションの設定で、Sのアドレスが優先的になるようです。
設定で0x00FFFF00 S
と設定した時に、「Section address overflow out of range : "S"」
と出た時に、HEW4の構成の編集でスタックの設定を
SPアドレス :0xFFFE00
スタックサイズ:0x200
として、コンパイルすると
セクションの設定が
0x00FFFC00 S
に書き換わるようです。
>MAPとイニシャライズ部分もあったほうが解決しやすいかもしれませんね。
コンパイル後のMAPは下記のようになっています。
開始 終了
$VECT0 0x00000 0x00003
$VECT7 0x0001C 0x0001F
:
:
:
$VECT63 0x000FC 0x000FF
PResetPRG 0x00400 0x00421
PIntPRG 0x00422 0x00525
P 0x00800 0x15735
C 0x15736 0x1658B
C$DSEC 0x1658C 0x16597
C$BSEC 0x16598 0x1659F
C$INT
D 0x165A0 0x1726D
C$VTBL 0x1726E 0x17F97
B 0x200000 0x202D4B
R 0x240000 0x240CCD
S 0xFFFD00 0xFFFEFF
DIntPRG 0xFFFF00 0xFFFF09
イニシャライズ部分は
rsetprg.cpp
#pragma section ResetPRG
__entry(vect=0) void PowerON_Reset(void)
{
set_imask_ccr((_UBYTE)1);
_INITSCT();
_CALL_INIT(); // Remove the comment when you use global class object
// _INIT_IOLIB(); // Remove the comment when you use SIM I/O
// errno=0; // Remove the comment when you use errno
// srand((_UINT)1); // Remove the comment when you use rand()
// _s1ptr=NULL; // Remove the comment when you use strtok()
HardwareSetup(); // Use Hardware Setup
set_imask_ccr((_UBYTE)0);
main();
// _CLOSEALL(); // Remove the comment when you use SIM I/O
_CALL_END(); // Remove the comment when you use global class object
sleep();
}
hwsetup.cpp
void HardwareSetup(void)
{
// Initialize routine
/* SRAMの初期化 */
P1DDR = 0xff; /*A0〜A7*/
P2DDR = 0xff; /*A8〜A15*/
P5DDR = 0x0f; /*A16〜A19*/
P8DDR = 0x1E; /*CS0〜CS2*/
}
main.cpp
void main(void)
{
short int i;
/* COM0初期化 */
P9DDR |= 0x05; /*TXD0端子を出力にする。*/
SCI0.SCR.BYTE = 0x00; /* clear all flags */
/* 2400-57600baud are available at n=0(cks0=0,cks2=0) */
SCI0.SMR.BYTE = 0; /* Ascnc, 8bit , NoParity, stop1, 1/1 */
SCI0.BRR = brr; /* 13 : 57600baud (CPU=25MHz) */
for(i=0;i<1000;i++); /* wait more than 1bit time */
SCI0.SCR.BYTE = 0x70; /* scr = 0111 0000 (TIE=0,RIE=1,TE=1,RE=1) */
while (SCI0.SSR.BYTE & 0x80 == 0x00);
P4DDR = 0x0F; //Port-4(0〜3)を出力設定
PBDDR = 0xF7; //Port-B(3bit以外)出力設定
//以下にクラスのnew処理
****A::Create(); //static m_pInstance = new ****A;
****B::Create();
****C::Create();
****D::Create();
//継承したクラスの、オーバーライドした関数を実行している部分でダンマリになる。
//クラスの継承部分に問題あり?
//継承しない方法で確認中
}