?? cpu_config.h
字號:
/*
* TOPPERS/JSP Kernel
* Toyohashi Open Platform for Embedded Real-Time Systems/
* Just Standard Profile Kernel
*
* Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
* Toyohashi Univ. of Technology, JAPAN
*
* TOPPERS/JSP for Blackfin
*
* Copyright (C) 2004 by Suikan
* Copyright (C) 2004 by Ujinosuke
*
* 忋婰挊嶌尃幰偼丆埲壓偺 (1)乣(4) 偺忦審偐丆Free Software Foundation
* 偵傛偭偰岞昞偝傟偰偄傞 GNU General Public License 偺 Version 2 偵婰
* 弎偝傟偰偄傞忦審傪枮偨偡応崌偵尷傝丆杮僜僼僩僂僃傾乮杮僜僼僩僂僃傾
* 傪夵曄偟偨傕偺傪娷傓丏埲壓摨偠乯傪巊梡丒暋惢丒夵曄丒嵞攝晍乮埲壓丆
* 棙梡偲屇傇乯偡傞偙偲傪柍彏偱嫋戻偡傞丏
* (1) 杮僜僼僩僂僃傾傪僜乕僗僐乕僪偺宍偱棙梡偡傞応崌偵偼丆忋婰偺挊嶌
* 尃昞帵丆偙偺棙梡忦審偍傛傃壓婰偺柍曐徹婯掕偑丆偦偺傑傑偺宍偱僜乕
* 僗僐乕僪拞偵娷傑傟偰偄傞偙偲丏
* (2) 杮僜僼僩僂僃傾傪丆儔僀僽儔儕宍幃側偳丆懠偺僜僼僩僂僃傾奐敪偵巊
* 梡偱偒傞宍偱嵞攝晍偡傞応崌偵偼丆嵞攝晍偵敽偆僪僉儏儊儞僩乮棙梡
* 幰儅僯儏傾儖側偳乯偵丆忋婰偺挊嶌尃昞帵丆偙偺棙梡忦審偍傛傃壓婰
* 偺柍曐徹婯掕傪宖嵹偡傞偙偲丏
* (3) 杮僜僼僩僂僃傾傪丆婡婍偵慻傒崬傓側偳丆懠偺僜僼僩僂僃傾奐敪偵巊
* 梡偱偒側偄宍偱嵞攝晍偡傞応崌偵偼丆師偺偄偢傟偐偺忦審傪枮偨偡偙
* 偲丏
* (a) 嵞攝晍偵敽偆僪僉儏儊儞僩乮棙梡幰儅僯儏傾儖側偳乯偵丆忋婰偺挊
* 嶌尃昞帵丆偙偺棙梡忦審偍傛傃壓婰偺柍曐徹婯掕傪宖嵹偡傞偙偲丏
* (b) 嵞攝晍偺宍懺傪丆暿偵掕傔傞曽朄偵傛偭偰丆TOPPERS僾儘僕僃僋僩偵
* 曬崘偡傞偙偲丏
* (4) 杮僜僼僩僂僃傾偺棙梡偵傛傝捈愙揑傑偨偼娫愙揑偵惗偠傞偄偐側傞懝
* 奞偐傜傕丆忋婰挊嶌尃幰偍傛傃TOPPERS僾儘僕僃僋僩傪柶愑偡傞偙偲丏
*
* 杮僜僼僩僂僃傾偼丆柍曐徹偱採嫙偝傟偰偄傞傕偺偱偁傞丏忋婰挊嶌尃幰偍
* 傛傃TOPPERS僾儘僕僃僋僩偼丆杮僜僼僩僂僃傾偵娭偟偰丆偦偺揔梡壜擻惈傕
* 娷傔偰丆偄偐側傞曐徹傕峴傢側偄丏傑偨丆杮僜僼僩僂僃傾偺棙梡偵傛傝捈
* 愙揑傑偨偼娫愙揑偵惗偠偨偄偐側傞懝奞偵娭偟偰傕丆偦偺愑擟傪晧傢側偄丏
*
*
*/
/*
* 僾儘僙僢僒埶懚偺僇乕僱儖帒尮乮BLACKfin梡乯
*
* 偙偺僀儞僋儖乕僪僼傽僀儖偼丆t_config.h 偺傒偐傜僀儞僋儖乕僪偝傟傞丏
* 懠偺僼傽僀儖偐傜捈愙僀儞僋儖乕僪偟偰偼側傜側偄丏
*/
#ifndef _CPU_CONFIG_H_
#define _CPU_CONFIG_H_
#include <api.h>
/*
* BLACKfin娭楢僼傽僀儖偺撉傒崬傒
*/
#include <cdef_LPBLACKFIN.h>
/*
* 僇乕僱儖偺撪晹幆暿柤偺儕僱乕儉
*/
#include <cpu_rename.h>
/*
* BLACKfin偺價僢僩儅僢僾専嶕婡擻傪巊偆
* BLACKfin偼MSB偐傜悢偊傞丅
*/
#define CPU_BITMAP_SEARCH
#define PRIMAP_BIT(pri) (0x40000000u >> (pri))
/*
* TCB 拞偺僼傿乕儖僪偺價僢僩暆偺掕媊
*
* cpu_context.h 偵擖傟傞曽偑僄儗僈儞僩偩偑丆嶲徠偺埶懚惈偺娭學偱丆
* cpu_context.h 偵偼擖傟傜傟側偄丏
*/
#define TBIT_TCB_TSTAT 8 /* tstat 僼傿乕儖僪偺價僢僩暆 */
#define TBIT_TCB_PRIORITY 8 /* priority 僼傿乕儖僪偺價僢僩暆 */
/*
* BLACKfin偺IMASK傊偺愝掕僷僞乕儞
*
*/
#define IMASK_LOCK 0xc01f
#define IMASK_UNLOCK 0xffff
#ifndef _MACRO_ONLY
/*
* 僾儘僙僢僒偺摿庩柦椷偺僀儞儔僀儞娭悢掕媊
*/
/*
* 儗僨傿僉儏乕僒乕僠偺偨傔偺價僢僩儅僢僾僒乕僠娭悢
*
* 價僢僩儅僢僾偺壓埵16價僢僩傪巊梡偟丆嵟壓埵價僢僩傪嵟掅桪愭搙偵懳墳
* 偝偣傞丏
*/
#if 1
Inline UINT
bitmap_search(UINT bitmap)
{
UINT numOfSign;
/*
* 偙偺僐乕僪偼丆bitmap乮UINT宆乯偑32價僢僩偱偁傞偙偲傪壖掕偟
* 偰偄傞丏Signbits 柦椷偼32價僢僩惍悢傪庢偭偰MSB偐傜楢懕偡傞
* 晞崋價僢僩 - 1 傪曉偡丅all 0偺偲偒偼31傪曉偡丅LSB偺傒偑1偺
* 偲偒偼30傪曉偡丅
*/
asm( "%0=signbits %1;": "=l"(numOfSign) : "d"(bitmap) );
return( numOfSign );
}
#else
#include <fract.h>
#define bitmap_search(bitmap) norm_fr1x32(bitmap)
#endif
/*
* 僞僗僋僐儞僥僉僗僩僽儘僢僋偺掕媊
*/
typedef struct task_context_block {
UW ctx_regs[43];
VP sp; /* 僗僞僢僋億僀儞僞 */
FP pc; /* 僾儘僌儔儉僇僂儞僞 */
} CTXB;
/*
* 僔僗僥儉忬懺嶲徠
* 曉偡抣偼埲壓偺偲偍傝
* TRUE : 旕僞僗僋僐儞僥僉僗僩
* FALSE: 僞僗僋僐儞僥僉僗僩
* IPEND偑$8000偐$8010偺帪丄僞僗僋僐儞僥僉僗僩偱偁傞丅偦傟埲奜偺偲偒偼旕僞僗僋僐儞僥僉僗僩丅
*/
Inline BOOL
sense_context()
{
return( *pIPEND & 0x7FEF );
}
/*
* 尰嵼偺儘僢僋忬懺傪挷傋傞丅娗棟奜妱傝崬傒傑偱儘僢僋偡傞sil_loc_int()偵
* 傛傞儘僢僋忬懺偼丄偙偺sense_lock()偱偼柍帇偡傞丅
*/
Inline BOOL
sense_lock()
{
#ifdef UNMANAGED_INT
return((*pIMASK & ~UNMANAGED_INT )== 0xC01F );
#else
return(*pIMASK == 0xC01F );
#endif
}
#define t_sense_lock sense_lock
#define i_sense_lock sense_lock
/*
* CPU儘僢僋偲偦偺夝彍乮僞僗僋僐儞僥僉僗僩梡乯
*
* task_intmask 偼丆chg_ipm 傪僒億乕僩偡傞偨傔偺曄悢丏chg_ipm 傪僒億乕
* 僩偟側偄応崌偵偼丆task_intmask 偑忢偵 0 偵側偭偰偄傞偲峫偊傟偽傛偄丏
*
*/
#ifdef SUPPORT_CHG_IPM
extern UH task_intmask; /* 僞僗僋僐儞僥僉僗僩偱偺妱崬傒儅僗僋 */
#endif /* SUPPORT_CHG_IPM */
#ifdef UNMANAGED_INT
#if UNMANAGED_INT & 0xC01F
// 娗棟奜妱傝崬傒偺斖埻僠僃僢僋丅娗棟奜妱傝崬傒偼IVHW偐傜IVG13偺娫偱側偗傟偽側傜側偄
#error "Illegal un-managed interrupt : must be IVHW-IVG13"
#endif
#endif
// BLACKfin偱偼IMASK偵0xC01F傪彂偒崬傫偱CPU傪儘僢僋偡傞丅
Inline void
t_lock_cpu()
{
#ifdef UNMANAGED_INT
unsigned int imask;
asm volatile( "cli %0;" :"=d"(imask) );
asm volatile( "sti %0;" : :"d"(0xC01f | (imask & UNMANAGED_INT) ) );
#else
asm volatile( "sti %0;" : :"d"(0xC01F) );
#endif
}
Inline void
t_unlock_cpu()
{
#ifdef UNMANAGED_INT
unsigned int imask;
asm volatile( "cli %0;" :"=d"(imask) );
asm volatile( "sti %0;" : :"d"( (0xffff & ~UNMANAGED_INT) | (imask & UNMANAGED_INT) ) );
#else
asm volatile( "sti %0;" : :"d"(0xffff) );
#endif
}
/*
* CPU儘僢僋偲偦偺夝彍乮旕僞僗僋僐儞僥僉僗僩梡乯
*/
Inline void
i_lock_cpu()
{
#ifdef UNMANAGED_INT
unsigned int imask;
asm volatile( "cli %0;" :"=d"(imask) );
asm volatile( "sti %0;" : :"d"(0xC01f | (imask & UNMANAGED_INT) ) );
#else
asm volatile( "sti %0;" : :"d"(0xC01F) );
#endif
}
Inline void
i_unlock_cpu()
{
#ifdef UNMANAGED_INT
unsigned int imask;
asm volatile( "cli %0;" :"=d"(imask) );
asm volatile( "sti %0;" : :"d"( (0xffff & ~UNMANAGED_INT) | (imask & UNMANAGED_INT) ) );
#else
asm volatile( "sti %0;" : :"d"(0xffff) );
#endif
}
/*
* 僞僗僋僨傿僗僷僢僠儍
*/
/*
* 嵟崅桪愭弴埵僞僗僋傊偺僨傿僗僷僢僠乮cpu_support.S乯
*
* dispatch 偼丆僞僗僋僐儞僥僉僗僩偐傜屇傃弌偝傟偨僒乕價僗僐乕儖張棟
* 撪偱丆CPU儘僢僋忬懺偱屇傃弌偝側偗傟偽側傜側偄丏
*/
extern void dispatch(void);
/*
* 尰嵼偺僐儞僥僉僗僩傪幪偰偰僨傿僗僷僢僠乮cpu_support.S乯
*
* exit_and_dispatch 偼丆CPU儘僢僋忬懺偱屇傃弌偝側偗傟偽側傜側偄丏
*/
extern void exit_and_dispatch(void);
/*
* 妱崬傒僴儞僪儔乛CPU椺奜僴儞僪儔偺愝掕
*/
/*
* 妱崬傒僴儞僪儔偺愝掕
*
* 儀僋僩儖斣崋 inhno 偺妱崬傒僴儞僪儔偺婲摦斣抧傪 inthdr 偵愝掕偡傞丏
* evtvector 偼start.asm偱掕媊偝傟偰偄傞丅
*/
extern void (* dev_vector[])(void) ;
extern void (* exc_vector)(VP) ;
Inline void
define_inh(INHNO inhno, FP inthdr)
{
dev_vector[inhno] = inthdr;
}
/*
* CPU椺奜僴儞僪儔偺愝掕
*
* 儀僋僩儖斣崋 excno 偺CPU椺奜僴儞僪儔偺婲摦斣抧傪 exchdr 偵愝掕偡傞丏
*/
Inline void
define_exc(EXCNO excno, FP exchdr)
{
// exc_vector[excno] = exchdr; // 椺奜僴儞僪儔傪攝楍偵奿擺
exc_vector = (void (*)(VP))exchdr; // 椺奜僴儞僪儔傪奿擺
}
/*
* 妱崬傒僴儞僪儔乛CPU椺奜僴儞僪儔偺弌擖岥張棟
*/
/*
* 妱崬傒僴儞僪儔偺弌擖岥張棟偺惗惉儅僋儘
*
* reqflg 傪僠僃僢僋偡傞慜偵妱崬傒傪嬛巭偟側偄偲丆reqflg 傪僠僃僢僋屻
* 偵婲摦偝傟偨妱崬傒僴儞僪儔撪偱僨傿僗僷僢僠偑梫媮偝傟偨応崌偵丆僨傿
* 僗僷僢僠偝傟側偄丏
*/
#define INTHDR_ENTRY(inthdr) extern void inthdr(void);
#define INT_ENTRY(inthdr) inthdr
/*
* CPU椺奜僴儞僪儔偺弌擖岥張棟偺惗惉儅僋儘
*
* reqflg 傪僠僃僢僋偡傞慜偵妱崬傒傪嬛巭偟側偄偲丆reqflg 傪僠僃僢僋屻
* 偵婲摦偝傟偨妱崬傒僴儞僪儔撪偱僨傿僗僷僢僠偑梫媮偝傟偨応崌偵丆僨傿
* 僗僷僢僠偝傟側偄丏
*/
#define EXCHDR_ENTRY(exchdr) extern void exchdr( VP );
#define EXC_ENTRY(exchdr) exchdr
/*
* CPU椺奜偺敪惗偟偨帪偺僔僗僥儉忬懺偺嶲徠
*/
/*
* CPU椺奜偺敪惗偟偨帪偺僐儞僥僉僗僩偺嶲徠
*/
Inline BOOL
exc_sense_context(VP p_excinf)
{
return( *pIPEND & 0x7FE6 ); // IVG15, GIE, EXP, EMU 埲奜偺價僢僩偑棫偭偰偄傟偽旕僞僗僋僐儞僥僉僗僩
}
/*
* CPU椺奜偺敪惗偟偨帪偺CPU儘僢僋忬懺偺嶲徠丅娗棟奜妱傝崬傒偺忬懺偼柍帇偡傞丅
*/
Inline BOOL
exc_sense_lock(VP p_excinf)
{
#ifdef UNMANAGED_INT
return((*pIMASK | UNMANAGED_INT) != 0xFFFF ); // 0xFFFF側傜傾儞儘僢僋
#else
return(*pIMASK != 0xFFFF ); // 0xFFFF側傜傾儞儘僢僋
#endif
}
/*
* 僾儘僙僢僒埶懚偺弶婜壔
*/
extern void cpu_initialize(void);
/*
* 僾儘僙僢僒埶懚偺廔椆帪張棟
*/
extern void cpu_terminate(void);
#endif /* _MACRO_ONLY */
#endif /* _CPU_CONFIG_H_ */
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -