📄 cpu_support.s
字号:
/* 介檬の充哈みの眷圭 */first_exception: mov.l sp, er2 /* er2 = タスクスタックポインタ */ mov.l #STACKTOP, sp /* 充哈みスタックに磊仑 */ push.l er2 /* タスクスタックポインタを 充哈みスタックに锣闰 */ ldc.b r0l, exr /* (附哼の充哈みレベル笆惧)充哈み钓材 */ jsr @er1 /* 充哈みハンドラ钙叫 */ ldc.b #MAX_IPM, exr /* lock_cpu 陵碰 (充哈み敦贿) */ mov.l @sp, sp /* タスクスタックに磊仑 */ mov.l @_intnest, er0 /* er0 = intnest */ dec.l #1, er0 /* 充哈みネストカウンタ -= 1 */ mov.l er0, @_intnest /* ディスパッチ妥滇/タスク毋嘲借妄妥滇(reqflg)の冉年 */ mov.l @_reqflg, er0 /* er0 = reqflg */ or.l er0, er0 /* 冉年婶尸 */ bne occur_dispatch_or_tsk_exception /* reqflg = TRUE の箕、ジャンプ */ /* 布淡の掘凤が、OR で喇惟の箕 ˇ觅变ディスパッチが券栏 ˇタスク毋嘲借妄妥滇が券栏 */ /* レジスタの牲傅 */ret_to_task_int: pop.l er6 /* +0:er6 */ pop.l er5 /* +4:er5 */ pop.l er4 /* +8:er4 */ pop.l er3 /* +12:er3 */ pop.l er2 /* +16:er2 */ pop.l er1 /* +20:er1 */ pop.l er0 /* +24:er0 */ /* +28:EXR -> EXR_offset = 28 */ rte /* 充哈み券栏眷疥に提る */ /* EXR の牲傅(unlock_cpu 陵碰)はハ〖ドウェアが乖う。 *//* * 充哈み叫掐庚借妄における觅变ディスパッチ/タスク毋嘲に簇する借妄 */occur_dispatch_or_tsk_exception:/* 充哈み券栏改疥の冉年 */ mov.b @(EXR_offset, sp), r0l /* r01 = スタック惧のEXR */ and.b #EXR_I_MASK, r0l /* r01 = スタック惧の充り哈みマスク */#ifdef SUPPORT_CHG_IPM /* r1l = タスクコンテキストの 充哈みマスク */ mov.b @_task_intmask, r1l#else /* SUPPORT_CHG_IPM */ mov.b #0, r1l#endif /* SUPPORT_CHG_IPM */ cmp.b r0l, r1l /* 冉年婶尸 (充哈み券栏改疥) */ bne ret_to_task_int /* 充哈み券栏眷疥が、タスクコンテキスト でない箕、ジャンプ */ /* 侠妄弄な尸呆黎は、to_int_routine における SUPPORT_CHG_IPM マクロで跋まれた改疥の木稿である。コストの啼玛から、塑剂弄 に票じなので、ret_to_task_int と淡揭した。 */ sub.l er0, er0 /* er0 = NULL (= 0) */ mov.l er0, @_reqflg /* reqflg = NULL (reqflgをクリア) *//* 觅变ディスパッチに簇する冉年 */ /* ディスパッチ敦贿/钓材の冉年 */ mov.l @_enadsp, er0 /* er0 = enadsp */ or.l er0, er0 /* 冉年婶尸 */ beq to_tsk_exc /* ディスパッチ敦贿ならジャンプ */ /* スケジュ〖リング冯蔡の冉年 */ mov.l @_runtsk, er0 /* er0 = runtsk */ mov.l @_schedtsk, er1 /* er1 = schedtsk */ cmp.l er0, er1 /* 冉年婶尸 */ beq to_tsk_exc /* runtsk == schedtsk ならジャンプ *//* 觅变ディスパッチが券栏した眷圭 */occur_dispatch:#ifdef H8S_2600 /* H8S_2600はコンパイルオプション年盗 */ /* 姥下レジスタの锣闰 */ /* er0 は布淡にて网脱するので撬蝉できない */ stmac mach, er1 push.l er1 stmac macl, er1 push.l er1#endif /* H8S_2600 */ mov.l sp, @(TCB_sp, er0) /* runtsk->sp = sp (タスクスタックポインタを瘦赂) */ mov.l #ret_int_r, er1 mov.l er1, @(TCB_pc, er0) /* runtsk->pc = ret_int_r (タスクの悸乖浩倡戎孟を瘦赂) */ jmp dispatcher_1 /* ディスパッテャ钙叫 *//* 觅变ディスパッチによってディスパッチしたタスクコンテキストの倡幌孟爬 */_ret_int_r: /* monitor 羹け */ret_int_r:#ifdef H8S_2600 /* H8S_2600はコンパイルオプション年盗 */ /* 姥下レジスタの牲傅 */ pop.l er0 ldmac er0, macl pop.l er0 ldmac er0, mach#endif /* H8S_2600 *//* 觅变ディスパッチが券栏しなかった眷圭の倡幌孟爬 *//* タスク毋嘲借妄に簇する冉年 */to_tsk_exc: mov.l @_runtsk, er0 /* er0 = runtsk */ /* タスク毋嘲借妄敦贿/钓材の冉年 */ mov.b @(TCB_enatex, er0), r1l /* r1l = runtsk->enatex */ btst #TCB_enatex_bit, r1l /* TCB_enatex == 1 か々 */ beq to_int_routine /* タスク毋嘲借妄敦贿の箕、ジャンプ */ /* タスク毋嘲妥滇の铜痰の冉年 */ mov.l @(TCB_texptn, er0), er1 /* er1 = runtsk->texptn */ beq to_int_routine /* タスク毋嘲妥滇が痰い箕、ジャンプ */ jsr @_call_texrtn /* タスク毋嘲借妄ル〖チンの钙叫 */to_int_routine:/* chg_ipm の厦は、觅变ディスパッチ黎のタスクの啼玛なので、ここに淡揭する。 */#ifdef SUPPORT_CHG_IPM /* 充り哈みハンドラ姜位箕に侍のタスクへスイッチしたときに、 充り哈みマスクを腊圭させる借妄 */ /* 毋¨ディスパッチ界进¨ タスクA->充り哈みハンドラ->タスクB->タスクA 瓢侯¨ この箕にタスクB柒で、充哈みマスクの恃构が乖われた眷圭に、 この充哈みマスクに簇する攫鼠を、タスクBからタスクAへと 苞き费ぐために涩妥。*/ mov.b @_task_intmask, r1l /* r1l = task_intmask */ /* task_intmask¨CHG_IPM により恃构された材墙拉のある 充哈みマスク */ mov.b r1l, @(EXR_offset, sp) /* スタック惧の EXR に惧今きをする。 */ /* 扩嘎祸灌¨EXR のトレ〖スビット T は瘦赂されない。 */#endif /* SUPPORT_CHG_IPM */ jmp ret_to_task_int /* タスクコンテキストへの牲耽 *//*============================================================================*//* * タスク弹瓢借妄 */ .global _activate_r_activate_r: /* ここに丸るときは、CPUロックになっている。 */ mov.l #_ext_tsk, er0 push.l er0 /* タスクからの提り戎孟を肋年 */ /* タスク簇犯の肋年洁洒 */ mov.l @_runtsk, er2 /* er2 = runtsk */ mov.l @(TCB_tinib, er2), er2 /* er2 = runtsk->tinib */ /* タスク弹瓢戎孟の肋年 */ mov.l @(TINIB_task, er2), er1 /* er1 = runtsk->tinib->task */ /* タスクへの苞眶∈橙磨攫鼠∷肋年 */ mov.l @(TINIB_exinf, er2), er0 /* er0 = runtsk->tinib->exinf */#ifdef SUPPORT_CHG_IPM ldc.b @_task_intmask, exr /* unlock_cpu陵碰(充哈み钓材) */#else /* SUPPORT_CHG_IPM */ ldc.b #0, exr /* unlock_cpu陵碰(充哈み钓材) */#endif /* SUPPORT_CHG_IPM */ jmp @er1 /* タスク弹瓢 *//*============================================================================*//* 鼎奶ドキュメントにはない、迫极の婶尸 *//* * no_reg_exception() * CPU毋嘲として判峡されていない毋嘲が券栏すると钙び叫される。 * 毋嘲が券栏した箕爬の PC、er0×7 を叫蜗してカ〖ネルを匿贿する。 */ .global no_reg_exceptionno_reg_exception: push.l er0 /* er0×6を瘦赂 */ push.l er1 push.l er2 push.l er3 push.l er4 push.l er5 push.l er6 mov.l sp, er0 /* 苞眶にスタックポインタを肋年 */ /* CPU毋嘲券栏箕爬の SP は、 34(= 4*7(er) + 1(exr) + 1(徒腆) + 1(ccr) + 3(pc) ) を苞く */ jsr @_cpu_experr /* cpu_experr()の钙び叫し */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -