8.5.7
Application Startup
Specify the following in the application.
The items marked with [Optional] may be unnecessary in some cases.
(1) | Preparation of Entry Point (PIC Initiation Address) |
This is the address from which the application is initiated.
(2) | Initialization of Stack Pointer [Optional] |
This processing is not necessary when the application shares the stack with the master.
When necessary, add appropriate settings by referring to section 7.3.2 (2).
(3) | Initialization of General Registers Used as Base Registers [Optional] |
This processing is not necessary when no base register is used.
When necessary, add appropriate settings by referring to section 7.3.2 (3).
(4) | Initialization Processing of Sections [Optional] |
This processing is not necessary when the master initializes them.
When necessary, add appropriate settings by referring to the example shown later.
Note that the processing described in section 7.3.2 (5) cannot be used without change.
(5) | Initialization Processing of Libraries [Optional] |
This processing is not necessary when no standard library is used.
When necessary, add appropriate settings by referring to section 7.3.2 (6).
Initialization of PSW for main Function Execution [Optional]
Specify interrupt masks or move to the user mode as necessary.
Add appropriate settings by referring to sections 7.3.2 (8) and 7.3.2 (9).
(6) | User Program Execution |
Execute the main function.
Specify the processing by referring to section 7.3.2 (10).
The following shows an example of application startup.
The processing is divided into three files.
- | startup_picpid.c: Body of the startup processing. |
- | initsct_pid.src: Section initialization for PID; _INITSCT_PID. |
This is created by modifying the _INITSCT function described in section 7.3.2 (5) to support the PID function.
"__PID_REG" in the program will be converted into PID register when the assembling.
- | initiolib.c; Contains _INITLIB, which initializes the standard libraries. |
This is created by modifying the code described in section 7.3.2 (6) to be used for the application.
[startup_picpid.c]
// Initialization Processing Described in Section 7.3.2(5)
#pragma section C C$DSEC //Section name is set to C$DSEC
const struct {
void *rom_s; //Start address member of the initialized data section in ROM
void *rom_e; //End address member of the initialized data section in ROM
void *ram_s; //Start address member of the initialized data section in RAM
} DTBL[] = {__sectop("D"), __secend("D"), __sectop("R")};
#pragma section C C$BSEC //Section name is set to C$BSEC
const struct {
void *b_s; //Start address member of the uninitialized data section
void *b_e; //End address member of the uninitialized data section
} BTBL[] = {__sectop("B"), __secend("B")};
extern void main(void);
extern void _INITLIB(void); // Library initialization processing described
//in section 7.3.2 (6)
#pragma entry application_pic_entry
void application_pic_entry(void)
{
_INITSCT_PICPID();
_INITLIB();
main();
}
|
[initsct_pid.src]
; Section Initialization Routine for PID Support
; ** Note ** Check the PID register.
; This code assumes that R13 is used as the PID register. If another
; register is used as the PID register, modify the description related to R13
; in the following code to the register assigned as the PID register
; in your system.
.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; // Specifies the minimum unit of the heap area
// allocation size. (Default: 1024)
void _INIT_LOWLEVEL(void);
void _INIT_OTHERLIB(void);
void _INITLIB (void)
{
_INIT_LOWLEVEL(); // Initial settings for low-level interface routines
_INIT_IOLIB(); // Initial settings for I/O library
_INIT_OTHERLIB(); // Initial settings for rand and strtok functions
}
void _INIT_LOWLEVEL(void)
{ // Make necessary settings for low-level library
}
void _INIT_OTHERLIB(void)
{
srand(1); // Initial settings necessary when the rand function is used
}
|