FAQ
どのようにして外部メモリ・デバイスを指すカスタム変数の定義を作成することができますか?(又は、typemodとは?)
CCSはRAM, プログラム・メモリー、又は、外部メモリとすることができるメモリ領域を定義するために
使用することができるtypemodと呼ばれる機能を提供しています。
その使用は: read()とwrite()関数を指定しない場合、それはPIC® MCUのRAMを使用します。
特定のバンクに固定されるカスタム変数定義を作成したい場合に便利です。
例えば: これはDataEEと呼ばれる領域を定義し、5と0xFF間のアドレスを使用します。
DataEE_Read()とDataEE_Write()は夫々ユーザーの読み取りと書き込み関数です。
以下はAT29C1024外部フラッシュへ簡単に読み込みと書き込み
するためにカスタム変数定義を作成するため如何にtypemodが使用されるか示す完全なサンプルです: 上記のサンプルでcountmはカスタム変数定義fashmemを使用しています。
countm(the line countm=count)への如何なる書き込みもext_flash_write()を呼び出し、
そして、countm(the line count=countm)からの如何なる読み出しもext_flash_read()を呼び出します。
typemodでユーザーは配列、構造体や共用体を含む任意のデータ型を作成することができます。
またtypemod定義された変数の型へのポインタを作成することができます。例えば: typemodはユーザーが指定する読み取りと書き込みルーチンにより如何なるデータでも使用することが出来ます。
例えば、PIC MCUのプログラム・メモリー(ROM)に簡単に読み取りと書き込むためにtypemodを使用することが出来ます。
typemod <,read(),write(),start,end> name
read(int32 addr, int8 *ptr, int8 len)
この関数はこのカスタム変数型とデータのブロックを読み取る方法をコンパイルに指定します。
この関数はユーザーによって提供されアプリケーション固有のものでなければなりません。
ノート: その関数はread()以外の名前であることが出来ます。
write(int32 addr, int8 *ptr, int8 len)
この関数はこのカスタム変数の型からのデータのブロックを書き込むための方法をコンパイルに指定します。
この関数はユーザーによって提供されアプリケーション固有でなければなりません。
ノート: その関数はwrite()以外の名前であることが出来ます。
typemod <,DataEE_Read, DataEE_Write, 5, 0xFF> DataEE
#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;
}
}
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]