📄 cpu_support.s
字号:
/* * TOPPERS/JSP Kernel * Toyohashi Open Platform for Embedded Real-Time Systems/ * Just Standard Profile Kernel * * Copyright (C) 2000-2005 by Embedded and Real-Time Systems Laboratory * Toyohashi Univ. of Technology, JAPAN * * 惧淡螟侯涪荚は·笆布の (1)×(4) の掘凤か·Free Software Foundation * によって给山されている GNU General Public License の Version 2 に淡 * 揭されている掘凤を塔たす眷圭に嘎り·塑ソフトウェア∈塑ソフトウェア * を猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖恃ˇ浩芹邵∈笆布· * 网脱と钙ぶ∷することを痰浸で钓满するˉ * (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯 * 涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖 * スコ〖ド面に崔まれていることˉ * (2) 塑ソフトウェアを·ライブラリ妨及など·戮のソフトウェア倡券に蝗 * 脱できる妨で浩芹邵する眷圭には·浩芹邵に燃うドキュメント∈网脱 * 荚マニュアルなど∷に·惧淡の螟侯涪山绩·この网脱掘凤および布淡 * の痰瘦沮惮年を非很することˉ * (3) 塑ソフトウェアを·怠达に寥み哈むなど·戮のソフトウェア倡券に蝗 * 脱できない妨で浩芹邵する眷圭には·肌のいずれかの掘凤を塔たすこ * とˉ * (a) 浩芹邵に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟 * 侯涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ * (b) 浩芹邵の妨轮を·侍に年める数恕によって·TOPPERSプロジェクトに * 鼠桂することˉ * (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄 * 巢からも·惧淡螟侯涪荚およびTOPPERSプロジェクトを倘勒することˉ * * 塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚お * よびTOPPERSプロジェクトは·塑ソフトウェアに簇して·その努脱材墙拉も * 崔めて·いかなる瘦沮も乖わないˉまた·塑ソフトウェアの网脱により木 * 儡弄または粗儡弄に栏じたいかなる禄巢に簇しても·その勒扦を砷わないˉ * *//* * プロセッサ巴赂モジュ〖ル アセンブリ咐胳婶∈Xstormy16脱∷ */#define _MACRO_ONLY#include <offset.h>#include <cpu_sfrs.h>/* * タスクˇ充り哈みˇ毋嘲瓷妄脱RAM挝拌 */ .section .data_0,"aw" /* * 充り哈みˇ毋嘲ネストカウンタ * (カ〖ネル弹瓢箕を润タスクコンテキストと * して胺うため介袋猛を1とする) */ .global _kernel_intnest_kernel_intnest: .hword 1 /* * 充り哈みハンドラテ〖ブル * (UART充り哈みを崔め17改) */ .global _kernel_ih_table_kernel_ih_table: .hword 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* * 毋嘲ハンドラテ〖ブル * (踏年盗炭吾/瘩眶戎孟ワ〖ドアクセス/ * メモリ嘲/reserved) */ .global _kernel_eh_table_kernel_eh_table: .hword 0,0,0,0/* * 充り哈みベクトル * (このsectionは8000h-8083hにリンクされる) */ .section .int_vec,"ax" .global _start .align 1_start: clr1 psw,#7 br _kernel_int_irq_0 clr1 psw,#7 br _kernel_int_irq_1 clr1 psw,#7 br _kernel_int_irq_2 clr1 psw,#7 br _kernel_int_irq_3 clr1 psw,#7 br _kernel_int_irq_4 clr1 psw,#7 br _kernel_int_irq_5 clr1 psw,#7 br _kernel_int_irq_6 clr1 psw,#7 br _kernel_int_irq_7 clr1 psw,#7 br _kernel_int_irq_8 clr1 psw,#7 br _kernel_int_irq_9 clr1 psw,#7 br _kernel_int_irq_a clr1 psw,#7 br _kernel_int_irq_b clr1 psw,#7 br _kernel_int_irq_c clr1 psw,#7 br _kernel_int_irq_d clr1 psw,#7 br _kernel_int_irq_e clr1 psw,#7 br _kernel_int_irq_f .org 0x80 jmpf _kernel_int_irq_ex/* * 充り哈みハンドラ掐り庚 */_kernel_int_irq_0: /* * ワッチドッグタイマ充り哈みかRESETかの冉们 */ bn __WDTCR,#4,_after_reset bp __WDTCR,#5,_after_reset push r0 mov r0,#_kernel_ih_table+0 br _int_common_after_reset: jmpf _int_reset_kernel_int_irq_1: push r0 mov r0,#_kernel_ih_table+2 br _int_common_kernel_int_irq_2: push r0 mov r0,#_kernel_ih_table+4 br _int_common_kernel_int_irq_3: push r0 mov r0,#_kernel_ih_table+6 br _int_common_kernel_int_irq_4: push r0 mov r0,#_kernel_ih_table+8 br _int_common_kernel_int_irq_5: push r0 mov r0,#_kernel_ih_table+10 br _int_common_kernel_int_irq_6: push r0 mov r0,#_kernel_ih_table+12 br _int_common_kernel_int_irq_7: push r0 mov r0,#_kernel_ih_table+14 br _int_common_kernel_int_irq_8: push r0 mov r0,#_kernel_ih_table+16 br _int_common_kernel_int_irq_9: push r0 mov r0,#_kernel_ih_table+18 br _int_common_kernel_int_irq_a: push r0 mov r0,#_kernel_ih_table+20 br _int_common_kernel_int_irq_b: push r0 mov r0,#_kernel_ih_table+22 br _int_common_kernel_int_irq_c: push r0 mov r0,#_kernel_ih_table+24 br _int_common_kernel_int_irq_d: push r0 mov r0,#_kernel_ih_table+26 br _int_common_kernel_int_irq_e: push r0 mov r0,#_kernel_ih_table+28 br _int_common_kernel_int_irq_f: push r0 mov r0,#_kernel_ih_table+30 br _int_common/* * 充り哈みハンドラ掐り庚借妄 */_int_common: /* * r1/r2の锣闰(r0は锣闰貉み) */ push r1 push r2 /* * ネストした充り哈みかどうかチェック */ mov r1,_kernel_intnest bz interrupt_from_task/* * ネストした充り哈みの借妄 */ /* * ネストカウンタをインクリメントし、 * 惧疤の充り哈みを钓材 */ inc r1 mov _kernel_intnest,r1 set1 psw,#7 /* * r3-r9(caller saved register)の锣闰 */ push r3 push r4 push r5 push r6 push r7 push r8 push r9 /* * 充り哈みハンドラの钙び叫し */ mov r1,(r0) bz 1f mov r8,#0 call r8,r11: /* * r1-r9の牲傅 */ pop r9 pop r8 pop r7 pop r6 pop r5 pop r4 pop r3 pop r2 pop r1 /* * ネストカウンタをデクリメントし、 * 充り哈まれた傅の充り哈みハンドラへ提る */ clr1 psw,#7 mov r0,_kernel_intnest dec r0 mov _kernel_intnest,r0 pop r0 iret/* * ネストしていない充り哈みの借妄 */interrupt_from_task: /* * ネストカウンタをインクリメント */ mov _kernel_intnest,#1 /* * スタックを润タスク脱に磊り仑え、惧疤 * 充り哈みを钓材 */ mov r1,sp mov sp,#__stack set1 psw,#7 /* * r3-r9(caller saved register)を * タスク娄スタックに锣闰 */ mov (r1++),r3 mov (r1++),r4 mov (r1++),r5 mov (r1++),r6 mov (r1++),r7 mov r3,r8 mov (r1++),r3 mov r3,r9 mov (r1++),r3 /* * タスク娄スタックポインタを充り哈み脱 * スタックに锣闰 */ push r1 /* * 充り哈みハンドラの钙び叫し */ mov r1,(r0) bz 1f mov r8,#0 call r8,r11: /* * 充り哈みを敦贿 */ clr1 psw,#7/* * 充り哈み、毋嘲鼎奶の叫庚借妄 */ret_int_and_exc: /* * タスク脱スタックに提す */ pop r1 mov sp,r1 /* * ネストカウンタをデクリメント */ mov _kernel_intnest,#0 /* * reqflgをチェックし、FALSEなら、傅の * タスクに提る借妄にジャンプ */ mov r0,#_kernel_reqflg mov r1,(r0) bz ret_to_task_int/* * 充り哈み面にタスクの磊り仑え妥滇が券栏した眷圭の借妄 */ /* * reqflgをクリア */ mov r1,#0 mov (r0),r1 /* * ディスパッチ敦贿か、runtsk=schedtsk * なら、傅のタスクに提る借妄へ */ mov r0,#_kernel_enadsp mov r1,(r0) bz ret_int_1 mov r0,#_kernel_runtsk mov r1,(r0) mov r2,#_kernel_schedtsk mov r3,(r2) bz r1,r3,ret_int_1 /* * タスクの磊り仑えのため、r10-13/spを锣闰 */ push r10 push r11 push r12 push r13 mov r7,sp mov (r1,+TCB_sp),r7 /* r1 points runtsk */ /* * mode=1(ret_int_rに提る)を肋年し * ディスパッチャへ */ mov r7,#1 mov (r1,+TCB_mode),r7 br dispatcher/* * 充り哈み面のディスパッチからの牲耽借妄 */ret_int_r: /* * r10-13を牲傅 */ pop r13 pop r12 pop r11 pop r10/* * 傅のタスクに提る借妄 */ret_int_1: mov r0,#_kernel_runtsk mov r1,(r0) /* * タスク毋嘲ハンドラ钓材のチェック */ mov.b r7,(r1,+TCB_enatex) bn r7,#TCB_enatex_bit,ret_to_task_int /* * タスク毋嘲券栏のチェック */ mov r7,(r1,+TCB_texptn) bz ret_to_task_int /* * タスク毋嘲ハンドラの钙び叫し */ callf _kernel_call_texrtn /* * r0-r9を牲傅し、傅のタスクに提る */ret_to_task_int: pop r9 pop r8 pop r7 pop r6 pop r5 pop r4 pop r3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -