C コンパイラー ユーザーズガイド - Microchip...

120
2005 Microchip Technology Inc. DS51288C_JP MPLAB ® C18 C コンパイラー ユーザーズガイド

Transcript of C コンパイラー ユーザーズガイド - Microchip...

  • 2005 Microchip Technology Inc. DS51288C_JP

    MPLAB® C18C コンパイラー

    ユーザーズガイド

  • DS51288C_JP-page ii 2005 Microchip Technology Inc.

    この文献は読者が内容をお読みになる時の参考のために日本語に翻訳されています。翻訳に誤りが存在する場

    合、Microchip Technology Inc. 及び全ての子会社、関連会社、役員、従業員、代理業者は一切の責任を負いかねます。オリジナル文献を必ずご参照することを強くお勧めします。

    本書に書かれているデバイスアプリケーション等に関する内

    容は、参考情報に過ぎません。ご利用のアプリケーションが

    仕様を満たしているかどうかについては、お客様の責任にお

    いて確認をお願いします。これらの情報の正確さ、またはこ

    れの情報の使用に関し、Microchip はいかなる表明と保証を行うものではなく、また、一切の責任を負うものではありま

    せん。Microchip の明示的な書面による承認なしに、生命維持装置に Microchip の製品を使用することは認められていません。知的財産権に基づく、ライセンスを暗示的に与えたも

    のではありません。

    商標

    Microchip の名称とロゴ、Microchip のロゴ、Accuron、dsPIC、KEELOQ、microID、MPLAB、PIC、PICmicro、PICSTART、PRO MATE、PowerSmart、rfPIC、SmartShuntは米国及び他の国々のにおいて、Microchip Technology Inc.の登録商標です。

    AmpLab、FilterLab、Migratable Memory、MXDEV、MXLAB、PICMASTER、SEEVAL、SmartSensor、The Embedded Control Solutions Company は、米国においてMicrochip Technology Inc. の登録商標です。

    Analog-for-the-Digital Age、Application Maestro、dsPICDEM、dsPICDEM.net、dsPICworks、ECAN、ECONOMONITOR、FanSense、FlexROM、fuzzyLAB、In-Circuit Serial Programming、ICSP、ICEPIC、Linear Active Thermistor、MPASM、MPLIB、MPLINK、MPSIM、PICkit、PICDEM、PICDEM.net、PICLAB、PICtail、PowerCal、Powerlnfo、PowerMate、PowerTool、rfLAB、rfPICDEM、Select Mode、Smart Serial、SmartTel、Total Endurance 及び WiperLock は、米国及び他の国々のにおいて、Microchip Technology Inc. の商標とです。

    SQTP は米国において Microchip Technology Inc. のサービスマークです。

    本書に記載された上記以外の商標は、それぞれ所有会社の登

    録商標です。

    著作権。 © 2005 年 Microchip Technology Inc.、無断複写・転載を禁じます。

    再生紙を使用。

    Microchip デバイスのコード保護機能に関する以下の点に留意ください。• Microchip の製品は各製品独自の Microchip データーシートにある仕様を満たしています。

    • 各製品ファミリーは、通常の状態且つ所定の方法で利用いただければ市場にある類似製品の中で最も安全なファミリーの一つと Microchip は信じております。

    • 不正かつ非合法な方法を使ったコード保護機能の侵害があります。弊社の理解ではこうした手法は、Microchip データーシートにある動作仕様書以外の方法で Microchip 製品を使用することになります。こうした手法を使用した人は、ほとんどの場合、知的財産権の侵害となります。

    • Microchip はコードの統合性に関心をお持ちの顧客とは協働させていただきます。

    • Microchip または他のセミコンダクターメーカーがコードの安全性を保証したものではありません。コード保護は製品保護が「破られない」ということを保証するものではありません。

    コード保護は常に進化します。Microchip は、当社製品のコード保護機能を継続的に改善することをお約束いたします。マクロチップのコード保護機能を破ることは、(Digital Millennium Copyright Act) に違反します。こうした行為によるソフトウェアや著作権に関わる作品への不正アクセスがあった場合、同法に基づき賠償請求する権利があります。

    Microchip は、1OS/TS-16949 を受けました。本社、アリゾナ州チャンドラーとテンペとカリフォルニア州マウンテンビューにあるデザイン及びウエハー施設に対する 2002 年品質システム認証です。弊社の品質システムプロセスと手続きは、PlCmicro" 8-bit MCUs、 KEELOGIR コードホッピングデバイス、シリアル EEPROMs、マイクロペリフェラル、非揮発性メモリーとアナログ製品を対象としています。更に、開発システムの設計及び製造に関する Microchip の品質システムは、2000 年に ISO9001 の認証を受けています。

  • MPLAB® C18 C コンパイラーユーザーズガイド

    2005 Microchip Technology Inc. DS51288C_JP-page iii

    目次

    序文 .................................................................................................................................. 1第 1 章 はじめに

    1.1 概要.............................................................................................................. 71.2 コンパイラーの起動について ...................................................................... 7

    1.2.1 出力ファイル作成 .......................................................................................... 81.2.2 診断情報の表示 .............................................................................................. 81.2.3 マクロ定義 ..................................................................................................... 91.2.4 プロセッサーの選択....................................................................................... 91.2.5 モードの選択 ................................................................................................. 9

    第 2 章 言語仕様2.1 データタイプと制限................................................................................... 11

    2.1.1 整数型 .......................................................................................................... 112.1.2 浮動小数点型 ............................................................................................... 12

    2.2 データタイプ保存 - Endianness ................................................................ 122.3 ストレージクラス ...................................................................................... 13

    2.3.1 オーバーレイ ............................................................................................... 132.3.2 static関数引数 ......................................................................................... 14

    2.4 ストレージ修飾子 ...................................................................................... 142.4.1 near/farデータメモリーオブジェクト .................................................... 142.4.2 near/farプログラムメモリーオブジェクト ............................................. 142.4.3 ram/rom 修飾子 .......................................................................................... 15

    2.5 ファイルサーチパスの追加........................................................................ 152.5.1 システムヘッダーファイル .......................................................................... 152.5.2 ユーザーヘッダーファイル .......................................................................... 15

    2.6 定義済みマクロ名 ...................................................................................... 162.7 ISO との相違 ............................................................................................. 16

    2.7.1 整数の昇格 ................................................................................................... 162.7.2 数値定数....................................................................................................... 162.7.3 文字列定数 ................................................................................................... 17

    2.8 言語拡張..................................................................................................... 192.8.1 匿名構造体 ................................................................................................... 192.8.2 インラインアセンブリ ................................................................................. 20

    2.9 Pragma ...................................................................................................... 212.9.1 #pragma sectiontype ............................................................................. 212.9.2 #pragma interruptlow fname /

    #pragma interrupt fname .................................................................... 272.9.3 #pragma varlocate bank variable-name

    #pragma varlocate "section-name" variable-name...................... 31

    2.10 プロセッサー指定ヘッダーファイル ......................................................... 332.11 プロセッサー指定レジスター定義ファイル............................................... 352.12 コンフィギュレーションワード................................................................. 35

  • MPLAB® C18 C コンパイラーユーザーズガイド

    DS51288C_JP-page iv 2005 Microchip Technology Inc.

    第 3 章 ランタイムモデル3.1 メモリーモデル.......................................................................................... 373.2 関数呼び出し規則 ...................................................................................... 38

    3.2.1 戻り値...........................................................................................................393.2.2 ソフトウェアスタックの管理.......................................................................403.2.3 C とアセンブリ言語の混在 ..........................................................................40

    3.3 スタートアップコード ............................................................................... 453.3.1 デフォルト動作 ............................................................................................453.3.2 カスタマイズ ................................................................................................46

    3.4 コンパイラー管理リソース........................................................................ 46

    第 4 章 最適化4.1 同一文字列の統合 ...................................................................................... 494.2 分岐の最適化 ............................................................................................. 504.3 バンク切り替え.......................................................................................... 504.4 WREG コンテンツトラッキング ............................................................... 514.5 コード整理 ................................................................................................. 514.6 最後部コードの併合 .................................................................................. 524.7 執行されないコードの削除........................................................................ 534.8 コピー伝播 ................................................................................................. 534.9 冗長保存の削除.......................................................................................... 544.10 不要コード削除.......................................................................................... 554.11 過程抽象 .................................................................................................... 55

    第 5 章 サンプルアプリケーション付録 A COFF ファイルフォーマット

    A.1 struct filehdr - ファイルヘッダー..................................................... 61A.1.1 unsigned short f_magic .............................................................................61A.1.2 unsigned short f_nscns .............................................................................61A.1.3 unsigned long f_timdat ............................................................................61A.1.4 unsigned long f_symptr ............................................................................61A.1.5 unsigned long f_nsyms...............................................................................61A.1.6 unsigned short f_opthdr ...........................................................................61A.1.7 unsigned short f_flags......................................................................62

    A.2 struct opthdr - オプショナルファイルヘッダー ................................. 62A.2.1 unsigned short magic ..........................................................................62A.2.2 unsigned short vstamp ........................................................................62A.2.3 unsigned long proc_type....................................................................62A.2.4 unsigned long rom_width_bits.........................................................64A.2.5 unsigned long ram_width_bits.........................................................64

    A.3 struct scnhdr - セクションヘッダー ................................................... 64A.3.1 union _s ....................................................................................................65A.3.2 unsigned long s_size ..........................................................................65A.3.3 unsigned long s_scnptr......................................................................65A.3.4 unsigned long s_relptr......................................................................65A.3.5 unsigned long s_lnnoptr....................................................................65A.3.6 unsigned short s_nreloc....................................................................65A.3.7 unsigned short s_nlnno......................................................................65A.3.8 unsigned long s_flags ........................................................................66

  • 目次

    2005 Microchip Technology Inc. DS51288C_JP-page v

    A.4 struct reloc - 再配置エントリー ......................................................... 66A.4.1 unsigned long r_vaddr ....................................................................... 66A.4.2 unsigned long r_symndx ..................................................................... 66A.4.3 short r_offset ...................................................................................... 66A.4.4 unsigned short r_type ....................................................................... 67

    A.5 struct syment - シンボルテーブルエントリー ..................................... 68A.5.1 union_n...................................................................................................... 68A.5.2 unsigned long n_value .............................................................................. 68A.5.3 short n_scnum......................................................................................... 69A.5.4 unsigned short n_type ....................................................................... 69A.5.5 char n_sclass.......................................................................................... 70A.5.6 char n_numaux.......................................................................................... 70

    A.6 struct coff_lineno - 行数エントリー................................................ 71A.6.1 unsigned long l_srcndx ..................................................................... 71A.6.2 unsigned short l_lnno ....................................................................... 71A.6.3 unsigned long l_paddr ....................................................................... 71A.6.4 unsigned short l_flags ..................................................................... 71A.6.5 unsigned long l_fcnndx ..................................................................... 71

    A.7 struct aux_file - ソースファイルの補助シンボルテーブル............... 71A.7.1 unsigned long x_offset ..................................................................... 71A.7.2 unsigned long x_incline ................................................................... 71A.7.3 unsigned char x_flags.......................................................................... 72

    A.8 struct aux_scn - セクションの補助シンボルテーブル ........................ 72A.8.1 unsigned long x_scnlen ..................................................................... 72A.8.2 unsigned short x_nreloc ................................................................... 72A.8.3 unsigned short x_nlinno ................................................................... 72

    A.9 struct aux_tag - タグ名struct/union/enumの補助シンボルテーブルエントリー ................................................................................................. 72A.9.1 unsigned short x_size ....................................................................... 72A.9.2 unsigned long x_endndx ..................................................................... 72

    A.10 struct aux_eos - struct/union/enum終了のための補助シンボルテーブル............................................................................................................ 73A.10.1 unsigned long x_tagndx ................................................................... 73A.10.2 unsigned short x_size ..................................................................... 73

    A.11 struct aux_fcn - 関数名の補助シンボルテーブルエントリー ............. 73A.11.1 unsigned long x_tagndx ................................................................... 73A.11.2 unsigned long x_lnnoptr ................................................................. 73A.11.3 unsigned long x_endndx ................................................................... 73A.11.4 short x_actscnum ................................................................................ 73

    A.12 struct aux_fcn_calls - 関数呼び出しの補助シンボルテーブルエントリー............................................................................................................ 74A.12.1 unsigned long x_calleendx............................................................. 74A.12.2 unsigned long x_is_interrupt ...................................................... 74

    A.13 struct aux_arr - 配列の補助シンボルテーブルエントリー................. 74A.13.1 unsigned long x_tagndx ................................................................... 74A.13.2 unsigned short x_size ..................................................................... 74A.13.3 unsigned short x_dimen[X_DIMNUM].............................................. 74

    A.14 struct aux_eobf - ブロックまたは関数終了のための補助シンボルテーブルエントリー.......................................................................................... 75A.14.1 unsigned short x_lnno ..................................................................... 75

  • MPLAB® C18 C コンパイラーユーザーズガイド

    DS51288C_JP-page vi 2005 Microchip Technology Inc.

    A.15 struct aux_bobf - ブロックまたは関数開始のための補助シンボルテーブルエントリー.......................................................................................... 75A.15.1 unsigned short x_lnno ......................................................................75A.15.2 unsigned short x_endndx..................................................................75

    A.16 struct aux_var - struct/union/enumタイプの変数の補助シンボルテーブルエントリー .................................................................................. 75A.16.1 unsigned long x_tagndx....................................................................75A.16.2 unsigned short x_size ......................................................................75

    A.17 struct aux_field - ビットフィールドの補助エントリー.................... 76A.17.1 unsigned short x_size ......................................................................76

    付録 B ANSI インプリメンテーション定義動作B.1 はじめに .................................................................................................... 77B.2 識別子 ........................................................................................................ 77B.3 文字型 ........................................................................................................ 77B.4 整数型 ........................................................................................................ 78B.5 浮動小数型 ................................................................................................. 78B.6 配列とポインタ.......................................................................................... 79B.7 レジスター ................................................................................................. 79B.8 構造体と共用体.......................................................................................... 79B.9 ビットフィールド ...................................................................................... 79B.10 列挙型 ........................................................................................................ 80B.11 SWITCH 文 ................................................................................................ 80B.12 プリプロセッシング指令 ........................................................................... 80

    付録 C コマンドライン要約付録 D MPLAB C18 の診断情報

    D.1 エラー ........................................................................................................ 83D.2 警告............................................................................................................ 93D.3 メッセージ ................................................................................................. 95

    付録 E 拡張モードE.1 ソースコード互換性 .................................................................................. 97

    E.1.1 スタックフレームサイズ..............................................................................97E.1.2 staticパラメーター..................................................................................97E.1.3 overlayキーワード ...................................................................................97E.1.4 インラインアセンブリ .................................................................................98E.1.5 定義済みマクロ ............................................................................................98

    E.2 コマンドラインオプションの差異 ............................................................. 99E.3 COFF ファイルの差異 ............................................................................... 99

    E.3.1 汎用プロセッサー ........................................................................................99E.3.2 ファイルヘッダーの f_flagsフィールド ..................................................99

    語彙集 ...........................................................................................................................101索引 ..............................................................................................................................107全世界の販売及びサービス拠点 ...................................................................................114

  • MPLAB® C18 C コンパイラーユーザーズガイド

    2005 Microchip Technology Inc. DS51288C_JP-page 1

    序文

    はじめに

    本書において、MPLAB® C18 コンパイラーの技術的詳細を論述します。本書では、MPLAB C18 コンパイラーの全機能について説明します。プログラマーの方はすでに以下の点を理解されている事が前提となります。

    • C プログラムを書く知識がある。• プログラムの作成及びデバッグにあたって、MPLAB 統合開発環境 (IDE) の使い方の知識がある。

    • 書かれたコードのプロセッサーデータシートを解読し理解できる。

    本ガイドについて

    レイアウト

    本書のレイアウトは以下の通りです。

    • 第 1 章 : はじめに – MPLAB C18 コンパイラーの概要及びコンパイラーを使用するための情報の提供。

    • 第 2 章 : 言語仕様 – MPLAB C18 コンパイラーと ANSI 基準の違いについて論述します。

    • 第 3 章 : ランタイムモデル – MPLAB C18 コンパイラーの PIC18 PICmicro® マイクロコントローラーリソースの使用方法を論述します。

    • 第 4 章 : 最適化 –MPLAB C18 コンパイラーによる最適化について論述します。• 第 5 章 : サンプルアプリケーション – サンプルアプリケーションを提供し、本ユーザーズガイドで論述した各トピックについてソースコードを説明します。

    • 付録 A: COFF ファイルフォーマット – Microchip の COFF フォーマット詳細を説明します。

    • 付録 B: ANSI インプリメンテーション定義済み動作 – ANSI 基準の要求に基づき、MPLAB C18 インプリメンテーション定義済み動作を検討します。

    • 付録 C: コマンドライン要約 – 各コマンドラインオプションのリストおよび各オプションについての詳細説明。

    • 付録 D: MPLAB C18 診断 – エラー、警告とメッセージのリスト。• 付録 E: 拡張モード – 非拡張モードと拡張モードの違いについて検討します。

  • MPLAB® C18 C コンパイラーユーザーズガイド

    DS51288C_JP-page 2 2005 Microchip Technology Inc.

    本ガイドに使用している約定

    このユーザーズガイドでは、以下の約定を使用します。

    文書上の約定

    文書のアップデート

    全ての文書は将来いずれ古くなり、このガイドも例外ではありません。MPLAB C18は顧客のニーズを満たすために絶え間なく進化します。そのため、本書の中で一部のツールに対する記述は実際と違う場合があります。最新の文書を入手するには弊社のウェブサイトを参照ください。

    文書番号の規則

    文書は "DS" 番号付けられます。各ページのページ数の前の番号が、その番号にあたります。DS 番号の規則は DSXXXXXA です。

    説明 表示 例

    コード (Courier フォント ):Courierフォント サンプルソースコード distance -= time * speed;

    ファイル名とパス c:\mcc18\h

    キーワード _asm, _endasm, static

    コマンドラインオプション

    -Opa+, -Opa-

    斜体 Courier 可変名引数 file.o, ここの fileは任意の有効ファイル名を意味する

    大括弧 [ ] オプション引数 mcc18 [options] file [options]省略符号 ... 繰り返すテキスト文例の

    置き換えvar_name [, var_name...]

    ユーザーが提供するコードを表す。

    void main (void){ ...}

    0xnnnn 16 進数、nは 16 進数値 0xFFFF, 0x007A文書 (Arial フォント ):斜体文字 レファレンスブック MPLAB User’s Guide

    XXXXX = 文書の番号。A = 文書の改定番号。

  • 序文

    2005 Microchip Technology Inc. DS51288C_JP-page 3

    PIC18 開発レファレンスreadme.c18

    MPLAB C18 C コンパイラーの使用に関する最新情報は、ソフトウェアに入っているreadme.c18(ASCII テキスト ) ファイルを参照ください。この readme ファイルには、本文書にはない最新情報が含まれています。

    MPLAB® C18 C コンパイラー入門ガイド (DS51295)MPLAB C18 コンパイラーのインストール方法、簡単なプログラムの書き方、MPLAB IDE とコンパイラーと一緒に使う方法について説明します。MPLAB® C18 C コンパイラーライブラリー (DS51297)MPLAB C18 ライブラリーとコンパイル済みオブジェクトファイルレファレンスガイド。MPLAB C18 C コンパイラーの全ライブラリーのリストと各関数の詳細な説明。 MPLAB® IDE V6.XX クイックスタートガイド (DS51281)MPLAB IDE ソフトウェアのセットアップ方法とプロジェクトの作成やデバイス書き込み方法についての説明。

    MPASM™ User’s Guide with MPLINK™ Linker and MPLIB™ Librarian (DS33014)

    Microchip PICmicro MCU アセンブラー (MPASM)、リンカー (MPLINK) とライブラリアンの使用方法の説明 (MPLIB)。PICmicro® 18C MCU ファミリーレファレンスマニュアル (DS39500)エンハンスト MCU ファミリーデバイスに焦点をあてます。エンハンスト MCU ファミリーアーキテクチャーとペリフェラルモジュールの操作について説明します。但し、各デバイスの詳細については説明しません。

    PIC18 デバイスデータシートとアプリケーションノートデータシートは PIC18 デバイスの操作と電気的仕様を説明しています。アプリケーションノートは、PIC18 デバイスの使用方法を説明しています。上述の書類を入手するには、Microchip のウェブサイト (www.microchip.com) にアクセスし Adobe Acrobat フォーマット (.pdf) のファイルをダウンロードしてください。

  • MPLAB® C18 C コンパイラーユーザーズガイド

    DS51288C_JP-page 4 2005 Microchip Technology Inc.

    C 参考書American National Standard for Information Systems – Programming Language – C.

    American National Standards Institute (ANSI), 11 West 42nd. Street, New York, New York, 10036.

    この規格はプログラミング言語 C で表現するプログラムの形式を指定し、解釈を行っています。様々なコンピューターシステムで C 言語のプログラムの携帯性、信頼性、保守性と効率的な実行を促進することを目的としています。

    Beatman, John B. Embedded Design with the PIC18F452 Microcontroller, First Edition. Pearson Education, Inc., Upper Saddle River, New Jersey 07458.

    Microchip の PIC18FXXX ファミリーとエンハンストアプリケーションコードの書き方に焦点をあてています。

    Harbison, Samuel P. and Steele, Guy L., C A Reference Manual, Fourth Edition. Prentice-Hall, Englewood Cliffs, New Jersey 07632.

    C プログラミング言語を詳細に扱っています。本書は C 言語の詳述、ランタイムライブラリーと正確性、携帯性及び保守性に焦点をあてた C プログラミングのスタイルについてのレファレンスマニュアルです。

    Kernighan, Brian W. and Ritchie, Dennis M. The C Programming Language, Second Edition. Prentice Hall, Englewood Cliffs, New Jersey 07632.

    ANSI 規格定義しているように、C について簡潔に説明しています。本書は C言語プログラマーにとってすばらしい参考書です。

    Kochan, Steven G. Programming In ANSI C, Revised Edition. Hayden Books, Indianapolis, Indiana 46268.

    ANSI C を学ぶ上で優れた参考書の一つ。大学等で利用されています。Van Sickle, Ted. Programming Microcontrollers in C, First Edition. LLH Technology

    Publishing, Eagle Rock, Virginia 24085.

    本書はモトローラのマイクロコントローラーに焦点をあてていますが、マイクロコントローラーを C でプログラミングするための原則のところは有益です。

  • 序文

    2005 Microchip Technology Inc. DS51288C_JP-page 5

    MICROCHIP ウェブサイトMicrochip は、Microchip ホームページ上でオンラインサポートを提供しています。弊社はこのサイトを、お客様にファイルや情報を簡単に入手いただけるようにするための手段として使用しています。このサイトをご覧いただくには、インターネットへのアクセス手段とネットスケープナビゲーター ® やマイクロソフト ® インターネットエクスプローラーの様なブラウザ必要です。

    Microchip ウェブサイトにはお好みのインターネットブラウザで下記アドレスを使っていただければアクセス可能です。

    http://www.microchip.com

    ウェブサイトでは様々なサービスを提供しています。最新の開発ツール、データシート、アプリケーションノート、ユーザーズガイド、記事やサンプルプログラムをダウンロードいただけます。Microchip の営業所、代理店や工場の代表者等のMicrochip のビジネスの固有情報についても入手いただけます。

    テクニカルサポート

    • よくある質問 (FAQ)• オンラインディスカッショングループ - 製品、開発システム、技術情報等に関するコンファレンス

    • Microchip コンサルタントプログラムのメンバーリスト• Microchip 製品に関するその他の有益なウェブサイトへのリンク

    エンジニアのツールボックス

    • デザイン秘訣• デバイス正誤表

    他の入手可能情報

    • Microchip の最新プレスリリース• セミナーやイベントの一覧表• 求人

    開発システム顧客通知サービス

    Microchip は、お客様が Microchip 製品の最新情報を簡単に入手できるよう、顧客通知サービスを開始しました。一度購読いただくと、お客様が指定された製品ファミリーまたは関心をお持ちの開発ツールについて変更、アップデート、修正または正誤があった場合電子メールにて通知させていただきます。

    (http://www.microchip.com) の Microchip ウェブサイトにアクセスいただき、顧客変更通知をクリックしてください。その後は登録の指示に従ってください。

    開発システム製品グループのカテゴリーは以下の通りです。

    • コンパイラー• エミュレーター• インサーキットデバッガ• MPLAB IDE• プログラマー

  • MPLAB® C18 C コンパイラーユーザーズガイド

    DS51288C_JP-page 6 2005 Microchip Technology Inc.

    以下が各カテゴリーの説明です。

    コンパイラー – Microchip C コンパイラーと他の言語ツールの最新情報。MPLAB C17, MPLAB C18 と MPLAB C30 C コンパイラー ;MPASM™ と MPLAB ASM30 アセンブラー ;MPLINK™ と MPLAB LINK30 オブジェクトリンカー ;MPLIB™ と MPLAB LIB30 オブジェクトライブラリアンが含まれています。エミュレーター – Microchip のインサーキットエミュレーターの最新情報。MPLAB ICE 2000 と MPLAB ICE 4000 が含まれています。インサーキットデバッガ – Microchip インサーキットデバッガ、MPLAB ICD 2 の最新情報。

    MPLAB IDE – 開発システムツールための Windows® 統合開発環境である Microchip MPLAB® IDE の最新情報。このリストでは、MPLAB IDE、MPLAB SIM シミュレーター、MPLAB IDE プロジェクトマネジャーと通常のエディットやデバグ機能に焦点をあてています。

    プログラマー – Microchip デバイスプログラマーの最新情報。MPLAB PM3、PRO MATE® II デバイスプログラマーと PICSTART® プラス 開発プログラマーが含まれています。

    カスタマーサポート

    Microchip 製品ユーザーは、以下のチャンネルを通じてサポートを受けることができます。

    • 代理店または代理人• 営業所• フィールドアプリケーションエンジニア (FAE)• 企業向けアプリケーションエンジニア (CAE)• ホットラインサポートを受けるには、代理店、代理人またはフィールドアプリケーションエンジニア (FAE) へご連絡ください。各営業所でもサポートを行っております。営業所と場所につきましては裏面をご覧ください。

    (480) 792-7627 の企業向けアプリケーションエンジニア (CAE) にご連絡いただいても結構です。

    更に、システムの情報やアップグレード用の連絡先があります。この連絡先では、システムユーザー様に Microchip の開発システムソフトウェア製品の最新版のリストを提供致しております。また、最新のアップグレードキットの入手方法についての情報を提供させていただいております。

    ホットライン番号は以下の通りです。

    1-800-755-2345( 米国とカナダの大部分 )。1-480-792-7302( その他の国々 )。

  • MPLAB® C18 C コンパイラーユーザーズガイド

    2005 Microchip Technology Inc. DS51288C_JP-page 7

    第 1 章 はじめに

    1.1 概要MPLAB C18 コンパイラーは、PIC18 PICmicro® マイクロコントローラー (MCU) のための最適な自立 ANSI C コンパイラーです。ANSI 基準が効率的な PICmicro MCUサポートと矛盾する場合だけ、このコンパイラーは ANSI 基準 X3.159-1989 から逸脱します。コンパイラーは 32 ビット Windows コンソールアプリケーションで、Microchip MPLAB IDE と完全互換性があります。また、MPLAB ICE インサーキットエミュレーター、MPLAB ICD 2 インサーキットデバッガまたは MPLAB SIM シミュレーターにおいてソースレベルでデバッギングが可能となります。

    MPLAB C18 コンパイラーは以下の機能を持っています。• ANSI '89 互換性• 使い勝手のよいプロジェクトマネジメントとソースレベルデバッギングのための

    MPLAB IDE との統合• エンハンストコード再利用のための再配置可能オブジェクトモジュールの作成• MPASM アセンブラーが作成するオブジェクトモジュールとの互換性をもたせる事によって、一つのプロジェクトでアセンブラーと C プログラミングを混合させることが可能となります

    • 外部メモリーへの透明な読み込み / 書き込み• リアルタイムコントロールが必要時のインラインアセンブリへの強力なサポート• マルチレベルの最適化が可能な効率的コード作成エンジン• PWM、SPI™、I2C™、UART、USART、文字列操作や数学ライブラリーを含む強力なライブラリーサポート

    • ユーザーレベルでのデータやコードメモリー配置コントロール

    1.2 コンパイラーの起動についてMPLAB® C18 入門ガイドは (DS51295)、MPLAB IDE 上においてコンパイラーの使用方法を説明します。コンパイラーはコマンドラインから立ち上げることもできます。コマンドライン使用方法は以下の通りです。

    mcc18 [options] file [options]

    単一ソースファイルと任意のオプションを指定できます。--helpコマンドラインオプションには、コンパイラーが受け入れるコマンドラインオプションを記載しています。-verboseコマンドラインオプションによって、コンパイル終了時にバージョン情報、およびエラー、警告とメッセージの合計数を表示します。

  • MPLAB® C18 C コンパイラーユーザーズガイド

    DS51288C_JP-page 8 2005 Microchip Technology Inc.

    1.2.1 出力ファイル作成デフォルトで、コンパイラーは file.oという出力オブジェクトファイルを作成します。この fileは拡張名を除くコマンドラインで指定したソースファイルの名前です。出力オブジェクトファイル名を、-foコマンドラインオプションにオーバーライトすることも可能です。例えば、

    mcc18 -fo bar.o foo.c

    ソースファイルにエラーがある場合、コンパイラーは file.err名のエラーファイルを作成します。この fileは拡張名を除くコマンドラインで指定したソースファイル名です。エラーファイル名を-feコマンドラインオプションにオーバーライトすることができます。例えば、

    mcc18 -fe bar.err foo.c

    1.2.2 診断情報の表示-w と-nw コマンドラインオプションを使用して、診断をコントロールできます。-w コマンドラインオプションは警告診断レベル (1, 2 または 3) を設定します。表 1-1 は警告診断のレベルと診断タイプを示しています。 -nw コマンドラインオプションは、指定のメッセージ ( 付録 D または--help-message-listコマンドラインオプションはコンパイラーが作成した全てのメッセージを掲載しています。) を禁止します。すべてのメッセージのヘルプは、--help-message-allコマンドラインオプションを使って見る事ができます。特定の診断に関するヘルプについては、--help-messageを使うことができます。例えば、

    mcc18 --help-message=2068

    以下の結果を表示 :2068: obsolete use of implicit 'int' detected.

    The ANSI standard allows a variable to be declared without a base type being specified, e.g., "extern x;", in which case a base type of 'int' is implied. This usage is deprecated by the standard as obsolete, and therefore a diagnostic is issued to that effect.

    表 1-1: 警告レベル警告レベル 表示される診断

    1 エラー ( 致命的および非致命的 )2 レベル 1 プラス警告3 レベル 2 プラスメッセージ

  • はじめに

    2005 Microchip Technology Inc. DS51288C_JP-page 9

    1.2.3 マクロ定義-Dコマンドラインオプションによって、マクロの定義が可能になります。 -Dコマンドラインオプションを 2 通りの方法で指定できます。その方法とは-Dnameまたは -Dname=valueです。-Dnameは値 1 を持つマクロ name名を定義します。 -Dname=valueは値 valueを持つマクロ nameを定義します。例えば、

    mcc18 -DMODE

    はマクロ MODEモードが 1 の値を持つように定義します。そして、mcc18 -DMODE=2

    はマクロ MODEモードが 2 の値を持つ様に定義します。-Dコマンドラインオプションを使用する例としては、条件付コンパイルにおいてです。例えば、

    #if MODE == 1x = 5;

    #elif MODE == 2x = 6;

    #elsex = 7;

    #endif

    1.2.4 プロセッサーの選択デフォルトで、MPLAB C18 は汎用 PIC18 PICmicro マイクロコントローラーのアプリケーションをコンパイルします。オブジェクトファイルを、-pprocessorコマンドラインオプションを持つ特定のプロセッサーに限定する事が可能です。つまり、processorで特定のプロセッサーを限定します。例えば、PIC18F452 だけを使うオブジェクトファイルを制限するには、コマンドラインオプション-p18f452を使用します。コマンドラインオプション-p18cxxは、汎用 PIC18 PICmicro マイクロコントローラーのソースをコンパイルすることを説明しています。

    1.2.5 モードの選択コンパイラーは、2 種類のモードで動作可能です。つまり拡張モードまたは非拡張モードです。拡張モードで動作する時、コンパイラーは拡張命令 ( 例: ADDFSR, ADDULNK, CALLW, MOVSF, MOVSS, PUSHL, SUBFSRまたはSUBULNK)を使用するとともにリテラルオフセットアドレッシングを使用します。これにより、スタックベース変数へのアクセス命令が少なくて済みます ( プログラムメモリの使用量は小さくできます )。非拡張モードで動作する時、コンパイラーは拡張命令またはリテラルオフセットアドレッシングを使用しません。--extendedと --no-extendedコマンドラインオプションはコンパイラーに動作モードを伝えます。表 1-2 は指定のコマンドラインオプションに基づきコンパイラーが動作するモードを説明しています。

  • MPLAB® C18 C コンパイラーユーザーズガイド

    DS51288C_JP-page 10 2005 Microchip Technology Inc.

    表 1-2: モード選択

    -p extended -p no-extended -p18cxx プロセッサーの指定なし

    --extended 拡張 エラー 拡張 拡張

    --no-extended 非拡張 非拡張 非拡張 非拡張

    指定なし 非拡張 非拡張 非拡張 非拡張

    注 : コンパイラーを mcc18 --helpで起動する場合、表示ヘルプは非拡張で動作するコンパイラー用です。しかし、コンパイラーが拡張モードで動作する場合、全

    てのコマンドラインオプションが有効ということではありません。拡張モードで動作するコンパイラーのヘルプを見るには、コマンドライン mcc18 --extended --helpを使用ください。

    注 : 他のコマンドラインオプションは本ユーザーズガイドを通して論述されます。全べてのコマンドラインの要約は、付録 C にあります。

  • MPLAB® C18 C コンパイラーユーザーズガイド

    2005 Microchip Technology Inc. DS51288C_JP-page 11

    第 2 章 言語仕様

    2.1 データタイプと制限

    2.1.1 整数型MPLAB C18 コンパイラーは、ANSI 規格に準拠する整数型をサポートしています。整数型規格の範囲が表 2-1 に記載されています。更に、MPLAB C18 は 24 ビット整数型 short long int ( または long short int) を符号付きと符号のない種類でサポートしています。このタイプの範囲も表 2-1 に記載されています。

    表 2-1: 整数型データタイプサイズと制限タイプ サイズ 最小値 最大値

    char(1,2) 8 ビット -128 127signed char 8 ビット -128 127unsigned char 8 ビット 0 255int 16 ビット -32,768 32,767unsigned int 16 ビット 0 65,535short 16 ビット -32,768 32,767unsigned short 16 ビット 0 65,535short long 24 ビット -8,388,608 8,388,607unsigned short long 24 ビット 0 16,777,215long 32 ビット -2,147,483,648 2,147,483,647unsigned long 32 ビット 0 4,294,967,295注 1: charだけの場合デフォルトで符号付になります。

    2: charだけの場合、-kコマンドラインオプションによりデフォルトで符号なしになります。

  • MPLAB® C18 C コンパイラーユーザーズガイド

    DS51288C_JP-page 12 2005 Microchip Technology Inc.

    2.1.2 浮動小数点型32 ビット浮動小数点型は、doubleまたは floatデータタイプのいずれかを使用する MPLAB C18 には備わっています。浮動小数点型の範囲は表 2-2 に記載されています。

    表 2-2: 浮動小数点型データタイプのサイズと制限

    浮動小数点算術のための MPLAB C18 フォーマットは、IEEE 754 フォーマットの変形形式です。MPLAB C18 フォーマットと IEEE 754 フォーマットの違いは、上位 9ビット表示順によります。左シフトさせれば IEEE 754 フォーマットから MPLAB C18 フォーマットに変換します。右シフトさせれば MPLAB C18 フォーマットからIEEE 754 フォーマットへ変換します。表 2-3 はこの 2 つのフォーマットの比較表です。

    表 2-3: MPLAB C18 浮動小数点 対 IEEE 754 フォーマット

    2.2 データタイプ保存 - ENDIANNESSEndianness はマルチバイト値のバイトの保存順序です。MPLAB C18 は"little-endian" フォーマットでデータを保存します。若い番地に下位バイトが保存されます。値を " 下位を最初に " を基準に保存します。例えば、#pragma idata test=0x0200long l=0xAABBCCDD;

    メモリーレイアウトの結果は以下の通りです。

    タイプ サイズ最小

    指数値最大

    指数値正規化最小値 正規化最大値

    float 32 ビット -126 128 2–126 ≈ 1.17549435e - 38 2128 * (2-2–15) ≈ 6.80564693e + 38double 32 ビット -126 128 2–126 ≈ 1.17549435e - 38 2128 * (2-2–15) ≈ 6.80564693e + 38

    規格 指数バイト バイト 0 バイト 1 バイト 2IEEE 754 se0e1e2e3e4e5e6 e7ddd dddd dddd dddd dddd ddddMPLAB C18 e0e1e2e3e4e5e6e7 sddd dddd dddd dddd dddd dddd凡例 : s = 符号ビット

    d = 仮数e = 指数

    アドレス 0x0200 0x0201 0x0202 0x0203コンテンツ 0xDD 0xCC 0xBB 0xAA

  • 言語仕様

    2005 Microchip Technology Inc. DS51288C_JP-page 13

    2.3 ストレージクラスMPLAB C18はANSI規格のストレージクラス (自動変数、 外部変数、 レジスタ変数、 静的変数と typedef) をサポートしています。

    2.3.1 オーバーレイMPLAB C18 コンパイラーは overlayストレージクラスを導入しています。over-lay ストレージクラスは、コンパイラーが非拡張モードで動作するときにのみ適用されます ( セクション 1.2.5 「モードの選択」を参照 )。 overlayストレージクラスはローカル変数 ( 正式パラメーター、関数定義またはグローバル変数を除く ) に適用できます。オーバーレイストレージクラスは関連シンボルを関数指定の静的overlayセクションに配分します。こうした変数を静的に割り当てますが、各関数の入力時に初期化されます。例えば、

    void f (void){ overlay int x = 5; x++;}

    ストレージを静的に割り当てますが、x は各関数に入る時に 5 に初期化されます。初期化がない場合、関数に入る時の値は未定義となります。

    MPLINK リンカは、同時にアクティブにならないことを保証した関数からの over-lay のように、指定のローカルストレージをオーバーレイしようとします。例えば、int f (void){ overlay int x = 1; return x;}

    int g (void){ overlay int y = 2; return y;}

    fとgが同時にアクティブにならない場合、xとyは同じメモリーロケーションを共有する候補になります。しかし、次の例では :

    int f (void){ overlay int x = 1; return x;}

    int g (void){ overlay int y = 2; y = f ( ); return y;}

    fとgが同時にアクティブなので、xとyはオーバーレイされません。overlayローカルを使用する利点は、そのローカルを静的に割り当てている点です。つまり、通常、アクセスする命令数が少ないです ( プログラムメモリの使用量は少なくなります )。同時に、いくつかの変数をオーバーレイするため、これらの変数に必要な全データメモリー空間は、staticと宣言する場合より少ないです。

  • MPLAB® C18 C コンパイラーユーザーズガイド

    DS51288C_JP-page 14 2005 Microchip Technology Inc.

    MPLINK リンカがストレージ overlayのローカル変数を含む再帰関数を検知した場合、エラーが発生し停止します。MPLINK リンカが任意のモジュールの中でポインターを通して関数呼び出しを行ない、任意モジュール ( 同じモジュールとは限らない ) でストレージクラス overlayのローカル変数を検知した場合、エラーが発生し停止します。

    ローカル変数のデフォルトストレージクラスは autoです。これを明示的に static または overlayキーワードを用いて、あるいは暗示的に-scs (staticローカル変数 ) または-sco ( オーバーレイローカル変数 ) コマンドラインオプションを用いてオーバーライドすることは可能です。完全性を保つため、MPLAB C18 は-scaコマンドラインオプションをサポートしています。このオプションによって、ローカル変数のストレージクラスを明示的に autoに指定できます。

    2.3.2 static関数引数関数パラメーターは auto または staticのストレージクラスを持つ事ができます。autoパラメーターをソフトウェアスタックに配置すると、再入が可能となります。staticパラメーターをグローバルに割り当てると、直接アクセスが可能で、必要な命令数も通常少ないです。staticパラメーターはコンパイラーが非拡張モードで動作する時にのみ有効になります ( セクション 1.2.5 「モードの選択」を参照 )。関数パラメーターのデフォルトストレージクラスは autoです。これを明示的にstaticキーワードまたは暗示的に-scsコマンドラインオプションにオーバーライドすることが可能です。 -scoコマンドラインオプションは暗示的に関数パラメーターのストレージクラスを staticにオーバーライドします。

    2.4 ストレージ修飾子ANSI 規格の修飾子 (const、volatile) に加え、MPLAB C18 コンパイラーは far、near、rom と ramのストレージ修飾子を導入しています。構文上で、 これら新しい修飾子と識別子の関係は、ANSI C 中の constや volatile修飾子と識別子の関係と同じです。表 2-4 は定義時に指定したストレージ修飾子に基づくオブジェクトのロケーションを示しています。明確なストレージ修飾子がなしに定義されたオブジェクトのデフォルトストレージ修飾子は farと ramです。

    表 2-4: ストレージ修飾子によるオブジェクトのロケーション

    2.4.1 near/farデータメモリーオブジェクトfar修飾子は、データメモリーにある変数がメモリーバンクに存在し、この変数にアクセスする前にバンクスイッチ命令が必要であることを示すために使われます。near修飾子は、データメモリのアクセス RAM にあることを示すのに使われます。

    2.4.2 near/farプログラムメモリーオブジェクトfar修飾子は、プログラムメモリーにある変数がメモリープログラムの任意場所にある、またはポインタの場合、64K 以上のプログラムメモリーにアクセスできることを示すために使われます。near修飾子は、変数が 64K 以内のプログラムメモリにある、またはポインタの場合、64K までのプログラムメモリーをアクセスできることを示すために使用されます。

    rom ram

    far 任意プログラムメモリー 任意データメモリー ( デフォルト )

    near 64K 以内のプログラムメモリー アクセスメモリー

  • 言語仕様

    2005 Microchip Technology Inc. DS51288C_JP-page 15

    2.4.3 ram/rom 修飾子PICmicro マイクロコントローラーは、別々のプログラムメモリーとデータメモリーアドレスバスを使用するため、MPLAB C18 はプログラムメモリーのデータとデータメモリーのデータを識別するための拡張が必要です。ANSI/ISO C 規格はコードとデータが別々のアドレススペースにあることを認めています。しかし、コードスペースにデータを配置するには十分ではありません。このため、MPLAB C18 は romと ram修飾子を導入しています。 rom修飾子は、オブジェクトがメモリープログラムにあることを示します。一方、ram修飾子は、オブジェクトがデータメモリーにあることを示しています。 ポインタはデータメモリー (ram ポインタ ) またはプログラムメモリー (rom ポインタ ) を指します。 romと宣告がない場合、ポインタは ramポインタと見なされます。ポインタのサイズはポインタのタイプにより、表 2-5 に示されています。

    表 2-5: ポインタサイズ

    2.5 ファイルサーチパスの追加2.5.1 システムヘッダーファイル#include で指定されたソースファイルの取り込みは、MCC_INCLUDE環境変数に指定しているパスと-Iコマンドラインオプションで指定するディレクトリーで検索します。MCC_INCLUDE環境変数と-Iの値はセミコロンで区切りとした検索ディレクトリーリストです。指定ファイルは MCC_INCLUDE環境変数に記載されているディレクトリーと-Iコマンドラインオプションに記載されているディレクトリー両方存在する場合、-Iコマンドラインオプションのディレクトリーから取り込みます。これにより、MCC_INCLUDE環境変数は-Iコマンドラインオプションにオーバーライドされることが可能になります。

    2.5.2 ユーザーヘッダーファイル#include “filename” のソースファイルを、まずはファイルを含むディレクトリーで検索します。見つからない場合、システムヘッダーファイルの検索方法で検索します ( セクション 2.5.1 「システムヘッダーファイル」を参照 )。

    注 : rom変数に書き込む時、コンパイラーは TBLWT命令を使用します。しかし、使用するメモリータイプに基づき、追加のアプリケーションコードが必要になることもあります。追加情報についてはデータシートを参照ください。

    ポインタタイプ 例 サイズ

    データメモリーポインタ char * dmp; 16 ビットNear プログラムメモリーポインタ rom near char * npmp; 16 ビットFar プログラムメモリーポインタ rom far char * fpmp; 24 ビット

  • MPLAB® C18 C コンパイラーユーザーズガイド

    DS51288C_JP-page 16 2005 Microchip Technology Inc.

    2.6 定義済みマクロ名標準の定義済みマクロに加え、MPLAB C18 は以下の定義済みマクロを提供しています。

    __18CXX 定数 1 は MPLAB C18 コンパイラーを示す事を意味します。__PROCESSOR 特定のプロセッサー指定でコンパイルする場合、定数 1。例えば、

    -p18c452コマンドラインオプションでコンパイルする場合 __18C452を定数 1と定義し、 -p18f258コマンドラインオプションでコンパイルする場合、__18F258と定義します。

    __SMALL__ -msコマンドラインオプションでコンパイルする場合、定数 1。__LARGE__ -ml コマンドラインオプションでコンパイルする場合、定数 1。__TRADITIONAL18__ 非拡張モードを使う場合、定数 1。

    ( セクション 1.2.5 「モードの選択」を参照 )。__EXTENDED18__ 拡張モードで使用する場合、定数 1。

    ( セクション 1.2.5 「モードの選択」を参照 )。

    2.7 ISO との相違

    2.7.1 整数の昇格ISO は、全ての計算を int精度以上で遂行することを求めています。デフォルトで、オペランド数が intより小さい場合でも、MPLAB C18 は計算を最大オペランドサイズで遂行します。ISO の命令動作を-Oiコマンドオプションライン経由でつけることは可能です。

    例えば :unsigned char a, b;unsigned i;

    a = b = 0x80;i = a + b; /* ISO requires that i == 0x100, but in C18 i == 0 */

    この多様性は定数リテラルに適用します。定数リテラルの選択したタイプは、オーバーフローがない定数値を示す適切なグループからの最初のリテラルです。

    例えば :#define A 0x10 /* A will be considered a char unless -Oi specified */#define B 0x10 /* B will be considered a char unless -Oi specified */#define C (A) * (B)

    unsigned i;i = C; /* ISO requires that i == 0x100, but in C18 i == 0 */

    2.7.2 数値定数MPLAB C18は16進 (0x)と8進 (0)の標準接頭辞をサポートし、0b接頭辞を使った二進数もサポートしています。例えば、237 という値は、二進数では 0b11101101となります。

  • 言語仕様

    2005 Microchip Technology Inc. DS51288C_JP-page 17

    2.7.3 文字列定数データとしてプログラムメモリに保存される場合その主要使途は文字列定数です。したがって MPLAB C18 は全ての文字列定数をプログラムメモリに配置します。このタイプの文字列定数は " プログラムメモリーにある char配列 " (const rom char []) です。 .stringtableセクションは全ての定数文字列を含む romdataです ( セクション 2.9.1 「#pragma sectiontype」を参照 )。例えば、以下の文字列メ hello モを .stringtableセクションに配置されます。

    strcmppgm2ram (Foo, "hello");

    定数文字列はプログラムメモリーにあるため、文字列を扱う標準関数は複数ありま

    す。例えば、strcpy関数は 4 種類あり、データやプログラムメモリーへ ( から )文字列をコピーできます。

    /* * Copy string s2 in data memory to string s1 in data memory */char *strcpy (auto char *s1, auto const char *s2);

    /* * Copy string s2 in program memory to string s1 in data * memory */char *strcpypgm2ram (auto char *s1, auto const rom char *s2);

    /* * Copy string s2 in data memory to string s1 in program * memory */ rom char *strcpyram2pgm (auto rom char *s1, auto const char *s2);

    /* * Copy string s2 in program memory to string s1 in program * memory */rom char *strcpypgm2pgm (auto rom char *s1, auto const rom char *s2);

    MPLAB C18 を使用する時、プログラムメモリーの文字列テーブルを以下のように宣言します。

    rom const char table[][20] = { "string 1", "string 2", "string 3", "string 4" };rom const char *rom table2[] = { "string 1", "string 2", "string 3", "string 4" };

    table宣言は、各 20文字の長さの 4つの文字列の配置を宣言し、80バイトのプログラムメモリーを必要とします。table2をプログラムメモリーに対するポインタの配置と宣言します。 * の後の rom修飾子はポインター配列をプログラムメモリに配置します。table2のすべての文字列は 9 バイトの長さで、配列は 4 つの要素の長さです。従って、table2は (9*4+4*2) = 44 バイトのプログラムメモリーを使います。 table2へのアクセスは、 tableへのアクセスよりも非効率かもしれません。それは、ポインタが追加レベルの間接指示を要求するためです。

    MPLAB C18 の別々のアドレス空間における重要な影響は、プログラムメモリーのデータに対するポインタと データメモリーのデータを指すポインタは互換性がないということです。二つのポインタが互換性のあるタイプのオブジェクトを指している、且つポインタが指し示すオブジェクトが同じアドレス空間にある場合以外は、互換性はありません。例えば、プログラムメモリーの文字列を示すポインタとデータメモリーの文字列を指すポインタに互換性はありません。これは、別のアドレス空間に文字列が存在するためです。

  • MPLAB® C18 C コンパイラーユーザーズガイド

    DS51288C_JP-page 18 2005 Microchip Technology Inc.

    プログラムからデータメモリーに文字列をコピーする関数を以下のように書けます。

    void str2ram(static char *dest, static char rom *src){ while ((*dest++ = *src++) != '\0') ;}

    以下のコードは PICmicro MCU C ライブラリーを使って、PIC18C452 の USART にプログラムメモリーの文字列を送ります。文字列を USART 送るライブラリー関数、putsUSART(const char *str)は文字列を指すポインタを引数とみなし、文字列はデータメモリに配置されているでなければいけません。 rom char mystring[] = "Send me to the USART";

    void foo( void ){ char strbuffer[21]; str2ram (strbuffer, mystring); putsUSART (strbuffer);}

    代わりに、プログラムメモリーにある文字列から読み込むためにライブラリールーチンを変更できます。

    /* * The only changes required to the library routine are to * change the name so the new routine does not conflict with * the original routine and to add the rom qualifier to the * parameter. */void putsUSART_rom( static const rom char *data ){ /* Send characters up to the null */ do { while (BusyUSART()) ;

    /* Write a byte to the USART */ putcUSART (*data); } while (*data++);}

  • 言語仕様

    2005 Microchip Technology Inc. DS51288C_JP-page 19

    2.8 言語拡張

    2.8.1 匿名構造体MPLAB C18 は、共用体内に匿名構造体をサポートしています。匿名構造体のフォームは以下の通りです。 struct { member-list };

    匿名構造体は匿名オブジェクトを定義します。匿名構造体のメンバーの名前は構造体を宣言している作用域の他の名前とは区別しなければいけません。この作用域内、通常のメンバーアクセス方法が必要とせず、直接メンバーの使用が可能です。

    例えば :union foo{ struct { int a; int b; }; char c;} bar;char c;

    ...

    bar.a = c; /* 'a' is a member of the anonymous structure located inside 'bar' */

    オブジェクトまたはポインタを宣言した構造体は匿名構造体ではありません。例えば :union foo{ struct { int a; int b; } f, *ptr; char c;} bar;char c:

    ...

    bar.a = c; /* error */bar.ptr->a = c; /* ok */

    bar.aへの代入は違法です。なぜなら、メンバー名が特定のオブジェクトと関連していないためです。

  • MPLAB® C18 C コンパイラーユーザーズガイド

    DS51288C_JP-page 20 2005 Microchip Technology Inc.

    2.8.2 インラインアセンブリMPLAB C18 は、MPASM アセンブラーに類似する構文を使った内部アセンブラーを提供しています。アセンブラーコードのブロックは _asmで始まり、_endasmで終わる必要があります。ブロック内の構文は以下の通りです。 [label:] [ [arg1[, arg2[, arg3]]]]

    内部アセンブラーは MPASM アセンブラーと以下の点で違いがあります。 • 指示語命令をサポートしていません• コメントは C または C++ 表記である必要があります• テーブルの読み込み / 書き込みには、完全なテキストニーモニックを使用しなければなりません。 例えば、

    - TBLRD

    - TBLRDPOSTDEC

    - TBLRDPOSTINC

    - TBLRDPREINC

    - TBLWT

    - TBLWTPOSTDEC

    - TBLWTPOSTINC

    - TBLWTPREINC

    • 命令オペランドにデフォルトはありません。全てのオペランドを完全に指定する必要があります

    • デフォルト基数は十進数です• C 基数表記でリテラルを指定します。MPASM アセンブラー表記を使用しません。例えば、16 進数を 0x1234と指定すべきで、H’1234’ではありません。

    • ラベルにはコロン含める必要があります• インデックスアドレス構文 ( 例: []) はサポートされていません。- リテラルとアクセスビット ( 例えば CLRF 2,0、 CLRF [2]ではありません ) を指定する必要があります。

    例えば :_asm /* User assembly code */ MOVLW 10 // Move decimal 10 to count MOVWF count, 0

    /* Loop until count is 0 */ start: DECFSZ count, 1, 0 GOTO done BRA start done:_endasm

    通常、インラインアセンブリの使用を最低限に制限する事をお勧めします。インラインアセンブリに含まれている関数はコンパイラーで最適化されません。長いアセンブリコードを書く場合、MPASM を使用します。後に MPLINK を使用して、アセンブリコードモジュールを C モジュールにリンクします。

  • 言語仕様

    2005 Microchip Technology Inc. DS51288C_JP-page 21

    2.9 PRAGMA

    2.9.1 #pragma sectiontypeセクション宣言 pragma は、現在のセクションを MPLAB C18 が割り当てる関連タイプのセクションへ変更します。

    セクションは特定のメモリーアドレスにあるアプリケーションの一部です。セクションにはコードまたはデータを含めることができます。セクションをプログラムまたはデータメモリーに配置できます。各メモリーについて 2 タイプのセクションがあります。

    • プログラムメモリー- code – 実行可能な命令を含んでいます- romdata – 変数と定数を含んでいます

    • データメモリー- udata – 静的に割り当てられた未初期化ユーザー変数を含んでいます- idata – 静的に割り当てられた初期化ユーザー変数を含んでいます

    セクションは絶対的なもの、割り当てられているものまたは割り当てられていないものがあります。絶対セクションはセクション宣言 pragma の =addressを介し、明確なアドレスを与えられたセクションです。割り当てられたセクションは、リンカスクリプトの SECTION 命令と通して指定セクションと見なされているセクションです。割り当てられていないセクションは、絶対または割り当てられたセクション以外のものです。

    2.9.1.1 構文

    セクション指示語命令 :# pragma udata [attribute-list] [section-name [=address]]

    | # pragma idata [attribute-list] [section-name [=address]]| # pragma romdata [overlay] [section-name [=address]]| # pragma code [overlay] [section-name [=address]]

    属性リスト :

    属性| 属性リスト 属性

    属性 :

    access| overlay

    section-name: C 識別子

    address: 整数定数

  • MPLAB® C18 C コンパイラーユーザーズガイド

    DS51288C_JP-page 22 2005 Microchip Technology Inc.

    2.9.1.2 セクションコンテンツ

    codeセクションは実行可能なコンテンツを含み、プログラムメモリーに配置されます。romdata セクションには、プログラムメモリーに割り当てられたデータが含まれています ( 通常、 rom 修飾子で宣言した変数 )。romdataの使用方法に関する追加情報 ( 例 : メモリーマップペリフェラル ) については、MPASM™ User's Guide with MPLINK™ and MPLIB™ (DS33014) の MPLINK linker 部分をご参照ください。 udataセクションには、データメモリーに静的配置されている未初期化グローバルデータが含まれています。idataセクションにはデータメモリーに静的配置された初期化されたグローバルデータが含まれています。

    表 2-6 は、以下の例の各オブジェクトがどのセクションにあるかを示しています。rom int ri;rom char rc = 'A';

    int ui;char uc;

    int ii = 0;char ic = 'A';

    void foobar (void){ static rom int foobar_ri; static rom char foobar_rc = 'Z'; ...}void foo (void){ static int foo_ui; static char foo_uc; ...}

    void bar (void){ static int bar_ii = 5; static char bar_ic = 'Z'; ...}

  • 言語仕様

    2005 Microchip Technology Inc. DS51288C_JP-page 23

    表 2-6: オブジェクトのセクションロケーション

    2.9.1.3 デフォルトセクション

    デフォルトセクションは MPLAB C18 の各セクションタイプに存在します (表 2-7参照 )。

    表 2-7: デフォルトセクション名

    以前に宣言したセクション名を指定すると、MPLAB C18 が配置している関連タイプのデータを指定セクションへ再配置します。セクション属性は以前の宣言と一致している必要があります。そうしないと、エラーが発生します ( 付録 D.1「エラー」を参照 )。

    オブジェクト セクション位置

    ri romdata

    rc romdata

    foobar_ri romdata

    foobar_rc romdata

    ui udata

    uc udata

    foo_ui udata

    foo_uc udata

    ii idata

    ic idata

    bar_ii idata

    bar_ic idata

    foo code

    bar code

    foobar code

    セクションタイプ デフォルト名

    code .code_filename

    romdata .romdata_filename

    udata .udata_filename

    idata .idata_filename

    注 : filenameは作成されたオブジェクトファイルの名前です。例えば、"mcc18 foo.c -fo=foo.oは " “.code_foo.o” というデフォルトセクション名のオブジェクトファイルを作成します。

  • MPLAB® C18 C コンパイラーユーザーズガイド

    DS51288C_JP-page 24 2005 Microchip Technology Inc.

    名前のないセクション pragma 命令は関連タイプのデータの割り当てを現在のモジュールのデフォルトセクションにリセットします。例えば、

    /* * The following statement changes the current code * section to the absolute section high_vector */#pragma code high_vector=0x08...

    /* * The following statement returns to the default code * section */#pragma code...

    MPLAB C18 コンパイラーがソースのコンパイルを始めるとき、初期化データと未初期化データのデフォルトデータセクションがあります。これらのデフォルトセクションを、-Oa+オプションでコンパイラーを起動したかどうかによって、 アクセスまたは非アクセス RAM に配置します。 -Oa+ コマンドオプションラインは、非拡張モードで動作する時だけに適用します ( セクション 1.2.5 「モードの選択」を参照 )。 ソースコードで #pragma udata [access] name命令に遭遇した場合、現在の未初期化データセクションの名前は nameになります。nameはオプショナル access属性を指定するかどうかによって、アクセスまたは非アクセス RAM に配置されます。#pragma idata [access] nameの命令に遭遇した時も、現在の初期化データセクションについても同じ事があてはまります。 明示的に初期化される場合、オブジェクトを現在の初期化データセクションに配置します。明示的に初期化されていないオブジェクトを現在の未初期化データセクションに配置します。例えば、以下のコードでは、iを現在の初期化データセクションに配置し、uを現在の未初期化データセクションに配置します。

    int i = 5;int u;

    void main(void){ ...}

    オブジェクトの定義が明確な far修飾子を持っている場合 ( セクション 2.4 「ストレージ修飾子」を参照 )、オブジェクトを非アクセスメモリーに配置します。同様に、明示的な near修飾子 ( セクション 2.4 「ストレージ修飾子」を参照 ) はコンパイラーに対して、オブジェクトをアクセスメモリーに配置するよう指示します。オブジェクトの定義が nearまたは far修飾子のどちらもない場合、コンパイラーは-Oa+オプションをコマンドラインに指定したかどうかを判別します。

  • 言語仕様

    2005 Microchip Technology Inc. DS51288C_JP-page 25

    2.9.1.4 セクション属性

    #pragma sectiontype命令には、2 つのセクション属性、つまり accessまたはoverlayが含まれています。

    2.9.1.4.1 accessaccess属性はコンパイラーにデータメモリーのアクセス領域に指定セクションを配置するよう命令します ( アクセスデータメモリーのさらに詳しい内容についてはPICmicro® 18C MCU ファミリーレファレンスマニュアル (DS39500) を参照ください)。 access属性のデータセクションを、リンカスクリプトファイルの ACCESSBANKと定義されているメモリー領域に配置します。これらの領域は命令のアクセスビットを介してアクセスできる領域です。例えば、バンキングは必要ありません ( デバイスデータシート参照 )。アクセスセクションの変数を nearキーワードで宣言する必要があります。例えば、

    #pragma udata access my_access/* all accesses to these will be unbanked */near unsigned char av1, av2;

    2.9.1.4.2 overlayoverlay属性によって他のセクションを同じ物理アドレスに配置する事ができます。これにより、変数を同じロケーションに配置する事でメモリーの節約が可能になります ( 両方が同時にアクティブにならない限り )。 overlay属性を access属性と連携させて使う事ができます。

    2 つのセクションをオーバーレイするために、4 つの要件を満たす必要があります。1. 各セクションは別のソースファイルにある事。2. 両方のセクションは同じ名前であること。3. access属性を一つのセクションで指定する場合、他のセクションでも指定が

    必要です。

    4. 絶対アドレスを一つのセクションに指定する場合、同じ絶対アドレスを別のセクションにも指定する必要があります。

    overlay属性のコードセクションを他のoverlayコードセクションと重なるアドレスに配置する事は可能です。例えば。

    ファイル 1.c:#pragma code overlay my_overlay_scn=0x1000void f (void) { ...}

    ファイル 2.c:#pragma code overlay my_overlay_scn=0x1000void g (void) { ...}

  • MPLAB® C18 C コンパイラーユーザーズガイド

    DS51288C_JP-page 26 2005 Microchip Technology Inc.

    overlay属性のデータセクションを他のoverlayデータセクションに重なるアドレスに配置することは可能です。この関数によって、単一データレンジを同時にアクティブにならない複数の変数に使用できます。例えば、

    ファイル 1.c:#pragma udata overlay my_overlay_data=0x1fc/* 2 bytes will be located at 0x1fc and 0x1fe */int int_var1, int_var2;

    ファイル 2.c:#pragma udata overlay my_overlay_data=0x1fc/* 4 bytes will be located at 0x1fc */long long_var;

    オーバーレイセクションの取扱に関する追加情報は、MPASM™ User's Guide with MPLINK™ and MPLIB™ (DS33014) を参照ください。

    2.9.1.5 コードの配置#pragma code命令に準じ、別の #pragma code命令に遭遇するまで作成した全てのコードを指定のコードセクションに割り当てます。絶対コードセクションではコードを指定したアドレスに配置することができます。例えば、

    #pragma code my_code=0x2000

    はコードセクション my_codeをプログラムメモリーアドレス 0x2000に配置します。

    リンカは、強制的にコードセクションをプログラムメモリ領域に配置します。また、コードセクションを指定メモリー領域に配置することも可能です。セクションを指定メモリー領域に割り当てるために、リンカスクリプトの SECTION 命令を使用します。以下のリンカスクリプト命令はコードセクション my_code1をメモリー領域page1に割り当てます。

    SECTION NAME=my_code1 ROM=page1

    2.9.1.6 データの配置MPLAB C18 はデータをデータメモリまたはプログラムメモリーのいずれかに配置できます。オンチッププログラムメモリーに配置されたデータを読み込めるが、追加のユーザーコードがなければ書き込みはできません。外部プログラムメモリーのデータを、追加のユーザーコードがない限り、読み込みか書き込みかのどちらしかできません。

    例えば、以下は静的に割り当てられた未初期化データ (udata) のセクションを絶対アドレス 0x120と宣言します。#pragma udata my_new_data_section=0x120

    romキーワードはコンパイラーに、変数をプログラムメモリーに配置するよう命令します。コンパイラーはこの変数を現在の romdataタイプセクションに割り当てます。例えば、 #pragma romdata const_table const rom char my_const_array[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

    /* Resume allocation of romdata into the default section */#pragma romdata

    リンカは、強制的に romdataセクションをプログラムメモリー領域に配置し、udataと idataセクションをデータメモリー領域に配置します。また、データセクションを指定のメモリー領域に配置することも可能です。リンカスクリプトのSECTION命令は、セクションを指定メモリー領域に割り当てる際に使用します。以下は udataセクション my_dataをメモリー領域 gpr1に割り当てています。SECTION NAME=my_data RAM=gpr1

  • 言語仕様

    2005 Microchip Technology Inc. DS51288C_JP-page 27

    2.9.2 #pragma interruptlow fname /#pragma interrupt fname

    interrupt pragmaは、 高優先順位の割り込みサービスルーチン(ISR)関数を宣言します。interruptlow pragma は、優先順位の低い割り込みサービスルーチン関数を宣言します。

    割り込みは、稼働しているアプリケーションの実行を中止し、現在のコンテキストをセーブし、コントロールを ISR に移動させ、イベントを処理します。ISR が完了次第、以前のコンテキストを復元し、アプリケーションの通常の実行に戻ります。割り込みで保存・回復させる最小限のコンテキストは WREG、 BSRと STATUSです。 優先度の高い割り込みはシャドーレジスタを使用し、優先度の低い割り込みは、ソフトウェアスタックを使用します。結果として、優先度の高い割り込みは迅速な "割り込みからの復帰 " により終了し、優先度の低い割り込みは通常の復帰によって終了します。MOVWF命令と MOVF命令を要する WREG以外のソフトウェアスタックを介するコンテキストの各バイトには、二つの MOVFF 命令が必要です。従って、最低限のコンテキストを維持するには、優先度の低い割り込みは、優先度の高い割り込みの要求を越える 10 ワードの追加が必要です。割り込みサービスルーチンは、通常の C 関数を使ったセクションとは異なり、一時的なデータセクションを使用します。割り込みサービスルーチンで使用される一時データをこのセクションに割り当て、他の割り込み関数を含む他の関数の一時ロケーションにオーバーレイすることはありません。この割り当て pragma によって、割り込み一時データセクションに名前を付ける事ができ、コンパイラーの暫定変数を fname_tmpという名前の udataセクションに作成します。例えば void foo(void);...#pragma interrupt foovoid foo(void){ /* perform interrupt function here */}

    割り込みサービスルーチン fooのコンパイラーの一時変数を udataセクション foo_tmpに割り当てます。

  • MPLAB® C18 C コンパイラーユーザーズガイド

    DS51288C_JP-page 28 2005 Microchip Technology Inc.

    2.9.2.1 構文

    割り込み命令 : # pragma interrupt function-name [tmp-section-name][save=save-list]| # pragma interruptlow function-name [tmp-section-name][save=save-list]

    保存リスト :save-specifier

    | save-list, save-specifier保存識別子 :

    symbol-name| section("section-name")

    function-name: C識別子 -C関数を割り込みサービスルーチン(ISR)として命名します

    tmp-section-name: C 識別子 - ISR の一時データセクションを命名しますsymbol-name: C 識別子 - 割り込み処理後回復する変数名section-name: C 識別子、先頭文字はドット (.) が使用できます - 割り込み処理後回復するセクション名

    2.9.2.2 割り込みサービスルーチン

    MPLAB C18 ISR は他の C 関数と同様にローカル変数やアクセスグローバル変数を持っています。しかし、パラメーターと戻り値がない ISR を宣言する必要があります。これは、ハードウェアの割り込みは非同期的に起動するためです。ISR と他の関数がアクセスできるグローバル変数を volatileと宣言する必要があります。 ISR はハードウェア割り込みからしか起動できず、C 関数からの起動はできません。ISR は、通常の RETURN命令ではなく RETFIE命令を使用して戻ります。コンテキストの回復をせず FAST RETFIE命令を使用しますと WREG、 BSRと STATUSレジスタの値は破壊されることがあります。

  • 言語仕様

    2005 Microchip Technology Inc. DS51288C_JP-page 29

    2.9.2.3 割り込みベクター

    MPLAB C18 は ISR を割り込みベクターに自動的に配置しません。通常、GOTO命令を割り込みベクターに配置し、コントロールを ISR に移管します。例えば、#include

    void low_isr(void);void high_isr(void);

    /* * For PIC18 devices the low interrupt vector is found at * 00000018h. The following code will branch to the * low_interrupt_service_routine function to handle * interrupts that occur at the low vector. */#pragma code low_vector=0x18void interrupt_at_low_vector(void){ _asm GOTO low_isr _endasm}#pragma code /* return to the default code section */

    #pragma interruptlow low_isrvoid low_isr (void){ /* ... */}

    /* * For PIC18 devices the high interrupt vector is found at * 00000008h. The following code will branch to the * high_interrupt_service_routine function to handle * interrupts that occur at the high vector. */#pragma code high_vector=0x