| Revision | 4 (tree) |
|---|---|
| Time | 2009-10-31 23:24:39 |
| Author | (del#40607) |
Version 0.8
| @@ -49,6 +49,7 @@ | ||
| 49 | 49 | #define _CPU_CONTEXT_H_ |
| 50 | 50 | |
| 51 | 51 | #include "task.h" |
| 52 | +#include <string.h> | |
| 52 | 53 | |
| 53 | 54 | /* |
| 54 | 55 | * タスクコンテキストの初期化 |
| @@ -52,6 +52,7 @@ | ||
| 52 | 52 | /* |
| 53 | 53 | * ターゲットシステムの修了 |
| 54 | 54 | */ |
| 55 | +void exit(int status); | |
| 55 | 56 | void |
| 56 | 57 | sys_exit(void) |
| 57 | 58 | { |
| @@ -64,7 +65,8 @@ | ||
| 64 | 65 | void |
| 65 | 66 | sys_putc(char c) |
| 66 | 67 | { |
| 67 | -// putchar(c); | |
| 68 | + extern void debug_putc(char c); | |
| 69 | + debug_putc(c); | |
| 68 | 70 | } |
| 69 | 71 | |
| 70 | 72 |
| @@ -66,17 +66,6 @@ | ||
| 66 | 66 | Inline void |
| 67 | 67 | call_atexit() |
| 68 | 68 | { |
| 69 | - extern void software_term_hook(void); | |
| 70 | - volatile FP fp = software_term_hook; | |
| 71 | - | |
| 72 | - /* | |
| 73 | - * software_term_hookへのポインタを,一旦volatile FP型のfpに | |
| 74 | - * 代入してから使うのは,0との比較が最適化で削除されないよう | |
| 75 | - * にするためである. | |
| 76 | - */ | |
| 77 | - if (fp != 0) { | |
| 78 | - (*fp)(); | |
| 79 | - } | |
| 80 | 69 | } |
| 81 | 70 | |
| 82 | 71 | #endif /* _MACRO_ONLY */ |
| @@ -45,6 +45,11 @@ | ||
| 45 | 45 | #define _CPU_CONFIG_H_ |
| 46 | 46 | |
| 47 | 47 | /* |
| 48 | + * API定義 | |
| 49 | + */ | |
| 50 | +#include "api.h" | |
| 51 | + | |
| 52 | +/* | |
| 48 | 53 | * カーネルの内部識別名のリネーム |
| 49 | 54 | */ |
| 50 | 55 | #include <cpu_rename.h> |
| @@ -44,6 +44,8 @@ | ||
| 44 | 44 | #ifndef _CPU_DEFS_H_ |
| 45 | 45 | #define _CPU_DEFS_H_ |
| 46 | 46 | |
| 47 | +#define JSP_IPHONE | |
| 48 | + | |
| 47 | 49 | #ifndef _MACRO_ONLY |
| 48 | 50 | |
| 49 | 51 | #include <setjmp.h> |
| @@ -78,6 +80,7 @@ | ||
| 78 | 80 | /* |
| 79 | 81 | * システムの停止処理 |
| 80 | 82 | */ |
| 83 | +void exit(int status); | |
| 81 | 84 | Inline void |
| 82 | 85 | kernel_abort() |
| 83 | 86 | { |
| @@ -0,0 +1,77 @@ | ||
| 1 | +/* | |
| 2 | + * TOPPERS/JSP Kernel | |
| 3 | + * Toyohashi Open Platform for Embedded Real-Time Systems/ | |
| 4 | + * Just Standard Profile Kernel | |
| 5 | + * | |
| 6 | + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory | |
| 7 | + * Toyohashi Univ. of Technology, JAPAN | |
| 8 | + * Copyright (C) 2009 Akira Ujio | |
| 9 | + * | |
| 10 | + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation | |
| 11 | + * によって公表されている GNU General Public License の Version 2 に記 | |
| 12 | + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア | |
| 13 | + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, | |
| 14 | + * 利用と呼ぶ)することを無償で許諾する. | |
| 15 | + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 | |
| 16 | + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー | |
| 17 | + * スコード中に含まれていること. | |
| 18 | + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 | |
| 19 | + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 | |
| 20 | + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 | |
| 21 | + * の無保証規定を掲載すること. | |
| 22 | + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 | |
| 23 | + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ | |
| 24 | + * と. | |
| 25 | + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 | |
| 26 | + * 作権表示,この利用条件および下記の無保証規定を掲載すること. | |
| 27 | + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに | |
| 28 | + * 報告すること. | |
| 29 | + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 | |
| 30 | + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. | |
| 31 | + * | |
| 32 | + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お | |
| 33 | + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も | |
| 34 | + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 | |
| 35 | + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. | |
| 36 | + * | |
| 37 | + * @(#) $Id: cpu_config.c,v 1.8 2003/12/24 07:24:40 honda Exp $ | |
| 38 | + */ | |
| 39 | + | |
| 40 | +/* | |
| 41 | + * プロセッササポートモジュール | |
| 42 | + */ | |
| 43 | + | |
| 44 | +#import <UIKit/UIKit.h> | |
| 45 | + | |
| 46 | +static char msDebugStrings[1024]; | |
| 47 | +static int mnCountDebugStrings = 0; | |
| 48 | + | |
| 49 | +void debug_putc(char c) | |
| 50 | +{ | |
| 51 | + BOOL bOutput = FALSE; | |
| 52 | + | |
| 53 | + if( c == 0 ) NSLog(@"ooo"); | |
| 54 | + | |
| 55 | + if( c == '\n' ) | |
| 56 | + // Terminate | |
| 57 | + { | |
| 58 | + msDebugStrings[mnCountDebugStrings] = '\0'; | |
| 59 | + bOutput = TRUE; | |
| 60 | + } | |
| 61 | + else | |
| 62 | + // Continue | |
| 63 | + { | |
| 64 | + msDebugStrings[mnCountDebugStrings] = c; | |
| 65 | + if( ++mnCountDebugStrings >= sizeof(msDebugStrings)/sizeof(msDebugStrings[0]) ) | |
| 66 | + { | |
| 67 | + bOutput = TRUE; | |
| 68 | + } | |
| 69 | + } | |
| 70 | + | |
| 71 | + if( bOutput ) | |
| 72 | + { | |
| 73 | + mnCountDebugStrings = 0; | |
| 74 | + NSLog(@"%s",msDebugStrings); | |
| 75 | + } | |
| 76 | +} | |
| 77 | + |
| @@ -2,13 +2,22 @@ | ||
| 2 | 2 | // main.m |
| 3 | 3 | // sample1 |
| 4 | 4 | // |
| 5 | -// Created by 氏原 達裕 on 09/10/30. | |
| 5 | +// Created by Akira Ujio on 09/10/30. | |
| 6 | 6 | // Copyright __MyCompanyName__ 2009. All rights reserved. |
| 7 | 7 | // |
| 8 | 8 | |
| 9 | 9 | #import <UIKit/UIKit.h> |
| 10 | 10 | |
| 11 | +/* | |
| 12 | + * Toppersのスタートには jsp_for_iphone_start を呼ぶ | |
| 13 | + * Cocoaと別のthreadが生成され、生成されたthreadでToppersは動作する | |
| 14 | + */ | |
| 15 | +extern int jsp_for_iphone_start(void); | |
| 16 | + | |
| 11 | 17 | int main(int argc, char *argv[]) { |
| 18 | + | |
| 19 | + // user追加コード | |
| 20 | + jsp_for_iphone_start(); | |
| 12 | 21 | |
| 13 | 22 | NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; |
| 14 | 23 | int retVal = UIApplicationMain(argc, argv, nil, nil); |
| @@ -0,0 +1,162 @@ | ||
| 1 | +/* Configured with [sample1.cfg ] */ | |
| 2 | + | |
| 3 | +#include "kernel_cfg.h" | |
| 4 | +#include "kernel_id.h" | |
| 5 | + | |
| 6 | +#if TKERNEL_PRVER >= 0x1040 | |
| 7 | +#define CFG_INTHDR_ENTRY(inthdr) INTHDR_ENTRY(inthdr) | |
| 8 | +#define CFG_EXCHDR_ENTRY(exchdr) EXCHDR_ENTRY(exchdr) | |
| 9 | +#define CFG_INT_ENTRY(inthdr) INT_ENTRY(inthdr) | |
| 10 | +#define CFG_EXC_ENTRY(exchdr) EXC_ENTRY(exchdr) | |
| 11 | +#else | |
| 12 | +#error "This configuration file has no compatibility with TOPPERS/JSP rel 1.3 or earlier." | |
| 13 | +#endif | |
| 14 | + | |
| 15 | +#ifndef __EMPTY_LABEL | |
| 16 | +#define __EMPTY_LABEL(x,y) x y[0] | |
| 17 | +#endif | |
| 18 | + | |
| 19 | +#if TKERNEL_PRID != 0x0001u /* TOPPERS/JSP */ | |
| 20 | +#error "You can not use this configuration file without TOPPERS/JSP" | |
| 21 | +#endif | |
| 22 | + | |
| 23 | + /* User specified include files*/ | |
| 24 | +#include "sample1.h" | |
| 25 | +#include "hw_timer.h" | |
| 26 | +#include "timer.h" | |
| 27 | + | |
| 28 | + | |
| 29 | + /* Object initializer [task] */ | |
| 30 | + | |
| 31 | +#define TNUM_TSKID 4 | |
| 32 | + | |
| 33 | +const ID _kernel_tmax_tskid = (TMIN_TSKID + TNUM_TSKID - 1); | |
| 34 | + | |
| 35 | +static __STK_UNIT __stack_TASK1[__TCOUNT_STK_UNIT(STACK_SIZE)]; | |
| 36 | +static __STK_UNIT __stack_TASK2[__TCOUNT_STK_UNIT(STACK_SIZE)]; | |
| 37 | +static __STK_UNIT __stack_TASK3[__TCOUNT_STK_UNIT(STACK_SIZE)]; | |
| 38 | +static __STK_UNIT __stack_MAIN_TASK[__TCOUNT_STK_UNIT(STACK_SIZE)]; | |
| 39 | + | |
| 40 | +const TINIB _kernel_tinib_table[TNUM_TSKID] = { | |
| 41 | + {TA_HLNG, (VP_INT)(( VP_INT ) 1), (FP)(task), INT_PRIORITY(MID_PRIORITY), __TROUND_STK_UNIT(STACK_SIZE), __stack_TASK1, TA_HLNG, (FP)(tex_routine)}, | |
| 42 | + {TA_HLNG, (VP_INT)(( VP_INT ) 2), (FP)(task), INT_PRIORITY(MID_PRIORITY), __TROUND_STK_UNIT(STACK_SIZE), __stack_TASK2, TA_HLNG, (FP)(tex_routine)}, | |
| 43 | + {TA_HLNG, (VP_INT)(( VP_INT ) 3), (FP)(task), INT_PRIORITY(MID_PRIORITY), __TROUND_STK_UNIT(STACK_SIZE), __stack_TASK3, TA_HLNG, (FP)(tex_routine)}, | |
| 44 | + {TA_HLNG | TA_ACT, (VP_INT)(0), (FP)(main_task), INT_PRIORITY(MAIN_PRIORITY), __TROUND_STK_UNIT(STACK_SIZE), __stack_MAIN_TASK, TA_NULL, (FP)(NULL)} | |
| 45 | +}; | |
| 46 | + | |
| 47 | +const ID _kernel_torder_table[TNUM_TSKID] = {1,2,3,4}; | |
| 48 | + | |
| 49 | +TCB _kernel_tcb_table[TNUM_TSKID]; | |
| 50 | + | |
| 51 | + | |
| 52 | + /* Object initializer [semaphore] */ | |
| 53 | + | |
| 54 | +#define TNUM_SEMID 0 | |
| 55 | + | |
| 56 | +const ID _kernel_tmax_semid = (TMIN_SEMID + TNUM_SEMID - 1); | |
| 57 | + | |
| 58 | +__EMPTY_LABEL(const SEMINIB, _kernel_seminib_table); | |
| 59 | +__EMPTY_LABEL(SEMCB, _kernel_semcb_table); | |
| 60 | + | |
| 61 | + | |
| 62 | + /* Object initializer [eventflag] */ | |
| 63 | + | |
| 64 | +#define TNUM_FLGID 0 | |
| 65 | + | |
| 66 | +const ID _kernel_tmax_flgid = (TMIN_FLGID + TNUM_FLGID - 1); | |
| 67 | + | |
| 68 | +__EMPTY_LABEL(const FLGINIB, _kernel_flginib_table); | |
| 69 | +__EMPTY_LABEL(FLGCB, _kernel_flgcb_table); | |
| 70 | + | |
| 71 | + | |
| 72 | + /* Object initializer [dataqueue] */ | |
| 73 | + | |
| 74 | +#define TNUM_DTQID 0 | |
| 75 | + | |
| 76 | +const ID _kernel_tmax_dtqid = (TMIN_DTQID + TNUM_DTQID - 1); | |
| 77 | + | |
| 78 | +__EMPTY_LABEL(const DTQINIB, _kernel_dtqinib_table); | |
| 79 | +__EMPTY_LABEL(DTQCB, _kernel_dtqcb_table); | |
| 80 | + | |
| 81 | + | |
| 82 | + /* Object initializer [mailbox] */ | |
| 83 | + | |
| 84 | +#define TNUM_MBXID 0 | |
| 85 | + | |
| 86 | +const ID _kernel_tmax_mbxid = (TMIN_MBXID + TNUM_MBXID - 1); | |
| 87 | + | |
| 88 | +__EMPTY_LABEL(const MBXINIB, _kernel_mbxinib_table); | |
| 89 | +__EMPTY_LABEL(MBXCB, _kernel_mbxcb_table); | |
| 90 | + | |
| 91 | + | |
| 92 | + /* Object initializer [mempfix] */ | |
| 93 | + | |
| 94 | +#define TNUM_MPFID 0 | |
| 95 | + | |
| 96 | +const ID _kernel_tmax_mpfid = (TMIN_MPFID + TNUM_MPFID - 1); | |
| 97 | + | |
| 98 | +__EMPTY_LABEL(const MPFINIB, _kernel_mpfinib_table); | |
| 99 | +__EMPTY_LABEL(MPFCB, _kernel_mpfcb_table); | |
| 100 | + | |
| 101 | + | |
| 102 | + /* Object initializer [cyclic] */ | |
| 103 | + | |
| 104 | +#define TNUM_CYCID 1 | |
| 105 | + | |
| 106 | +const ID _kernel_tmax_cycid = (TMIN_CYCID + TNUM_CYCID - 1); | |
| 107 | + | |
| 108 | +const CYCINIB _kernel_cycinib_table[TNUM_CYCID] = { | |
| 109 | + {TA_HLNG,0,(FP)(cyclic_handler),2000,0} | |
| 110 | +}; | |
| 111 | + | |
| 112 | +CYCCB _kernel_cyccb_table[TNUM_CYCID]; | |
| 113 | + | |
| 114 | + | |
| 115 | + /* Object initializer [interrupt] */ | |
| 116 | + | |
| 117 | +#define TNUM_INHNO 2 | |
| 118 | + | |
| 119 | +const UINT _kernel_tnum_inhno = TNUM_INHNO; | |
| 120 | + | |
| 121 | +CFG_INTHDR_ENTRY(sigusr1_hander); | |
| 122 | +CFG_INTHDR_ENTRY(timer_handler); | |
| 123 | + | |
| 124 | +const INHINIB _kernel_inhinib_table[TNUM_INHNO] = { | |
| 125 | + {INHNO_SIGUSR1,TA_HLNG,(FP)CFG_INT_ENTRY(sigusr1_hander)}, | |
| 126 | + {INHNO_TIMER,TA_HLNG,(FP)CFG_INT_ENTRY(timer_handler)} | |
| 127 | +}; | |
| 128 | + | |
| 129 | + | |
| 130 | + /* Object initializer [exception] */ | |
| 131 | + | |
| 132 | +#define TNUM_EXCNO 0 | |
| 133 | + | |
| 134 | +const UINT _kernel_tnum_excno = TNUM_EXCNO; | |
| 135 | + | |
| 136 | +__EMPTY_LABEL(const EXCINIB, _kernel_excinib_table); | |
| 137 | + /* Initialization handler */ | |
| 138 | + | |
| 139 | +void | |
| 140 | +_kernel_call_inirtn(void) | |
| 141 | +{ | |
| 142 | + timer_initialize( (VP_INT)(0) ); | |
| 143 | +} | |
| 144 | + | |
| 145 | +void | |
| 146 | +_kernel_call_terrtn(void) | |
| 147 | +{ | |
| 148 | + timer_terminate( (VP_INT)(0) ); | |
| 149 | +} | |
| 150 | + | |
| 151 | + /* Object initialization routine */ | |
| 152 | + | |
| 153 | +void | |
| 154 | +_kernel_object_initialize(void) | |
| 155 | +{ | |
| 156 | + _kernel_task_initialize(); | |
| 157 | + _kernel_cyclic_initialize(); | |
| 158 | + _kernel_interrupt_initialize(); | |
| 159 | +} | |
| 160 | + | |
| 161 | +TMEVTN _kernel_tmevt_heap[TNUM_TSKID + TNUM_CYCID]; | |
| 162 | + |
| @@ -0,0 +1,13 @@ | ||
| 1 | +#ifndef KERNEL_ID_H | |
| 2 | +#define KERNEL_ID_H | |
| 3 | + | |
| 4 | + /* object identifier deifnition */ | |
| 5 | + | |
| 6 | +#define CYCHDR1 1 | |
| 7 | +#define MAIN_TASK 4 | |
| 8 | +#define TASK1 1 | |
| 9 | +#define TASK2 2 | |
| 10 | +#define TASK3 3 | |
| 11 | + | |
| 12 | +#endif /* KERNEL_ID_H */ | |
| 13 | + |
| @@ -0,0 +1,469 @@ | ||
| 1 | +/* | |
| 2 | + * TOPPERS/JSP Kernel | |
| 3 | + * Toyohashi Open Platform for Embedded Real-Time Systems/ | |
| 4 | + * Just Standard Profile Kernel | |
| 5 | + * | |
| 6 | + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory | |
| 7 | + * Toyohashi Univ. of Technology, JAPAN | |
| 8 | + * Copyright (C) 2004-2006 by Embedded and Real-Time Systems Laboratory | |
| 9 | + * Graduate School of Information Science, Nagoya Univ., JAPAN | |
| 10 | + * | |
| 11 | + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation | |
| 12 | + * によって公表されている GNU General Public License の Version 2 に記 | |
| 13 | + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア | |
| 14 | + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, | |
| 15 | + * 利用と呼ぶ)することを無償で許諾する. | |
| 16 | + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 | |
| 17 | + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー | |
| 18 | + * スコード中に含まれていること. | |
| 19 | + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 | |
| 20 | + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 | |
| 21 | + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 | |
| 22 | + * の無保証規定を掲載すること. | |
| 23 | + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 | |
| 24 | + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ | |
| 25 | + * と. | |
| 26 | + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 | |
| 27 | + * 作権表示,この利用条件および下記の無保証規定を掲載すること. | |
| 28 | + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに | |
| 29 | + * 報告すること. | |
| 30 | + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 | |
| 31 | + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. | |
| 32 | + * | |
| 33 | + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お | |
| 34 | + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も | |
| 35 | + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 | |
| 36 | + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. | |
| 37 | + * | |
| 38 | + * @(#) $Id: sample1.c,v 1.23 2007/03/27 08:55:29 hiro Exp $ | |
| 39 | + */ | |
| 40 | + | |
| 41 | +/* | |
| 42 | + * サンプルプログラム(1)の本体 | |
| 43 | + * | |
| 44 | + * JSPカーネルの基本的な動作を確認するためのサンプルプログラム. | |
| 45 | + * | |
| 46 | + * プログラムの概要: | |
| 47 | + * | |
| 48 | + * ユーザインタフェースを受け持つメインタスク(タスクID: MAIN_TASK, | |
| 49 | + * 優先度: MAIN_PRIORITY)と,三つの並列実行されるタスク(タスクID: | |
| 50 | + * TASK1〜TASK3,初期優先度: MID_PRIORITY)で構成される.また,起動周 | |
| 51 | + * 期が2秒の周期ハンドラ(周期ハンドラID: CYCHDR1)を用いる. | |
| 52 | + * | |
| 53 | + * 並列実行されるタスクは,task_loop 回空ループを実行する度に,タスク | |
| 54 | + * が実行中であることをあらわすメッセージを表示する. | |
| 55 | + * | |
| 56 | + * 周期ハンドラは,三つの優先度(HIGH_PRIORITY,MID_PRIORITY, | |
| 57 | + * LOW_PRIORITY)のレディキューを回転させる.プログラムの起動直後は, | |
| 58 | + * 周期ハンドラは停止状態になっている. | |
| 59 | + * | |
| 60 | + * メインタスクは,シリアルI/Oポートからの文字入力を行い(文字入力を | |
| 61 | + * 待っている間は,並列実行されるタスクが実行されている),入力された | |
| 62 | + * 文字に対応した処理を実行する.入力された文字と処理の関係は次の通り. | |
| 63 | + * Control-C または 'Q' が入力されると,プログラムを終了する. | |
| 64 | + * | |
| 65 | + * '1' : 以降のコマンドは TASK1 に対して行う. | |
| 66 | + * '2' : 以降のコマンドは TASK2 に対して行う. | |
| 67 | + * '3' : 以降のコマンドは TASK3 に対して行う. | |
| 68 | + * 'a' : タスクを act_tsk により起動する. | |
| 69 | + * 'A' : タスクに対する起動要求を can_act によりキャンセルする. | |
| 70 | + * 'e' : タスクに ext_tsk を呼び出させ,終了させる. | |
| 71 | + * 't' : タスクを ter_tsk により強制終了する. | |
| 72 | + * '>' : タスクの優先度を HIGH_PRIORITY にする. | |
| 73 | + * '=' : タスクの優先度を MID_PRIORITY にする. | |
| 74 | + * '<' : タスクの優先度を LOW_PRIORITY にする. | |
| 75 | + * 'G' : タスクの優先度を get_pri で読み出す. | |
| 76 | + * 's' : タスクに slp_tsk を呼び出させ,起床待ちにさせる. | |
| 77 | + * 'S' : タスクに tslp_tsk(10秒) を呼び出させ,起床待ちにさせる. | |
| 78 | + * 'w' : タスクを wup_tsk により起床する. | |
| 79 | + * 'W' : タスクに対する起床要求を can_wup によりキャンセルする. | |
| 80 | + * 'l' : タスクを rel_wai により強制的に待ち解除にする. | |
| 81 | + * 'u' : タスクを sus_tsk により強制待ち状態にする. | |
| 82 | + * 'm' : タスクの強制待ち状態を rsm_tsk により解除する. | |
| 83 | + * 'M' : タスクの強制待ち状態を frsm_tsk により強制解除する. | |
| 84 | + * 'd' : タスクに dly_tsk(10秒) を呼び出させ,時間経過待ちにさせる. | |
| 85 | + * 'x' : タスクにパターン 0x0001 の例外処理を要求する. | |
| 86 | + * 'X' : タスクにパターン 0x0002 の例外処理を要求する. | |
| 87 | + * 'y' : タスクに dis_tex を呼び出させ,タスク例外を禁止する. | |
| 88 | + * 'Y' : タスクに ena_tex を呼び出させ,タスク例外を許可する. | |
| 89 | + * 'r' : 三つの優先度(HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY)の | |
| 90 | + * レディキューを回転させる. | |
| 91 | + * 'c' : 周期ハンドラを動作させる. | |
| 92 | + * 'C' : 周期ハンドラを停止させる. | |
| 93 | + * 'z' : CPU例外を発生させる. | |
| 94 | + * 'Z' : CPUロック状態でCPU例外を発生させる(プログラムを終了する). | |
| 95 | + * 'V' : vxget_tim で性能評価用システム時刻を2回読む. | |
| 96 | + * 'v' : 発行したシステムコールを表示する(デフォルト). | |
| 97 | + * 'q' : 発行したシステムコールを表示しない. | |
| 98 | + */ | |
| 99 | + | |
| 100 | +#include "jsp_kernel.h" | |
| 101 | +#include <t_services.h> | |
| 102 | +#include "kernel_id.h" | |
| 103 | +#include "sample1.h" | |
| 104 | + | |
| 105 | +unsigned int sleep(unsigned int seconds); | |
| 106 | + | |
| 107 | +/* | |
| 108 | + * 並行実行されるタスクへのメッセージ領域 | |
| 109 | + */ | |
| 110 | +char message[3]; | |
| 111 | + | |
| 112 | +/* | |
| 113 | + * ループ回数 | |
| 114 | + */ | |
| 115 | +UW task_loop; /* タスク内でのループ回数 */ | |
| 116 | +UW tex_loop; /* 例外処理ルーチン内でのループ回数 */ | |
| 117 | + | |
| 118 | +/* | |
| 119 | + * ujio add: 09/11/01 | |
| 120 | + * Cocoaからsample1に対してコマンドを発行する | |
| 121 | + */ | |
| 122 | +char cmd; | |
| 123 | +void send_cmd_to_itron(char c) | |
| 124 | +{ | |
| 125 | + cmd = c; | |
| 126 | + itron_interrupt( INHNO_SIGUSR1 ); | |
| 127 | +} | |
| 128 | + | |
| 129 | +/* | |
| 130 | + * ujio add: 09/11/01 | |
| 131 | + * 上記の関数を実行したとき、この割り込みハンドラが実行される | |
| 132 | + */ | |
| 133 | +void sigusr1_hander() | |
| 134 | +{ | |
| 135 | + iwup_tsk(MAIN_TASK); | |
| 136 | +} | |
| 137 | + | |
| 138 | +/* | |
| 139 | + * 並行実行されるタスク | |
| 140 | + */ | |
| 141 | +void task(VP_INT exinf) | |
| 142 | +{ | |
| 143 | + volatile UW i; | |
| 144 | + INT n = 0; | |
| 145 | + INT tskno = (INT) exinf; | |
| 146 | + const char *graph[] = { "|", " +", " *" }; | |
| 147 | + char c; | |
| 148 | + | |
| 149 | + ena_tex(); | |
| 150 | + while (1) { | |
| 151 | + syslog(LOG_NOTICE, "task%d is running (%03d). %s", | |
| 152 | + tskno, ++n, graph[tskno-1]); | |
| 153 | + /* | |
| 154 | + * ujio add: 09/11/01 | |
| 155 | + * 無限ループ待ちだと、PC発熱がすごくなるので(MacBookの場合) | |
| 156 | + * sleep待ちに変更する。sleep(1)は1秒の待ちだが、Timer Handler | |
| 157 | + * がTIC_NUME毎に発行するSIG_ALRMで起床する。 | |
| 158 | + */ | |
| 159 | + for (i = 0; i < task_loop; i++) sleep(1); | |
| 160 | + c = message[tskno-1]; | |
| 161 | + message[tskno-1] = 0; | |
| 162 | + switch (c) { | |
| 163 | + case 'e': | |
| 164 | + syslog(LOG_INFO, "#%d#ext_tsk()", tskno); | |
| 165 | + ext_tsk(); | |
| 166 | + case 's': | |
| 167 | + syslog(LOG_INFO, "#%d#slp_tsk()", tskno); | |
| 168 | + syscall(slp_tsk()); | |
| 169 | + break; | |
| 170 | + case 'S': | |
| 171 | + syslog(LOG_INFO, "#%d#tslp_tsk(10000)", tskno); | |
| 172 | + syscall(tslp_tsk(10000)); | |
| 173 | + break; | |
| 174 | + case 'd': | |
| 175 | + syslog(LOG_INFO, "#%d#dly_tsk(10000)", tskno); | |
| 176 | + syscall(dly_tsk(10000)); | |
| 177 | + break; | |
| 178 | + case 'y': | |
| 179 | + syslog(LOG_INFO, "#%d#dis_tex()", tskno); | |
| 180 | + syscall(dis_tex()); | |
| 181 | + break; | |
| 182 | + case 'Y': | |
| 183 | + syslog(LOG_INFO, "#%d#ena_tex()", tskno); | |
| 184 | + syscall(ena_tex()); | |
| 185 | + break; | |
| 186 | +#ifdef CPUEXC1 | |
| 187 | + case 'z': | |
| 188 | + syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno); | |
| 189 | + RAISE_CPU_EXCEPTION; | |
| 190 | + break; | |
| 191 | + case 'Z': | |
| 192 | + loc_cpu(); | |
| 193 | + syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno); | |
| 194 | + RAISE_CPU_EXCEPTION; | |
| 195 | + unl_cpu(); | |
| 196 | + break; | |
| 197 | +#endif /* CPUEXC1 */ | |
| 198 | + default: | |
| 199 | + break; | |
| 200 | + } | |
| 201 | + } | |
| 202 | +} | |
| 203 | + | |
| 204 | +/* | |
| 205 | + * 並行して実行されるタスク用のタスク例外処理ルーチン | |
| 206 | + */ | |
| 207 | +void tex_routine(TEXPTN texptn, VP_INT exinf) | |
| 208 | +{ | |
| 209 | + volatile UW i; | |
| 210 | + INT tskno = (INT) exinf; | |
| 211 | + | |
| 212 | + syslog(LOG_NOTICE, "task%d receives exception 0x%04x. ", | |
| 213 | + tskno, texptn); | |
| 214 | + for (i = 0; i < tex_loop; i++); | |
| 215 | + | |
| 216 | + if (texptn & 0x8000) { | |
| 217 | + syslog(LOG_INFO, "#%d#ext_tsk()", tskno); | |
| 218 | + ext_tsk(); | |
| 219 | + } | |
| 220 | +} | |
| 221 | + | |
| 222 | +/* | |
| 223 | + * CPU例外ハンドラ | |
| 224 | + */ | |
| 225 | +#ifdef CPUEXC1 | |
| 226 | + | |
| 227 | +void | |
| 228 | +cpuexc_handler(VP p_excinf) | |
| 229 | +{ | |
| 230 | + ID tskid; | |
| 231 | + | |
| 232 | + syslog(LOG_NOTICE, "CPU exception handler (p_excinf = %08p).", | |
| 233 | + p_excinf); | |
| 234 | + if (sns_ctx() != TRUE) { | |
| 235 | + syslog(LOG_WARNING, | |
| 236 | + "sns_ctx() is not TRUE in CPU exception handler."); | |
| 237 | + } | |
| 238 | + if (sns_dpn() != TRUE) { | |
| 239 | + syslog(LOG_WARNING, | |
| 240 | + "sns_dpn() is not TRUE in CPU exception handler."); | |
| 241 | + } | |
| 242 | + syslog(LOG_DEBUG, | |
| 243 | + "sns_loc = %d sns_dsp = %d", sns_loc(), sns_dsp()); | |
| 244 | + syslog(LOG_DEBUG, | |
| 245 | + "vxsns_loc = %d vxsns_ctx = %d vxsns_dsp = %d vxsns_dpn = %d", | |
| 246 | + vxsns_loc(p_excinf), vxsns_ctx(p_excinf), | |
| 247 | + vxsns_dsp(p_excinf), vxsns_dpn(p_excinf)); | |
| 248 | + | |
| 249 | + if (!vxsns_loc(p_excinf) && !vxsns_ctx(p_excinf)) { | |
| 250 | + syscall(iget_tid(&tskid)); | |
| 251 | + syscall(iras_tex(tskid, 0x8000)); | |
| 252 | + } | |
| 253 | + else { | |
| 254 | + syslog(LOG_NOTICE, "Sample program ends with exception."); | |
| 255 | + kernel_exit(); | |
| 256 | + } | |
| 257 | +} | |
| 258 | + | |
| 259 | +#endif /* CPUEXC1 */ | |
| 260 | + | |
| 261 | +/* | |
| 262 | + * 周期ハンドラ | |
| 263 | + * | |
| 264 | + * HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY の各優先度のレディキュー | |
| 265 | + * を回転させる. | |
| 266 | + */ | |
| 267 | +void cyclic_handler(VP_INT exinf) | |
| 268 | +{ | |
| 269 | + irot_rdq(HIGH_PRIORITY); | |
| 270 | + irot_rdq(MID_PRIORITY); | |
| 271 | + irot_rdq(LOW_PRIORITY); | |
| 272 | +} | |
| 273 | + | |
| 274 | +/* | |
| 275 | + * メインタスク | |
| 276 | + */ | |
| 277 | +void main_task(VP_INT exinf) | |
| 278 | +{ | |
| 279 | + char c; | |
| 280 | + ID tskid = TASK1; | |
| 281 | +// volatile UW i; | |
| 282 | + INT tskno = 1; | |
| 283 | + ER_UINT ercd; | |
| 284 | + PRI tskpri; | |
| 285 | +// SYSTIM stime1, stime2; | |
| 286 | +#ifndef OMIT_VGET_TIM | |
| 287 | + SYSUTIM utime1, utime2; | |
| 288 | +#endif /* OMIT_VGET_TIM */ | |
| 289 | + | |
| 290 | + /* add ujio: 09/11/01 シリアル未実装なため、デバッグ分に低レベル出力をさせる */ | |
| 291 | + vmsk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_INFO)); | |
| 292 | + //vmsk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG)); | |
| 293 | + syslog(LOG_NOTICE, "Sample program starts (exinf = %d).", (INT) exinf); | |
| 294 | + | |
| 295 | + /* ujio add: 09/11/01 シリアル未対応 | |
| 296 | + syscall(serial_ctl_por(TASK_PORTID, | |
| 297 | + (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV))); | |
| 298 | + */ | |
| 299 | + | |
| 300 | + /* | |
| 301 | + * ループ回数の設定 | |
| 302 | + */ | |
| 303 | + /* | |
| 304 | + task_loop = LOOP_REF; | |
| 305 | + get_tim(&stime1); | |
| 306 | + for (i = 0; i < task_loop; i++); | |
| 307 | + get_tim(&stime2); | |
| 308 | + task_loop = LOOP_REF * 400 / (stime2 - stime1); | |
| 309 | + tex_loop = task_loop / 5; | |
| 310 | + */ | |
| 311 | + | |
| 312 | + /* | |
| 313 | + * ujio add: 09/11/01 | |
| 314 | + * 一秒待ちにする。syslogをデバッガのデバッグ文出力にしている関係で | |
| 315 | + * あまりに多いデバッグ文出力に耐えられない場合があるので1秒くらいにしておく | |
| 316 | + */ | |
| 317 | + task_loop = 1000 / TIC_NUME; | |
| 318 | + | |
| 319 | + /* | |
| 320 | + * タスクの起動 | |
| 321 | + */ | |
| 322 | + act_tsk(TASK1); | |
| 323 | + act_tsk(TASK2); | |
| 324 | + act_tsk(TASK3); | |
| 325 | + | |
| 326 | + /* | |
| 327 | + * メインループ | |
| 328 | + */ | |
| 329 | + do { | |
| 330 | + /* | |
| 331 | + * ujio add: 09/11/01 | |
| 332 | + * 現在シリアル未対応。代わりに割り込み+slp_tskで実装する | |
| 333 | + */ | |
| 334 | + //syscall(serial_rea_dat(TASK_PORTID, &c, 1)); | |
| 335 | + slp_tsk(); | |
| 336 | + c = cmd; | |
| 337 | + switch (c) { | |
| 338 | + case 'e': | |
| 339 | + case 's': | |
| 340 | + case 'S': | |
| 341 | + case 'd': | |
| 342 | + case 'y': | |
| 343 | + case 'Y': | |
| 344 | + case 'z': | |
| 345 | + case 'Z': | |
| 346 | + message[tskno-1] = c; | |
| 347 | + break; | |
| 348 | + case '1': | |
| 349 | + tskno = 1; | |
| 350 | + tskid = TASK1; | |
| 351 | + break; | |
| 352 | + case '2': | |
| 353 | + tskno = 2; | |
| 354 | + tskid = TASK2; | |
| 355 | + break; | |
| 356 | + case '3': | |
| 357 | + tskno = 3; | |
| 358 | + tskid = TASK3; | |
| 359 | + break; | |
| 360 | + case 'a': | |
| 361 | + syslog(LOG_INFO, "#act_tsk(%d)", tskno); | |
| 362 | + syscall(act_tsk(tskid)); | |
| 363 | + break; | |
| 364 | + case 'A': | |
| 365 | + syslog(LOG_INFO, "#can_act(%d)", tskno); | |
| 366 | + syscall(ercd = can_act(tskid)); | |
| 367 | + if (ercd >= 0) { | |
| 368 | + syslog(LOG_NOTICE, "can_act(%d) returns %d", | |
| 369 | + tskno, ercd); | |
| 370 | + } | |
| 371 | + break; | |
| 372 | + case 't': | |
| 373 | + syslog(LOG_INFO, "#ter_tsk(%d)", tskno); | |
| 374 | + syscall(ter_tsk(tskid)); | |
| 375 | + break; | |
| 376 | + case '>': | |
| 377 | + syslog(LOG_INFO, "#chg_pri(%d, HIGH_PRIORITY)", tskno); | |
| 378 | + chg_pri(tskid, HIGH_PRIORITY); | |
| 379 | + break; | |
| 380 | + case '=': | |
| 381 | + syslog(LOG_INFO, "#chg_pri(%d, MID_PRIORITY)", tskno); | |
| 382 | + chg_pri(tskid, MID_PRIORITY); | |
| 383 | + break; | |
| 384 | + case '<': | |
| 385 | + syslog(LOG_INFO, "#chg_pri(%d, LOW_PRIORITY)", tskno); | |
| 386 | + chg_pri(tskid, LOW_PRIORITY); | |
| 387 | + break; | |
| 388 | + case 'G': | |
| 389 | + syslog(LOG_INFO, "#get_pri(%d, &tskpri)", tskno); | |
| 390 | + syscall(ercd = get_pri(tskid, &tskpri)); | |
| 391 | + if (ercd >= 0) { | |
| 392 | + syslog(LOG_NOTICE, "priority of task %d is %d", | |
| 393 | + tskno, tskpri); | |
| 394 | + } | |
| 395 | + break; | |
| 396 | + case 'w': | |
| 397 | + syslog(LOG_INFO, "#wup_tsk(%d)", tskno); | |
| 398 | + syscall(wup_tsk(tskid)); | |
| 399 | + break; | |
| 400 | + case 'W': | |
| 401 | + syslog(LOG_INFO, "#can_wup(%d)", tskno); | |
| 402 | + syscall(ercd = can_wup(tskid)); | |
| 403 | + if (ercd >= 0) { | |
| 404 | + syslog(LOG_NOTICE, "can_wup(%d) returns %d", | |
| 405 | + tskno, ercd); | |
| 406 | + } | |
| 407 | + break; | |
| 408 | + case 'l': | |
| 409 | + syslog(LOG_INFO, "#rel_wai(%d)", tskno); | |
| 410 | + syscall(rel_wai(tskid)); | |
| 411 | + break; | |
| 412 | + case 'u': | |
| 413 | + syslog(LOG_INFO, "#sus_tsk(%d)", tskno); | |
| 414 | + syscall(sus_tsk(tskid)); | |
| 415 | + break; | |
| 416 | + case 'm': | |
| 417 | + syslog(LOG_INFO, "#rsm_tsk(%d)", tskno); | |
| 418 | + syscall(rsm_tsk(tskid)); | |
| 419 | + break; | |
| 420 | + case 'M': | |
| 421 | + syslog(LOG_INFO, "#frsm_tsk(%d)", tskno); | |
| 422 | + syscall(frsm_tsk(tskid)); | |
| 423 | + break; | |
| 424 | + case 'x': | |
| 425 | + syslog(LOG_INFO, "#ras_tex(%d, 0x0001)", tskno); | |
| 426 | + syscall(ras_tex(tskid, 0x0001)); | |
| 427 | + break; | |
| 428 | + case 'X': | |
| 429 | + syslog(LOG_INFO, "#ras_tex(%d, 0x0002)", tskno); | |
| 430 | + syscall(ras_tex(tskid, 0x0002)); | |
| 431 | + break; | |
| 432 | + case 'r': | |
| 433 | + syslog(LOG_INFO, "#rot_rdq(three priorities)"); | |
| 434 | + rot_rdq(HIGH_PRIORITY); | |
| 435 | + rot_rdq(MID_PRIORITY); | |
| 436 | + rot_rdq(LOW_PRIORITY); | |
| 437 | + break; | |
| 438 | + case 'c': | |
| 439 | + sta_cyc(CYCHDR1); | |
| 440 | + break; | |
| 441 | + case 'C': | |
| 442 | + stp_cyc(CYCHDR1); | |
| 443 | + break; | |
| 444 | +#ifndef OMIT_VGET_TIM | |
| 445 | + case 'V': | |
| 446 | + syscall(vxget_tim(&utime1)); | |
| 447 | + syscall(vxget_tim(&utime2)); | |
| 448 | + syslog(LOG_NOTICE, "utime1 = %d, utime2 = %d", | |
| 449 | + (UINT) utime1, (UINT) utime2); | |
| 450 | + break; | |
| 451 | +#endif /* OMIT_VGET_TIM */ | |
| 452 | + case 'v': | |
| 453 | + /* add ujio: 09/11/01 シリアル未実装なため、デバッグ分に低レベル出力をさせる */ | |
| 454 | + vmsk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_INFO)); | |
| 455 | + //vmsk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG)); | |
| 456 | + break; | |
| 457 | + case 'q': | |
| 458 | + /* add ujio: 09/11/01 シリアル未実装なため、デバッグ分に低レベル出力をさせる */ | |
| 459 | + vmsk_log(LOG_UPTO(LOG_NOTICE), LOG_UPTO(LOG_NOTICE)); | |
| 460 | + //vmsk_log(LOG_UPTO(LOG_NOTICE), LOG_UPTO(LOG_EMERG)); | |
| 461 | + break; | |
| 462 | + default: | |
| 463 | + break; | |
| 464 | + } | |
| 465 | + } while (c != '\003' && c != 'Q'); | |
| 466 | + | |
| 467 | + syslog(LOG_NOTICE, "Sample program ends."); | |
| 468 | + kernel_exit(); | |
| 469 | +} |
| @@ -0,0 +1,214 @@ | ||
| 1 | +/* | |
| 2 | + * TOPPERS/JSP Kernel | |
| 3 | + * Toyohashi Open Platform for Embedded Real-Time Systems/ | |
| 4 | + * Just Standard Profile Kernel | |
| 5 | + * | |
| 6 | + * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory | |
| 7 | + * Toyohashi Univ. of Technology, JAPAN | |
| 8 | + * Copyright (C) 2005 by Embedded and Real-Time Systems Laboratory | |
| 9 | + * Graduate School of Information Science, Nagoya Univ., JAPAN | |
| 10 | + * | |
| 11 | + * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation | |
| 12 | + * によって公表されている GNU General Public License の Version 2 に記 | |
| 13 | + * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア | |
| 14 | + * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, | |
| 15 | + * 利用と呼ぶ)することを無償で許諾する. | |
| 16 | + * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 | |
| 17 | + * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー | |
| 18 | + * スコード中に含まれていること. | |
| 19 | + * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 | |
| 20 | + * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 | |
| 21 | + * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 | |
| 22 | + * の無保証規定を掲載すること. | |
| 23 | + * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 | |
| 24 | + * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ | |
| 25 | + * と. | |
| 26 | + * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 | |
| 27 | + * 作権表示,この利用条件および下記の無保証規定を掲載すること. | |
| 28 | + * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに | |
| 29 | + * 報告すること. | |
| 30 | + * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 | |
| 31 | + * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. | |
| 32 | + * | |
| 33 | + * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お | |
| 34 | + * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も | |
| 35 | + * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 | |
| 36 | + * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. | |
| 37 | + * | |
| 38 | + * @(#) $Id: sample1.h,v 1.36 2007/05/08 07:43:52 honda Exp $ | |
| 39 | + */ | |
| 40 | + | |
| 41 | +/* | |
| 42 | + * サンプルプログラム(1)のヘッダファイル | |
| 43 | + */ | |
| 44 | + | |
| 45 | +#include <t_services.h> | |
| 46 | + | |
| 47 | +/* | |
| 48 | + * 各タスクの優先度の定義 | |
| 49 | + */ | |
| 50 | + | |
| 51 | +#define MAIN_PRIORITY 5 /* メインタスクの優先度 */ | |
| 52 | + /* HIGH_PRIORITY より高くすること */ | |
| 53 | + | |
| 54 | +#define HIGH_PRIORITY 9 /* 並列に実行されるタスクの優先度 */ | |
| 55 | +#define MID_PRIORITY 10 | |
| 56 | +#define LOW_PRIORITY 11 | |
| 57 | + | |
| 58 | +/* | |
| 59 | + * ターゲット依存の定義(CPU例外ハンドラの起動方法など) | |
| 60 | + */ | |
| 61 | + | |
| 62 | +#ifdef M68K | |
| 63 | + | |
| 64 | +#define CPUEXC1 5 /* ゼロ除算例外 */ | |
| 65 | +#define RAISE_CPU_EXCEPTION syslog(LOG_NOTICE, "zerodiv = %d", 10 / 0) | |
| 66 | + | |
| 67 | +#elif defined(SH3) | |
| 68 | + | |
| 69 | +#define CPUEXC1 224 /* ロードエラー例外 */ | |
| 70 | +#define RAISE_CPU_EXCEPTION (*((volatile int *) 0xFFFFFEC1)) | |
| 71 | + | |
| 72 | +#elif defined(SH1) | |
| 73 | + | |
| 74 | +#define CPUEXC1 9 /* CPUアドレスエラー例外 */ | |
| 75 | +#define RAISE_CPU_EXCEPTION (*((volatile int *) 0xFFFFFEC1)) | |
| 76 | +#ifdef TOKIWA_SH1 | |
| 77 | +#define STACK_SIZE 512 /* タスクのスタックサイズ */ | |
| 78 | +#endif /* TOKIWA_SH1 */ | |
| 79 | + | |
| 80 | +#elif defined(ARMV4) | |
| 81 | + | |
| 82 | +#define CPUEXC1 4 /* ロードエラー例外 */ | |
| 83 | +#define RAISE_CPU_EXCEPTION (*((volatile int *) 0xFFFFFEC1)) | |
| 84 | + | |
| 85 | +#elif defined(V850) | |
| 86 | + | |
| 87 | +#elif defined(H8) | |
| 88 | + | |
| 89 | +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ | |
| 90 | + | |
| 91 | +#elif defined(H8S) | |
| 92 | + | |
| 93 | +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ | |
| 94 | +#define LOOP_REF 4000L /* 速度計測用のループ回数 */ | |
| 95 | + | |
| 96 | +#elif defined(MICROBLAZE) | |
| 97 | + | |
| 98 | +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ | |
| 99 | +#define STACK_SIZE 2048 /* タスクのスタックサイズ */ | |
| 100 | + | |
| 101 | +#elif defined(IA32) | |
| 102 | + | |
| 103 | +#define CPUEXC1 0 /* ゼロ除算例外 */ | |
| 104 | +#define RAISE_CPU_EXCEPTION syslog(LOG_NOTICE, "zerodiv = %d", 10 / 0) | |
| 105 | +#define OMIT_VGET_TIM | |
| 106 | + | |
| 107 | +#elif defined(TMS320C54X) | |
| 108 | + | |
| 109 | +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ | |
| 110 | +#define STACK_SIZE 320 /* タスクのスタックサイズ */ | |
| 111 | +#define LOOP_REF 500000L /* 速度計測用のループ回数 */ | |
| 112 | + | |
| 113 | +#elif defined(XSTORMY16) | |
| 114 | + | |
| 115 | +#define CPUEXC1 0 /* 無効命令例外 */ | |
| 116 | +#define RAISE_CPU_EXCEPTION __asm__( ".hword 0x0006" ) | |
| 117 | +#define OMIT_VGET_TIM /* vxget_tim()は非サポート */ | |
| 118 | +#define LOOP_REF 4000L /* 速度計測用のループ回数 */ | |
| 119 | +#define STACK_SIZE 256 /* タスクのスタックサイズ */ | |
| 120 | +#define TASK_PORTID 2 /* SIOはポート2を用いる */ | |
| 121 | + | |
| 122 | +#elif defined(MIPS3) || defined(MIPS64) | |
| 123 | + | |
| 124 | +#define CPUEXC1 Bp /* ブレークポイント例外(ゼロ除算時に発生) */ | |
| 125 | +#define RAISE_CPU_EXCEPTION syslog(LOG_NOTICE, "zerodiv = %d", 10 / 0) | |
| 126 | + | |
| 127 | +#elif defined(M16C) && defined(OAKS16) | |
| 128 | + | |
| 129 | +#define CPUEXC1 32 /* CPU例外ハンドラ番号 */ | |
| 130 | +#define RAISE_CPU_EXCEPTION asm(" int #32") /* ソフトウェア割込み発生 */ | |
| 131 | +#define STACK_SIZE 512 /* タスクのスタックサイズ */ | |
| 132 | +#define TASK_PORTID 2 /* 文字入力するシリアルポートID */ | |
| 133 | + | |
| 134 | +#elif defined(M16C) && defined(OAKS16_MINI) | |
| 135 | + | |
| 136 | +#define CPUEXC1 32 /* CPU例外ハンドラ番号 */ | |
| 137 | +#define RAISE_CPU_EXCEPTION asm(" int #32") /* ソフトウェア割込み発生 */ | |
| 138 | +#define STACK_SIZE 384 /* タスクのスタックサイズ */ | |
| 139 | +#define TASK_PORTID 2 /* 文字入力するシリアルポートID */ | |
| 140 | + | |
| 141 | +#elif defined(M16C) && defined(M3029) | |
| 142 | + | |
| 143 | +#define CPUEXC1 32 /* CPU例外ハンドラ番号 */ | |
| 144 | +#define RAISE_CPU_EXCEPTION asm(" int #32") /* ソフトウェア割込み発生 */ | |
| 145 | +#define STACK_SIZE 512 /* タスクのスタックサイズ */ | |
| 146 | +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ | |
| 147 | + | |
| 148 | +#elif defined(LINUX) | |
| 149 | + | |
| 150 | +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ | |
| 151 | +#define OMIT_VGET_TIM | |
| 152 | +#define LOOP_REF 4000000 /* 速度計測用のループ回数 */ | |
| 153 | + | |
| 154 | +#elif defined(NIOS2) | |
| 155 | + | |
| 156 | +#define CPUEXC1 0 /* 未実装命令例外 */ | |
| 157 | +#define RAISE_CPU_EXCEPTION Asm("div zero, zero, zero"); | |
| 158 | + | |
| 159 | +#elif defined(M32C) | |
| 160 | + | |
| 161 | +#define CPUEXC1 32 /* CPU例外ハンドラ番号 */ | |
| 162 | +#define RAISE_CPU_EXCEPTION asm(" int #32") /* ソフトウェア割込み発生 */ | |
| 163 | +#define STACK_SIZE 512 /* タスクのスタックサイズ */ | |
| 164 | +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ | |
| 165 | + | |
| 166 | +#elif defined(M32R) | |
| 167 | + | |
| 168 | +#define CPUEXC1 EXC_TRAP00 | |
| 169 | +#define RAISE_CPU_EXCEPTION Asm("trap 0") | |
| 170 | + | |
| 171 | +#elif defined(TLCS_900) && defined(ZUP_F16_EX) | |
| 172 | + | |
| 173 | +#define CPUEXC1 3 /* CPU例外ハンドラ番号 */ | |
| 174 | +#define RAISE_CPU_EXCEPTION Asm(" swi 2") /* ソフトウェア割込み発生 */ | |
| 175 | +#define STACK_SIZE 512 /* タスクのスタックサイズ */ | |
| 176 | +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ | |
| 177 | +#define OMIT_VGET_TIM | |
| 178 | + | |
| 179 | +#elif defined(JSP_IPHONE) | |
| 180 | + | |
| 181 | +#undef CPUEXC1 /* CPU例外ハンドラをサポートしない */ | |
| 182 | +#define OMIT_VGET_TIM | |
| 183 | +extern void sigusr1_hander(void); | |
| 184 | + | |
| 185 | +#endif | |
| 186 | + | |
| 187 | +/* | |
| 188 | + * ターゲットに依存する可能性のある定数の定義 | |
| 189 | + */ | |
| 190 | + | |
| 191 | +#ifndef TASK_PORTID | |
| 192 | +#define TASK_PORTID 1 /* 文字入力するシリアルポートID */ | |
| 193 | +#endif /* TASK_PORTID */ | |
| 194 | + | |
| 195 | +#ifndef STACK_SIZE | |
| 196 | +#define STACK_SIZE 8192 /* タスクのスタックサイズ */ | |
| 197 | +#endif /* STACK_SIZE */ | |
| 198 | + | |
| 199 | +#ifndef LOOP_REF | |
| 200 | +#define LOOP_REF 1000000 /* 速度計測用のループ回数 */ | |
| 201 | +#endif /* LOOP_REF */ | |
| 202 | + | |
| 203 | +/* | |
| 204 | + * 関数のプロトタイプ宣言 | |
| 205 | + */ | |
| 206 | +#ifndef _MACRO_ONLY | |
| 207 | + | |
| 208 | +extern void task(VP_INT tskno); | |
| 209 | +extern void main_task(VP_INT exinf); | |
| 210 | +extern void tex_routine(TEXPTN texptn, VP_INT tskno); | |
| 211 | +extern void cyclic_handler(VP_INT exinf); | |
| 212 | +extern void cpuexc_handler(VP p_excinf); | |
| 213 | + | |
| 214 | +#endif /* _MACRO_ONLY */ |
| @@ -2,7 +2,7 @@ | ||
| 2 | 2 | // sample1AppDelegate.h |
| 3 | 3 | // sample1 |
| 4 | 4 | // |
| 5 | -// Created by 氏原 達裕 on 09/10/30. | |
| 5 | +// Created by Akira Ujio on 09/10/30. | |
| 6 | 6 | // Copyright __MyCompanyName__ 2009. All rights reserved. |
| 7 | 7 | // |
| 8 | 8 |
| @@ -2,7 +2,7 @@ | ||
| 2 | 2 | // sample1ViewController.h |
| 3 | 3 | // sample1 |
| 4 | 4 | // |
| 5 | -// Created by 氏原 達裕 on 09/10/30. | |
| 5 | +// Created by Akira Ujio on 09/10/30. | |
| 6 | 6 | // Copyright __MyCompanyName__ 2009. All rights reserved. |
| 7 | 7 | // |
| 8 | 8 |
| @@ -9,8 +9,76 @@ | ||
| 9 | 9 | #import <UIKit/UIKit.h> |
| 10 | 10 | |
| 11 | 11 | @interface sample1ViewController : UIViewController { |
| 12 | - | |
| 12 | + IBOutlet UIButton *btn_1; | |
| 13 | + IBOutlet UIButton *btn_2; | |
| 14 | + IBOutlet UIButton *btn_3; | |
| 15 | + IBOutlet UIButton *btn_act_tsk; | |
| 16 | + IBOutlet UIButton *btn_can_act; | |
| 17 | + IBOutlet UIButton *btn_ter_tsk; | |
| 18 | + IBOutlet UIButton *btn_chg_priH; | |
| 19 | + IBOutlet UIButton *btn_chg_priM; | |
| 20 | + IBOutlet UIButton *btn_chg_priL; | |
| 21 | + IBOutlet UIButton *btn_get_pri; | |
| 22 | + IBOutlet UIButton *btn_wup_tsk; | |
| 23 | + IBOutlet UIButton *btn_can_wup; | |
| 24 | + IBOutlet UIButton *btn_rel_wai; | |
| 25 | + IBOutlet UIButton *btn_sus_tsk; | |
| 26 | + IBOutlet UIButton *btn_rsm_tsk; | |
| 27 | + IBOutlet UIButton *btn_frsm_tsk; | |
| 28 | + IBOutlet UIButton *btn_ras_tex1; | |
| 29 | + IBOutlet UIButton *btn_ras_tex2; | |
| 30 | + IBOutlet UIButton *btn_ret_rdq; | |
| 31 | + IBOutlet UIButton *btn_sta_cyc; | |
| 32 | + IBOutlet UIButton *btn_stp_cyc; | |
| 33 | + IBOutlet UIButton *btn_vxget_tim; | |
| 34 | + IBOutlet UIButton *btn_vmsk_logl; | |
| 35 | + IBOutlet UIButton *btn_vmsk_logN; | |
| 36 | + IBOutlet UIButton *btn_ext_tsk; | |
| 37 | + IBOutlet UIButton *btn_slp_tsk; | |
| 38 | + IBOutlet UIButton *btn_tslp_tsk; | |
| 39 | + IBOutlet UIButton *btn_dly_tsk; | |
| 40 | + IBOutlet UIButton *btn_dis_tex; | |
| 41 | + IBOutlet UIButton *btn_ena_tex; | |
| 42 | + IBOutlet UIButton *btn_excep; | |
| 43 | + IBOutlet UIButton *btn_excepL; | |
| 44 | + IBOutlet UIButton *btn_QUIT; | |
| 13 | 45 | } |
| 14 | 46 | |
| 47 | +@property(nonatomic,retain) UIButton *btn_1; | |
| 48 | +@property(nonatomic,retain) UIButton *btn_2; | |
| 49 | +@property(nonatomic,retain) UIButton *btn_3; | |
| 50 | +@property(nonatomic,retain) UIButton *btn_act_tsk; | |
| 51 | +@property(nonatomic,retain) UIButton *btn_can_act; | |
| 52 | +@property(nonatomic,retain) UIButton *btn_ter_tsk; | |
| 53 | +@property(nonatomic,retain) UIButton *btn_chg_priH; | |
| 54 | +@property(nonatomic,retain) UIButton *btn_chg_priM; | |
| 55 | +@property(nonatomic,retain) UIButton *btn_chg_priL; | |
| 56 | +@property(nonatomic,retain) UIButton *btn_get_pri; | |
| 57 | +@property(nonatomic,retain) UIButton *btn_wup_tsk; | |
| 58 | +@property(nonatomic,retain) UIButton *btn_can_wup; | |
| 59 | +@property(nonatomic,retain) UIButton *btn_rel_wai; | |
| 60 | +@property(nonatomic,retain) UIButton *btn_sus_tsk; | |
| 61 | +@property(nonatomic,retain) UIButton *btn_rsm_tsk; | |
| 62 | +@property(nonatomic,retain) UIButton *btn_frsm_tsk; | |
| 63 | +@property(nonatomic,retain) UIButton *btn_ras_tex1; | |
| 64 | +@property(nonatomic,retain) UIButton *btn_ras_tex2; | |
| 65 | +@property(nonatomic,retain) UIButton *btn_ret_rdq; | |
| 66 | +@property(nonatomic,retain) UIButton *btn_sta_cyc; | |
| 67 | +@property(nonatomic,retain) UIButton *btn_stp_cyc; | |
| 68 | +@property(nonatomic,retain) UIButton *btn_vxget_tim; | |
| 69 | +@property(nonatomic,retain) UIButton *btn_vmsk_logl; | |
| 70 | +@property(nonatomic,retain) UIButton *btn_vmsk_logN; | |
| 71 | +@property(nonatomic,retain) UIButton *btn_ext_tsk; | |
| 72 | +@property(nonatomic,retain) UIButton *btn_slp_tsk; | |
| 73 | +@property(nonatomic,retain) UIButton *btn_tslp_tsk; | |
| 74 | +@property(nonatomic,retain) UIButton *btn_dly_tsk; | |
| 75 | +@property(nonatomic,retain) UIButton *btn_dis_tex; | |
| 76 | +@property(nonatomic,retain) UIButton *btn_ena_tex; | |
| 77 | +@property(nonatomic,retain) UIButton *btn_excep; | |
| 78 | +@property(nonatomic,retain) UIButton *btn_excepL; | |
| 79 | +@property(nonatomic,retain) UIButton *btn_QUIT; | |
| 80 | + | |
| 81 | +- (IBAction) btn_push:(id) sender; | |
| 82 | + | |
| 15 | 83 | @end |
| 16 | 84 |
| @@ -2,7 +2,7 @@ | ||
| 2 | 2 | // sample1AppDelegate.m |
| 3 | 3 | // sample1 |
| 4 | 4 | // |
| 5 | -// Created by 氏原 達裕 on 09/10/30. | |
| 5 | +// Created by Akira Ujio on 09/10/30. | |
| 6 | 6 | // Copyright __MyCompanyName__ 2009. All rights reserved. |
| 7 | 7 | // |
| 8 | 8 |
| @@ -2,7 +2,7 @@ | ||
| 2 | 2 | // sample1ViewController.m |
| 3 | 3 | // sample1 |
| 4 | 4 | // |
| 5 | -// Created by 氏原 達裕 on 09/10/30. | |
| 5 | +// Created by Akira Ujio on 09/10/30. | |
| 6 | 6 | // Copyright __MyCompanyName__ 2009. All rights reserved. |
| 7 | 7 | // |
| 8 | 8 |
| @@ -10,8 +10,105 @@ | ||
| 10 | 10 | |
| 11 | 11 | @implementation sample1ViewController |
| 12 | 12 | |
| 13 | +@synthesize btn_1,btn_2,btn_3,btn_act_tsk; | |
| 14 | +@synthesize btn_can_act,btn_ter_tsk,btn_chg_priH,btn_chg_priM; | |
| 15 | +@synthesize btn_chg_priL; | |
| 16 | +@synthesize btn_get_pri; | |
| 17 | +@synthesize btn_wup_tsk; | |
| 18 | +@synthesize btn_can_wup; | |
| 19 | +@synthesize btn_rel_wai; | |
| 20 | +@synthesize btn_sus_tsk; | |
| 21 | +@synthesize btn_rsm_tsk; | |
| 22 | +@synthesize btn_frsm_tsk; | |
| 23 | +@synthesize btn_ras_tex1; | |
| 24 | +@synthesize btn_ras_tex2; | |
| 25 | +@synthesize btn_ret_rdq; | |
| 26 | +@synthesize btn_sta_cyc; | |
| 27 | +@synthesize btn_stp_cyc; | |
| 28 | +@synthesize btn_vxget_tim; | |
| 29 | +@synthesize btn_vmsk_logl; | |
| 30 | +@synthesize btn_vmsk_logN; | |
| 31 | +@synthesize btn_ext_tsk; | |
| 32 | +@synthesize btn_slp_tsk; | |
| 33 | +@synthesize btn_tslp_tsk; | |
| 34 | +@synthesize btn_dly_tsk; | |
| 35 | +@synthesize btn_dis_tex; | |
| 36 | +@synthesize btn_ena_tex; | |
| 37 | +@synthesize btn_excep; | |
| 38 | +@synthesize btn_excepL; | |
| 39 | +@synthesize btn_QUIT; | |
| 13 | 40 | |
| 14 | 41 | |
| 42 | +void send_cmd_to_itron(char c); | |
| 43 | + | |
| 44 | +typedef struct { const char *btn_text; char signal; } cmd_t; | |
| 45 | + | |
| 46 | +static const cmd_t cmds[] = { | |
| 47 | +{ "TASK1", '1' }, | |
| 48 | +{ "TASK2", '2' }, | |
| 49 | +{ "TASK3", '3' }, | |
| 50 | +{ "act_tsk", 'a' }, | |
| 51 | +{ "can_act", 'A' }, | |
| 52 | +{ "ter_tsk", 't' }, | |
| 53 | +{ "chg_priH", '>' }, | |
| 54 | +{ "chg_priM", '=' }, | |
| 55 | +{ "chg_priL", '<' }, | |
| 56 | +{ "get_pri", 'G' }, | |
| 57 | +{ "wup_tsk", 'w' }, | |
| 58 | +{ "can_wup", 'W' }, | |
| 59 | +{ "rel_wai", 'l' }, | |
| 60 | +{ "sus_tsk", 'u' }, | |
| 61 | +{ "rsm_tsk", 'm' }, | |
| 62 | +{ "frsm_tsk", 'M' }, | |
| 63 | +{ "ras_tex1", 'x' }, | |
| 64 | +{ "ras_tex2", 'X' }, | |
| 65 | +{ "rot_rdq", 'r' }, | |
| 66 | +{ "sta_cyc", 'c' }, | |
| 67 | +{ "stp_cyc", 'C' }, | |
| 68 | +{ "vxget_tim", 'V' }, | |
| 69 | +{ "vmsk_logI", 'v' }, | |
| 70 | +{ "vmsk_logN", 'q' }, | |
| 71 | +{ "ext_tsk", 'e' }, | |
| 72 | +{ "slp_tsk", 's' }, | |
| 73 | +{ "tslp_tsk", 'S' }, | |
| 74 | +{ "dly_tsk", 'd' }, | |
| 75 | +{ "dis_tex", 'y' }, | |
| 76 | +{ "ena_tex", 'Y' }, | |
| 77 | +{ "excep", 'z' }, | |
| 78 | +{ "excepL", 'Z' }, | |
| 79 | +{ "QUIT", 'Q' }, | |
| 80 | +}; | |
| 81 | + | |
| 82 | +- (IBAction) btn_push:(id) sender { | |
| 83 | + UIButton *obj = (UIButton*)sender; | |
| 84 | + char cmd = 0; | |
| 85 | + unichar str_[32]; | |
| 86 | + char str[32]; | |
| 87 | + [[obj currentTitle] getCharacters:str_ ]; | |
| 88 | + | |
| 89 | + // unichar -> char | |
| 90 | + for(int i=0;i<sizeof(str)/sizeof(str[0]);++i) | |
| 91 | + { | |
| 92 | + char c = (char)str_[i]; | |
| 93 | + if( str_[i] > 0x7F ) { str[i] = '\0'; break; } | |
| 94 | + str[i] = c; | |
| 95 | + } | |
| 96 | + | |
| 97 | + for(int i=0;i<sizeof(cmds)/sizeof(cmds[0]);++i) | |
| 98 | + { | |
| 99 | + if( strcmp(cmds[i].btn_text, str ) == 0 ) | |
| 100 | + { | |
| 101 | + cmd = cmds[i].signal; | |
| 102 | + break; | |
| 103 | + } | |
| 104 | + } | |
| 105 | + | |
| 106 | + //NSLog(@"%s: %d",str, cmd); | |
| 107 | + | |
| 108 | + if( cmd ) send_cmd_to_itron(cmd); | |
| 109 | +} | |
| 110 | + | |
| 111 | + | |
| 15 | 112 | /* |
| 16 | 113 | // The designated initializer. Override to perform setup that is required before the view is loaded. |
| 17 | 114 | - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { |
| @@ -59,6 +156,39 @@ | ||
| 59 | 156 | |
| 60 | 157 | |
| 61 | 158 | - (void)dealloc { |
| 159 | + [btn_1 release]; | |
| 160 | + [btn_2 release]; | |
| 161 | + [btn_3 release]; | |
| 162 | + [btn_act_tsk release]; | |
| 163 | + [btn_can_act release]; | |
| 164 | + [btn_ter_tsk release]; | |
| 165 | + [btn_chg_priH release]; | |
| 166 | + [btn_chg_priM release]; | |
| 167 | + [btn_chg_priL release]; | |
| 168 | + [btn_get_pri release]; | |
| 169 | + [btn_wup_tsk release]; | |
| 170 | + [btn_can_wup release]; | |
| 171 | + [btn_rel_wai release]; | |
| 172 | + [btn_sus_tsk release]; | |
| 173 | + [btn_rsm_tsk release]; | |
| 174 | + [btn_frsm_tsk release]; | |
| 175 | + [btn_ras_tex1 release]; | |
| 176 | + [btn_ras_tex2 release]; | |
| 177 | + [btn_ret_rdq release]; | |
| 178 | + [btn_sta_cyc release]; | |
| 179 | + [btn_stp_cyc release]; | |
| 180 | + [btn_vxget_tim release]; | |
| 181 | + [btn_vmsk_logl release]; | |
| 182 | + [btn_vmsk_logN release]; | |
| 183 | + [btn_ext_tsk release]; | |
| 184 | + [btn_slp_tsk release]; | |
| 185 | + [btn_tslp_tsk release]; | |
| 186 | + [btn_dly_tsk release]; | |
| 187 | + [btn_dis_tex release]; | |
| 188 | + [btn_ena_tex release]; | |
| 189 | + [btn_excep release]; | |
| 190 | + [btn_excepL release]; | |
| 191 | + [btn_QUIT release]; | |
| 62 | 192 | [super dealloc]; |
| 63 | 193 | } |
| 64 | 194 |