FAQ

どのようにして外部メモリ・デバイスを指すカスタム変数の定義を作成することができますか?(又は、typemodとは?)

CCSはRAM, プログラム・メモリー、又は、外部メモリとすることができるメモリ領域を定義するために 使用することができるtypemodと呼ばれる機能を提供しています。

その使用は:

typemod <,read(),write(),start,end> name
  • read() - メモリーのこのブロックのために定義された読み取り関数を定義。関数は このプロトタイプに従っている必要があります:
          read(int32 addr, int8 *ptr, int8 len)
    この関数はこのカスタム変数型とデータのブロックを読み取る方法をコンパイルに指定します。 この関数はユーザーによって提供されアプリケーション固有のものでなければなりません。
    ノート: その関数はread()以外の名前であることが出来ます。

  • write() - メモリーのこのブロック用に定義された書き込み関数を定義します。 関数はこのプロトタイプに従っている必要があります:
          write(int32 addr, int8 *ptr, int8 len)
    この関数はこのカスタム変数の型からのデータのブロックを書き込むための方法をコンパイルに指定します。 この関数はユーザーによって提供されアプリケーション固有でなければなりません。
    ノート: その関数はwrite()以外の名前であることが出来ます。

  • start - 指定されたメモリーの先頭アドレスを定義します。  このカスタム変数の定義を使用して最初に定義された変数はこのアドレスから開始します。

  • end - 指定されたメモリの終了アドレスを定義します。  そのためこのカスタム変数定義のために定義することができる変数の最大バイト数は開始-終了です。

  • name - このカスタム変数の型の名前を定義します。  これはこのtypemodを使用する変数を定義するときに宣言子として使用される名前です。

read()とwrite()関数を指定しない場合、それはPIC® MCUのRAMを使用します。 特定のバンクに固定されるカスタム変数定義を作成したい場合に便利です。

例えば:

typemod <,DataEE_Read, DataEE_Write, 5, 0xFF> DataEE

これはDataEEと呼ばれる領域を定義し、5と0xFF間のアドレスを使用します。 DataEE_Read()とDataEE_Write()は夫々ユーザーの読み取りと書き込み関数です。

以下はAT29C1024外部フラッシュへ簡単に読み込みと書き込み するためにカスタム変数定義を作成するため如何にtypemodが使用されるか示す完全なサンプルです:

#include <protoexternal.h>
#include <utility.c>
#include <at29c1024.c>

void ext_flash_read(int32 addr, int8 *ram, int8 bytes) {
   read_block_ext_flash_memory(addr,ram,bytes);
}

void ext_flash_write(int32 addr, int8 *ram, int8 bytes) {
   read_block_ext_flash_memory(addr,ram,bytes);
}

typemod <,ext_flash_read, ext_flash_write,5,0xFF> flashmem;

int flashmem countm;

void main(void) {
   int count;
   int_ext_flash_memory();
   count=countm;
   while(TRUE) {
      show_binary_on_leds(count);
      wait_for_one_press();
      count++;
      countm=count;
   }
}

上記のサンプルでcountmはカスタム変数定義fashmemを使用しています。 countm(the line countm=count)への如何なる書き込みもext_flash_write()を呼び出し、 そして、countm(the line count=countm)からの如何なる読み出しもext_flash_read()を呼び出します。 typemodでユーザーは配列、構造体や共用体を含む任意のデータ型を作成することができます。

またtypemod定義された変数の型へのポインタを作成することができます。例えば:

int flashmem ext_array[50];
int flashmem *ptr;
int i;

ptr=&ext_array[25];

i=*ptr;  //get ext_array[25] from the external flash memory

ptr++;   //point to ext_array[26]
*ptr=i;  //write to ext_array[26]

typemodはユーザーが指定する読み取りと書き込みルーチンにより如何なるデータでも使用することが出来ます。 例えば、PIC MCUのプログラム・メモリー(ROM)に簡単に読み取りと書き込むためにtypemodを使用することが出来ます。