📄 cpu_config.c
字号:
/* * TOPPERS/JSP Kernel * Toyohashi Open Platform for Embedded Real-Time Systems/ * Just Standard Profile Kernel * * Copyright (C) 2000 by Embedded and Real-Time Systems Laboratory * Toyohashi Univ. of Technology, JAPAN * * Copyright (C) 2004 by SEIKO EPSON Corp, JAPAN * * 惧淡螟侯涪荚は·笆布の (1)×(4) の掘凤か·Free Software Foundation * によって给山されている GNU General Public License の Version 2 に淡 * 揭されている掘凤を塔たす眷圭に嘎り·塑ソフトウェア∈塑ソフトウェア * を猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖恃ˇ浩芹邵∈笆布· * 网脱と钙ぶ∷することを痰浸で钓满するˉ * (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯 * 涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖 * スコ〖ド面に崔まれていることˉ * (2) 塑ソフトウェアを·ライブラリ妨及など·戮のソフトウェア倡券に蝗 * 脱できる妨で浩芹邵する眷圭には·浩芹邵に燃うドキュメント∈网脱 * 荚マニュアルなど∷に·惧淡の螟侯涪山绩·この网脱掘凤および布淡 * の痰瘦沮惮年を非很することˉ * (3) 塑ソフトウェアを·怠达に寥み哈むなど·戮のソフトウェア倡券に蝗 * 脱できない妨で浩芹邵する眷圭には·肌のいずれかの掘凤を塔たすこ * とˉ * (a) 浩芹邵に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟 * 侯涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ * (b) 浩芹邵の妨轮を·侍に年める数恕によって·TOPPERSプロジェクトに * 鼠桂することˉ * (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄 * 巢からも·惧淡螟侯涪荚およびTOPPERSプロジェクトを倘勒することˉ * * 塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚お * よびTOPPERSプロジェクトは·塑ソフトウェアに簇して·その努脱材墙拉も * 崔めて·いかなる瘦沮も乖わないˉまた·塑ソフトウェアの网脱により木 * 儡弄または粗儡弄に栏じたいかなる禄巢に簇しても·その勒扦を砷わないˉ * *//* * プロセッサ巴赂モジュ〖ル(S1C33脱) */#include "jsp_kernel.h"#include "check.h"#include "task.h"#include "itron.h"#include "s1c33.h"#include "sys_config.h"/* * CPUロック豺近箕に牲傅する */UINT tps_OrgIntLevel;/* * 充哈みネストカウンタ */UINT tps_IntNestCnt;/* * 充哈み扩告レジスタ 疤弥泼年借妄 */ER get_Offset(INTNO);ER get_BitFlag(INTNO);/* * プロセッサ巴赂の介袋步 */voidcpu_initialize(){ tps_IntNestCnt = 0; /* 充哈みネストカウントの介袋步 */ tps_OrgIntLevel = TPS_INIT_INTLEVEL; /* * 充り哈み钓材フラグを肋年し、OS瓷妄布の充り哈みをマスクする */ set_psr((TPS_CPULOCK_LEV << 8) | S1C33_PSR_FLAG_IE);}/* * プロセッサ巴赂の姜位借妄 */voidcpu_terminate(){}/* * タスク弹瓢借妄 */voidactivate_r(void){ unlock_cpu(); Asm("xld.w %r0, ext_tsk"); /* 提り疤弥をext_tskに肋年 */ Asm("pushn %r0"); Asm("ld.w %%r6, %0": : "r"(runtsk->tinib->exinf)); set_pc(runtsk->tinib->task);}/* * タスクディスパッチャ * * dispatchはタスクコンテキストˇCPUロック觉轮で钙び叫す。 * exit_and_dispatchも票屯だが、カ〖ネル弹瓢箕に滦炳するため * 润タスクコンテキストˇCPUロック豺近觉轮の钙び叫しにも滦炳 * している。 */voiddispatch(void){ TCB * task; Asm("pushn %r3"); task = runtsk; task->tskctxb.sp = get_sp(); task->tskctxb.pc = && dispatch_1; /* gcc橙磨怠墙を蝗脱する */ Asm("xjp _kernel_exit_and_dispatch");dispatch_1: Asm("popn %r3"); task = (TCB * volatile) runtsk; if ((task->enatex != FALSE) && (task->texptn != 0)) { Asm("xjp _kernel_calltex"); /* 毋嘲ハンドラ弹瓢 */ }}voidexit_and_dispatch(void){ register UW ulPsr; lock_cpu(); /* CPUをロックする */ runtsk = schedtsk; if (runtsk != NULL) { set_sp(runtsk->tskctxb.sp); set_pc(runtsk->tskctxb.pc); } set_sp(STACKTOP); /* 悸乖材墙なタスクがない眷圭 */ ulPsr = get_psr(); /* 充り哈みを钓材してイベント */ ulPsr |= S1C33_PSR_FLAG_IE; /* 券栏を略つ */ set_psr(ulPsr); unlock_cpu(); while (1) { Asm("halt"); }}/* * 充哈みハンドラ/CPU毋嘲ハンドラ叫庚借妄 */voidret_int(void){ static TCB * task; reqflg = FALSE; task = runtsk; if (task == NULL) { /* アイドル借妄へジャンプする */ Asm("xjp _kernel_exit_and_dispatch"); } if ((enadsp != FALSE) && (task != schedtsk)) {#ifndef __c33adv Asm("pushn %r1");#endif /* __c33adv */ task->tskctxb.sp = get_sp(); task->tskctxb.pc = && ret_int_2;/* gcc橙磨怠墙を蝗脱 */ /* ディスパッチ借妄へジャンプ */ Asm("xjp _kernel_exit_and_dispatch");ret_int_2:#ifndef __c33adv Asm("popn %r1");#endif /* __c33adv */ } task = (TCB * volatile) runtsk; if ((task->enatex != FALSE) && (task->texptn != 0)) { call_texrtn(); /* 毋嘲ハンドラ弹瓢 */ }#ifdef __c33adv Asm("pops %sor");#else /* __c33adv */ Asm("ld.w %alr, %r1"); Asm("ld.w %ahr, %r0");#endif /* __c33adv */#if TPS_DAREA_CNT == 4 /* デ〖タエリアポインタ眶に */ Asm("popn %r11"); /* 炳じたpop借妄を乖う */#elif TPS_DAREA_CNT == 3 Asm("popn %r12");#elif TPS_DAREA_CNT == 2 Asm("popn %r13");#elif TPS_DAREA_CNT == 1 Asm("popn %r14");#else Asm("popn %r15");#endif /* TPS_DAREA */ Asm("reti"); /* CPUロック觉轮は牲耽した */ /* タスクのサ〖ビスコ〖ルから */ /* リタ〖ンする箕に豺近される */}/* * 充哈みレベル恃构借妄 */ERchg_ilv(ILEVNO ilevno){ UW ulPsr; ER ercd; LOG_CHG_ILV_ENTER(ilevno) CHECK_TSKCTX_UNL(); if(ilevno > TPS_INTLEV_MAX){ ercd = E_PAR; } else { ulPsr = get_psr(); /* 附哼のPSR猛を艰评 */ ulPsr = (ulPsr & ~S1C33_PSR_MASK_IL) | (ilevno << 8); set_psr(ulPsr); /* PSR猛を构糠 */ ercd = E_OK; }exit: LOG_CHG_ILV_LEAVE(ercd) /* Set New IL */ return(ercd);}/* * 充哈みレベル艰评借妄 */ERget_ilv(ILEVNO *p_ilevno){ UW ulPsr; ER ercd; LOG_GET_ILV_ENTER(p_ilevno) CHECK_TSKCTX_UNL(); if(p_ilevno == NULL){ ercd = E_PAR; } else { ulPsr = get_psr(); /* 附哼の充哈みレベルを艰评 */ *p_ilevno = (ulPsr & S1C33_PSR_MASK_IL) >> 8; ercd = E_OK; }exit: LOG_GET_ILV_LEAVE(ercd, piLevno) return(ercd);}#ifndef __c33pe/* * 充哈み券栏钓材借妄 */ERena_int(INTNO intno){ INT iOffset, iBitFlag; iOffset = get_Offset(intno); /* レジスタ疤弥を艰评する */ iBitFlag = get_BitFlag(intno); if(iOffset == E_PAR || iBitFlag == E_PAR){ return (E_PAR); } /* 充り哈みを钓材する */ (*(s1c33Intc_t *) S1C33_INTC_BASE).bIntEnable[iOffset] |= (UB)iBitFlag; return (E_OK);}/* * 充哈み券栏敦贿借妄 */ERdis_int(INTNO intno){ INT iOffset, iBitFlag; iOffset = get_Offset(intno); /* レジスタ疤弥を艰评する */ iBitFlag = get_BitFlag(intno); if(iOffset == E_PAR || iBitFlag == E_PAR){ return (E_PAR); } /* 充り哈みを敦贿する */ (*(s1c33Intc_t *) S1C33_INTC_BASE).bIntEnable[iOffset] &= ~((UB)iBitFlag); return (E_OK);}/* * 充哈み券栏妥傍クリア */ERclr_int(INTNO intno){ INT iOffset, iBitFlag; iOffset = get_Offset(intno); /* レジスタ疤弥を艰评する */ iBitFlag = get_BitFlag(intno); if(iOffset == E_PAR || iBitFlag == E_PAR){ return (E_PAR); }#ifdef __c33adv if(intno > S1C33_INHNO_SERIAL3TX){ /* 钓材/敦贿レジスタと妥傍 */ iOffset -= 0x0d; /* フラグレジスタのオフセット */ } /* 疤弥が办米しないため */#endif /* __c33adv */ /* 充り哈み妥傍をクリアする */ (*(s1c33Intc_t *) S1C33_INTC_BASE).bIntFactor[iOffset] = ((UB)iBitFlag); return (E_OK);}#else /* __c33pe */#error "*_int() are valid for C33 Standard/Advanced macro."#endif /* __c33pe */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -