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

📄 cpu_config.c

📁 toppers操作系统源码
💻 C
字号:
/* *  TOPPERS/JSP Kernel *      Toyohashi Open Platform for Embedded Real-Time Systems/ *      Just Standard Profile Kernel * *  Copyright (C) 2000-2004 by Embedded and Real-Time Systems Laboratory *                              Toyohashi Univ. of Technology, JAPAN *  Copyright (C) 2001-2004 by Industrial Technology Institute, *                              Miyagi Prefectural Government, JAPAN *  Copyright (C) 2001-2004 by Dep. of Computer Science and Engineering *                   Tomakomai National College of Technology, JAPAN *  Copyright (C) 2003-2004 by Katsuhiro Amano * *  惧淡螟侯涪荚は·笆布の (1)×(4) の掘凤か·Free Software Foundation *  によって给山されている GNU General Public License の Version 2 に淡 *  揭されている掘凤を塔たす眷圭に嘎り·塑ソフトウェア∈塑ソフトウェア *  を猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖恃ˇ浩芹邵∈笆布· *  网脱と钙ぶ∷することを痰浸で钓满するˉ *  (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯 *      涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖 *      スコ〖ド面に崔まれていることˉ *  (2) 塑ソフトウェアを·ライブラリ妨及など·戮のソフトウェア倡券に蝗 *      脱できる妨で浩芹邵する眷圭には·浩芹邵に燃うドキュメント∈网脱 *      荚マニュアルなど∷に·惧淡の螟侯涪山绩·この网脱掘凤および布淡 *      の痰瘦沮惮年を非很することˉ *  (3) 塑ソフトウェアを·怠达に寥み哈むなど·戮のソフトウェア倡券に蝗 *      脱できない妨で浩芹邵する眷圭には·肌のいずれかの掘凤を塔たすこ *      とˉ *    (a) 浩芹邵に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟 *        侯涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ *    (b) 浩芹邵の妨轮を·侍に年める数恕によって·TOPPERSプロジェクトに *        鼠桂することˉ *  (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄 *      巢からも·惧淡螟侯涪荚およびTOPPERSプロジェクトを倘勒することˉ * *  塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚お *  よびTOPPERSプロジェクトは·塑ソフトウェアに簇して·その努脱材墙拉も *  崔めて·いかなる瘦沮も乖わないˉまた·塑ソフトウェアの网脱により木 *  儡弄または粗儡弄に栏じたいかなる禄巢に簇しても·その勒扦を砷わないˉ * *  @(#) $Id: cpu_config.c,v 1.6 2005/11/13 14:05:01 honda Exp $ *//* *  プロセッサ巴赂モジュ〖ル∈H8脱∷ *   カ〖ネル柒婶で蝗脱する年盗 *    C咐胳簇眶の悸挛 */#include "jsp_kernel.h"#include "check.h"#include "task.h"#include "sil.h"#include <hw_serial.h>  /*  SCI_putchar_pol()  */#ifdef SUPPORT_CHG_IPM/* *  タスクコンテキストでの充哈みマスク */volatile UB      task_intmask = 0;#endif /* SUPPORT_CHG_IPM *//* *  润タスクコンテキストでの充哈みマスク */volatile UB      int_intmask = 0;/* *  充哈みネストカウンタ */volatile UB      intnest = 0;/* *  CPUロック觉轮を山すフラグ */volatile BOOL    iscpulocked = TRUE;/* *  タイマのプライオリティレベル肋年脱のデ〖タ *      塑丸はhw_timer.hに淡揭するべきだが、そうすると *      hw_timer.hをインクル〖ドしたファイルですべて悸挛步されて *   メモリ挝拌を狸铜してしまうため、悸挛はここに淡揭する。 */const IRC TIMER_IRC = {(UB*)SYSTEM_TIMER_IPR,                        SYSTEM_TIMER_IP_BIT,                        SYSTEM_TIMER_IPM                      };/* *  SYSCRの介袋猛 *      $CPUディレクトリで年盗する柒推 *       ビット7 SSBY=0¨sleep炭吾でスリ〖プモ〖ドへ败乖 *       ビット3 UE=1¨CCR.UIを充哈みマスクビットとして网脱 *       ビット1 1¨リザ〖ブビット *       ビット0 RAME=1¨柒垄RAM铜跟 *      $SYSディレクトリでSYSCR_SYSとして年盗する柒推 *       ビット6-4 STS¨スタンバイˇタイマˇセレクト *       ビット2 NMIEG¨NMIエッジ */#define SYSCR_INI	(H8SYSCR_UE | BIT1 | H8SYSCR_RAME | SYSCR_SYS)/* *  プロセッサ巴赂の介袋步 */voidcpu_initialize(void){        /*         *  笆布の3つはスタ〖トアップル〖チンで介袋步が貉んでいる。         *    ˇ充哈みネストカウンタ intnest         *    ˇ润タスクコンテキストの充哈みマスク int_intmask         *    ˇタスクコンテキストの充哈みマスク task_intmask         *      ∈chg_ipmをサポ〖トする眷圭∷         */        /*         *  SYSCRの肋年         */        sil_wrb_mem((VP)H8SYSCR, (VB)SYSCR_INI);                 /*  踏窗喇  */        /*  sleep炭吾で莲败する臼排蜗觉轮の肋年  */        /*  你レベル叫蜗脱シリアルポ〖トの介袋步  */        SCI_initialize(SCI_LOW_PORTID);}/* *  プロセッサ巴赂の姜位借妄 */voidcpu_terminate(void){}#ifdef SUPPORT_CHG_IPM/* *  充哈みマスクの恃构 * * IPMに肋年できる猛としてIPM_LEVEL0、IPM_LEVEL1がマクロ年盗されている。 * * * IPM_LEVEL0¨レベル0 すべての充哈みを减け烧ける * IPM_LEVEL1¨レベル1 NMIおよびプライオリティレベル1の充哈みのみを *            减け烧ける * *  chg_ipm を蝗って IPM をレベル2∈NMI 笆嘲のすべての充哈みを敦贿∷に *  恃构することはできないˉNMI 笆嘲のすべての充哈みを敦贿したい眷圭 *  には·loc_cpu によりCPUロック觉轮にすればよいˉ *  IPM が 0 笆嘲の箕にも·タスクディスパッチは瘦伪されないˉIPM は· *  タスクディスパッチによって·糠しく悸乖觉轮になったタスクへ苞き费が *  れるˉそのため·タスクが悸乖面に·侍のタスクによって IPM が恃构さ *  れる眷圭があるˉJSPカ〖ネルでは·IPM の恃构はタスク毋嘲借妄ル〖チ *  ンによっても弹こるのが·これによって胺いが岂しくなる觉斗は警ないと *  蛔われるˉ * IPM の猛によってタスクディスパッチを敦贿したい眷圭には·dis_dspを *  驶脱すればよいˉ */SYSCALL ERchg_ipm(IPM ipm){        ER      ercd = E_OK;        LOG_CHG_IPM_ENTER(ipm);        CHECK_TSKCTX_UNL();        CHECK_PAR( (ipm == IPM_LEVEL0) || (ipm == IPM_LEVEL1) || (ipm == IPM_LEVEL2));        t_lock_cpu();        task_intmask = ipm;        t_unlock_cpu();    exit:        LOG_CHG_IPM_LEAVE(ercd)        return(ercd);}/* *  充哈みマスクの徊救 */SYSCALL ERget_ipm(IPM *p_ipm){        ER      ercd = E_OK;        LOG_GET_IPM_ENTER(p_ipm);        CHECK_TSKCTX_UNL();        t_lock_cpu();        *p_ipm = task_intmask;        t_unlock_cpu();    exit:        LOG_GET_IPM_LEAVE(ercd, *p_ipm);        return(ercd);}#endif /* SUPPORT_CHG_IPM *//* * 腮警箕粗略ち *   庙罢祸灌¨ *    筛洁ではdlytimはUINT房だが16ビットしかないので、 *    UW房に恃构している。 *    sil_dly_nse()は柒婶でsil_dly_nse2()を钙び叫す。 */void sil_dly_nse(UINT dlytim) {	sil_dly_nse_long((UW)dlytim);}/*****笆布、鼎奶婶とのインタ〖フェ〖スに崔まれない婶尸*********//* * 判峡されていない充り哈みのデフォルト借妄 *//* * スタックの黎片から称レジスタのまでのオフセット *  *  スタック菇陇 *   +0:er0 *   +4:er1 *   +8:er2 *  +12:er3 *  +16:er4 *  +20:er5 *  +24:er6 *  +28:crr *  +29:pc *  +32×:充哈み涟に蝗脱されていたスタック挝拌 *//* * 充哈み券栏木涟のスタックポインタまでのオフセット */#define OFFSET_SP	32/* * 判峡されていない充り哈みが券栏すると钙び叫される */void cpu_experr(EXCSTACK *sp){    UW sp2, pc, ccr, tmp;        sp2 = (UW)sp + OFFSET_SP;    tmp = sp->pc;    ccr = (tmp >> 24U) & 0xff;	/*  惧疤1バイト  */    pc = tmp & 0x00ffffffUL;	/*  布疤3バイト  */    	/*	 *  %x∈腊眶房∷では2バイトしか山绩できないので	 *  %p∈ポインタ房∷を脱いて4バイト山绩している。	 */    syslog(LOG_EMERG, "Unexpected interrupt.");    syslog(LOG_EMERG, "PC  = 0x%08p SP  = 0x%08p CCR  = 0x%02x",                       (VP)pc, (VP)sp2, (INT)ccr);    syslog(LOG_EMERG, "ER0 = 0x%08p ER1 = 0x%08p ER2 = 0x%08p ER3 = 0x%08p",           (VP)(sp->er0), (VP)(sp->er1), (VP)(sp->er2), (VP)(sp->er3));    syslog(LOG_EMERG, "ER4 = 0x%08p ER5 = 0x%08p ER6 = 0x%08p",                       (VP)(sp->er4), (VP)(sp->er5), (VP)(sp->er6));    while(1)    	;}/* *  タ〖ゲットシステムの矢机叫蜗 * *  システムの你レベルの矢机叫蜗ル〖チンˉ */voidcpu_putc(char c){    if (c == '\n') {        SCI_putchar_pol('\r');    }    SCI_putchar_pol(c);}

⌨️ 快捷键说明

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