8.5.7 アプリケーションのスタートアップ

アプリケーションでは、次の項目を設定してください。

【オプション】と書かれている項目は、不要な場合があります。

(1)

エントリポイント(PICの起動アドレス)の用意

アプリケーションの起動アドレスです。

(2)

スタックポインタの初期化【オプション】

マスタとスタックを共有する場合は、不要です。

必要な場合は、7.3.2(2)を参考に、設定を追加してください。

(3)

ベースレジスタに使用する汎用レジスタの初期化【オプション】

ベースレジスタを使用しない場合は、不要です。

必要な場合は、7.3.2(3)を参考に、設定を追加してください。

(4)

セクションの初期化処理【オプション】

マスタ側で初期化する場合は、不要です。

必要な場合は、後述の例を参考に、設定を追加してください。

なお、7.3.2(5)の方法はそのままでは使用できません。

(5)

ライブラリの初期化処理【オプション】

標準ライブラリを使用しない場合は、不要です。

必要な場合は、7.3.2(6)を参考に、設定を追加してください。

(6)

main関数向けPSW初期化【オプション】

必要に応じて、割り込みマスクやユーザモードへの移行を行います。

7.3.2(8)と(9)を参考に、設定を追加してください。

(7)

ユーザプログラムの実行

main関数を実行します。

7.3.2(10)を参考に、設定してください。

 

以下、アプリケーション側のスタートアップ例を示します。

3つのファイルに分かれています。

-

startup_picpid.c … スタートアップ本体。

-

initsct_pid.src … セクション初期化のPID版である_INITSCT_PIDです。

7.3.2(5)で述べている_INITSCT関数をPID対応にしたものです。

プログラム中の”__PID_REG”は、PIDレジスタに変換されます。

-

initiolib.c … 標準ライブラリの初期化を行う、_INITLIBを収録しています。

7.3.2(6)をアプリケーション用に変更したものです。

[startup_picpid.c]
// マニュアル 7.3.2(5)セクションの初期化処理
#pragma section C C$DSEC //セクション名をC$DSEC にします
const struct {
    void *rom_s; //初期化データセクションのROM 上の先頭アドレスメンバ
    void *rom_e; //初期化データセクションのROM 上の最終アドレスメンバ
    void *ram_s; //初期化データセクションのRAM 上の先頭アドレスメンバ
} DTBL[] = {__sectop("D"), __secend("D"), __sectop("R")};
#pragma section C C$BSEC //セクション名をC$BSEC にします
const struct {
    void *b_s; //未初期化データセクションの先頭アドレスメンバ
    void *b_e; //未初期化データセクションの最終アドレスメンバ
} BTBL[] = {__sectop("B"), __secend("B")};
 
extern void main(void);
extern void _INITLIB(void); // マニュアル 7.3.2(6) ライブラリの初期化処理
#pragma entry application_pic_entry
void application_pic_entry(void)
{ 
    _INITSCT_PICPID();
    _INITLIB();
     main();
}
 
[initsct_pid.src]
; PID対応 セクション初期化ルーチン
    .glb   __INITSCT_PICPID
    .glb   __PID_TOP
    .section  C$BSEC,ROMDATA,ALIGN=4
    .section  C$DSEC,ROMDATA,ALIGN=4
    .section  P,CODE
 
__INITSCT_PICPID:               ; function: _INITSCT
    .STACK    __INITSCT_PICPID=28
    PUSHM     R1-R6
    ADD       #-__PID_TOP,__PID_REG,R6   ;   How long distance PID moves
;;;
;;; clear BBS(B)
;;;
    ADD       #TOPOF C$BSEC,  R6, R4
    ADD       #SIZEOF C$BSEC, R4, R5
    MOV.L     #0, R2
    BRA       next_loop1
 
loop1:
    MOV.L     [R4+], R1
    MOV.L     [R4+], R3
    CMP       R1, R3
    BLEU      next_loop1
    SUB       R1, R3
    SSTR.B
next_loop1:
    CMP       R4,R5
    BGTU      loop1
 
;;;
;;; copy DATA from ROM(D) to RAM(R)
;;;
    ADD       #TOPOF C$DSEC,  R6, R4
    ADD       #SIZEOF C$DSEC, R4, R5
    BRA       next_loop3
 
loop3:
    MOV.L     [R4+], R2
    MOV.L     [R4+], R3
    MOV.L     [R4+], R1
    CMP       R2, R3
    BLEU      next_loop3
    SUB       R2, R3
    ADD       R6, R2       ; Adjust for real address of PID
    SMOVF
next_loop3:
    CMP       R4, R5
    BGTU      loop3
    POPM      R1-R6
    RTS
 
    .end
 
[initiolib.c]
#include <stdio.h>
#include <stdlib.h>
#define IOSTREAM 3
const size_t _sbrk_size = 520; // ヒープ領域確保サイズの最小単位を指定します
// (省略時:1024)
 
void _INIT_LOWLEVEL(void);
void _INIT_OTHERLIB(void);
 
void _INITLIB (void)
{
    _INIT_LOWLEVEL(); // 低水準インタフェースルーチンの初期設定をします
    _INIT_IOLIB(); // 入出力ライブラリの初期設定をします
    _INIT_OTHERLIB(); // rand 関数、strtok 関数の初期設定をします
}
void _INIT_LOWLEVEL(void)
{ // 低水準ライブラリで必要な初期設定をしてください
}
void _INIT_OTHERLIB(void)
{
     srand(1); // rand 関数を使用する場合の初期設定です
}