Ignore:
Timestamp:
Jun 2, 2015, 3:39:53 PM (9 years ago)
Author:
nmir-saito
Message:

ファイルの mime-type 変更

File:
1 edited

Legend:

Unmodified
Added
Removed
  • ssp_qb_r5f100le_cs/trunk/arch/arm_m_gcc/prc_config.h

    • Property svn:mime-type set to text/plain; charset=shift_jis
    r93 r95  
    88 *             Nagoya Municipal Industrial Research Institute, JAPAN
    99 *
    10  *  ã‹L’˜ìŒ ŽÒ‚́CˆÈ‰º‚Ì(1)`(4)‚ÌðŒ‚ð–ž‚½‚·ê‡‚ÉŒÀ‚èC–{ƒ\ƒtƒgƒEƒF
    11  *  ƒAi–{ƒ\ƒtƒgƒEƒFƒA‚ð‰ü•Ï‚µ‚½‚à‚Ì‚ðŠÜ‚ށDˆÈ‰º“¯‚¶j‚ðŽg—pE•¡»E‰ü
    12  *  •ÏEÄ”z•ziˆÈ‰ºC—˜—p‚ƌĂԁj‚·‚邱‚Ƃ𖳏ž‚Å‹–‘ø‚·‚éD
    13  *  (1) –{ƒ\ƒtƒgƒEƒFƒA‚ðƒ\[ƒXƒR[ƒh‚ÌŒ`‚Å—˜—p‚·‚éê‡‚ɂ́Cã‹L‚Ì’˜ì
    14  *      Œ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’肪C‚»‚Ì‚Ü‚Ü‚ÌŒ`‚Ń\[
    15  *      ƒXƒR[ƒh’†‚ÉŠÜ‚Ü‚ê‚Ä‚¢‚邱‚ƁD
    16  *  (2) –{ƒ\ƒtƒgƒEƒFƒA‚ðCƒ‰ƒCƒuƒ‰ƒŠŒ`Ž®‚ȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
    17  *      —p‚Å‚«‚éŒ`‚ōĔz•z‚·‚éê‡‚ɂ́CÄ”z•z‚É”º‚¤ƒhƒLƒ
    18 ƒƒ“ƒgi—˜—p
    19  *      ŽÒƒ}ƒjƒ
    20 ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L
    21  *      ‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
    22  *  (3) –{ƒ\ƒtƒgƒEƒFƒA‚ðC‹@Ší‚É‘g‚ݍž‚ނȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
    23  *      —p‚Å‚«‚È‚¢Œ`‚ōĔz•z‚·‚éê‡‚ɂ́CŽŸ‚Ì‚¢‚¸‚ê‚©‚ÌðŒ‚ð–ž‚½‚·‚±
    24  *      ‚ƁD
    25  *    (a) Ä”z•z‚É”º‚¤ƒhƒLƒ
    26 ƒƒ“ƒgi—˜—pŽÒƒ}ƒjƒ
    27 ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜
    28  *        ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
    29  *    (b) Ä”z•z‚ÌŒ`‘Ô‚ðC•Ê‚É’è‚ß‚é•û–@‚É‚æ‚Á‚āCTOPPERSƒvƒƒWƒFƒNƒg‚É
    30  *        •ñ‚·‚邱‚ƁD
    31  *  (4) –{ƒ\ƒtƒgƒEƒFƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚é‚¢‚©‚Ȃ鑹
    32  *      ŠQ‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð–Ɛӂ·‚邱‚ƁD
    33  *      ‚Ü‚½C–{ƒ\ƒtƒgƒEƒFƒA‚̃†[ƒU‚Ü‚½‚̓Gƒ“ƒhƒ†[ƒU‚©‚ç‚Ì‚¢‚©‚Ȃ闝
    34  *      —R‚ÉŠî‚­¿‹‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð
    35  *      –Ɛӂ·‚邱‚ƁD
     10 *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
     11 *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
     12 *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
     13 *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
     14 *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
     15 *      スコード中に含まれていること.
     16 *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
     17 *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
     18 *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
     19 *      の無保証規定を掲載すること.
     20 *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
     21 *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
     22 *      と.
     23 *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
     24 *        作権表示,この利用条件および下記の無保証規定を掲載すること.
     25 *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
     26 *        報告すること.
     27 *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
     28 *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
     29 *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
     30 *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
     31 *      免責すること.
    3632 *
    37  *  –{ƒ\ƒtƒgƒEƒFƒA‚́C–³•ÛØ‚Å’ñ‹Ÿ‚³‚ê‚Ä‚¢‚é‚à‚Ì‚Å‚ ‚éDã‹L’˜ìŒ ŽÒ‚¨
    38  *  ‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚́C–{ƒ\ƒtƒgƒEƒFƒA‚ÉŠÖ‚µ‚āC“Á’è‚ÌŽg—p–Ú“I
    39  *  ‚ɑ΂·‚é“K‡«‚àŠÜ‚߂āC‚¢‚©‚È‚é•ÛØ‚às‚í‚È‚¢D‚Ü‚½C–{ƒ\ƒtƒgƒEƒF
    40  *  ƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚½‚¢‚©‚Ȃ鑹ŠQ‚ÉŠÖ‚µ‚Ä‚àC‚»
    41  *  ‚̐ӔC‚𕉂í‚È‚¢D
     33 *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     34 *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     35 *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     36 *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     37 *  の責任を負わない.
    4238 *
    4339 *  @(#) $Id: prc_config.h 1304 2008-08-27 07:28:36Z ertl-honda $
     
    4541
    4642/*
    47  *              ƒvƒƒZƒbƒTˆË‘¶ƒ‚ƒWƒ
    48 [ƒ‹iARM-M—pj
    49  *
    50  *  ‚±‚̃Cƒ“ƒNƒ‹[ƒhƒtƒ@ƒCƒ‹‚́Ctarget_config.hi‚Ü‚½‚́C‚»‚±‚©‚çƒCƒ“ƒN
    51  *  ƒ‹[ƒh‚³‚ê‚éƒtƒ@ƒCƒ‹j‚Ì‚Ý‚©‚çƒCƒ“ƒNƒ‹[ƒh‚³‚ê‚éD‘¼‚̃tƒ@ƒCƒ‹‚©‚ç
    52  *  ’¼ÚƒCƒ“ƒNƒ‹[ƒh‚µ‚Ä‚Í‚È‚ç‚È‚¢D
     43 *              プロセッサ依存モジュール(ARM-M用)
     44 *
     45 *  このインクルードファイルは,target_config.h(または,そこからインク
     46 *  ルードされるファイル)のみからインクルードされる.他のファイルから
     47 *  直接インクルードしてはならない.
    5348 */
    5449
     
    5954
    6055/*
    61  *  ƒvƒƒZƒbƒT‚Ì“ÁŽê–½—߂̃Cƒ“ƒ‰ƒCƒ“ŠÖ”’è‹`
     56 *  プロセッサの特殊命令のインライン関数定義
    6257 */
    6358#include "prc_insn.h"
    6459
    6560/*
    66  *  ”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg—p‚̃Xƒ^ƒbƒN‰Šú’l
     61 *  非タスクコンテキスト用のスタック初期値
    6762 */
    6863#define TOPPERS_ISTKPT(istk, istksz) ((STK_T *)((char *)(istk) + (istksz)))
     
    7368
    7469/*
    75  *  Š„ž‚݃lƒXƒg”
     70 *  割込みネスト数
    7671 */
    7772extern uint8_t intnest;
    7873
    7974/*
    80  *  ƒRƒ“ƒeƒLƒXƒg‚ÌŽQÆ
     75 *  コンテキストの参照
    8176 *
    8277 */
     
    9994
    10095/*
    101  *  TOPPERS•W€Š„ž‚ݏˆ—ƒ‚ƒfƒ‹‚ÌŽÀŒ»
    102  *
    103  *  Š„ž‚Ý—Dæ“xƒ}ƒXƒN‚Æ‚µ‚ẮCBASEPRI‚ð—p‚¢‚éD‘SŠ„ž‚Ý‚ð‹ÖŽ~‚·‚é
    104  *  ‹@”\‚Æ‚µ‚āCFAULTMASK‚âPRIMASK‚ª‚ ‚邪CƒJ[ƒlƒ‹ŠÇ—ŠO‚ÌŠ„ž‚Ý‚ð
    105  *  ƒTƒ|[ƒg‚·‚邽‚߁C‚±‚ê‚ç‚ÍCPUƒƒbƒN‚Ì‚½‚ß‚É—p‚¢‚È‚¢D
    106  *  ‚»‚Ì‚½‚߁CBASEPRI‚ð—p‚¢‚Ä‹[Ž—“I‚ÉCPUƒƒbƒNƒtƒ‰ƒO‚ðŽÀŒ»‚·‚éD
    107  *
    108  *  ‚Ü‚¸CCPUƒƒbƒNó‘Ô‚ðŠÇ—‚·‚½‚߂̕ϐ”(lock_flag)‚ð—pˆÓ‚·‚éD
    109  *
    110  *  CPUƒƒbƒNƒtƒ‰ƒO‚ªƒNƒŠƒA‚³‚ê‚Ä‚¢‚éŠÔ‚́CBASEPRI‚ðƒ‚ƒfƒ‹ã‚ÌŠ„ž‚Ý
    111  *  —Dæ“xƒ}ƒXƒN‚Ì’l‚ɐݒ肷‚éD‚±‚̊Ԃ́Cƒ‚ƒfƒ‹ã‚ÌŠ„ž‚Ý—Dæ“xƒ}ƒX
    112  *  ƒN‚́CBASEPRI‚ð—p‚¢‚éD
     96 *  TOPPERS標準割込み処理モデルの実現
     97 *
     98 *  割込み優先度マスクとしては,BASEPRIを用いる.全割込みを禁止する
     99 *  機能として,FAULTMASKやPRIMASKがあるが,カーネル管理外の割込みを
     100 *  サポートするため,これらはCPUロックのために用いない.
     101 *  そのため,BASEPRIを用いて擬似的にCPUロックフラグを実現する.
     102 *
     103 *  まず,CPUロック状態を管理すための変数(lock_flag)を用意する.
     104 *
     105 *  CPUロックフラグがクリアされている間は,BASEPRIをモデル上の割込み
     106 *  優先度マスクの値に設定する.この間は,モデル上の割込み優先度マス
     107 *  クは,BASEPRIを用いる.
    113108 *
    114  *  ‚»‚ê‚ɑ΂µ‚ÄCPUƒƒbƒNƒtƒ‰ƒO‚ªƒZƒbƒg‚³‚ê‚¢‚éŠÔ‚́CBASEPRI‚ðCƒJ[ƒl
    115  *  ƒ‹ŠÇ—ŠO‚Ì‚à‚Ì‚ðœ‚­‚·‚ׂĂ̊„ž‚Ý—v‹‚ðƒ}ƒXƒN‚·‚é’l(TIPM_LOCK)‚ƁC
    116  *  ƒ‚ƒfƒ‹ã‚ÌŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‚Ƃ̍‚‚¢•û‚ɐݒ肷‚éD‚±‚̊Ԃ̃‚ƒfƒ‹ã
    117  *  ‚ÌŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‚́C‚»‚Ì‚½‚߂̕ϐ”(saved_iipm, “à•”•\Œ»‚Å•ÛŽ)
    118  *  ‚ð—pˆÓ‚µ‚Ä•ÛŽ‚·‚éD
    119  */
    120 
    121 /*
    122  *  Š„ž‚Ý—Dæ“xƒ}ƒXƒN‚ÌŠO•”•\Œ»‚Æ“à•”•\Œ»‚Ì•ÏŠ·
    123  *
    124  *  ƒAƒZƒ“ƒuƒŠŒ¾Œê‚̃\[ƒXƒtƒ@ƒCƒ‹‚©‚çƒCƒ“ƒNƒ‹[ƒh‚·‚éê‡‚Ì‚½‚߂ɁC
    125  *  CAST‚ðŽg—p
    126  *  Š„ž‚Ý—Dæ“x‚̃rƒbƒg•(TBITW_IPRI)‚ª 8 ‚̏ꍇ‚́C“à•”—Dæ“x 255
    127  *  ‚́CŠO•”—Dæ“x -1 ‚ɑΉž‚·‚éD
    128  */
    129 #define EXT_IPM(iipm)   (CAST(PRI,((iipm >> (8 - TBITW_IPRI)) - (1 << TBITW_IPRI))))       /* “à•”•\Œ»‚ðŠO•”•\Œ»‚É */
    130 #define INT_IPM(ipm)    (((1 << TBITW_IPRI) - CAST(uint8_t, -(ipm)))  << (8 - TBITW_IPRI)) /* ŠO•”•\Œ»‚ð“à•”•\Œ»‚É */
    131 
    132 /*
    133  *  CPUƒƒbƒNó‘Ô‚Å‚ÌŠ„ž‚Ý—Dæ“xƒ}ƒXƒN
     109 *  それに対してCPUロックフラグがセットされいる間は,BASEPRIを,カーネ
     110 *  ル管理外のものを除くすべての割込み要求をマスクする値(TIPM_LOCK)と,
     111 *  モデル上の割込み優先度マスクとの高い方に設定する.この間のモデル上
     112 *  の割込み優先度マスクは,そのための変数(saved_iipm, 内部表現で保持)
     113 *  を用意して保持する.
     114 */
     115
     116/*
     117 *  割込み優先度マスクの外部表現と内部表現の変換
     118 *
     119 *  アセンブリ言語のソースファイルからインクルードする場合のために,
     120 *  CASTを使用
     121 *  割込み優先度のビット幅(TBITW_IPRI)が 8 の場合は,内部優先度 255
     122 *  は,外部優先度 -1 に対応する.
     123 */
     124#define EXT_IPM(iipm)   (CAST(PRI,((iipm >> (8 - TBITW_IPRI)) - (1 << TBITW_IPRI))))       /* 内部表現を外部表現に */
     125#define INT_IPM(ipm)    (((1 << TBITW_IPRI) - CAST(uint8_t, -(ipm)))  << (8 - TBITW_IPRI)) /* 外部表現を内部表現に */
     126
     127/*
     128 *  CPUロック状態での割込み優先度マスク
    134129 */
    135130#define TIPM_LOCK    TMIN_INTPRI
    136131
    137132/*
    138  *  CPUƒƒbƒNó‘Ô‚Å‚ÌŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‚Ì“à•”•\Œ»
    139  *
    140  *  TIPM_LOCK‚́CCPUƒƒbƒNó‘Ô‚Å‚ÌBASEPRI‚Ì’lDƒJ[ƒlƒ‹ŠÇ—ŠO‚Ì‚à‚Ì‚ð
    141  *  œ‚­‚·‚ׂĂ̊„ž‚Ý‚ðƒ}ƒXƒN‚·‚é’l‚É’è‹`‚·‚éD 
     133 *  CPUロック状態での割込み優先度マスクの内部表現
     134 *
     135 *  TIPM_LOCKは,CPUロック状態でのBASEPRIの値.カーネル管理外のものを
     136 *  除くすべての割込みをマスクする値に定義する. 
    142137 */
    143138#define IIPM_LOCK    INT_IPM(TIPM_LOCK)
    144139
    145140/*
    146  *  TIPM_ENAALLiŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‘S‰ðœj‚Ì“à•”•\Œ»
    147  *
    148  *  BASEPRI‚É '0' ‚ðÝ’è‚·‚邱‚ƂŁC‘SŠ„ž‚Ý‚ð‹–‰Â‚·‚éD
     141 *  TIPM_ENAALL(割込み優先度マスク全解除)の内部表現
     142 *
     143 *  BASEPRIに '0' を設定することで,全割込みを許可する.
    149144 */
    150145#define IIPM_ENAALL  (0)
     
    154149
    155150/*
    156  *  CPUƒƒbƒNƒtƒ‰ƒOŽÀŒ»‚Ì‚½‚߂̕ϐ”
     151 *  CPUロックフラグ実現のための変数
    157152 *
    158  *  ‚±‚ê‚ç‚̕ϐ”‚́CCPUƒƒbƒNó‘Ô‚ÌŽž‚̂ݏ‘‚«Š·‚¦‚Ä‚à‚æ‚¢‚Æ‚·‚éD
    159  *  ƒCƒ“ƒ‰ƒCƒ“ŠÖ”’†‚ŁCƒAƒNƒZƒX‚̏‡˜‚ª•Ï‰»‚µ‚È‚¢‚悤Cvolatile ‚ðŽw’èD
    160  */
    161 extern volatile bool_t  lock_flag;    /* CPUƒƒbƒNƒtƒ‰ƒO‚Ì’l‚ð•ÛŽ‚·‚é•Ï” */
    162 extern volatile uint32_t saved_iipm;  /* Š„ž‚Ý—Dæ“x‚ðƒ}ƒXƒN‚·‚é•Ï” */
    163 
    164 /*
    165  *  CPUƒƒbƒNó‘Ԃւ̈ڍs
    166  *
    167  *  BASEPRIiƒn[ƒhƒEƒFƒA‚ÌŠ„ž‚Ý—Dæ“xƒ}ƒXƒNj‚ðCsaved_iipm‚É•Û‘¶‚µC
    168  *  ƒJ[ƒlƒ‹ŠÇ—ŠO‚Ì‚à‚Ì‚ðœ‚­‚·‚ׂĂ̊„ž‚Ý‚ðƒ}ƒXƒN‚·‚é’liTIPM_LOCKj
    169  *  ‚ɐݒ肷‚éD‚Ü‚½Clock_flag‚ðtrue‚É‚·‚éD
    170  *
    171  *  BASEPRI‚ªCÅ‰‚©‚çTIPM_LOCK‚Æ“¯‚¶‚©‚»‚ê‚æ‚荂‚¢ê‡‚ɂ́C‚»‚ê‚ð
    172  *  saved_iipm‚É•Û‘¶‚·‚é‚݂̂ŁCTIPM_LOCK‚ɂ͐ݒ肵‚È‚¢D‚±‚ê‚́Cƒ‚ƒfƒ‹
    173  *  ã‚ÌŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‚ªCTIPM_LOCK‚Æ“¯‚¶‚©‚»‚ê‚æ‚荂‚¢ƒŒƒxƒ‹‚ɐݒè
    174  *  ‚³‚ê‚Ä‚¢‚éó‘Ô‚É‚ ‚½‚éD
    175  *
    176  *  ‚±‚̊֐”‚́CCPUƒƒbƒNó‘ԁilock_flag‚ªtrue‚̏ó‘ԁj‚ŌĂ΂ê‚邱‚Æ‚Í
    177  *  ‚È‚¢‚à‚Ì‚Æ‘z’肵‚Ä‚¢‚éD
     153 *  これらの変数は,CPUロック状態の時のみ書き換えてもよいとする.
     154 *  インライン関数中で,アクセスの順序が変化しないよう,volatile を指定.
     155 */
     156extern volatile bool_t  lock_flag;    /* CPUロックフラグの値を保持する変数 */
     157extern volatile uint32_t saved_iipm;  /* 割込み優先度をマスクする変数 */
     158
     159/*
     160 *  CPUロック状態への移行
     161 *
     162 *  BASEPRI(ハードウェアの割込み優先度マスク)を,saved_iipmに保存し,
     163 *  カーネル管理外のものを除くすべての割込みをマスクする値(TIPM_LOCK)
     164 *  に設定する.また,lock_flagをtrueにする.
     165 *
     166 *  BASEPRIが,最初からTIPM_LOCKと同じかそれより高い場合には,それを
     167 *  saved_iipmに保存するのみで,TIPM_LOCKには設定しない.これは,モデル
     168 *  上の割込み優先度マスクが,TIPM_LOCKと同じかそれより高いレベルに設定
     169 *  されている状態にあたる.
     170 *
     171 *  この関数は,CPUロック状態(lock_flagがtrueの状態)で呼ばれることは
     172 *  ないものと想定している.
    178173 */
    179174Inline void
     
    183178
    184179        /*
    185          *  current_iipm()‚Ì•Ô‚è’l‚𒼐Úsaved_iipm‚É•Û‘¶‚¹‚¸CˆêŽž•Ï”iipm
    186          *  ‚ð—p‚¢‚Ä‚¢‚é‚̂́Ccurrent_iipm()‚ðŒÄ‚ñ‚¾’¼Œã‚ÉŠ„ž‚Ý‚ª”­¶‚µC
    187          *  ‹N“®‚³‚ꂽŠ„ž‚ݏˆ—‚Åsaved_iipm‚ª•ÏX‚³‚ê‚é‰Â”\«‚ª‚ ‚邽‚ß‚Å
    188          *  ‚ ‚éD
     180         *  current_iipm()の返り値を直接saved_iipmに保存せず,一時変数iipm
     181         *  を用いているのは,current_iipm()を呼んだ直後に割込みが発生し,
     182         *  起動された割込み処理でsaved_iipmが変更される可能性があるためで
     183         *  ある.
    189184         */
    190185        iipm = get_basepri();
     
    192187        saved_iipm = iipm;
    193188        lock_flag = true;
    194         /* ƒNƒŠƒeƒBƒJƒ‹ƒZƒNƒVƒ‡ƒ“‚Ì‘OŒã‚сƒ‚ƒŠ‚ª‘‚«Š·‚í‚é‰Â”\«‚ª‚ ‚é */
     189        /* クリティカルセクションの前後でメモリが書き換わる可能性がある */
    195190        Asm("":::"memory");
    196191}
     
    200195
    201196/*
    202  *  CPUƒƒbƒNó‘Ԃ̉ðœ
    203  *
    204  *  lock_flag‚ðfalse‚É‚µCIPMiƒn[ƒhƒEƒFƒA‚ÌŠ„ž‚Ý—Dæ“xƒ}ƒXƒNj‚ðC
    205  *  saved_iipm‚É•Û‘¶‚µ‚½’l‚É–ß‚·D
    206  *
    207  *  ‚±‚̊֐”‚́CCPUƒƒbƒNó‘ԁilock_flag‚ªtrue‚̏ó‘ԁj‚ł̂݌Ă΂ê‚é‚à
    208  *  ‚Ì‚Æ‘z’肵‚Ä‚¢‚éD
     197 *  CPUロック状態の解除
     198 *
     199 *  lock_flagをfalseにし,IPM(ハードウェアの割込み優先度マスク)を,
     200 *  saved_iipmに保存した値に戻す.
     201 *
     202 *  この関数は,CPUロック状態(lock_flagがtrueの状態)でのみ呼ばれるも
     203 *  のと想定している.
    209204 */
    210205Inline void
    211206x_unlock_cpu(void)
    212207{
    213         /* ƒNƒŠƒeƒBƒJƒ‹ƒZƒNƒVƒ‡ƒ“‚Ì‘OŒã‚сƒ‚ƒŠ‚ª‘‚«Š·‚í‚é‰Â”\«‚ª‚ ‚é */
     208        /* クリティカルセクションの前後でメモリが書き換わる可能性がある */
    214209        Asm("":::"memory");
    215210        lock_flag = false;
     
    221216
    222217/*
    223  *  CPUƒƒbƒNó‘Ô‚ÌŽQÆ
     218 *  CPUロック状態の参照
    224219 */
    225220Inline bool_t
     
    234229
    235230/*
    236  * iƒ‚ƒfƒ‹ã‚́jŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‚̐ݒè
    237  *
    238  *  CPUƒƒbƒNƒtƒ‰ƒO‚ªƒNƒŠƒA‚³‚ê‚Ä‚¢‚鎞‚́Cƒn[ƒhƒEƒFƒA‚ÌŠ„ž‚Ý—Dæ“xƒ}
    239  *  ƒXƒN‚ðÝ’è‚·‚éDCPUƒƒbƒNƒtƒ‰ƒO‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚鎞‚́Csaved_iipm
    240  *  ‚ðÝ’肵C‚³‚ç‚ɁCƒn[ƒhƒEƒFƒA‚ÌŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‚ðCÝ’肵‚悤‚Æ
    241  *  ‚µ‚½iƒ‚ƒfƒ‹ã‚́jŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‚ÆTIPM_LOCK‚̍‚‚¢•û‚ɐݒ肷‚éD
     231 * (モデル上の)割込み優先度マスクの設定
     232 *
     233 *  CPUロックフラグがクリアされている時は,ハードウェアの割込み優先度マ
     234 *  スクを設定する.CPUロックフラグがセットされている時は,saved_iipm
     235 *  を設定し,さらに,ハードウェアの割込み優先度マスクを,設定しようと
     236 *  した(モデル上の)割込み優先度マスクとTIPM_LOCKの高い方に設定する.
    242237 */
    243238Inline void
     
    263258
    264259/*
    265  * iƒ‚ƒfƒ‹ã‚́jŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‚ÌŽQÆ
    266  *
    267  *  CPUƒƒbƒNƒtƒ‰ƒO‚ªƒNƒŠƒA‚³‚ê‚Ä‚¢‚鎞‚̓n[ƒhƒEƒFƒA‚ÌŠ„ž‚Ý—Dæ“xƒ}
    268  *  ƒXƒN‚ðCƒZƒbƒg‚³‚ê‚Ä‚¢‚鎞‚Ísaved_iipm‚ðŽQÆ‚·‚éD
     260 * (モデル上の)割込み優先度マスクの参照
     261 *
     262 *  CPUロックフラグがクリアされている時はハードウェアの割込み優先度マ
     263 *  スクを,セットされている時はsaved_iipmを参照する.
    269264 */
    270265Inline PRI
     
    292287
    293288/*
    294  *  SVCƒnƒ“ƒhƒ‰iprc_support.Sj
     289 *  SVCハンドラ(prc_support.S)
    295290 */
    296291extern void svc_handler(void);
    297292
    298293/*
    299  *  ƒXƒ^[ƒgƒAƒbƒvƒ‹[ƒ`ƒ“istart.Sj
     294 *  スタートアップルーチン(start.S)
    300295 */
    301296extern void _start(void);
    302297
    303298/*
    304  *  ƒfƒBƒXƒpƒbƒ`ƒƒ‚Ì“®ìŠJŽniprc_support.Sj
    305  *
    306  *  start_dispatch‚́CƒJ[ƒlƒ‹‹N“®Žž‚ɌĂяo‚·‚ׂ«‚à‚̂ŁC‚·‚ׂĂ̊„ž
    307  *  ‚Ý‚ð‹ÖŽ~‚µ‚½ó‘ԁiŠ„ž‚݃ƒbƒNó‘Ô‚Æ“¯“™‚̏ó‘ԁj‚ŌĂяo‚³‚È‚¯‚ê‚Î
    308  *  ‚È‚ç‚È‚¢D
     299 *  ディスパッチャの動作開始(prc_support.S)
     300 *
     301 *  start_dispatchは,カーネル起動時に呼び出すべきもので,すべての割込
     302 *  みを禁止した状態(割込みロック状態と同等の状態)で呼び出さなければ
     303 *  ならない.
    309304 */
    310305extern void start_dispatch(void) NoReturn;
     
    312307
    313308/*
    314  *  ƒJ[ƒlƒ‹‚̏I—¹ˆ—‚̌ďo‚µiprc_support.Sj
    315  *
    316  *  call_exit_kernel‚́CƒJ[ƒlƒ‹‚̏I—¹Žž‚ɌĂяo‚·‚ׂ«‚à‚̂ŁC”ñƒ^ƒXƒN
    317  *  ƒRƒ“ƒeƒLƒXƒg‚ɐ؂芷‚¦‚āCƒJ[ƒlƒ‹‚̏I—¹ˆ—iexit_kernelj‚ðŒÄ‚яo
    318  *  ‚·D
     309 *  カーネルの終了処理の呼出し(prc_support.S)
     310 *
     311 *  call_exit_kernelは,カーネルの終了時に呼び出すべきもので,非タスク
     312 *  コンテキストに切り換えて,カーネルの終了処理(exit_kernel)を呼び出
     313 *  す.
    319314 */
    320315extern void call_exit_kernel(void) NoReturn;
    321316
    322317/*
    323  *  ƒAƒCƒhƒ‹ƒ‹[ƒv‚ÌŽÀ‘•
    324  *
    325  *  ’P‚ÉCPUƒƒbƒNó‘Ô‚ÆCPUƒƒbƒN‰ðœó‘Ô‚ðŒÄ‚яo‚·ŽÀ‘•‚Æ‚·‚éD
    326  *  ƒXƒŠ[ƒvƒ‚[ƒh‚É“ü‚ê‚éê‡‚Í–{ˆ—‚ðwfi–½—ß‚ð—p‚¢‚ď‘‚«Š·‚¦‚ê‚Ηǂ¢D
     318 *  アイドルループの実装
     319 *
     320 *  単にCPUロック状態とCPUロック解除状態を呼び出す実装とする.
     321 *  スリープモードに入れる場合は本処理をwfi命令を用いて書き換えれば良い.
    327322 */
    328323Inline void
     
    330325{
    331326        lock_flag = false;
    332         /* CPUƒAƒ“ƒƒbƒN => CPUƒƒbƒN  */
     327        /* CPUアンロック => CPUロック  */
    333328        Asm("\tmsr BASEPRI , %0" : : "r"(0) : "memory");
    334329        Asm("\tmsr BASEPRI , %0" : : "r"(IIPM_LOCK) : "memory");
     
    337332
    338333/*
    339  *  Š„ž‚ݔԍ†EŠ„ž‚݃nƒ“ƒhƒ‰”ԍ†
    340  *
    341  *  Š„ž‚݃nƒ“ƒhƒ‰”ԍ†(inhno)‚ÆŠ„ž‚ݔԍ†(intno)‚́CŠ„‚荞‚Ý”­¶Žž‚É
    342  *  EPSR‚ɐݒ肳‚ê‚é—áŠO”ԍ†‚Æ‚·‚éD
    343  */
    344 
    345 /*
    346  *  Š„ž‚ݔԍ†‚͈̔͂̔»’è
     334 *  割込み番号・割込みハンドラ番号
     335 *
     336 *  割込みハンドラ番号(inhno)と割込み番号(intno)は,割り込み発生時に
     337 *  EPSRに設定される例外番号とする.
     338 */
     339
     340/*
     341 *  割込み番号の範囲の判定
    347342 */
    348343#define VALID_INTNO(intno)           ((TMIN_INTNO <= (intno)) && ((intno) <= TMAX_INTNO))
     
    351346
    352347/*
    353  *  Š„ž‚݃nƒ“ƒhƒ‰‚̐ݒè
    354  *
    355  *  ƒxƒNƒgƒ‹”ԍ†inhno‚ÌŠ„ž‚݃nƒ“ƒhƒ‰‚Ì‹N“®”Ô’nint_entry‚ɐݒ肷‚éDŠ„ž‚Ý
    356  *  ƒnƒ“ƒhƒ‰ƒe[ƒuƒ‹
     348 *  割込みハンドラの設定
     349 *
     350 *  ベクトル番号inhnoの割込みハンドラの起動番地int_entryに設定する.割込み
     351 *  ハンドラテーブル
    357352 */
    358353Inline void
    359354x_define_inh(INHNO inhno, FP int_entry)
    360355{
    361         /* “Á‚ɍs‚¤ˆ—‚Í‚È‚¢ */
    362 }
    363 
    364 /*
    365  *  Š„ž‚݃nƒ“ƒhƒ‰‚̏o“üŒûˆ—‚̐¶¬ƒ}ƒNƒ
     356        /* 特に行う処理はない */
     357}
     358
     359/*
     360 *  割込みハンドラの出入口処理の生成マクロ
    366361 *
    367362 */
     
    370365
    371366/*
    372  *  Š„ž‚Ý—v‹‹ÖŽ~ƒtƒ‰ƒO
    373  */
    374 
    375 /*
    376  *  Š„ž‚Ý‘®«‚ªÝ’肳‚ê‚Ä‚¢‚é‚©‚ð”»•Ê‚·‚邽‚߂̕ϐ”ikernel_cfg.cj
     367 *  割込み要求禁止フラグ
     368 */
     369
     370/*
     371 *  割込み属性が設定されているかを判別するための変数(kernel_cfg.c)
    377372 */
    378373extern const uint32_t   bitpat_cfgint[];
    379374
    380375/*
    381  *  Š„ž‚Ý—v‹‹ÖŽ~ƒtƒ‰ƒO‚̃Zƒbƒg
    382  *
    383  *  Š„ž‚Ý‘®«‚ªÝ’肳‚ê‚Ä‚¢‚È‚¢Š„ž‚Ý—v‹ƒ‰ƒCƒ“‚ɑ΂µ‚ÄŠ„ž‚Ý—v‹‹ÖŽ~
    384  *  ƒtƒ‰ƒO‚ðƒNƒŠƒA‚µ‚悤‚Æ‚µ‚½ê‡‚ɂ́Cfalse‚ð•Ô‚·D 
     376 *  割込み要求禁止フラグのセット
     377 *
     378 *  割込み属性が設定されていない割込み要求ラインに対して割込み要求禁止
     379 *  フラグをクリアしようとした場合には,falseを返す. 
    385380 */
    386381Inline bool_t
     
    390385
    391386        /*
    392          *  Š„ž‚Ý‘®«‚ªÝ’肳‚ê‚Ä‚¢‚È‚¢ê‡
     387         *  割込み属性が設定されていない場合
    393388         */
    394389        if ((bitpat_cfgint[intno >> 5] & (1 << (intno & 0x1f))) == 0x00) {
     
    412407
    413408/*
    414  *  Š„ž‚Ý—v‹‹ÖŽ~ƒtƒ‰ƒO‚̉ðœ
    415  *
    416  *  Š„ž‚Ý‘®«‚ªÝ’肳‚ê‚Ä‚¢‚È‚¢Š„ž‚Ý—v‹ƒ‰ƒCƒ“‚ɑ΂µ‚ÄŠ„ž‚Ý—v‹‹ÖŽ~
    417  *  ƒtƒ‰ƒO‚ðƒNƒŠƒA‚µ‚悤‚Æ‚µ‚½ê‡‚ɂ́Cfalse‚ð•Ô‚·D
     409 *  割込み要求禁止フラグの解除
     410 *
     411 *  割込み属性が設定されていない割込み要求ラインに対して割込み要求禁止
     412 *  フラグをクリアしようとした場合には,falseを返す.
    418413 */
    419414Inline bool_t
     
    423418
    424419        /*
    425          *  Š„ž‚Ý‘®«‚ªÝ’肳‚ê‚Ä‚¢‚È‚¢ê‡
     420         *  割込み属性が設定されていない場合
    426421         */
    427422        if ((bitpat_cfgint[intno >> 5] & (1 << (intno & 0x1f))) == 0x00) {
     
    458453
    459454/*
    460  *  Š„ž‚Ý—v‹ƒ‰ƒCƒ“‚Ì‘®«‚̐ݒè
     455 *  割込み要求ラインの属性の設定
    461456 */
    462457extern void x_config_int(INTNO intno, ATR intatr, PRI intpri);
    463458
    464459/*
    465  *  Š„ž‚݃nƒ“ƒhƒ‰“üŒû‚Å•K—v‚ÈIRC‘€ì
     460 *  割込みハンドラ入口で必要なIRC操作
    466461 */
    467462Inline void
    468463i_begin_int(INTNO intno)
    469464{
    470         /* “Á‚ɍs‚¤ˆ—‚Í‚È‚¢ */
    471 }
    472 
    473 /*
    474  *  Š„ž‚݃nƒ“ƒhƒ‰‚̏oŒû‚Å•K—v‚ÈIRC‘€ì
     465        /* 特に行う処理はない */
     466}
     467
     468/*
     469 *  割込みハンドラの出口で必要なIRC操作
    475470 */
    476471Inline void
    477472i_end_int(INTNO intno)
    478473{
    479         /* “Á‚ɍs‚¤ˆ—‚Í‚È‚¢ */
    480 }
    481 
    482 /*
    483  *  CPU—áŠOƒnƒ“ƒhƒ‰ŠÖŒW
     474        /* 特に行う処理はない */
     475}
     476
     477/*
     478 *  CPU例外ハンドラ関係
    484479 */
    485480
    486481/*
    487  *  CPU—áŠOƒnƒ“ƒhƒ‰”ԍ†
     482 *  CPU例外ハンドラ番号
    488483 */
    489484#define VALID_EXCNO_DEFEXC(excno)    (TMIN_EXCNO <= (excno) && (excno) <= TMAX_EXCNO)
    490485
    491486/*
    492  *  CPU—áŠOƒnƒ“ƒhƒ‰‚Ì‹–‰Â
     487 *  CPU例外ハンドラの許可
    493488 */
    494489extern void enable_exc(EXCNO excno);
    495490
    496491/*
    497  *  CPU—áŠOƒnƒ“ƒhƒ‰‚Ì‹ÖŽ~
     492 *  CPU例外ハンドラの禁止
    498493 */
    499494extern void disable_exc(EXCNO excno);
    500495
    501496/*
    502  *  CPU—áŠOƒnƒ“ƒhƒ‰‚̐ݒè
     497 *  CPU例外ハンドラの設定
    503498 */
    504499Inline void
     
    506501{
    507502        /*
    508          *  ˆê•”‚Ì—áŠO‚Í‹–‰Â‚ðs‚¤•K—v‚ª‚ ‚é
     503         *  一部の例外は許可を行う必要がある
    509504         */
    510505        enable_exc(excno);
     
    512507
    513508/*
    514  *  CPU—áŠOƒnƒ“ƒhƒ‰‚Ì“üŒûˆ—‚̐¶¬ƒ}ƒNƒ
     509 *  CPU例外ハンドラの入口処理の生成マクロ
    515510 */
    516511#define EXC_ENTRY(excno, exchdr)    exchdr
     
    519514
    520515/*
    521  *  CPU—áŠOƒGƒ“ƒgƒŠiprc_support.Sj
     516 *  CPU例外エントリ(prc_support.S)
    522517 */
    523518extern void exc_entry(void);
    524519
    525520/*
    526  *  Š„ž‚݃Gƒ“ƒgƒŠiprc_support.Sj
     521 *  割込みエントリ(prc_support.S)
    527522 */
    528523extern void int_entry(void);
    529524
    530525/*
    531  *  ƒvƒƒZƒbƒTˆË‘¶‚̏‰Šú‰»
     526 *  プロセッサ依存の初期化
    532527 */
    533528extern void prc_initialize(void);
    534529
    535530/*
    536  *  ƒvƒƒZƒbƒTˆË‘¶‚̏I—¹Žžˆ—
     531 *  プロセッサ依存の終了時処理
    537532 */
    538533extern void prc_terminate(void) NoReturn;
    539534
    540535/*
    541  *  atexit‚̏ˆ—‚ƃfƒXƒgƒ‰ƒNƒ^‚ÌŽÀs
     536 *  atexitの処理とデストラクタの実行
    542537 */
    543538Inline void
     
    548543
    549544        /*
    550          *  software_term_hook‚ւ̃|ƒCƒ“ƒ^‚ðCˆê’UvolatileŽw’è‚Ì‚ ‚éfp‚É‘ã
    551          *  “ü‚µ‚Ä‚©‚çŽg‚¤‚̂́C0‚Æ‚Ì”äŠr‚ªÅ“K‰»‚ō폜‚³‚ê‚È‚¢‚悤‚É‚·‚邽
    552          *  ‚ß‚Å‚ ‚éD
     545         *  software_term_hookへのポインタを,一旦volatile指定のあるfpに代
     546         *  入してから使うのは,0との比較が最適化で削除されないようにするた
     547         *  めである.
    553548         */
    554549        if (fp != 0) {
     
    558553
    559554/*
    560  * “o˜^‚³‚ê‚Ä‚¢‚È‚¢—áŠO‚ª”­¶‚·‚é‚ƌĂяo‚³‚ê‚é
     555 * 登録されていない例外が発生すると呼び出される
    561556 */
    562557extern void default_exc_handler(void *p_excinf);
    563558
    564559/*
    565  * –¢“o˜^‚ÌŠ„ž‚Ý‚ª”­¶‚µ‚½ê‡‚ɌĂяo‚³‚ê‚é
     560 * 未登録の割込みが発生した場合に呼び出される
    566561 */
    567562extern void default_int_handler(void *p_excinf);
Note: See TracChangeset for help on using the changeset viewer.