⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 n3rarm.h

📁 NORTi3 is a realtime multitasking operating system conforming to the micro-ITRON 3.0 specification.
💻 H
字号:
/******************************************************************************
* NORTi3/ARM Definitions                                                      *
*                                                                             *
*  Copyright (c)  1995-2000, MiSPO Co., Ltd.                                  *
*  All rights reserved.                                                       *
*                                                                             *
* 04/Aug/1999                                                                 *
* 19/Jan/2000  GreenHills C 偵懳墳                                            *
* 09/Mar/2000  僗僞僢僋梡儊儌儕偺僒僀僘掕媊偺楻傟傪廋惓                       *
* 30/Oct/2001  The semicolon of extern "C" { ... }; is deleted.               *
*              ARM/Thumb 偄偢傟偺僞僗僋傕惗惉壜擻偵廋惓                       *
******************************************************************************/

#ifndef N3RARM_H
#define N3RARM_H
#ifdef __cplusplus
extern "C" {
#endif

/* Context structuer */
#ifdef __ghs                                    /* Green Hills ARM-C */
typedef struct t_ctx
{
    int ercd; /* arg1 & return */
    int stacd;/* arg2 */
    UINT ptn; /* arg3 */
    VP ptr;   /* arg4 */
    int r4;   /* variable */
    int r5;   /* variable */
    int r6;   /* variable */
    int r7;   /* variable */
    int r8;   /* variable */
    int r9;   /* variable */
    int r10;  /* variable */
    int r11;  /* variable */
    FP  lr;   /* link address */
    int psr;  /* Program Status Register */
    int r12;  /* scratch / new sb when linkage call*/
    FP  pc;   /* program counter */
} T_CTX;
#else                                           /* armcc */
typedef struct t_ctx
{
    int ercd; /* arg1 & return */
    int stacd;/* arg2 */
    UINT ptn; /* arg3 */
    VP ptr;   /* arg4 */
    int v1;   /* variable */
    int v2;   /* variable */
    int v3;   /* variable */
    int v4;   /* variable */
    int v5;   /* variable */
    int v6;   /* variable */
    int v7;   /* variable */
    int v8;   /* variable */
    FP  lr;   /* link address */
    int psr;  /* Program Status Register */
    int ip;   /* scratch / new sb when linkage call*/
    FP  pc;   /* program counter */
} T_CTX;
#endif /* defined(compiler) */

/* memory pool & stack area definitions */

#ifdef MPLMSZ
#if ((MPLMSZ)/SIZEOF_INT!=0)

#ifdef __ghs
#pragma ghs section data=".MPLMEM"
int cdecl MPLMEM[(MPLMSZ)/SIZEOF_INT] = {0};
#pragma ghs section data=default
#else
int cdecl MPLMEM[(MPLMSZ)/SIZEOF_INT];
#endif

#endif
#endif

#ifdef STKMSZ
#if ((STKMSZ)/SIZEOF_INT!=0)

#ifdef __ghs
#pragma ghs section data=".STKMEM"
int cdecl STKMEM[(STKMSZ)/SIZEOF_INT] = {0};
#pragma ghs section data=default
#else
int cdecl STKMEM[(STKMSZ)/SIZEOF_INT];
#endif

#endif
#endif

ER  _dispatch(void);
ER  _dispatch1(void);
ER  _dispatch2(void);
void _dispatch3(void);
void _dis_ims(void);
ER _ret_ims(void);
void _ret_ims2(void);
void _ope_ims(void);
UINT _vdis_psw(void);
void _vset_psw(UINT);
void _ret_int(void);
#ifdef __ghs                                    /* Green Hills ARM-C */

asm ER swi_call(ER (*func)(void))
{
%reg func
    mov r0,func
    swi 0x00
%mem func
    ldr r0,func
    swi 0x00
%error
}
asm void swi_callv(void (*func)(void))
{
%reg func
    mov r0,func
    swi 0x00
%mem func
    ldr r0,func
    swi 0x00
%error
}
asm UINT swi_call_a1(UINT (*func)(void))
{
%reg func
    mov r0,func
    swi 0x00
%mem func
    ldr r0,func
    swi 0x00
%error
}
asm void swi_call_a1v(void (*func)(UINT),UINT p1)
{
%reg func %reg p1
    mov r0,func
    mov r1,p1
    swi 0x00
%reg func %mem p1
    mov r0,func
    ldr r1,p1
    swi 0x00
%reg func %con p1
    mov r0,func
    mov r1,p1
    swi 0x00
%mem func %reg p1
    ldr r0,func
    mov r1,p1
    swi 0x00
%mem func %mem p1
    ldr r0,func
    ldr r1,p1
    swi 0x00
%mem func %con p1
    ldr r0,func
    mov r1,p1
    swi 0x00
%error
}

#else                                           /* armcc */

ER    __swi(0x00)       swi_call(ER (*routine)(void));
ER    __swi(0x00)       swi_callv(void (*routine)(void));
ER    __swi(0x00)       swi_call_a1(UINT (*routine)(void));
ER    __swi(0x00)       swi_call_a1v(void (*routine)(UINT),UINT);

#endif

#define dispatch()      swi_call(_dispatch)
#define dispatch1()     swi_call(_dispatch1)
#define dispatch2()     swi_call(_dispatch2)
#define dispatch3()     swi_callv(_dispatch3)
#define dis_ims()       swi_callv(_dis_ims)
#define ret_ims()       swi_call(_ret_ims)
#define ret_ims2()      swi_callv(_ret_ims2)
#define ope_ims()       swi_callv(_ope_ims)
#define ret_int()       swi_callv(_ret_int)

#define vdis_psw()      swi_call_a1(_vdis_psw)
#define vset_psw(PSW)   swi_call_a1v(_vset_psw,(PSW));

#define ret_wup(id)     { wup_tsk(id); ret_int(); }

#define syssta_sub()        IMASK &= ~0x80
#define unl_cpu_sub()       IMASK &= ~0xc0
#define chg_ims_sub(imask)  \
    if (imask)  IMASK |=  0x80;                 \
    else        IMASK &= ~0x80;
#define ref_sys_sub(imask)  ((imask & 0x80) != 0)

#define ref_ims_sub(ims)    ((ims & 0x80) != 0)

#define cre_tsk_sub()       stksz -= sizeof(T_CTX)

#define sta_tsk_sub()       \
    ctx->ercd = stacd;      \
    ctx->psr = (((UW)tcb->ctsk->task & 1)?0x00000030:0x00000010);

#ifdef __ghs
extern signed char *init_ISP;
#define c_sysini_sub()      \
    ISP = init_ISP - CFG.tstksz;                \
    if (pSTKMEM != NULL)                        \
    {   stktop = (B *)pSTKMEM;                  \
        sp = stktop + CFG.stkmsz;               \
    }                                           \
    else                                        \
    {   sp = ISP - CFG.istksz;                  \
    }
#else
#define c_sysini_sub()      \
    if (pSTKMEM != NULL)                        \
    {   stktop = (B *)pSTKMEM;                  \
        sp = stktop + CFG.stkmsz;               \
    }                                           \
    else                                        \
    {   sp = ISP - CFG.istksz;                  \
    }
#endif

extern const UH KNL_SR;

#ifdef __cplusplus
}
#endif
#endif /* N3RARM_H */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -