RH850の割り込み/例外実現方法 CC-RHアプリケーションガイド

Similar documents
RL78開発環境移行ガイド R8C/M16C, H8S/H8SXからRL78への移行(統合開発環境編)(High-performance Embedded Workshop→CS+)

ブート領域、フラッシュ領域の分割方法 RL78ファミリ用Cコンパイラ CC-RL

スライド 1

ex05_2012.pptx

スライド 1

RX開発環境移行ガイド V850からRXへの移行(コンパイラ編)(CA850/CX→CC-RX)

スライド 1

ex04_2012.ppt

Microsoft PowerPoint - kougi7.ppt

スライド 1

SuperH RISC engine C/C++ コンパイラ Ver.7 不具合内容 - 過去のお知らせ SuperH RISC engine C/C++ コンパイラ Ver.7 台における不具合内容を以下に示します のチェックツールをルネサスエレクトロニクス株式会社のホームページ

2.RL78 での割り込み処理 ( 割り込み受け付け ) マスクが解除された (xxmk ビットが 0 の ) 割り込み要求信号は 2 つの用途で使用されます 一つ目は,CPU のスタンバイ状態の解除です この動作は, 割り込み優先順位とは全く無関係で, マスクされていない (xxmk=0 の )

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

スライド 1

命令セットの構成例 a) 算術 演算命令 例 )ADD dest, source : dest dest + source SUB dest, source : dest dest - source AND dest, source : dest dest AND source SHR reg, c

S1C17 Family Application Note S1C17 シリーズ PORT 多重割り込みアプリケーションノート Rev.1.0

スライド 1

PowerPoint プレゼンテーション

アプリケーションノート MT-R300 割り込みプログラムのデバッグ方法

スライド 1

SuperH RISC engineファミリ用 C/C++コンパイラパッケージ V.7~V.9 ご使用上のお願い

MMUなしプロセッサ用Linuxの共有ライブラリ機構

CS+ RL78コンパイラ CC-RL V リリースノート

スライド 1

スライド 1

PowerPoint Presentation

アジェンダ Renesas Synergy TM プラットフォーム構成 ThreadX とは ThreadX の状態遷移 ThreadX とμITRONの機能比較 まとめ ページ 2

内容 1. 仕様 動作確認条件 ハードウェア説明 使用端子一覧 ソフトウェア説明 動作概要 ファイル構成 オプション設定メモリ 定数一覧 変数一

PowerPoint プレゼンテーション

スライド 1

スライド 1

04-process_thread_2.ppt

初心者のための RL78 入門コース ( 第 3 回 : ポート出力例 2 とポート入力 ) 第 3 回の今回は, 前回作成したプログラムを RL78/G13 のハードウェアを用いて見直しをお こないます 今回の内容 8. コード生成を利用した実際のプログラム作成 ( その 2) P40 9. コー

Cコンパイラパッケージお知らせ

DumpCollection IT Exam Training online / Bootcamp PDF and Testing Engine, study and practice

Microsoft Word - dg_sataahciip_refdesign_jp.doc

RL78開発環境移行ガイド RL78ファミリ間の移行 (コンパイラ編:コンパイラオプション・アセンブラオプション)(CA78K0R→CC-RL)

スライド 1

gengo1-11

今週の進捗

Microsoft PowerPoint - 11.pptx

10-vm1.ppt

スライド 1

1. USB の VCP( 仮想 COM ポート ) について USB の VCP( 仮想 COM ポート ) は USB を非同期シリアル通信として使用するための USB のドライバです PC には VCP ドライバをインストールする必要があります USB の VCP( 仮想 COM ポート )

CoIDE 用 F4D_VCP の説明 V /07/05 USB の VCP( 仮想 COM ポート ) による非同期シリアル通信を行うプログラムです Free の開発ツール CoIDE で作成した STM32F4 Discovery 用のプロジェクトです プログラムの開始番地は 0x

1. 使用する信号 1.1. UART 信号 UART 通信に使用する信号と接続相手との接続は以下の通りです UART 信号表 番号 CPU 機能名 CPU 信号名 基板コネクタピン番号 方向 接続相手の信号名 1 USART1_TX PA9 CN > RxD 2 USART1_R

Microsoft PowerPoint - RL78G14_動画マニュアル_タイマRD.ppt [互換モード]

MODBUS ユーザーズマニュアル 페이지 1 / 23

arduino プログラミング課題集 ( Ver /06/01 ) arduino と各種ボードを組み合わせ 制御するためのプログラミングを学 ぼう! 1 入出力ポートの設定と利用方法 (1) 制御( コントロール ) する とは 外部装置( ペリフェラル ) が必要とする信号をマイ

プログラミング実習I

Microsoft PowerPoint - CproNt02.ppt [互換モード]

情報処理Ⅰ演習

PowerPoint プレゼンテーション

Notes and Points for TMPR454 Flash memory

Undestand の解析 Understand の C 言語で抽出できない依存関係について サンプルコードを用いて説明します 確認バージョン Understand 3.0 (Build 640) Understand 3.1 (Build 700) Understand 4.0 (Build 78

RL78/F13, F14 割り込み要因判別方法

Java知識テスト問題

Nios II - Vectored Interrupt Controller の実装

自己紹介 湯浅陽一 1999 年より Linux kernel 開発に参加 MIPS アーキテクチャのいくつかの CPU へ Linux kernel を移植

81 /******************************************************************************/ 82 /* スレーブアドレスの設定 */ 83 /*****************************************

RX210 グループ MTU2 を用いた相補 PWM モードの波形出力 要旨 本サンプルコードでは MTU2 を用いて相補 PWM モードの波形を出力する方法について説 明します 対象デバイス RX210 1 / 41

内容 1. APX-3302 の特長 APX-3312 から APX-3302 へ変更するためには 差分詳細 ハードウェア ハードウェア性能および仕様 ソフトウェア仕様および制限 Ini ファイルの設

UIOUSBCOM.DLLコマンドリファレンス

数はファイル内のどの関数からでも参照できるので便利ではありますが 変数の衝突が起こったり ファイル内のどこで値が書き換えられたかわかりづらくなったりなどの欠点があります 複数の関数で変数を共有する時は出来るだけ引数を使うようにし グローバル変数は プログラムの全体の状態を表すものなど最低限のものに留

Python によるジオプロセシング スクリプト入門

Microsoft PowerPoint - OS07.pptx

計算機アーキテクチャ

二次元連続動的計画法による知的画像処理システム ImageFileSelector RTC 機能仕様書 ImageFileSelectorRTC Ver.1.0 ( 株 ) 東日本計算センター 1 / 11

PLCシリアル通信 MODBUS通信 データ送信/受信プログラム例

1. 新規プロジェクト作成の準備新規プロジェクトのためのフォルダを用意して そこにプロジェクトを作成します [ 新しいフォルダー ] をクリックして希望のフォルダに新しいフォルダを作成します この例では TrST_F401N_BlinkLD2 というフォルダを作成しました TrST_F401N_Bl

Microsoft PowerPoint - OS03.pptx

Microsoft PowerPoint - RX62N動画マニュアルDMAC.ppt [互換モード]

Python によるジオプロセシング スクリプト入門

1.1 ラベル ラベルはカラム 1 から始まらなければならない ラベルの後にはコロン スペース タブ 改行が続いてよい ラベルはアルファベットかアンダーバーで始まり 英数字 アンダーバー クエスチョンマークを含んでよい ラベルは 32 文字までである デフォルトではこれらは大文字と小文字を区別するが

PowerPoint プレゼンテーション

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

プレポスト【解説】

マクロ(シミュレータコマンド)の使い方

39733a.fm

Prog1_10th

GOT1000 ファイル操作関数スクリプトサンプル画面取扱説明書

TOPPERS活用アイデア・アプリケーション開発

CS+ 統合開発環境 ユーザーズマニュアル CC-RL ビルド・ツール操作編

電磁流量計 WZ-C Modbus RTU 通信仕様書 ver.8.225

RTC_STM32F4 の説明 2013/10/20 STM32F4 内蔵 RTC の日付 時刻の設定および読み込みを行うプログラムです UART2( 非同期シリアル通信ポート 2) を使用して RTC の設定および読み込みを行います 無料の開発ツール Atollic TrueSTUDIO for

WAP121 および WAP321 アクセス ポイントのダウンロード/バックアップ コンフィギュレーション ファイル

Microsoft PowerPoint ppt

PIC24F Family Reference Manual Section 9 WDT

Microsoft Word - CBSNet-It連携ガイドver8.2.doc

Microsoft PowerPoint - Kozos12step_07_

Apache-Tomcat と 冗長な UTF-8 表現 (CVE 検証レポート ) 2008 年 08 月 26 日 Ver. 0.1

MSP430 CCSv5 を使い Flash Memory 内容と version 情報を確認する方法 ( テクニック編 ) Rev: PIC Trout 今回は 下記の2 件について説明します 1) CCSv5 を使用して MSP430 の Flash Memory 内容を

CASL入門

Microsoft PowerPoint - 09.pptx

始めに, 最下位共通先祖を求めるための関数 LcaDFS( int v ) の処理を記述する. この関数は値を返さない再帰的な void 関数で, 点 v を根とする木 T の部分木を深さ優先探索する. 整数の引数 v は, 木 T の点を示す点番号で, 配列 NodeSpace[ ] へのカーソル

○前期高齢者(70歳~74歳)(老人保健なし)

プログラミング演習3 - Cプログラミング -

PowerPoint プレゼンテーション

マイコンボードの LED 制御 準備編その 1 マイコンとノート PC の役割 どうすれば LED は光るの? 光らせる LED の選択は? マイコン端子に接続された LED マイコン端子の電圧設定 制御用ソフトウェアの注意点 1

ArcGIS Runtime SDK for .NET アプリケーション配布ガイド

Transcription:

RH850の割り込み / 例外実現方法 CC-RH アプリケーションガイド R20UT3546JJ0101 2018.10.12 ソフトウェア開発統括部 ソフトウェア技術部ルネサスエレクトロニクス株式会社

アジェンダ 概要ページ 03 割り込み / 例外発生時に実行する関数の定義ページ 10 直接ベクタ方式のベクタの定義ページ 17 テーブル参照方式のベクタの定義ページ 25 その他 割り込み制御ページ 32 Page 2

概要

RH850 の割り込み / 例外方法について RH850 には直接ベクタ方式とテーブル参照方式の 2 種類の割り込 み / 例外があります 直接ベクタ方式は 発生要因毎に固定のハンドラ アドレスにジャンプして ジャンプ先のコードを実行します RBASE あるいは EBASE のいずれをベース アドレスとして 発生要因のオフセット値を加算した値をハンドラ アドレスとします テーブル参照方式は ハンドラ アドレスに格納されたワードデータを読み出して そのワードデータが指すアドレスにジャンプします INTBP をベース レジスタとして チャネル番号 *4 のオフセット値を加算した値をハンドラ アドレスとします Page 4

直接ベクタ方式 イメージ 1 PSW.EBV=0 の場合 PSW.EBV=1 の場合 EIINTn( 優先度 15) EIINTn( 優先度 14) 中略 HVTRAP EIINTn( 優先度 15) EIINTn( 優先度 14) EBASE SYSERR 空き 中略 HVTRAP SYSERR RBASE RESET RBASE RESET Page 5

直接ベクタ方式 イメージ 2 eiret _intp0 3 割り込み / 例外発生 Next PC PC 1 ハンドラ アドレスにジャンプ ハンドラ アドレス RBASE or EBASE jr _intp0 jr _intp0 2 ハンドラ アドレスのコードを実行 Page 6

テーブル参照方式 イメージ 1 EIINT508 EIINT504 EIINT509 EIINT505 EIINT510 EIINT506 EIINT511 EIINT507 INTBP RBASE = EBASE 中略 EIINT4 EIINT5 EIINT6 EIINT7 EIINT0 EIINT1 EIINT2 EIINT3 FEINT 中略 SYSERR RESET Page 7

テーブル参照方式 イメージ 2 eiret 500H 3 割り込み / 例外発生 Next PC PC 1 ハンドラ アドレスのワードデータを読み出す jr _intp0 500H 2 テーブルからワードデータを取得し このアドレスにPCを遷移 INTBP Page 8

割り込み / 例外の実現方法 CC-RH を使用して以下の 2 ステップにより RH850 の割り込み / 例外を実現してください 1 #pragma interrupt 指令を用いた割り込み / 例外関数の定義 2 割り込み / 例外ベクタの定義 本アプリケーションノートでは CC-RH を使用して直接ベクタ方式 / テーブル参照方式の割り込み / 例外を実現する手法をそれぞれ説明します Page 9

割り込み / 例外発生時に実行する関数 の定義

割り込み / 例外関数の定義方法 1 割り込み関数を C 言語で記述する場合 #pragma interrupt 指令を 使用してください これにより C 言語で記述した関数を割り込み 関数として CC-RH がコンパイルします #pragma interrupt 関数名 ( 割り込み仕様 [, 割り込み仕様 ]) 関数名で指定した関数を割り込み仕様で指定した仕様に従ってコンパイルします 通常関数とは関数本体を実行するまでの入口 / 出口コードが異なります 割り込み関数の注意事項 : 戻り型は常に void としてください 引数なし または引数 1 個のみ使用できます 引数は EIIC(EI レベル例外要因 ) または FEIC(FE レベル例外要因 ) です 通常関数のように呼び出さないでください Page 11

割り込み / 例外関数の定義方法 2 割り込み仕様 enable= priority= channel= fpu= fxu= callt= resbank param= 機能 多重割り込みの可否を指定します 引数には true/false/manual が記載できます 直接ベクタ方式の割り込み発生要因を指定します テーブル参照方式の割り込みチャネル番号を指定します priority/channel はどちらか一方のみ指定可能です 両方指定した場合はエラーとなります ( 注 ) どのチャネル番号を指定しても 同じ EI レベル割り込みとしてコードを出力します FPU 機能システムレジスタ FPEPC/FPSR を退避 / 復帰するか指定します 引数には true/false/auto が記載できます FPU を使用している場合には true を指定してください fxrs/fxxp を退避 / 復帰するか指定します 引数には true/false/auto が記載できます ( 注 )-Xcpu=g4mh が指定されていない場合はエラーになります CTPC/CTPSW を退避 / 復帰するか指定します 引数には true/false が記載できます ( 注 ) コンパイル時に callt 命令を生成することはありません そのため CTPC/CTPSW の退避 / 復帰は不要です resbank 命令を関数の出口コードに出力します 割り込み仕様 priority= に EIINT 以外を同時に指定した場合はエラーになります ( 注 )-Xcpu=g4mh が指定されていない場合はエラーになります 例外要因レジスタの値を引数で受け取る方法を指定します 例外要因レジスタ名は 1 から 4 個まで指定できます Page 12

割り込み / 例外関数の定義方法 3 #pragma interrupt 指令の割り込み仕様に priority あるいは channel を指定することにより 以下の RH850 割り込み / 例外関数を定義することが可能です EI レベル割り込み FE レベル割り込み ( 復帰 / 回復可 ) FE レベル割り込み ( 復帰 / 回復不可 ) 以降のページでは それぞれの割り込み / 例外関数の出力コードの内容を説明します Page 13

EI レベル割り込み関数の出力コード #pragma interrupt 指令の割り込み仕様としてpriority=EIINT/FPI 等 あるいはchannelを指定すると EIレベル割り込み関数として右記のような入口コード (1.~7.) と出口コード (8.~15.) を出力します 1. 使用するスタック領域を確保 2. 割り込み関数中で使用するCaller-Saveレジスタを退避 3. EIPC,EIPSW を退避 (enable=true manual 指定時 ) 4. 仮引数を記述した関数の場合 EIIC をR6 に設定 5. 多重割り込みを許可 (enable=true 指定時 ) 6. CTPC,CTPSW を退避 (callt=true 指定時 ) 7. FPEPC,FPSR を退避 (fpu=true 指定時 ) 割り込み関数としてユーザーが記述した処理 8. インプレサイス割り込み待ちを設定 9. FPEPC,FPSR を復帰 (fpu=true 指定時 ) 10. CTPC,CTPSW を復帰 (callt=true 指定時 ) 11. 多重割り込みを禁止 (enable=true 指定時 ) 12. EIPC,EIPSW を復帰 (enable=true manual 指定時 ) 13. 割り込み関数中で使用したCaller-Saveレジスタを復帰 14. 使用したスタック領域を解放 15. eiret Page 14

FE レベル割り込み関数の出力コード ( 復帰 / 回復可 ) #pragma interrupt 指令の割り込み仕様としてpriority=FEINT/PIE 等のような復帰 / 回復可能な割り込み発生要因を指定すると FEレベル割り込み関数として右記のような入口コード (1.~5.) と出口コード (6.~10.) を出力します 1. 使用するスタック領域を確保 2. 割り込み関数中で使用するCaller-Saveレジスタを退避 3. 仮引数を記述した関数の場合 FEIC をR6 に設定 4. CTPC,CTPSW を退避 (callt=true 指定時 ) 5. FPEPC,FPSR を退避 (fpu=true 指定時 ) 割り込み関数としてユーザーが記述した処理 6. FPEPC,FPSR を復帰 (fpu=true 指定時 ) 7. CTPC,CTPSW を復帰 (callt=true 指定時 ) 8. 割り込み関数中で使用したCaller-Saveレジスタを復帰 9. 使用したスタック領域を解放 10.feret Page 15

FE レベル割り込み関数の出力コード ( 復帰 / 回復不可 ) #pragma interrupt 指令の割り込み仕様としてpriority=FENMI/SYSERR 等のような復帰 / 回復不能な割り込み発生要因を指定すると FEレベル割り込み関数として右記のような入口コード (1.) を出力します 1. 仮引数を記述した関数の場合 FEIC を R6 に設定 なし 割り込み関数としてユーザーが記述した処理 出口コードは出力しないため abort() を呼び出してプログラムを終了させる等 ユーザープログラム内で適切に処置してください Page 16

直接ベクタ方式のベクタを定義

ハンドラ アドレスの決定方法 直接ベクタ方式のハンドラ アドレスは (RESET を除く ) PSW.EBV=0 の場合には RBASE+ オフセット アドレス PSW.EBV=1 の場合には EBASE+ オフセット アドレスとなります 割り込み / 例外要因 PSW.EBV=0 ベース レジスタ PSW.EBV=1 RESET RBASE なし 000H SYSERR EBASE 010H HVTRAP FETRAP TRAP0 TRAP1 RIE FPP/FPI UCPOP オフセット アドレス 020H 030H 040H 050H 060H 070H 080H Page 18

直接ベクタ方式のベクタ定義 1 ベクタは各要因ごとに 0x10 バイト確保されています アセンブラで各要因ごとに 実行したい関数へのジャンプ命令を記述することでベクタを定義してください 例 : ベース レジスタを RBASE 固定で使用する場合 または RBASE=EBASE で使用する場合.section "RESET", text jr32 start ; RESET.align 0x10 jr32 _syser ; SYSERR.align 0x10 jr32 _hvtr ; HVTRAP.align 0x10 jr32 _intp14 ; EIINTn( 優先度 14).align 0x10 jr32 _intp15 ; EIINTn( 優先度 15) 0x10 RBASE jr32 jr32 jr32 jr32 jr32 _intp15 _intp14 _hvtr _syser start Page 19

直接ベクタ方式のベクタ定義 2 RESET セクションをリセット ベクタ アドレス (RBASE の値 ) に配置させてください セクションの配置アドレスはリンカオプション -start で指定します -start=section1,section2,.../address 例 :0x00 番地から上位方向に RESET セクションを 0x1000 番地から上位方向に.const.text セクションを配置させる場合 -start=reset/00,.const,.text/1000 上位 RESET.const.text 0x00 0x1000 Page 20

直接ベクタ方式のベクタ定義 3 例 :RBASE EBASE で使用する場合.section "RESET", text jr32 start ; RESET jr32 jr32 _intp15 _intp14.section VECT", text.ds 0x10 ; 空き領域 jr32 _syser ; SYSERR.align 0x10 jr32 _hvtr ; HVTRAP.align 0x10 jr32 _intp14 ; EIINTn( 優先度 14).align 0x10 jr32 _intp15 ; EIINTn( 優先度 15) 0x10 EBASE RBASE jr32 jr32 jr32 _hvtr _syser 空き領域 start Page 21

直接ベクタ方式のベクタ定義 4 RBASE EBASE で使用する場合は VECT セクションを所望のアドレスに配置させ VECT セクションの先頭アドレスを EBASE に設定してください VECT セクションを 0x100 番地に配置したい場合は 右記の例のような定義してください セクションの配置アドレスはリンカオプション -start で指定します -start=section1,section2,.../address 例 :0x100 番地から上位方向に VECT セクションを 0x1000 番地から上位方向に.const.text セクションを配置させる場合 -start= RESET/00,VECT/100,.const,.text/1000 上位 RESET VECT.const.text 0x00 0x100 0x1000 Page 22

直接ベクタ方式のベクタ定義 5 統合開発環境 CS+ 上から GUI 操作により -start オプションを指定することも可能です [ リンク オプション ] タブ => [ セクション ] カテゴリ =>[ セクションの開始アドレス ] から [ セクション設定 ] ダイアログを起ち上げて指定してください Page 23

直接ベクタ方式のベクタ定義 6 RBASE EBASE で使用する場合は VECT セクションの先頭アドレスを INTBP に設定する 必要があります セクションの先頭アドレスは特殊シンボルを使用すると便利です 参考 : 特殊シンボル アセンブラにおいて - セクション名に # s を付けると そのセクションの先頭アドレス - セクション名に # e を付けると そのセクションの終端アドレス 例 : アセンブラで EBASE の設定方法 _set_ebase: mov # svect, r10 ldsr r10, 3, 1 ; set EBASE リセット後に VECT セクションの先頭アドレス (# svect) を EBASE( レジスタ番号 :SR3, 1) に格納します Page 24

テーブル参照方式のベクタの定義

ハンドラ アドレスの決定方法 テーブル参照方式のハンドラ アドレスは INTBP+ 割り込みチャンネル番号 *4 となります 種類 ハンドラ アドレス EIINT0 INTBP + 0 * 4 EIINT1 INTBP + 1 * 4 EIINT2 INTBP + 2 * 4 EIINT510 INTBP + 510 * 4 EIINT511 INTBP + 511 * 4 INTBP EIINT508 EIINT509 EIINT510 EIINT511 EIINT504 EIINT505 EIINT506 EIINT507 中略 EIINT4 EIINT5 EIINT6 EIINT7 EIINT0 EIINT1 EIINT2 EIINT3 0x4 0x4 0x4 0x4 0 0xF Page 26

テーブル参照方式への変更方法 1 EI レベル割り込み EIINTn は 直接分岐方式とテーブル参照方式のいずれかを 選択可能です デフォルトでは直接分岐方式となっています テーブル参照方 式に変更するには割り込み制御レジスタ EICn で選択します EICn (n: チャネル番号 ) 15 6 3 0 EICTn EIRFn EIMKn EITBn EIPn EITBn 割り込みベクタ方式選択ビット 0 : 直接分岐方式 1 : テーブル参照方式 Page 27

テーブル参照方式への変更方法 2 例 :EIC0 レジスタのアドレスが 0xFFFEEA00 のマイコンの EIINT0~EIINT3 の割り込みをアセンブラでテーブル参照方式に変更する場合 _init_eiint: mov 0xFFFEEA00, r10 ; get EIC0 register address set1 6, 0[r10] ; set EIINT0 as table reference set1 6, 2[r10] ; set EIINT1 as table reference set1 6, 4[r10] ; set EIINT2 as table reference set1 6, 6[r10] ; set EIINT3 as table reference EIINT0 の割り込み制御レジスタ EIC0 のアドレスをベースアドレスにして そのアドレスからのオフセットにより それぞれの割り込みベクタ選択ビットにアクセスすると便利です Page 28

テーブル参照方式のベクタ定義 1 ベクタは各チャネルごとに 0x4 バイト確保されています アセンブラで.dw 疑似 命令を使用してテーブル参照方式のベクタを定義してください 例 :4 バイト領域を確保し 関数 func のアドレスで初期化する場合.dw #_fucn 例 :EIINT0 発生時に int0 EIINT20 発生時に int20 EIINT47 発生時に int47 関数を実行するベクタ定義し EIINTTBL セクションとする場合.section "EIINTTBL", const.dw #_int0 ; EIINT0.ds (19 0) * 4 ; EIINT1~EIINT19 の領域 (76byte) を確保.dw #_int20 ; EIINT20.ds (46-20) * 4 ; EIINT21~EIINT46 の領域 (104byte) を確保.dw #_int47 ; EIINT47 Page 29

テーブル参照方式のベクタ定義 2 イメージ 0x60 0x50 #_int20 #_int47.section "EIINTTBL", const.dw #_int0 ; EIINT0.ds (19 0) * 4.dw #_int20 ; EIINT20.ds (46-20) * 4.dw #_int47 ; EIINT47 # seiinttbl #_int0 0x4 0 0xF Page 30

テーブル参照方式のベクタ定義 3 EIINTTBL セクションを所望のアドレスに配置させ EIINTTBL セクションの先頭 アドレスを INTBP に設定してください セクションの先頭アドレスは特殊シンボル を使用すると便利です 例 : アセンブラでINTBPの設定方法 _set_intbp: mov # seiinttbl, r10 ldsr r10, 4, 1 ; set INTBP リセット後に EIINTTBL セクションの先頭アドレス (# seiinttbl) を INTBP ( レジスタ番号 :SR4, 1) に格納します Page 31

その他 割り込み制御

割り込みの禁止 / 許可 CC-RH では 以下の方法によりソース上から EI レベル割 り込みの許可 / 禁止を制御することが可能です 組み込み関数 DI(), EI() #pragma block_interrupt 指令 Page 33

組み込み関数による制御 組み込み関数 DI(), EI() により C ソース上から割り込みを禁止 許可したい区間を指定することが可能です 組み込み関数 DI() EI() 動作 EI レベル マスカブル割り込み / 例外の受け付けを禁止 EI レベル マスカブル割り込み / 例外の受け付けを許可 例 : 組み込み関数の記述方法 void func(void) { : DI(); /* 割り込みを禁止して行いたい処理を記述 */ EI(); : } Page 34

# pragma block_interrupt 指令による制御 #pragma block_interrupt 指令により関数全体を割り込みを禁止にすることが可能です #pragma block_interrup 関数名 関数名で指定した関数に対し EI レベルマスカブル割り込みを禁止します 関数の最初に DI ( ) を 最後に EI ( ) を記述することもできますが この場合 CC-RH が出力する入口コードと出口コードに対して割り込みを禁止 / 許可することができず 関数全体を完全に割り込み禁止にすることができません #pragma block_interrupt 指令を用いることで 入口コード実行の直前に割り込みを禁止し 出口コード実行直後に割り込みを許可します そのため関数全体を完全に割り込み禁止にすることができます 例 : #pragma block_interrupt 指令の記述方法 #pragma block_interrupt func void func(void) { : /* 割り込みを禁止して行いたい処理を記述 */ : } Page 35

Renesas.com