source: azure_iot_hub_f767zi/trunk/asp_baseplatform/monitor/arch/m16c.c@ 457

Last change on this file since 457 was 457, checked in by coas-nagasima, 4 years ago

ファイルを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 8.7 KB
Line 
1/*
2 * TOPPERS/ASP Educative Program
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Just Standard Profile Kernel
5 *
6 * Copyright (C) 2003-2009 by Ryosuke Takeuchi
7 * Platform Development Center RICOH COMPANY,LTD. JAPAN
8 *
9 * 上記著作権者は,Free Software Foundation によって公表されている
10 * GNU General Public License の Version 2 に記述されている条件か,以
11 * 下の(1)~(4)の条件を満たす場合に限り,本ソフトウェア(本ソフトウェ
12 * アを改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
13 * 利用と呼ぶ)することを無償で許諾する.
14 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
16 * スコード中に含まれていること.
17 * (2) 本ソフトウェアを再利用可能なバイナリコード(リロケータブルオブ
18 * ジェクトファイルやライブラリなど)の形で利用する場合には,利用
19 * に伴うドキュメント(利用者マニュアルなど)に,上記の著作権表示,
20 * この利用条件および下記の無保証規定を掲載すること.
21 * (3) 本ソフトウェアを再利用不可能なバイナリコードの形または機器に組
22 * み込んだ形で利用する場合には,次のいずれかの条件を満たすこと.
23 * (a) 利用に伴うドキュメント(利用者マニュアルなど)に,上記の著作
24 * 権表示,この利用条件および下記の無保証規定を掲載すること.
25 * (b) 利用の形態を,別に定める方法によって,上記著作権者に報告する
26 * こと.
27 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
28 * 害からも,上記著作権者を免責すること.
29 *
30 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者は,
31 * 本ソフトウェアに関して,その適用可能性も含めて,いかなる保証も行わ
32 * ない.また,本ソフトウェアの利用により直接的または間接的に生じたい
33 * かなる損害に関しても,その責任を負わない.
34 *
35 * @(#) $Id$
36 */
37
38/*
39 * TOPPERS/ASP用タスクモニタCPU依存プログラム.
40 *
41 */
42
43#include <itron.h>
44#include <sil.h>
45#include <stdio.h>
46#include "kernel_impl.h"
47#include "task.h"
48#include "task_expansion.h"
49#include "monitor.h"
50
51extern void _kernel_break_wait();
52
53/*
54 * レジスタの構造体
55 */
56typedef struct t_reg{
57 uint16_t r0;
58 uint16_t r1;
59 uint16_t r2;
60 uint16_t r3;
61 uint16_t a0;
62 uint16_t a1;
63 uint16_t sb;
64 uint16_t fb;
65 uint16_t lpc;
66 uint8_t lflg;
67 uint8_t hpc;
68}T_REG;
69
70/*
71 * メモリのマッピング定義構造体
72 */
73
74typedef struct t_memdef{
75 uint32_t mstart;
76 uint32_t mend;
77 uint8_t mtype;
78 uint8_t mstate;
79}T_MEMDEF;
80
81/*
82 * M16Cのメモリマッピング
83 */
84
85static T_MEMDEF const memdefine[] = {
86 0x00000000, 0x000003FF, PORT_AREA, MREAD_WRITE,
87#if defined(OAKS16)
88 0x00000400, 0x00002BFF, MEMORY_AREA, MREAD_WRITE,
89 0x000E0000, 0x000FFFFF, MEMORY_AREA, MREAD_ONLY
90#elif defined(OAKS16_MINI)
91 0x00000400, 0x00000BFF, MEMORY_AREA, MREAD_WRITE,
92 0x000F0000, 0x000FFFFF, MEMORY_AREA, MREAD_ONLY
93#else
94 0x00000400, 0x000033FF, MEMORY_AREA, MREAD_WRITE,
95 0x000E0000, 0x000FFFFF, MEMORY_AREA, MREAD_ONLY
96#endif
97};
98
99/******************************************************************************
100 * ハードウェアポート属性参照関数
101 ******************************************************************************/
102/*
103 * アドレスからメモリ領域属性を取り出す
104 * mode=0:領域の型
105 * mode=1:読み取り書き込み属性
106 */
107
108char
109getMemoryType(ulong_t address, int_t mode)
110{
111 int_t count = sizeof(memdefine) / sizeof(T_MEMDEF);
112 int_t i;
113
114 for(i = 0 ; i < count ; i++){
115 if(address >= memdefine[i].mstart && address <= memdefine[i].mend){
116 if(mode == 0)
117 return memdefine[i].mtype;
118 else
119 return memdefine[i].mstate;
120 }
121 }
122 return NONE_AREA;
123}
124
125/*
126 * アドレスからアライン後のアドレスを取り出す
127 */
128
129ulong_t
130MonAlignAddress(ulong_t address)
131{
132 return address;
133}
134
135/******************************************************************************
136 * メモリアクセス用関数
137 ******************************************************************************/
138/*
139 * メモリ領域に対する読み出し関数
140 * 領域のチェックを行い、エラーならゼロを返す
141 */
142int_t
143MemoryRead(ulong_t address, intptr_t p, int_t type)
144{
145 int_t len;
146
147 switch(getMemoryType(address, 0)){
148 case PORT_AREA:
149 if(type == 2){
150 len = 2;
151 *((UH _far *)p) = sil_reh_mem((VP)address);
152 }
153 else if(type == 4){
154 len = 4;
155 *((UW _far *)p) = sil_rew_mem((VP)address);
156 }
157 else{
158 len = 1;
159 *((UB _far *)p) = sil_reb_mem((VP)address);
160 }
161 break;
162 case MEMORY_AREA:
163 if(type == 2){
164 len = 2;
165 *((UH _far *)p) = *((UH _far *)address);
166 }
167 else if(type == 4){
168 len = 4;
169 *((UW _far *)p) = *((UW _far *)address);
170 }
171 else{
172 len = 1;
173 *((UB _far *)p) = *((UB _far *)address);
174 }
175 break;
176 default:
177 len = 0;
178 break;
179 }
180 return len;
181}
182
183/*
184 * メモリ領域に対する書き込み関数
185 * 領域のチェックを行い、エラーならゼロを返す
186 */
187int_t
188MemoryWrite(ulong_t address, intptr_t p, int_t type)
189{
190 int_t len;
191
192 switch(getMemoryType(address, 0)){
193 case PORT_AREA:
194 if(type == 2){
195 len = 2;
196 sil_wrh_mem((VP)address, *((UH _far *)p));
197 }
198 else if(type == 4){
199 len = 4;
200 sil_wrw_mem((VP)address, *((UW _far *)p));
201 }
202 else{
203 len = 1;
204 sil_wrb_mem((VP)address, *((UB _far *)p));
205 }
206 break;
207 case MEMORY_AREA:
208 if(getMemoryType(address, 1) == MREAD_ONLY){
209 len = 0;
210 }
211 else if(type == 2){
212 len = 2;
213 *((UH _far *)address) = *((UH _far *)p);
214 }
215 else if(type == 4){
216 len = 4;
217 *((UW _far *)address) = *((UW _far *)p);
218 }
219 else{
220 len = 1;
221 *((UB _far *)address) = *((UB _far *)p);
222 }
223 break;
224 default:
225 len = 0;
226 break;
227 }
228 return len;
229}
230
231/******************************************************************************
232 * モニタ用関数
233 ******************************************************************************/
234/*
235 * エクセプションの引数よりpcを取り出す関数
236 */
237ulong_t
238get_exception_pc(void * p_excinf)
239{
240 ulong_t pc;
241
242 pc = *(uint16_t*)((char*)p_excinf+16) | ((ulong_t)(*((char*)p_excinf+19) & 0xf) << 16);
243 return pc;
244}
245
246/*
247 * レジスタ内容の表示
248 */
249void
250display_registers(ID tskid)
251{
252 ER ercd;
253 T_RTST rtst;
254 T_REG reg;
255 uint32_t pc;
256
257 ercd = ref_tst(tskid, &rtst);
258 if(ercd == E_OK){
259 if(rtst.tskpc == (FP)_kernel_break_wait){
260 reg = *((T_REG *)rtst.tsksp);
261 pc = reg.lpc | (((UW)reg.hpc & 0xf)<<16);
262 printf(" PC=%06lx SP=%04x", (unsigned long)pc, (UW)rtst.tsksp+sizeof(T_REG));
263 printf(" IPL=%1x U=%1x I=%1x", (reg.hpc>>4) & 0x7, (reg.lflg>>7) & 1, (reg.lflg>>6) & 1);
264 printf(" O=%1x B=%1x S=%1x", (reg.lflg>>5) & 1, (reg.lflg>>4) & 1, (reg.lflg>>3) & 1);
265 printf(" Z=%1x D=%1x C=%1x\n", (reg.lflg>>2) & 1, (reg.lflg>>1) & 1, reg.lflg & 1);
266 printf(" R0=%04x R1=%04x R2=%04x", reg.r0, reg.r1, reg.r2);
267 printf(" R3=%04x A0=%04x A1=%04x", reg.r3, reg.a0, reg.a1);
268 printf(" SB=%04x FB=%04x\n", reg.sb, reg.fb);
269 printf(" %06lx %02x %02x\n", (unsigned long)pc, *((UB*)pc), *((UB*)(pc+1)));
270 return;
271 }
272 else if(rtst.tskstat == TTS_DMT){
273 printf(" wait in activate_r() !!\n");
274 return;
275 }
276 }
277 printf(" wait in dispatch() !!\n");
278}
279
280#if 0
281/******************************************************************************
282 * エラー通知用関数
283 ******************************************************************************/
284/*
285 * イレギュラー割込みハンドラー
286 */
287void
288irregular_int_handler(void)
289{
290 if(runtsk){
291 if(intnest > 1){
292 syslog_1(LOG_EMERG, "Irregular Interrupt occured in tskid=%d !", TSKID(runtsk));
293 kernel_exit();
294 }
295 else{
296 syslog_1(LOG_ERROR, "Irregular Interrupt occured in tskid=%d !", TSKID(runtsk));
297 isus_tsk(TSKID(runtsk));
298 }
299 }
300 else{
301 syslog_0(LOG_EMERG, "Irregular Interrupt occured in Idle!");
302 kernel_exit();
303 }
304}
305
306/*
307 * イレギュラーエクセプション
308 */
309void
310irregular_ext_handler(VP p_excinf)
311{
312 UW pc = get_exception_pc(p_excinf);
313
314 if(runtsk){
315 if(exc_sense_context(p_excinf)){
316 syslog_1(LOG_EMERG, "Irregular Exception occured in not task Context pc=0x%x !", pc);
317 kernel_exit();
318 }
319 else{
320 syslog_2(LOG_ERROR, "Irregular Exception occured in tskid=%d pc=0x%x !", TSKID(runtsk), pc);
321 isus_tsk(TSKID(runtsk));
322 }
323 }
324 else{
325 syslog_1(LOG_EMERG, "Irregular Exception occured in Idle pc=0x%x !", pc);
326 kernel_exit();
327 }
328}
329#endif
330
Note: See TracBrowser for help on using the repository browser.