Version 5での新しい機能

Cコード・オプティマイザー

コード・オプティマイザー

バージョン5は速度よりスペースを最適化する非常に積極的なコード・オプティマイザーを含んだ最初のリリースとなります。 新しいオプティマイザーはコンパイルされるプログラム全体でコードが繰り返されるブロックをを検索し、 これら繰り返されるブロックの全てを1つの共有サブ-ルーチンにします。 オプティマイザは最適化を行う際にユニットの境界を超える能力を提供しコンパイルの最終段階で実行されます。

#opt compress:この新しい最適化 レベルはプロジェクトにコード行を追加することによって達成することができます。

プログラム・メモリのサイズ減少の平均は約15%です。あるケースではプログラム・メモリの60%の削減が見られます。 下記は圧縮レベルの例です:

最適化レベルの効率 コンパイラのバージョン  
V4.141 V5.006
ファイル / プロセッサー (プログラム・メモリ・バイト) 削減 %
ex_modbus_master.c
PIC16F1937
3926 3068 22.00%
ex_j1939.c
PIC18F4580
7552 6166 18.00%
ex_st_webserver2.c
PIC18F4550 + ENC28J60
60282 52664 12.00%
この新しい最適化レベルはエンハンストPIC16とPIC18マイクロ・ コントローラでサポートされています。

標準化が向上されました

CCS Cコンパイラ・バージョン5は従来のC規格に更に準拠するようにアップデートされました:

  • 特定のPIC® MCUのヘッダー・ファイル[.h]が 現在プロトタイプされています。 コンパイラの組み込み関数とデータ型のプロトタイプが含まれています。 これは定義されていないためエラーとなるコンパイラの組み込み関数とデータ型にフラッグが立てられますので 非常に便利です。
  • 新しいコマンド-ライン・パラメータ: sourceline. これはコンパイルされようとしている ファイルにCソース行を挿入するために追加されました。使用例:
    ccsc.exe +FH myfile.c sourceline="#device PIC16F887"
  • 標準Cライブラリーiso646.hstdbool.h が追加されました。

マルチプル・コンパイラ・バージョン

複数のコンパイラ・バージョンマルチプル・コンパイラ・バージョン
Version 5 IDEから コンパイラの現在のバージョンと複数の前バージョンの中から選択出来るようになりました。この機能 はプロジェクト, テストや証明書に基づく特定のバージョンで標準化のために用意されています。

プロジェクト・ノート[Project Notes]

各プロジェクトで"Project Notes"を作成 することが出来ます。このファイルには各プロジェクトに関連するノートを作成することができます。 これらの各ファイルはメニューやファイルのナビゲーション・パネルを経由して特定のプロジェクトに関連付けることができます。
プロジェクト・ノート

識別子エクスプローラ

識別子エクスプローラ
Version 5 IDEの新しい "Identifier Explorer"[識別子エクスプローラ] はプログラムの識別子の関係を早く容易に見る事ができます。例えば、各ファイルでどの変数と関数が宣言 されているか、または、グローバル変数にアクセス出来る全ての関数を見ることが出来ます。 このスクリーンショットは1つの関数でアクセスできるすべてのグローバル変数やコール出来るローカル変数と関数を示しています。

ファイル・ナビゲーション・パネル

ファイル・ナビゲーション・パネル
"Files Navigation Panel"[ファイル・ナビゲーション・パネル] のスタイルと機能が向上され簡素化されました。例えば、ユニットを追加、リンク、そして、他のCとHファイルを1つのコンパイレーション・ ユニット・プロジェクトに簡単に追加出来ます。

プロジェクト・ヒストリー

Version 5 は自動的にソース・コード変更の履歴を保持します。 IDEは保存する頻度とどれだけでも古いファイルを(1時間に一度、一日の一度等にセーブ毎にファイルを維持)を 設定出来ます。 IDE内部のファイル比較ユーティリティはこの履歴を保持しユーザーは古いファイルと現在のファイルを比較することができます。
ファイル比較
ファイル比較

エクスプローラで表示

エクスプローラで表示
エディタ・タブで右クリックすることで'Show in Explorer'[エクスプローラで表示]が利用できます。これはファイルのある場所を示す エクスプローラ・ウィンドウを開きます。

ノートにセーブ

ノートにセーブ
マルチプル・デバッグ・ウィンドウの 右クリック・メニューにオプション "Save to notes" が追加されました。 これは選択されたデータ(Break logやRAM dataの様な)をプロジェクトに関連付けられた ノート・ファイルの最後に加えます。

ウォッチでのマウス-オーバー

デバッギング中に如何なる構造体、又は、配列変数上でマウスをホーバーリングしても "Watch"ウィンドウでポップアップ・ノートを展開、又は、縮小することが出来ます。
ウォッチでのマウス-オーバー

"Watch"項目のドラッグ&ドロップ

"Watch"項目のドラッグ&ドロップ"
重要なウォッチ変数がリストの中間や下にある場合、Watchウィンドウ内でウォッチの項目を ドラッグ&ドロップで希望通りに並び換えることが出来ます。

スーパー・バー

Superbarは共通して良く使われる項目を強調するために再配置されました。 コンパイラのエディターはインスタント構文チェック, コラム編集, 、もう少し一般的に使用される項目を強調するために再配置されています。 当社のCエディタはインスタント構文チェック、列の編集、スマート強調や 正規表現での検索で更新されます。 デバッガは配列や構造体のような複雑な変数をWatchしやすくなりました。
IDEスクリーン・ショット

統計ビューワー[Statistic Viewer]

統計ビューワー
便利な統計ビューワはグラフィカルにプログラム・メモリ, データ・メモリとスタック領域の割合の量を表示します。 関数のセクションではグラフィカルにどの機能が最もプログラム・メモリやデータ・メモリを使用しているかを 円グラフで示します。 これはユーザーがより少ないメモリを使用するためにプログラムを最適化する方法を探している場合に どの関数を見るべきかをユーザーが決定するのに非常に便利です。

ツリー・ビューワ

刷新された ツリー・ビューワはコール・ツリーをグラフィカルに示します。 コール・ツリーの各関数はブロックによって表されれます。 ユーザーはブロックの配置をドラッグ&ドロップすることで置き換えることができます。 これはコール・ツリーのブランチを非表示にし、1つの関数からコール されいるものだけを検査するこも可能です。
ツリー・ビューワ

ライブ構文チェッカー

ライブ構文チェッカー
エディターが ライブ構文チェッカーを持ちました。 コンパイルからプロジェクトを妨げるどの様なコードエラーも問題のある構文の下に赤い下線で 表示されます。 このチェックはタイピングしている間でもライブで行われます。構文エラーを 見るには単にマウスを下線のある上にはわせるだけです。

コピー・プロジェクト・ツール

"Copy project tool"はプロジェクト内のすべての関連するファイルを新しいディレクトリ, 又は, ZIPファイルにコピーします。
コピー・プロジェクト・ツール

コピー・ファインド&サーチ・ツール

ファインド&サーチ・ツール
ファインド&サーチ・ツールは正規表現を使用することが出来ます。 正規表現は文字, 数字, 又は、フレーズの特定の組み合わせの一致のために ユーザーが検索フィールドに複雑なパラメータを入力することができます。 このサンプルのスクリーン・ショットでは, 'foob0r', 'foob1r', 'foobar', 'foobaar'等を見つけるためにfoob([0-9]|a+)r が入力されています。

ファインド・ツール

ファインド・ツール
エディターの'Find all References' と 'Find Declaration'ツールが新しくなりました。 これらのユニークな新しいツールはエディターで識別子の上で右クリックすることで選択することが出来ます。 'Find All References'はインテリジェントに他のコメントされたリファレンス、又は、オーバーロードの ためにマッチしない同様の識別子をスキップしてこの識別子の全てのリファレンスを見つけます。 'Find Declaration'はその識別子が宣言された場所を見つけます。

ブックマーク・ツール

ブックマーク・ツール
高度なブックマークツールは プロジェクト固有のものでプロジェクト内の全てのファイルにまたがっています。メニューは ブックマークがセットされた場所も示します。

ビルドと実行ツール

コンパイル・メニューには 新しく'Build and Run'が追加されました。これはプログラムをコンパイルし、そして、シンプルなマウス・クリックでマイコンにそれを プログラムします。
ビルドと実行ツール

カラム編集

カラム編集
Editorツールはまたカラムの編集機能を備えています。

これはテキストの同じブロックに含まれている置き換え、又は、編集する必要があるいくつかの行がある場合に便利です。 この機能を使用するには、例として、左図の様に int を含む3行のブロック領域が選択された状態で下図で示す unsigned_int8 とキー入力をすれば下の2行も自動的に置換されます。 この領域は例の様に行の左端である必要性はなく、任意のカラムからのブロック領域でも可能です。 さらにブロック領域のテキストの消去(DEL)、コピー&ペースト(cntl-C, cntl-V)、 カット&ペースト(cntl-X, cntl-V)も出来ます。 このブロック領域の選択操作法は従来の選択操作の前に予めCtrlキーを押した状態でマウスで矩形の左上、右下の順に領域選択します。

C++ストリーム演算子をサポート

標準Cでは基本的なI/Oがgetc(), putc()printf() のような関数で処理され、そして、データのフォーマット[書式設定]は atoi(), atof(), strotul()sprintf() ような関数によって処理されます。 例えば、RS232を介しての浮動小数点数の読み出しはatof()が 続くgets()の組み合わせが必要です。 CCSはこれらのタスクの多くを達成するinput.cライブラリが含まれていますが、 固定RS232ストリームを使用したそのinput.cライブラリはKeypad/LCD、又は、修正なしのUSBでは 動作しません。

CCS CコンパイラのV5でC++ストリーム演算子を追加サポートしました。 C++ストリームはI/Oとデータ・フォーマッティングのための統合されたインターフェースを提供 しています。

その追加された2つの演算子は抽出演算子と挿入演算子です:

演算子シンボル 演算子名
>> Extraction
<< Insertion

使用されるとき、これら演算子はデータの方向を示します。例えば:

サンプル コメント
x >> y xから読み込み/解析されたデータを保存/yへ送信
x << y yから読み込み/解析されたデータを保存/xへ送信

これらの演算子の美しさは上記の例のxとyは関数, RS232シリアル・ストリーム, 変数, 文字列等々の如何なる組み合わせで有る ことが出来ると言うことです。 CCS Cコンパイラのこの新しい機能のキー・フィーチャの1つは渡された変数のデータ・タイプ型に基づいて自動的に変換する方法です。 これらの変換は自動的に行われ、atof()がコールされる必要など他の関数の助けは必要ありません。 例えば、変数がfloat型である場合、コンパイラは正しく入力でstringからfloatに、そして、出力でfloatをstring に変換します

出力のために C++ストリーム・オペレータを使用

ストリーム << 識別子

上記のサンプルのstream は次の1つです:

  • cout - デフォルト #use rs232()ストリームにマップされます。 これは明示的にcoutのストリームクラスを使用する既存のC++コードを使用するための互換性を提供します。
  • RS232 stream name - #use rs232()stream=xオプションでストリームが認識されます。
  • char array (string) - データは識別子から解析されヌルターミネータを持つchar配列に保存されます。.
  • function - その入力変数のためにchar型をとる関数。例えば、lcd_putc() CCSで lcd.c ドライバー、又は、 usb_cdc_putc() CCSで usb_cdc.hドライバー

識別子[identifier]は int, float, fixed point decimal, int1 (boolean) 又は、char arrayであることが出来ます。

識別子[identifier] は次の如何なるマニピュレータでも構いません:

  • hex - 変数を文字列に変換するとき、それをhexフォーマット・キャラクター (%x in printf()と同じ)に変換します。
  • dec (デフォルト) - 変数を文字列に変換するとき、それをdecimalフォーマット・キャラクター ( %d in printf()と同じ)に変換します。
  • setprecision(x) - 小数点以下の桁数をセット
  • setw(x) - 出力するキャラクタ数をセット
  • boolalpha - int1を "true"又は、"false"として出力
  • noboolalpha (デフォルト) - int1を"1"又は、"0"として出力
  • fixed (デフォルト) - 浮動小数点数を decimal形式で表示(printf()の%fと同じ)
  • scientific - 浮動小数点数を Eノーテーション(printf()の%eと同様)で表示
  • iosdefault - 全ての修飾子をデフォルト設定にもどす
  • endl - CR/LF出力

これはこの演算子使用のサンプルです:

cout << "Price is $" << setw(4) << setprecision(2) << cost*num << endl;

このサンプルは定数*numの結果に基づき小数点以下2桁を有し、CR/LFが続く "Price is $"を送信します。 これはデフォルトのRS232ストリームであるcoutを用いて送信されます。

ここでCCSのlcd.cドライバで提供されているlcd_putc()関数を使ってLCD上に表示するために上記のサンプルを変更:

lcd_putc << "Price is $" << setw(4) << setprecision(2) << cost*num << endl;

ここでresult_stringと呼ばれる文字列変数に書式を保存するには上記のサンプルに変更を加えます:

result_string << "Price is $" << setw(4) << setprecision(2) << cost*num << endl;

入力のためにC++ストリーム演算子を使用

stream >> identifier

上記のサンプルのstreamは次の1つです:

  • cin - デフォルトの#use rs232() ストリームにマップします。これは明示的にcoutストリーム・クラスを使用する既存のC++コードを使用するための互換性を提供します。
  • RS232 stream name - #use rs232()stream=xオプションで識別されたストリーム
  • function - charを返す関数。例えば CCSの usb_cdc.hドライバーのusb_cdc_getc()、 この関数は a r が受信されるまで各文字列に対してコールされます。

識別子は整数、キャラクタ、 キャラクタ配列、浮動、固定小数点タイプの変数が可能です。Float タイプのフォーマットは Eフォーマットを使用出来ます。

識別子[identifier] は次の如何なるマニピュレータでも構いません:

  • hex - 16進数
  • dec (デフォルト) - 10進数
  • strspace - 文字列にスペースを入れることが可能
  • nostrspace (デフォルト) - 文字入力でスペースで終了
  • iosdefault - 全操作をデフォルト設定にする

これはユーザーからの読み出し数とそれを変数値に保存するサンプルです。:

cout << "Enter Number";

cin >> value;


上記のサンプルはCCSの usb_cdc.h ドライバーのルーチンを使ってUSBバーチャルCOMポートから読み込むために即座に修正することが 出来ます:

usb_cdc_putc << "Enter Number";

usb_cdc_getc >> value;


複数の値を一度に読むことが出来ます。:

cin << variable1 << variable2 << variable3;

上記のサンプルで、入力演算子は variable1に読み込んで終了し、そして、そのデータ・タイプに対して 有効で無い文字を受信しますとvariable2 に読み込みを開始 します。例えば、もし、variable1とvariable2の両方がint型である場合、variable1への読み込みを停止し、 そして、"0"から"9"ではないスペースや改行のような任意の文字を受信するとvariable2に読み込みを始めます。

文字列から変数へのデータ変換も可能。このサンプルは str文字例変数をval 変数に変換します。 変換のタイプはvalのデータ・タイプで決定されます:

str >> val;

新しい入力キャプチャとPWMライブラリー

CCSはPIC® MCUのキャプチャ/コンペア/PWM, 入力キャプチャと 出力キャプチャ周辺機器の使用をさらに容易にするために新しい #use capture()#use pwm()ライブラリーを追加しました。 これらの周辺機器を使用する1つの課題は希望する周波数及び分解能で動作するようにPWMを設計するか、 または既知の持続時間にイベントを測定するキャプチャ周辺機器を構成することです。 もう1つの課題はコンフィギュレーションが一般的に特定のPIC® MCUファミリーと 1つのオシレータ速度に対してのみ有効であるということです。; PIC® MCU、またはオシレータ の変更はこれらの周辺機器が構成される方法を見直し更新を意味します。

CCSの新しい#use capture()#use pwm()ライブラリはこれらの周辺機器の使用を簡単にすることによりこれらの問題を解決し、 異なるPIC® MCUとオシレータ速度に移植可能なコードを作ります。

入力キャプチャ

入力キャプチャ周辺機器はその周辺機器の入力ピンが希望のレベルに達したとき サンプルしタイマー値を保持します。 このペリフェラルは2つのイベント館の経過時間を測定するために便利です。

これはある入力信号の周波数を測定するために使用される新しい #use capture() ライブラリーの例を示します:

#use capture(INPUT=PIN_C1, TIMER=1, TICK=1ms, \
CAPTURE_RISING, define=CAPTURE_TICKS_PER_SECOND)

unsigned int16 GetFrequency(void)
{
unsigned int16 t;

get_capture_time();

while (!get_capture_event());

t = get_capture_time();

while (!get_capture_event());

t = get_capture_time() - t;

return(CAPTURE_TICKS_PER_SECOND / t);
}

上記のサンプルは新しいライブラリーに対するAPIを示しています:

  • #use capture() - その入力キャプチャ周辺機器を使用のために設定します。 GPIOピンとトリガ・イベントを選択(IC又はCCPピンを使用しなければならない)することが出来ます。 タイマー構成も設定させます、どの内部タイマーを使用し、そして、bit毎の分解能を選択します。 このサンプルでは1つのプログラムで複数のピンのためのマルチプル#use capture()
  • get_capture_event() - もし、イベントが起り、そして、get_capture_time() がイベントを読むために使用される必要がある場合、TRUEを返します。 これはイベントを読むためにget_capture_time()が使用されるまで TRUEを返します。
  • get_capture_time() - 最後のタイミング・イベントを読み取ります。 これによって返されたタイミング分解能は#use capture()により定義されます。そして、このサンプルでは、それは CAPTURE_TICKS_PER_SECONDです。

上記のサンプルではキャプチャ・ペリフェラルとTimer 1はビット当たり1ms tickの分解能で ピンC1の立ち上がり電圧をキャプチャするように構成されます。 必ずしも全てのPIC® MCUとオシレータのコンフィギュレーションが1ms tick分解能に構成される わけではありません。 よって#use capture()の定義オプションがライブラリによって達成された 最終的な分解能に基づいてリテラルを定義します。 コンパイラは詳細な最後に達成された分解能の情報メッセージを提供します。

PWM

パルス幅変調(PWM)はアナログ信号を表すためにデジタル信号のオン/オフをパルス化する方法です。 PWMの2つのプロパティは周波数とデューティ・サイクルです。デューティ・サイクルはデジタル信号のオン対オフの比です。

これはCCS #use_pwm()ライブラリーが使用されている例:

#use pwm(OUTPUT=PIN_C1, TIMER=2, FREQUENCY=50000)

void DACSetHalfValue(void)
{
pwm_on();

set_pwm_frequency(10000); //Hzで

set_pwm_duty_percent(500); //10の位の%で
}

上記のサンプルは新しいライブラリーのためのAPIを示しています:

  • #use pwm() - PWMペリフェラルを構成します。 PWMピン, タイマーと初期開始周波数を設定します。 このサンプルでは示めされていませんが、ストリーム識別子は同じプログラムで複数の#use pwm()を 使用することが出来ます。同じくこのサンプルでは示めされていませんが、より低いPWM周波数でデューティ・サイクルの分解能のほとんどのビットを使用したい 開発者のためにPWMの分解能サイズを設定しています。
  • pwm_on() - 動的にPWMをオンにする pwm_off() もPWMのターンオフに利用出来ます。
  • set_pwm_frequency() - 新しい周波数をHzでセット
  • set_pwm_duty_percent() - 新規デューティ・サイクル値をセット, パラメータは10の位の%です。

#use pwm()は希望する周波数, 希望する分解能, 又は、両方の コンビネーションでユーザーがPWMを設定することができます。 PIC® MCUとオシレータによっては希望する周波数に達することは常に可能ではありませんが、 その場合はコンパイラが最終の周波数の詳細情報のメッセージを与えてくれます。

シリアル・ルーチンにフロー制御とバッファリングを追加するためにV5 を使用

CCSのパワフルな#use rs232()ライブラリは バッファリングの送信, バッファリングの受信とフロー制御が追加されました。 シリアル・ライブラリのAPIは変更せずに残されました(getc(), putc(), printf()),。このAPIを使った 既存のコードは簡単に#use rs232()コンフィギュレーションを変更することにより バッファリングとフロー制御を追加することができます。 新しい #use rs232() パラメータを使用することで、ユーザーが指定出来ます: 送信バッファのサイズ, 受信バッファNサイズ, 割り込みの使用、又は、不使用, CTSとRTSのためのピン

フロー・コントロール、又は、バッファなしでの #use rs232() の使用のサンプルを見てみましょう:

#use rs232(UART1, baud=9600)

void Transaction(char *pString)
{
printf(pString);

delay_ms(500);

while(kbhit())
{
*pString++ = getc();
}
}

上記のコードは2つの問題を持っています:

  1. そのprintf()は無遅延で受信ユニットにpStringするか、 又は、送信を読み込む受信ユニットの能力を考慮。 もし、受信ユニットがビジー、又は、送信を処理することが出来ない場合は、その処理が損なわれることになります。
  2. 送信のためのprinf()と受信のための kbhit()/getc()間に 大きな遅延(500ミリ秒)があります。 もし、受信ユニットがその500msのディレイの前に応答を送った場合には Transaction()ルーチンがその応答を逃すことがあり得ます。

バッファリングとフロー・コントロールの使用により, 上記の両方の問題を回避することが出来ます。 これは上記のコードをアップデートします、今回はCCS C Compiler V5の新しい#use rs232()機能を使用します。

#use rs232(UART1, baud=9600, RECEIVE_BUFFER=25, TRANSMIT_BUFFER=25, RTS=PIN_C5, CTS=PIN_C4, TXISR)

void Transaction(char *pString)
{
printf(pString);

delay_ms(500);

while(kbhit())
{
*pString++ = getc();
}
}

アップデートされたサンプルについて最初に注目すべきはUARTの設定のために 変更されたコードが#use rs232()行だけであると 言うことです。printf(), kbhit()getc() は変える 必要がありません。これは以下に簡単に既存のコードでバッファリングとフロー制御が できるかを示しています。バッファリング・オプションをフロー制御無しで使用 することが出来ます。

これは上記サンプルで示される新しい#use rs232()オプションの概要です:

  • RTS - RTSのためにどのピンを使用するかを指定。 このピンは受信バッファがいっぱいになっているためPIC® MCUにより トランスミッタに送信を停止するように指示するための出力です。 ハイ・レベル、又は、ロー・レベルを宣言する場合の設定に使用出来る RTS_LEVELのオプションもあります。
  • CTS - CTSのために使用するピンを指定。 このピンは受信ユニットが受信を処理できるかどうかを判断するためにPIC®printf()/putc()は 送信バッファにデータを配置します。 ハイ・レベル、又は、ロー・レベルを宣言する場合の設定に使用出来るCTS_LEVELのオプションもあります。
  • RECEIVE_BUFFER と TRANSMIT_BUFFER - それぞれ受信と送信バッファのサイズを設定
  • TXISR - 指定された時, その #use rs232()ライブラリはPIC® MCUのEUSART周辺機器の 準備ができたときにデータを送信するTBE(バッファエンプティを送信)ISRを使用します。 このオプションはハードウエアEUSARTペリフェラルを使うときのみ使用することが出来ます。 送信を使用することができるかどうかを判断するTBEフラグをポーリングするputc()/printf()が使用され たときTXNOISRオプションも使用することができます。 詳しくは以下をご覧下さい。

バッファリングの受信は常にISRを使用します。これを達成するためにはハードウェアEUSARTペリフェラル が使用されるか、又は、RXピンが外部インターラプト・ピンでなければいけません。 バッファリングの送信はこれらの制限を持っていませんので、任意のGPIOピンを送信のために使用することが出来ます。

上記の例で、もしCTSピンが有効である場合において、printf()を呼び出すには送信バッファにデータを配置し、 その後RS232ライブラリは送信バッファからデータをプッシュします。
受信バッファにデータがある場合、そのkbhit()はTRUEを返し、 そして、getc()は次の文字を受信バッファから読み出されます。 その#use rs232()ライブラリーはバッファの残りのサイズに応じて ISR受信中に自動的にRTSピンを制御します。

RS232 APIにバッファに関する新しい関数が追加されました:

  • putc() - パラメータなし(又は、 単にストリーム識別子)が呼び出されたとき、送信バッファ内の文字を送信する 必要があるかどうかを判断するため、TBEとフロー制御ピンをポーリングします。
  • xmit_buffer_bytes(), receive_buffer_bytes() - そのバッファのバイト数を返します。
  • xmit_buffer_full(), receive_buffer_full() - バッファがフルの場合に TRUEを返します。

これあはV5コンパイラがシリアル・ライブラリーにバッファリングとフロー制御が追加された一部に 過ぎません。もっと多くのコンフィギュレーションと制御オプションがあります!

タイマー・ティック・ライブラリー[Timer tick]

#use_timer() ライブラリーはPIC® MCU PWM とOC ペリフェラルを使い易くします。 また、この新しいライブラリーは異なったPIC® MCU、又は、異なったクロック・スピードからコードをポートするのも 容易にします。このライブラリーはタイマー, プリスケーラの設定をユーザーの設定をベースに自動的に行われます。例えば:

#use timer(tick=20ms, bits=16, define=TICKS_PER_SECOND)

int1 OneSecondExired(void)
{
static unsigned int16 t;
int1 ret = FALSE;

if ((tick_get() - t) >= TICKS_PER_SECOND)
{
t = get_ticks();
ret = TRUE;
}

return(ret);
}

#use timer()はどの様な内部タイマーも設定することが出来ます。 コンパイラは特定のPIC® MCUとオシレータに基づいた最終的な分解能を表示する 情報メッセージを提供します。定義オプションはビット当たりの分解能を決定するためと実行時の定数を 定義するために使用することが出来ます。(TICKS_PER_SECOND 上記サンプルの様に).

一度#use timer()が使用されますとそのタイマーが 自立タイマーを作成するために使用され、get_ticks()が現在の時間を読むために 使用することができます。 #use timer() はPIC® MCUのタイマーに機能があれば、 外部クロック・ソースからの読み取りも設定することも出来ます。

SPI 共有

バージョン5はSPIを再設定ができるルーチンを追加することで 同じSPIペリフェラルやピンを共有する複数の#use spi()ストリームのための能力を追加しました。 これは新機能の使用例です:

#use spi(SPI1, stream=STREAM_SPI_EEPROM, NOINIT)

unsigned int8 EEPROMRead(unsigned int16 address)
{
unsigned int8 ret;

spi_init(STREAM_SPI_EEPROM);

SPI_EEPROM_SELECT();

spi_xfer(STREAM_SPI_EEPROM, address);

spi_xfer(STREAM_SPI_EEPROM, address >> 8);

ret = spi_xfer(STREAM_SPI_EEPROM);

SPI_EEPROM_DESELECT();

return(ret);
}

#use_spi()NOINITオプションと spi_init() 関数が新機能としてバージョン5に追加されました。 NOINIT オプションはコンパイラにmain()の 開始時にSPIペリフェラルを初期化しない様に伝えます。 spi_init() ルーチンが、このSPIストリームをその設定パラメータに基づき初期化します。 動的にクロック・レートを変更するためにspi_init()にオプショナル・パラメータ を追加しました。

これら追加の利点は、各SPIデバイスが異なる最大クロック・レートを持っているか、又は、異なったSPIモードで 操作されていても同じSPIピン、又は、SPIペリフェラルを共有しながら複数のSPIデバイスを使用することが出来ます。 spi_init()を使用することで、デバイスと通信する前にそのデバイスの設定に基づいた SPIペリフェラルを再設定することが出来ます。

pin_select() 関数

CCS Cコンパイラのバージョン5の前はPIC® MCUのピン・セレクト(又は、再プログラム可能なピン) はプリプロセッサー・コマンドを介して行われました。例えば:

#pin_select U1TX = PIN_D5

プリプロセッサー・コマンドの欠点は動的ではなく常にmain()の初めに 実行されたということです。 CCS Cコンパイラのバージョン5ではpin_select() が追加され動的に再設定が出来るようになりました。:

pin_select(U1TX, PIN_D5);

J1939 CAN ドライバー

物理レイヤにCANを用いてSAE J1939データ・リンク・レイヤーを実行するためのドライバーが追加されました。

time.h の改良

time.hは現在の日付/時刻とを読み取り日付/時刻変数の演算を実行する標準Cライブラリです。 バージョン5 では以前のバージョンのtime.hが改良されました。 time.hファイルは簡単に使用するためにリアルタイム・クロックのように既存のデバイスに 適応できるようにするためにクリーンアップされています。 ds1305.c ドライバーも追加されました。これは time.hとコンパチブルです。

virtual_eeprom.c - 仮想EEPROMドライバー

このドライバはプログラム・メモリ(フラッシュ)の2ページを使用して仮想EEPROMを作成します。 書き込みバランシング・アルゴリズムがこのドライバーに統合されていてフラッシュ・メモリの耐久性の劣化の問題から 一つのアドレスに連続書き込みをしないようにされています。

その他のドライバーとサンプルの改良
  • input.c ドライバが既存の文字列や整数の編集を可能にするためにアップグレードされました。
  • USB driver/library 同時にCDCとHIDの両方のインターフェイスを含むデバイスの作成を可能にするためにアップグレードされました。
  • internal_eeprom.c が内部EEPROMにマルチバイト構造の記述を簡略化するために追加されました。

Cプロファイラー

PIC® MCUの実行中、Cプロファイラ−・ツールは連続的にロギングし、そして、 プログラムのプロファイルを与えるためにラン-タイム・イベントを分析しています。 関数が実行された回数, それに要した最小/最大/平均時間とプログラムの呼び出しシーケンス がログされて分析されます。また、ユーザーは特別なデバッグ・メッセージを送信したり、 又は、ある変数をログするためにそのコードのブロックのみをプロファイルする様に指定することができます。

Cプロファイラーは1つのCCS Cコンパイラのステートメント #use profile() でグローバルに有効, 無効又は、設定することが出来ます。
ほとんどのアプリケーションでは、Cプロファイラー・ツール用にアプリケーションを構成するために 1つの#use profile()コマンドのみが要求されます。 また、ユーザーがプロファイルする必要のあるどのデータとルーチンを細かく調整するためのCプロファイル・ツールを動的に制御する ための#profileプリプロセッサー・コマンドとprofileout()マクロもあります。

CプロファイラーはPIC® MCUがデバッグモードでは無く、PIC® MCUが実行モードの間に動作します。 実行速度を高く保つために実行中のPIC® MCUからは最少量を読み込みます。 例えば、文字列は全体ではなく文字列の1バイトの識別子を使用して送信されます。 これは高い実行速度が必要な多くのシナリオで、そして、そのオーバーヘッドのために 標準的なICDデバッガ使用することが出来ない場合にで理想的です。 例えば、USBはわずか数ミリ秒の遅延のためにUSBが動作しないことがありますので、 ICDでデバッグすることは困難です。オーバーヘッドが最小限に保たれているのでUSB操作は Cプロファイラーでデバッグすることができます。

統計[Statistics]

統計スクリーン・ショット

Cプロファイラーの統計ビューはプログラムの実動作で全関数の各関数について所要時間の最小, 最大, 平均時間の詳細な情報を示してくれます。 プログラム設計時点で各関数の実稼働時間等を知り得ることは非常に有効です。 特に複数の設計者で遂行するプロジェクトでマルチタスクなプログラム設計時に 各設計者の作成のプログラムの所要時間を調整する際には、この機能は必須項目となります。 さらに、大きなプログラム作成時には全関数に対してこの様な統計所要時間を調査する 必要が無い時もあります。 その際には計測の必要な重要な関数にのみ下記に示す様に 各関数の冒頭で#profile ON/OFF で指定することも可能です:

#profile OFF

void FunctionNotLogged(void)
{
/* code */
}

#profile ON

関数の代わりに特定のコードのブロックのタイミングを追跡することも可能です。これは特殊なprofileout()マクロで行うことができます。 もし、ユーザーのアプリケーションで#use profile()が有効になって いないとprofileout()は無効にされます。 これはいくつかの関数のタイミングを追跡するためのprofileout()の使用例:

profileout("start main loop")

Function1();

Function2();

Function3();

profileout("stop main loop")

上記のサンプルの様にprofileout()を使う時には、 Cプロファイル・ツールの統計ウィンドウに"main loop"が表示されます。

トレース・プロファイリングにはPIC® MCUにより送信 されたトレース・プロファイル・メッセージを受信するためにCCS ICD-U64が必要です。 PIC® MCUはデバッグ・モードではなく実行モードで実行されますとPIC® MCU はICDが接続されていなくても通常に実行されます。

メッセージ

メッセージ・スクリーン・ショット

Cプロファイラー・ツールのデータ・メッセージ・ビューはプログラムによって送信されたすべてのデバッグ・メッセージをキャプチャします。 最近のメッセージや変更は黄色で強調表示されます。
これらはprofileout()マクロを使用して送られたメッセージです。 ここで使用するためのいくつかの有効な構文は以下のとおりです:

profileout("dynamic string")
profileout("string", value)
profileout(value)

上記のイメージでは次のコードが使用されています:

profileout("Potentiometer", value)

実行時間とオーバーヘッドを低くく保つために1バイトの識別子のタグを使用する 代わりにCプロファイラー・ツールが実際の文字列を送信しないことを繰り返すことが重要です。

呼び出しシーケンス

呼び出しシーケンスのスクリーン・ショット

Cプロファイラー・ツールの呼び出しシーケンス・ビューはプロファイルされるプログラムの実行パスを表示します。 各関数にパスされたパラメータを検査することによりこのビューはプログラムのある部分が実行している理由を デバッグするために使用することが出来ます。

大規模なプログラムは多くの関数を持つことが出来ますので、受信したデータの量を減らすためにルーチン がプロファイルされる動的制御するために#trace off#trace onを繰り返すことが重要です。

呼び出しシーケンス・ビューはトリガー、又は、ある条件に基づいたデータのフィルターリングの方法も 持っています。そのトリガー・タイプは:

  • None - 全受信データを表示
  • Freeze - 指定された関数が実行された時に表示をストップ
  • One Shot - 指定された関数が実行される迄表示をストップ
  • Continuous - 指定された関数が実行された時に表示をクリア
  • Accumulate - 指定された関数の呼び出しシーケンスで違いをハイライト

デバッギングしないデバッグ!

Cプロファイラー・ツールはICDを使っての場合のオーバーヘッド無しでプログラムをデバッグするための優れたツールです。 CプロファイラーはCCS Cコンパイラ V5とICD-U64が必要です!