ホームページ>H8をMacで>その7b+・TOPPERSに移行する(ファイルシステム編) その後
目次
その7b+・TOPPERSに移行する(ファイルシステム編) その後
目的と経緯
以下は、マイコンボードのOSをMESからTOPPERS/JSPに移行した際の覚書です。
ふと突然、長らくほっぽってあったマイコンボードを弄りたくなって、埃まみれ(苦笑)になっていたボードを引っ張りだしてきました。
依然として、ネットラジオが最終目標ではありますが、何もかも忘れていた(更に苦笑)こともあって、ここはリハビリを兼ねて、FatFsから再開する事にしました。
(一部動作結果が思わしくなかったことが、何となく引っかかっていたのもあったのですが。)
FatFsを最新版に差し替える
再開に伴い、FatFsを今回の作業時点での最新版(R0.09)に差し替えてみました。
FatFs最新版は、以下の作者様のサイトからダウンロードしました。(資料の「サンプル・プロジェクト 」)
参考サイト(1):えるむ(ELM - 汎用FATファイルシステム・モジュール)
作業の記録
以下は対症療法的試行錯誤の結果を整理したものです。漏れや何か問題がある可能性があります。
<ディレクトリの再編成>
<ソースの編集>
- ベースには、その7bで使用した「FatFs for TOPPERS(R0.04ベース)」を用いる。
- ffsample.zip(R0.09)を展開し、できたffsampleフォルダを(任意の場所に)置いた。
- ffsample/h8/h8_mmc/から、mmc.cを、toppers_fatfs/source/config/h8_akih8_3069f/にコピー(旧ファイルを差し替え)
- ffsample/h8/h8_mmc/から、mmc.cを除いたもの全てを(不要なものもあるが、手っ取り早く)、toppers_fatfs/source/fatfs/にコピー(旧ファイルを差し替え)
なお、ビルドは、カーネルから行う必要はなく(?)、サンプルプログラムの方だけでOKのようです。
- toppers_fatfs/source/fatfs/integer.h
//typedef int INT; // TOPPERS側と二重定義になるのでコメントアウト //typedef unsigned int UINT; // TOPPERS側と二重定義になるのでコメントアウト typedef unsigned int UINT2; // UINTをUINT2として再定義(あまりに安直なので、良い子はまねしないで下さい(笑)これに伴い、以下のファイルの「UINT」を「UINT2」に全置換。
toppers_fatfs/source/fatfs/ff.h
toppers_fatfs/source/fatfs/ff.c
toppers_fatfs/source/config/h8_akih8_3069f/mmc.c
- toppers_fatfs/source/sample/sample1.c
void test_read_write(FATFS *fs) { … //WORD n; UINT2 n; … } void test_seek(FATFS *fs) { … //WORD n; UINT2 n; … } void make_file(char *filename) { … //WORD n; UINT2 n; … }さらに、「sects_clust」を「csize」に全置換。
あと、scan_files()はこちらのページの使用例のものに差し替えています。
- toppers_fatfs/source/fatfs/ff.c(R0.04の時と同様の内容)
最後に追加(注:入れる場所は検討の余地あり。未実装なのはコピー元のFatFs for TOPPERSがそうなっているため)
/* * 日付・時刻の取得 * ToDo:未実装 */ DWORD get_fattime(void) { return ((DWORD)0); }- toppers_fatfs/source/config/h8_akih8_3069f/mmc.c(R0.04の時と同様の内容)
//#include "machine.h" // コメントアウト /* Control signals (Platform dependent) */ //#define MMCLK IO.PDR5.BIT.B0 /* MMC SCLK */ //#define MMDI IO.PDR5.BIT.B1 /* MMC DI */ //#define MMDO IO.PDR5.BIT.B2 /* MMC DO */ //#define MMCS IO.PDR5.BIT.B3 /* MMC CS */ //#define SELECT() MMCS = 0 /* MMC CS = L */ //#define DESELECT() MMCS = 1 /* MMC CS = H */ #define MMCLK PBDR.BIT.B3 /* MMC SCLK */ // MESベースから変更 #define MMDI PBDR.BIT.B6 /* MMC DI */ // MESベースと変更なし #define MMDO PBDR.BIT.B7 /* MMC DO */ // MESベースと変更なし #define MMCS PBDR.BIT.B0 /* MMC CS */ // MESベースと変更なし #define SELECT() MMCS = 1 /* MMC CS = L */ // ハードウェアで論理が反転している?ので逆を指定 #define DESELECT() MMCS = 0 /* MMC CS = H */ // ハードウェアで論理が反転している?ので逆を指定 //#define SOCKPORT IO.PDR5.BYTE /* Socket control port */ #define SOCKPORT PBDR.BYTE /* Socket control port */ … void power_on (void)は(ウチでは使わないので)全文コメントアウト void power_off (void)は(ウチでは使わないので)全文コメントアウト … DSTATUS disk_initialize ( … ) { PBDDR = 0x49; /* I/O port の種別を指定(入れる場所は検討の余地あり) */ … // power_on(); /* Force socket power on */コメントアウト … // power_off();コメントアウト … }
動作テスト
結果として、サンプルプログラムの各テスト項目とも、正常に動作しました。
(ただし、若干の紆余曲折がありました。詳細は、次項の「考察」を参照して下さい。)
考察
当初は、FatFsを最新版に変更しても、処理の途中でエラーが出て止まっていました。
(以下のケース以外にも、ディレクトリ検索の途中(3階層目に入るとダメみたい)で終わってしまう、とか、ソースを弄るごとに症状は様々。)
印象としては、メモリ破壊のような感じだったので、あれこれ試行錯誤した結果、「sample1.cの、test_dir()とscan_files()のstaticを外してやる」ことで、うまくいくようになりました。
関数のstaticって、スコープの役割だけでなく、メモリ配置にも関係するんでしょうか。よく分かりません。ただし、(UINTのUINT2へのリプレースといい)あまりにも行き当たりばったり過ぎる(笑)ので、もっと真面目に構成を見直した方がいいとは思いますが、まぁ、個人が学習(道楽)目的でやってる程度であれば許してもらえる範囲かな、という感じです。
なお、SDカードをMacに接続すると、いろいろ隠しファイル/フォルダが作られますが、それらも一通りリストアップする事が出来ました。
お世話になったサイト
有用なソフトウェアおよび貴重な情報をご提供頂いている皆様に、お礼申し上げます。(以下、順不同)
参考サイト(1):えるむ(ELM - 汎用FATファイルシステム・モジュール)
更新履歴
2011.11.12 新規作成
[Home] [MacSoft] [Donation] [History]