📄 makeoffset.c
字号:
/* * TOPPERS/JSP Kernel * Toyohashi Open Platform for Embedded Real-Time Systems/ * Just Standard Profile Kernel * * Copyright (C) 2003-2004 by Naoki Saito * Nagoya Municipal Industrial Research Institute, JAPAN * * 惧淡螟侯涪荚は·笆布の (1)×(4) の掘凤か·Free Software Foundation * によって给山されている GNU General Public License の Version 2 に淡 * 揭されている掘凤を塔たす眷圭に嘎り·塑ソフトウェア∈塑ソフトウェア * を猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖恃ˇ浩芹邵∈笆布· * 网脱と钙ぶ∷することを痰浸で钓满するˉ * (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯 * 涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖 * スコ〖ド面に崔まれていることˉ * (2) 塑ソフトウェアを·ライブラリ妨及など·戮のソフトウェア倡券に蝗 * 脱できる妨で浩芹邵する眷圭には·浩芹邵に燃うドキュメント∈网脱 * 荚マニュアルなど∷に·惧淡の螟侯涪山绩·この网脱掘凤および布淡 * の痰瘦沮惮年を非很することˉ * (3) 塑ソフトウェアを·怠达に寥み哈むなど·戮のソフトウェア倡券に蝗 * 脱できない妨で浩芹邵する眷圭には·肌のいずれかの掘凤を塔たすこ * とˉ * (a) 浩芹邵に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟 * 侯涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ * (b) 浩芹邵の妨轮を·侍に年める数恕によって·TOPPERSプロジェクトに * 鼠桂することˉ * (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄 * 巢からも·惧淡螟侯涪荚およびTOPPERSプロジェクトを倘勒することˉ * * 塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚お * よびTOPPERSプロジェクトは·塑ソフトウェアに簇して·その努脱材墙拉も * 崔めて·いかなる瘦沮も乖わないˉまた·塑ソフトウェアの网脱により木 * 儡弄または粗儡弄に栏じたいかなる禄巢に簇しても·その勒扦を砷わないˉ * * @(#) $Id: makeoffset.c,v 1.3 2005/11/24 12:41:23 honda Exp $ *//* * offset.inc (もしくは offset.h) について * * offset.inc は菇陇挛の泼年の妥燎が菇陇挛の黎片から部バイト誊に * 赂哼するかということや, 泼年のビットフィ〖ルドが黎片から * 部バイト黎の部ビット誊に赂哼するか, という攫鼠を * アセンブリ咐胳ファイルに涂えるために赂哼している. * * offset.inc ファイルの面咳は, 帽なるシンボル年盗ファイルである. * シンボルといっても年盗するシンボルの叹疚にはパタ〖ンがあり, * 络きく尸けて肌の3硷梧に尸梧できる. * * <菇陇挛叹>_<妥燎叹> (毋) TCB_sp, TCB_pc, TCB_enatex など * <菇陇挛叹>_<妥燎叹>_bit (毋) TCB_enatex_bit など * <菇陇挛叹>_<妥燎叹>_mask (毋) TCB_enatex_mask など * * (毋) * TCB_texptn .equ 14 * TCB_sp .equ 20 * TCB_pc .equ 24 * TCB_enatex .equ 13 * TCB_enatex_bit .equ 6 * TCB_enatex_mask .equ 0040H * * 办戎はじめは泼年の妥燎が菇陇挛の黎片から部バイト黎にあるか * ということを绩す眶猛につけるラベルの叹疚. * 企戎誊は泼年のビットフィ〖ルド面のビットが, 布疤から眶えて * 部ビット誊にあるかということを绩す眶猛につけるラベルの叹疚. * 0から幌まる眶猛で山附する. 呵も布疤のビットは妈0ビットである. * 话戎誊は黎ほどの <菇陇挛叹>_<妥燎叹>_bit とも簇息するが, * 泼年のビットフィ〖ルド面のビットのマスク猛の叹疚. * _bit と *_mask の猛の粗には肌の簇犯がある. * (*_mask) == (1 << *_bit) * * (毋) TCB_enatex_bit が 6 の箕, TCB_enatex_mask は 40H * * ちなみにM32C巴赂婶の悸刘では, 泼年ビットのチェックなどに * ビット炭吾アドレッシングを蝗脱しているので *_mask というラベルは * 蝗脱していない. *//* * offset.inc の侯り数(M32Cタ〖ゲット巴赂婶羹け) * * GNU Cコンパイラを脱いているタ〖ゲット巴赂婶については, * カ〖ネルのトップディレクトリの布にある util というディレクトリの * 布に genoffset という perl スクリプトが脱罢されているので, * 泼に缄瓢で offset.h を侯喇する涩妥はない. * genoffset は GNU 倡券茨董を鳞年して侯喇されているので, * 栏喇されるアセンブリ咐胳悼击炭吾や栏喇惮搂の佰なる戮の * Cコンパイラにはそのまま努脱できない材墙拉がある. * そこで, ここではWindows茨董 羹けの genoffset を脱罢せず, * 侯り数をここに淡し, 缄侯度で offset.inc を侯喇してもらうことと * する. 笆布にその数恕を绩す. なお, この数恕はM32Cの倡券茨董や * 炭吾セットに巴赂しているため, 戮のタ〖ゲットを蝗脱している眷圭は * そのまま努脱できない. * * 1. makeoffset.c というファイルからCコンパイラを蝗脱して * アセンブリ咐胳ファイル makeoffset.a30 を栏喇する. * コンパイルオプションはカ〖ネルコ〖ドに涂えるものと票じ * ものを涂える. * ルネサス澜ツ〖ル TM を蝗脱している眷圭は, プロジェクトエディタの * 栏喇缄界ビュ〖から makeoffset.a30 を联び, 宝クリックメニュ〖の * 帰婶尸ビルド帲を联买することで栏喇できる. * もしくはコマンドプロンプトでメイクファイルと票じディレクトリに * 败瓢し, "make -f メイクファイル叹 makeoffset.a30" を * 悸乖しても票屯の冯蔡が评られる. (メイクファイルはTMが蝗脱して * いるものと票じファイルを回年材墙) * * 2. 黎ほどの 1. の侯度で评られた, makeoffset.a30 ファイルから * "! BEGIN XXXX" ではじまり "! END" で姜わっている婶尸を玫す. * * 4舱疥あり, それぞれ警しずつ佰なるので界に棱汤する. * (笆布, 棱汤面ではアセンブリ咐胳ファイルのコメント乖は臼く) * * (1) 菇陇挛の黎片からメンバへのオフセット * * ! BEGIN TCB_texptn * bset 00H,0000000eH * ! END * * 惧淡"! BEGIN"の稿ろの矢机误がoffset.incで年盗するシンボル叹となる. * そのシンボルの猛は, 肌乖のbset炭吾の妈2オペランドの猛である * 0000000eHがそれに陵碰する. これが菇陇挛の黎片からtexptnまでの * オフセット猛となる. したがってこの眷圭, offset.inc には * TCB_texptn .equ 14 * という乖を淡揭する. * * (2) 菇陇挛のメンバが菇陇挛で, その面のメンバに滦するオフセット * * TCB_sp についてもほぼ票屯だが, sp はTCB菇陇挛の木儡の * メンバでなくTCB菇陇挛のメンバであるCTXB菇陇挛のメンバで * ある爬が佰なる. それでも年盗するシンボル叹としては * TCB_sp のように山附する. アセンブリ咐胳ファイルでは * * ! BEGIN TCB_sp * mov.l 00000014H,A0 * extz [A0],R0 * bset 0,R0L * mov.l #00000014H,A0 * mov.b R0L,[[A0]] * ! END * * * のようになり,14H(=20) が滇める猛なのでoffset.inc には肌のように * 淡揭する. * * TCB_sp .equ 20 * * (3) メンバが簇眶へのポインタであった眷圭 * * 肌は TCB_pc の眷圭. * * ! BEGIN TCB_pc * mov.l #00000018H,A0 * jsri.a [A0] * ! END * * pc も sp と票じく, TCB菇陇挛の木儡のメンバではないが * TCB_pc と山附している. これは簇眶のアドレスを呈羌する恃眶なので, * (((TCB *)0)->tskctxb.pc)(); * として簇眶钙び叫しのように淡揭すると惧淡のようなアセンブリ咐胳 * コ〖ドを叫蜗する. シンボル年盗する狠のシンボル叹は海までと * 票じく, TCB_pc とする. * 滇める猛は菇陇挛から簇眶ポインタまでのオフセットであり, 惧のmov.l * 炭吾の冯蔡から 00000018H(=24) となる. * したがって, offset.inc には肌のように淡揭する. * * TCB_pc .equ 24 * * (4) 菇陇挛のメンバがビットフィ〖ルドでそのビット疤弥も梦りたい眷圭 * * ! BEGIN TCB_enatex * bset 6,0000000cH+1 * ! END * * 海までと票屯, BEGIN の稿の矢机误をシンボル叹とする. * ここでのTCB_enatexの猛は菇陇挛の黎片からビットフィ〖ルドを崔むバ * イトまでのオフセットで, M32Cのビット炭吾アドレッシングは回年でき * るビット疤弥が0から7の粗に箭まるようにアクセスするアドレスに努碰 * 眶が裁えられるので cH+1(=13) となっている. また, ビットフィ〖ルド * 面の呵布疤ビットからのビット疤弥は 6となる. * 笆惧より肌のように今くことができる. * * TCB_enatex .equ 13 * TCB_enatex_bit .equ 6 * TCB_enatex_mask .equ 40H */#include "jsp_kernel.h"#include "task.h"void makeoffset(void);voidmakeoffset(void){ asm("! BEGIN TCB_texptn\n"); (INT)(((TCB *)0)->texptn) |= 1; asm("! END"); asm("! BEGIN TCB_sp\n"); *(char *)(((TCB *)0)->tskctxb.sp) |= 1; asm("! END"); asm("! BEGIN TCB_pc\n"); (((TCB *)0)->tskctxb.pc)(); asm("! END"); asm("! BEGIN TCB_enatex\n"); (INT)(((TCB *)0)->enatex) = 1; asm("! END");}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -