📄 cpu_support.asm
字号:
/*
* 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梡乯
* by Suikan ( 2004 )
*/
// 32bit 儗僕僗僞傊偺懄抣僙僢僩丒儅僋儘
#define LOAD( reg, value32 ) reg##.h = hi(value32); reg##.l = lo(value32);
#define _MACRO_ONLY
#include "offset.h"
#define SIL_DLY_TIM1 (24*1000000000/CORECLOCK)
#define SIL_DLY_TIM2 (12*1000000000/CORECLOCK)
#define PLLCLOCK (CLKIN*MSELVAL)
#define SYSCLOCK (PLLCLOCK / SSELVAL)
#define CORECLOCK (PLLCLOCK / CSELVAL)
#define CSELVAL 1
#define SSELVAL 5
#define MSELVAL 22
#define CLKIN 27000000
/*
* 僞僗僋僨傿僗僷僢僠儍
*
* dispatch 偼丆妱崬傒嬛巭忬懺偱屇傃弌偝側偗傟偽側傜側
* 偄丏exit_and_dispatch 傕丆妱崬傒嬛巭忬懺偱屇傃弌偡丅
* p0 : &runtsk
* p1 : &schedtsk
* p2 : runtsk
* p3 : schedtsk
* p4 : &reqflg
*/
.section program;
.global __kernel_dispatch;
.global __kernel_exit_and_dispatch;
.extern ldf_stack_end;
.extern __kernel_reqflg;
.extern __kernel_call_texrtn;
.extern __kernel_runtsk, __kernel_schedtsk;
__kernel_dispatch:
[--sp] = (r7:4, p5:3);
[--sp] = rets;
[--sp] = fp;
LOAD( p0, __kernel_runtsk )
LOAD( p1, __kernel_schedtsk)
p2 = [p0]; // p2 傪 runtsk 偵
p5 = [p2+8]; // Added by Chen Yi @srf
LOAD( r1, dispatch_r ) // 幚峴嵞奐斣抧傪曐懚
nop;
nop;
p2 = p5; // Added by Chen Yi @srf
[p2+TCB_sp] = sp; // 僞僗僋僗僞僢僋傪曐懚
[p2+TCB_pc] = r1;
// 僗働僕儏乕儖偝傟偨僞僗僋傪庢傝弌偡
dispatcher:
r0 = [p1];
[p0] = r0; // runtsk = schedtsk
p5 = r0; // Added by Chen Yi @srf
cc = r0 == 0;
if cc jump dispatcher_1; // runtsk偑柍偗傟偽妱傝崬傒懸偪偵丅
nop;
nop;
p3 = [p5+12]; // p3偼schedtsk // p3 points to tinib_table
nop;
nop;
nop;
sp = [p3+TCB_sp]; // 僞僗僋僗僞僢僋暅婣
p5 = [p3+TCB_pc]; // 幚峴嵞奐斣抧暅婣
nop;
nop;
nop;
jump (p5); // 幚峴嵞奐斣抧傊旘傇
// ready 僞僗僋偑側偄応崌偺妱崬傒懸偪
dispatcher_1:
LOAD( r0, ldf_stack_end) // 僀儀儞僩僗僞僢僋億僀儞僞傪愝掕
sp = r0;
LOAD( p4, __kernel_reqflg )
wait_for_intr:
csync;
raise 14; // 妱傝崬傒懸偪忬懺偵堏峴
csync;
/*
* 妱傝崬傒懸偪偼IVG14偺妱傝崬傒忬懺偱峴偆丅偙偙偱IVG14偵慗堏偡傞偺偼
* 偳偺僗僞僢僋傪巊偆偐偲偄偆栤戣偺夝寛偲丆妱崬傒僴儞僪儔撪偱
* 偺僞僗僋僨傿僗僷僢僠偺杊巭偲偄偆2偮偺堄枴偑偁傞丏
*
* 妱崬傒傪懸偮娫偼丆runtsk 傪 NULL乮=0乯偵愝掕偟側偗傟偽側傜
* 側偄丏偙偺傛偆偵愝掕偟側偄偲丆妱崬傒僴儞僪儔偐傜 iget_tid
* 傪屇傃弌偟偨嵺偺摦嶌偑巇條偵崌抳偟側偔側傞丏
*
* 妱傝崬傒懸偪忬懺偼idle偵側傞偨傔丄幚嵺偵偼妱傝崬傒偱偼側偔wakeup
* 僀儀儞僩偑曔懆偝傟丄偦傟偵敽偆妱傝崬傒傪張棟偡傞偙偲偵側傞丅
* 偟偨偑偭偰 SIC_IMASK偲SIC_IWR偼摨偠偵偟偰偍偐側偗傟偽側傜側偄丅
* 偙傟偼傾僾儕働乕僔儑儞僾儘僌儔儅偺愑擟偱峴偆丅
*/
r0 = [p4]; // reqflag庢摼
cc = r0;
if !cc jump wait_for_intr; // reqflg偑0側傜妱傝崬傒懸偪
r0 = 0;
[p4] = r0; // reqflg傪僋儕傾
jump dispatcher;
// 僞僗僋偺嵞奐斣抧丅僞僗僋椺奜偺張棟傪偍偙側偄丄
// dispatch()偐傜栠傞
// 偙偺傾僪儗僗傊偼昁偢 dispatcher偐傜旘傫偱偔傞丅
// 偟偨偑偭偰丄p3偼昁偢schedtsk偺撪梕偵側偭偰偄傞丅
dispatch_r:
fp = [sp++];
r2 = [p3+TCB_texptn]; // schedtsk->texptn
cc = r2 == 0; // texptrn偑0側傜cc => 1
r0 = [p3+TCB_enatex];
LOAD( r1, TCB_enatex_mask )
r0 = r0 & r1; // enatex偑0側傜丄az => 1
cc |= az; // cc = ( !enatex || ! texptn ) = !( enatex && texptn )
if cc jump dispatch_r_1(bp); // if ( !enatex || !texptn ) 懄儕僞乕儞
sp += -12; // 僟儈乕堷悢椞堟妋曐
call __kernel_call_texrtn;
sp += 12; // 僟儈乕堷悢椞堟奐曻
dispatch_r_1:
rets = [sp++];
(r7:4, p5:3) = [sp++];
rts;
__kernel_dispatch.end:
/*
* TOPPERS/JSP奐巒張棟:
* start.asm 偼 kernel_start傪CPU儘僢僋忬懺丄僞僗僋桪愭弴埵偱屇傇丅
* kernel_start偼偦偺傑傑exit_and_dispatch傪屇傇丅
* _exit_and_dispatch偼丄偦傟傑偱偺僗僞僢僋忬懺側偳傪扨偵攑婞偟丄
* 僗働僕儏乕儖偝傟偨僞僗僋傪奐巒偡傞丅
*/
__kernel_exit_and_dispatch:
// dispatcher埲崀偱巊偆億僀儞僞傪愝掕
LOAD( p0, __kernel_runtsk )
LOAD( p1, __kernel_schedtsk)
jump dispatcher;
__kernel_exit_and_dispatch.end:
/*
* 僞僗僋婲摦帪張棟
* _activate_r傊偼偐側傜偢dispatcher偐傜旘傫偱偔傞丅偦偺偨傔丄CPU儘僢僋傪
* 偼偢偝側偗傟偽側傜側偄丅
*/
.section program;
.global __kernel_activate_r;
__kernel_activate_r:
r1 = 0xffff(z);
#ifdef UNMANAGED_INT
cli r0; // 尰嵼偺儅僗僋傪庢傝弌偡
r2 = UNMANAGED_INT(z);
r0 = r0 & r2; // 娗棟奜妱傝崬傒偺傒庢傝弌偡
r2 = ~r2; // 媡儅僗僋
r1 = r1 & r2; //
r1 = r1 | r0; // 娗棟奜妱傝崬傒傪峫椂偟偨儅僗僋
#endif
sti r1; // CPU 傾儞儘僢僋
p0 = [sp++]; // 僞僗僋僄儞僩儕乕傪庢傝弌偡
r0 = [sp++]; // ext_tsk偺斣抧傪庢傝弌偡
rets = r0; // ext_tsk傪僟儈乕偺栠傝斣抧偵偡傞
r0 = [sp++]; // ext_inf傪庢傝弌偡 : r0 偼堷悢1
sp += -12;
jump (p0); // 僞僗僋偺奐巒
__kernel_activate_r.end:
/*
* 旝彮帪娫懸偪
* 撪懁偺儖乕僾偼12僒僀僋儖偱夞傞丅
*/
.global __kernel_sil_dly_nse;
__kernel_sil_dly_nse:
r1 = SIL_DLY_TIM1;
r2 = SIL_DLY_TIM2;
r0 = r0 - r1; // dilay - SIL_DLY_TIM1
cc = an; // 寢壥偑0傛傝戝偒偗傟偽
if !cc jump _sil_dly_nse_1; // 儖乕僾
rts;
_sil_dly_nse_1:
r0 = r0 - r2;
nop;
cc = an; // 寢壥偑0傛傝戝偒偗傟偽
if !cc jump _sil_dly_nse_1; // 儖乕僾
rts;
__kernel_sil_dly_nse.end:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -