📄 core_config.h
字号:
/* * TOPPERS/ASP Kernel * Toyohashi Open Platform for Embedded Real-Time Systems/ * Advanced Standard Profile Kernel * * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory * Toyohashi Univ. of Technology, JAPAN * Copyright (C) 2006-2008 by Embedded and Real-Time Systems Laboratory * Graduate School of Information Science, Nagoya Univ., JAPAN * * 惧淡螟侯涪荚は·笆布の(1)×(4)の掘凤を塔たす眷圭に嘎り·塑ソフトウェ * ア∈塑ソフトウェアを猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖 * 恃ˇ浩芹邵∈笆布·网脱と钙ぶ∷することを痰浸で钓满するˉ * (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯 * 涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖 * スコ〖ド面に崔まれていることˉ * (2) 塑ソフトウェアを·ライブラリ妨及など·戮のソフトウェア倡券に蝗 * 脱できる妨で浩芹邵する眷圭には·浩芹邵に燃うドキュメント∈网脱 * 荚マニュアルなど∷に·惧淡の螟侯涪山绩·この网脱掘凤および布淡 * の痰瘦沮惮年を非很することˉ * (3) 塑ソフトウェアを·怠达に寥み哈むなど·戮のソフトウェア倡券に蝗 * 脱できない妨で浩芹邵する眷圭には·肌のいずれかの掘凤を塔たすこ * とˉ * (a) 浩芹邵に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟 * 侯涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ * (b) 浩芹邵の妨轮を·侍に年める数恕によって·TOPPERSプロジェクトに * 鼠桂することˉ * (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄 * 巢からも·惧淡螟侯涪荚およびTOPPERSプロジェクトを倘勒することˉ * また·塑ソフトウェアのユ〖ザまたはエンドユ〖ザからのいかなる妄 * 统に答づく懒滇からも·惧淡螟侯涪荚およびTOPPERSプロジェクトを * 倘勒することˉ * * 塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚お * よびTOPPERSプロジェクトは·塑ソフトウェアに簇して·泼年の蝗脱誊弄 * に滦する努圭拉も崔めて·いかなる瘦沮も乖わないˉまた·塑ソフトウェ * アの网脱により木儡弄または粗儡弄に栏じたいかなる禄巢に簇しても·そ * の勒扦を砷わないˉ * * @(#) $Id: core_config.h 848 2008-03-20 15:55:44Z honda $ *//* * コア巴赂モジュ〖ル∈ARM脱∷ * * このインクル〖ドファイルは·target_config.h∈または·そこからインク * ル〖ドされるファイル∷のみからインクル〖ドされるˉ戮のファイルから * 木儡インクル〖ドしてはならないˉ */#ifndef TOPPERS_CORE_CONFIG_H#define TOPPERS_CORE_CONFIG_H/* * ARM巴赂の年盗 */#include "arm.h"/* * CPUロックとするCPSRのパタ〖ン */#ifndef CPSR_CPULOCK#define CPSR_CPULOCK (CPSR_IRQ_BIT)#endif /* CPSR_CPULOCK *//* * 充哈みロックとするCPSRのパタ〖ン */#define CPSR_INTLOCK (CPSR_FIQ_BIT|CPSR_IRQ_BIT)/* * CPSRに撅にセットするパタ〖ン */#ifndef CPSR_ALWAYS_SET#define CPSR_ALWAYS_SET 0x00#endif /* CPSR_ALWAYS_SET *//* * 毋嘲の戎规 */#define EXCH_NO_RESET 0#define EXCH_NO_UNDEF 1#define EXCH_NO_SWI 2#define EXCH_NO_PABORT 3#define EXCH_NO_DABORT 4#define EXCH_NO_IRQ 5#define EXCH_NO_FIQ 6/* * 毋嘲の改眶 */ #define TNUM_EXCH 7#ifndef TOPPERS_MACRO_ONLY/* * 润タスクコンテキスト脱のスタック介袋猛 */#define TOPPERS_ISTKPT(istk, istksz) ((STK_T *)((char_t *)(istk) + (istksz)))/* * プロセッサの泼检炭吾のインライン簇眶年盗 */#include "core_insn.h"/* * タスクコンテキストブロックの年盗 */typedef struct task_context_block { void *sp; /* スタックポインタ */ FP pc; /* プログラムカウンタ */} CTXB;/* * TOPPERS筛洁充哈み借妄モデルの悸附 * * IRQをカ〖ネル瓷妄柒·FIQをカ〖ネル瓷妄嘲の充哈みとして胺うˉ * * ARM巴赂婶では·TOPPERS筛洁充哈み借妄モデルのうち·CPUロック觉轮 * のみを艰り胺うˉ充哈み庭黎刨マスク·充哈み妥滇敦贿フラグに簇して * は·称タ〖ゲット巴赂婶で艰り胺う *//* * コンテキスト徊救のための恃眶 */extern uint32_t excpt_nest_count; /* 毋嘲∈充哈み/CPU毋嘲∷のネスト搀眶のカウント *//* * コンテキストの徊救 * * ARMでは·タスクコンテキストと润タスクコンテキストの尉数をス〖パ〖 * バイザ〖モ〖ドで瓢侯させるˉそのため·CPSRの柒推では冉侍できないˉ * そのため·毋嘲∈充哈み/CPU毋嘲∷のネスト搀眶をカウントする恃眶 * ∈excpt_nest_count∷を脱罢し·毋嘲の掐り庚でインクリメントすること * で·コンテキストを冉年するˉ */Inline bool_tsense_context(void){ return(excpt_nest_count > 0U);}/* * CPUロック觉轮への败乖 */Inline voidx_lock_cpu(void){ set_sr(current_sr() | CPSR_CPULOCK | CPSR_ALWAYS_SET); /* クリティカルセクションの涟稿でメモリが今き垂わる材墙拉がある */ Asm("":::"memory");}#define t_lock_cpu() x_lock_cpu()#define i_lock_cpu() x_lock_cpu()/* * CPUロック觉轮の豺近 */Inline voidx_unlock_cpu(void){ /* クリティカルセクションの涟稿でメモリが今き垂わる材墙拉がある */ Asm("":::"memory"); set_sr((current_sr() & (~CPSR_CPULOCK)) | CPSR_ALWAYS_SET);}#define t_unlock_cpu() x_unlock_cpu()#define i_unlock_cpu() x_unlock_cpu()/* * CPUロック觉轮の徊救 */Inline bool_tx_sense_lock(void){ return((current_sr() & CPSR_CPULOCK) == CPSR_CPULOCK); }#define t_sense_lock() x_sense_lock()#define i_sense_lock() x_sense_lock()/* * タスクディスパッチャ *//* * 呵光庭黎界疤タスクへのディスパッチ∈core_support.S∷ * * dispatchは·タスクコンテキストから钙び叫されたサ〖ビスコ〖ル借妄か * ら钙び叫すべきもので·タスクコンテキストˇCPUロック觉轮ˇディスパッ * チ钓材觉轮ˇ∈モデル惧の∷充哈み庭黎刨マスク链豺近觉轮で钙び叫さな * ければならないˉ */extern void dispatch(void);/* * ディスパッチャの瓢侯倡幌∈core_support.S∷ * * start_dispatchは·カ〖ネル弹瓢箕に钙び叫すべきもので·すべての充哈 * みを敦贿した觉轮∈充哈みロック觉轮と票霹の觉轮∷で钙び叫さなければ * ならないˉ */extern void start_dispatch(void) NoReturn;/* * 附哼のコンテキストを嘉ててディスパッチ∈core_support.S∷ * * exit_and_dispatchは·ext_tskから钙び叫すべきもので·タスクコンテキ * ストˇCPUロック觉轮ˇディスパッチ钓材觉轮ˇ∈モデル惧の∷充哈み庭黎 * 刨マスク链豺近觉轮で钙び叫さなければならないˉ */extern void exit_and_dispatch(void) NoReturn;/* * カ〖ネルの姜位借妄の钙叫し∈core_support.S∷ * * call_exit_kernelは·カ〖ネルの姜位箕に钙び叫すべきもので·润タスク * コンテキストに磊り垂えて·カ〖ネルの姜位借妄∈exit_kernel∷を钙び叫 * すˉ */extern void call_exit_kernel(void) NoReturn; /* * タスクコンテキストの介袋步 * * タスクが蒂贿觉轮から悸乖できる觉轮に败乖する箕に钙ばれるˉこの箕爬 * でスタック挝拌を蝗ってはならないˉ * * activate_contextを·インライン簇眶ではなくマクロ年盗としているのは· * この箕爬ではTCBが年盗されていないためであるˉ */extern void start_r(void);#define activate_context(p_tcb) \{ \ (p_tcb)->tskctxb.sp = (void *)((char_t *)((p_tcb)->p_tinib->stk) \ + (p_tcb)->p_tinib->stksz); \ (p_tcb)->tskctxb.pc = (FP)start_r; \}/* * calltexは蝗脱しない */#define OMIT_CALLTEX /* * CPU毋嘲ハンドラの判峡脱テ〖ブル */extern const FP exch_tbl[TNUM_EXCH];/* * タ〖ゲット润巴赂婶に崔まれる筛洁の毋嘲瓷妄怠墙の介袋步借妄を脱いない */#define OMIT_INITIALIZE_EXCEPTION/* * CPU毋嘲ハンドラの介袋步 */Inline voidinitialize_exception(void){}/* * CPU毋嘲の券栏した箕のシステム觉轮の徊救 *//* * CPU毋嘲の券栏した箕のコンテキストの徊救 * * CPU毋嘲の券栏した箕のコンテキストが·タスクコンテキストの箕にfalse· * そうでない箕にtrueを手すˉ */Inline bool_texc_sense_context(void *p_excinf){ return((*((uint32_t *) p_excinf)) != 0U);}/* * CPU毋嘲の券栏した箕の(モデル惧の)充哈み庭黎刨マスクの徊救 */Inline uint8_texc_get_ipm(void *p_excinf){ return((uint8_t)(*(((uint32_t *)(p_excinf)) + 1)));}/* * CPU毋嘲の券栏した箕のCPSRの艰评 */Inline uint32_texc_get_sr(void *p_excinf){ return(*(((uint32_t *)(p_excinf)) + 2)); }/* * CPUロック觉轮か */Inline bool_texc_sense_lock(void *p_excinf){ return((exc_get_sr(p_excinf) & CPSR_CPULOCK) == CPSR_CPULOCK);}/* * 充哈みロック觉轮か */Inline bool_texc_sense_int_lock(void *p_excinf){ return((exc_get_sr(p_excinf) & CPSR_INTLOCK) == CPSR_INTLOCK);}/* * CPU毋嘲の券栏した箕のコンテキストと充哈みのマスク觉轮の徊救 * * CPU毋嘲の券栏した箕のシステム觉轮が·カ〖ネル悸乖面でなく·タスクコ * ンテキストであり·充哈みロック觉轮でなく·CPUロック觉轮でなく·∈モ * デル惧の∷充哈み庭黎刨マスク链豺近觉轮である箕にtrue·そうでない箕 * にfalseを手す∈CPU毋嘲がカ〖ネル瓷妄嘲の充哈み借妄面で券栏した眷圭 * にもfalseを手す∷ˉ * */Inline bool_texc_sense_intmask(void *p_excinf){ return(!exc_sense_context(p_excinf) && (exc_get_ipm(p_excinf) == 0U) && !exc_sense_lock(p_excinf) && !exc_sense_int_lock(p_excinf));}/* * CPU毋嘲の券栏した箕のコンテキストと充哈み】CPUロック觉轮の徊救 * * CPU毋嘲の券栏した箕のシステム觉轮が·カ〖ネル悸乖面でなく·タスクコ * ンテキストであり·充哈みロック觉轮でなく·CPUロック觉轮でない箕に * true·そうでない箕にfalseを手す∈CPU毋嘲がカ〖ネル瓷妄嘲の充哈み借 * 妄面で券栏した眷圭にもfalseを手す∷ˉ * */Inline bool_texc_sense_unlock(void *p_excinf){ return(!exc_sense_context(p_excinf) && !exc_sense_lock(p_excinf) && !exc_sense_int_lock(p_excinf)); }/* * プロセッサ巴赂の介袋步 */extern void core_initialize(void);/* * プロセッサ巴赂の姜位箕借妄 */extern void core_terminate(void);/* * ベクタ〖テ〖ブルの炭吾から徊救されるジャンプ黎アドレス * ∈start.S∷ */extern void *vector_ref_tbl;/* * 毋嘲ベクタから木儡悸乖するハンドラを判峡 */ extern void x_install_exc(EXCNO excno, FP exchdr);/* * 毋嘲ハンドラ *//* * 踏年盗炭吾 毋嘲ハンドラ∈core_support.S∷ */extern void undef_handler(void);/* * SWI 毋嘲ハンドラ∈core_support.S∷ */extern void swi_handler(void);/* * プリフェッチアボ〖ド 毋嘲ハンドラ∈core_support.S∷ */extern void prefetch_handler(void);/* * デ〖タアボ〖ド 毋嘲ハンドラ∈core_support.S∷ */extern void data_abort_handler(void);/* * FIQ 毋嘲ハンドラ∈core_support.S∷ */extern void fiq_handler(void);/* * 踏年盗の毋嘲が掐った眷圭の借妄 */extern void default_exc_handler(void);#endif /* TOPPERS_MACRO_ONLY */#endif /* TOPPERS_CORE_CONFIG_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -