作者のつぶやき 2002年2月1日〜2月28日 Junk box | P/ECE hacking | BBS
△ 2002年3月のつぶやきへ
2002/02/22 MSか。
- X箱発売ネタは各所でやってると思うので略

- 今日は、いつもより多めにメールがきましたね...。
  • 2002/02/22 23:48 Microsoft プロダクト セキュリティ 警告サービス New Security Information (MS02-010)
  • 2002/02/22 23:33 Microsoft プロダクト セキュリティ 警告サービス New Security Information (MS02-009)
  • 2002/02/22 23:13 Microsoft プロダクト セキュリティ 警告サービス New Security Information (MS02-008)
  • 2002/02/22 16:15 Microsoft プロダクト セキュリティ 警告サービス New Security Information (MS02-010) 速報
  • 2002/02/22 15:13 Microsoft プロダクト セキュリティ 警告サービス New Security Information (MS02-009) 速報
  • 2002/02/22 13:28 Microsoft プロダクト セキュリティ 警告サービス New Security Information (MS02-008) 速報
速報なんてついたのは今回が初めてな気が。微妙にやる気を感じます。いつもはセキュ板あたりで関連情報の書き込みがあった翌日くらいに、その内容のメールが来てましたし(^^;

- ぱ研で検索エンジンモノが実装された模様。UTF-8もちゃんとデコードされてます。 ソースが公開されたらルーチンをこっちにも使わせていただこうとおもいます。しかし何故 charset=Shift_JIS (^^;;;

2002/02/21 P/ECEの動作クロックと電池の持ち
おさんぽ綾香@フルバージョン+電圧モニタ P/ECEは電池電圧がモニタ出来るように作られているので、動作クロックによる電池の持ち具合を調べてみました。 電池にはPanasonicのアルカリ乾電池12本セット(LR6GD/12SW, 使用推奨期限 2003年12月)を使い、 残量変化を調べるためのプログラムには、チュートリアル「おさんぽ綾香」を最後まで完成させたものにこれをインクルード、修正したものを 用いました。音の出力レベルは8で内蔵スピーカで演奏, BIOSは ver1.18, 気温は10℃で行いました。

動作クロックと電池電圧 さて、結果は右の通り。データは1分毎に収集し、過去1分間の平均電圧を、最高電圧を、最低電圧をでプロットしました。

- 標準的な動作クロックである24MHzでは、約4時間で 1Vを切ってしまいました。 1V以下となるとその後電圧が急激に低下していくようですので、この辺が使用限界な感じです。

- 12MHzモードでこのプログラムを実行するとコマ落ちが生じてしまうため、きちんとした比較にはならないのですが、 24MHz時の1.5倍程度は持つ感じですね。電池を長持ちさせるためには、こまめにクロック調整をしたほうがよさそうです。

- ちなみに48MHzモードかつメモリアクセスを1Waitとすると、2時間でアウト。 といっても、WonderSwanは 3MHz で 20時間 (P/ECEもWonderSwanも単3電池1本で動作)ですから、演算量の割には電池の持ちはいいと思います。


2002/02/10 Shift JISとgcc
えー、私はgccが嫌いです。理由はShift JISでコケるから :-)
gccでコンパイルされてるperlが走っているサーバにcgiを投げる場合には、 大抵EUCにコード変換してからアップロードしないとエラーや文字化けの原因になります。 また、各種開発環境でも、gccベースなモノはいっぱいあって困ってしまいます。
#これだけShift JISが普及してるのに対応しないなんて....怠慢というか傲慢というか...ぶつぶつ。
#それに甘んじてるユーザもアレといえばアレだけど。
さて、gccでトラブルになるShift JISな漢字は実は以下の文字のみです。
表予ソ十―暴構能貼申噂饅兔x欺圭蚕曾箪禄
浬喀媾彌拿杤歃濬畚秉綵臀藹觸軆鐔鷭xЫ\
これらはすべて2バイト目に0x5c(\)を含みます。このため、 printf 中に、
"ートしています"
なんて書くと謎のWarningが出たり文字化けしたり..。さらに、

 unsigned char BASE64_TABLE[]=
   {"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}; // 変換
 int BASE64_INVTABLE[256]; // 逆引き用

と書くと、コンパイラは青色の部分を前の行のコメントの続き(前の行が\でおわっているから)だと勘違いして、 無かったことにしてくれやがります。もうね、(以下略)

と愚痴っても何もはじまりませんので、これの対策です。 上に挙げた漢字のうち自分がよくつかうような文字を覚えてしまってそれを意図的に避ける、というのも 一つの手ですが、よくやるのが、おかしな結果になるところに\をつっこむ方法。"ソ\ート"とかね。 また、行末の場合には // 変換表_ なんて感じで余計な文字を最後に入れます。ああ、うざい(-_-#

で、本題。P/ECEもgccベースなコンパイラ等がくっついてきます。当然これらを気にしなければいけないんだろうなーと、鬱になっていたところ、

PCC33 - EPSON S1C33 GNU C Compiler Driver for PIECE ver1.00
Usage: pcc33 [options...] files...
Options:
  :
  :
  -J         : Enable Shift_JIS strings on(=1 def:) / off(=0)
  :

いやー、わかってらっしゃる。printf中に適当に漢字を書いても全然問題になりません。 でも、これでも行末のは、やっぱり駄目か...。 とおもったら、ver 1.02で暫定サポートされてますね。 至れり尽せり。
動作周波数によるP/ECEの電池の持ち実験は、手元の電池がなくなってしまったので、また後ほど。

2002/02/09 P/ECEってば
世間的にはほとんど盛り上がっていない P/ECEですが、 結構熱いことになってます。ハードウェア系だけをみても、 などなど、その他いっぱいです。いやはや。
そうそう、回路図にも、カーネルのソースにも、転送ツールにも何故かお名前がある (って、一人でつくったんでしょうか(汗>P/ECE) MIO.Hさんのページによると、 拡張端子のシリアルI/Oはデバッグ時に 3.3V 3MHz で叩くようです。 普通のシリアルとしても結構な速さがでるかも<ってマニュアル読めよ(-_-#
また、P/ECEの画面キャプチャは、 任意のタイミングでDOS窓から、
isd c
と打ち込むだけで出来る模様。親切ですね。
#って、48MHz動作時は落ちるなぁ。直さないと。
現在、各動作クロックにおける電池の減り具合を検証中。 電池の電圧がはじめからモニタできるようになってるので、電圧の経時変化を追うのは簡単です。
#ただ、ファイルシステムが...。
#FAT(ファイルアロケーションテーブル)が見えないのにセクタ単位で書き込むAPIって気持ち悪い...。

2002/02/08 お役に立ってますか?
トップページ40000hitありがとうございます。 トップページのアクセスカウンタなんてちっとも気にしてなかったんですが、 いつのまにやら(私としては)えらい勢いで回っているので、ちとびっくりしております。
#全然更新してなかったのに何故...
ちなみに、トップページのアクセス数は全体の15%程度。これは意図通りでニヤリ( ̄ー ̄) といった感じです。 これからも、もっと直リンしていただけるよう、開発日報(このページ)の それぞれの水色の題名の部分にもリンクをつけました。
#まさやんのページで多用してるのをみて、いいなぁ、とおもったので。
#ちなみに、今までもURLのあとに#日付をつければそこを参照できるようにはしてます。
各項目にリンクを張りたい場合には、水色の部分をクリック(&リロード)した時にブラウザに表示されるURLをつかってくださいませ。
それでは、今後ともよろしくおねがいいたします。

2002/02/04 P/ECEを48MHzで動かす(3/3)
なんで前回の手順だけではほんの僅かしか速くならないんでしょう。
とりあえず、回路図を見直してみました。
48MHz動作に関連する部分の回路 クロックを48 MHzに切り替えるためには、まず、P07 を 0 にします(これをやっているのがport_P0x &= ~0x80;の部分です)。 すると、PLLS1 が 0 になります。PLLS0 は VDDE につながっているので常に 1 です。 CPUマニュアルによると、PLLS1=0 / PLLS0=1の時 クロックは x4、PLLS1=1 / PLLS0=1 の時 クロックは x2 となります。 これは正しく動いているのはこれまで検証済みです。ところで、よくみると、#X2SPDの方にも線がつながってますね。 CPUマニュアルの170ページ以降をみると、これの動作が書いてあります。
#X2SPD端子が0に設定されている時、外部メモリへのアクセスはCPUクロックの1/2になります。
#X2SPD端子が1に設定されている時は、外部、内部ともCPUクロックと同じになります。
がーん。ということは、せっかく48MHzに切り替えても、外部アクセスは24MHzと同じになるのか。 そりゃないよ。何で#X2SPDなんかに配線を....。あっ、
ココをカットすれば外部も48MHz動作 ×印をカットすれば、#X2SPDは VDDE につながって、常に 1 となるので 外部メモリにも 48MHz のクロックが行くやん。
#そのためのプルアップ抵抗(R114,47k)だったのか(;´Д`)
#MIO.Hさん(回路図にお名前が)に乾杯
じゃ、さっそくパターンを切ってみますか(笑) と思い、ふたを開けてみました。うっ、
細かくて私の手には負えません(T-T)
どなたかトライしてみてください。但し自己責任で。

#情報によるとこのCPUは外部バスの動作周波数上限が33MHzらしいので、
#パターンを切って無理矢理48MHzは規格外...。

さて、他にソフトだけで外部メモリに高速アクセスする手は無いものか。 CPUドキュメントの 188〜189ページ外部ROM/RAM等へのウエイト設定等を行うためのレジスタ一覧が載っています。 \PIECE\docs\資料\info.txtとCPUドキュメントの28ページを見比べると、 SRAMはエリア4、FlashROMはエリア10に該当するようなので、ベンチマークプログラムの 「// 結果を画面に出力」 のところに以下の行を追加して眺めてみました。

	pceFontSetPos( 0, 30);
	pceFontPrintf(" SRAM       WAIT = %1d",\
		(7&(*(volatile unsigned short int*)0x4812A)) );
	pceFontSetPos( 0, 40);
	pceFontPrintf(" Flash ROM  WAIT = %1d",\
		(7&(*(volatile unsigned short int*)0x48126)) );

結果は、
クロックSRAMFlash
6 MHz1 wait1 wait
12 MHz2 wait2 wait
24 MHz2 wait2 wait
48 MHz2 wait2 wait

なんか、ウエイト数変わってるし. . .
Σ( ̄□ ̄ハッ。ということは 48MHz でも 1 waitにすればいいのか。でも 1waitにしたら速すぎてついてこれないかなぁ。 SRAMのドキュメントによると、1 waitでは規格外のようです。 でも、あえて、48MHz時には1waitとなるように、両方のソースをちょこっと弄ってみました。すると、
クロックカウント
6 MHz994
12 MHz1408
24 MHz2871
48 MHz3024→4473

ウエイトを削ってもSRAMもFlash ROMもついてくるよ。(;´Д`) ハァハァ
(注)48MHz以外の周波数でウエイトを削ってもやはり速くなります。
他に高速化の手段はないかなぁ...。 そこで、CPUマニュアルをX2SPDでさらに検索。200ページに、
#X2SPD端子が0に設定されている場合、A1X1MD(D3/0x4813A)に1を書き込むとエリア1(内蔵周辺回路)がCPUクロックの2サイクルでリード/ライトされます。 A1X1MDが0の場合は4サイクルでリード/ライトされます。
#X2SPD端子が1の場合は、A1X1MDの設定にかかわらず2サイクルに固定です。
とあります。ん?じゃ、A1X1MDに1を書けばもしや!?.......はじめから 1 でした(泣
というわけで、要点をまとめると、

P/ECEを48MHzでそれなりに動作させるためには、

- P07 ピンを 0に設定する。
- USB/1msタイマなどを設定しなおす。
- 極力内蔵RAMを使うようにする。
以上、3点に気をつければいいということになります。 48 MHzモードは一見 24 MHzの倍速で動く気がしますが、 Flash ROM/SRAMへのアクセスには 24MHz時と同じだけ時間がかかるので、 カーネルをひたすら呼ぶようなアプリケーションに用いても速度の向上はほとんど期待できません
また、他のスピードアップテクとして、SRAM/Flash ROMを 1ウエイトに設定しなおす という方法があります。これを使うと何の工夫も無しに1.5倍速位になります。 これは 48MHzに限らず使えます。但し、規格外です。 上で弄ったソースと実行ファイルをこちらに置いておきます。 ご自分のプログラムへのご利用・改造・再配布などもご自由にどうぞ。
#カーネルのバージョンアップにより、USB/1msタイマの設定法を変更しなければならなくなるかもしれません。
ただし、何度も書くようですが、 ご利用は自己責任で。
おわり

もし、こうやればもっと速くなるよ、というのがありましたら、メールBBSなどで教えていただけると嬉しいです。
Special Thanks : PIECE Official WebPage - P/ECE開発者掲示板(NN4.xでは読めません)に書き込んでいただいた皆さん。

2002/02/02 P/ECEを48MHzで動かす(2/3)
さて、とりあえず、倍速で動いてるっぽいですが、きのうの状態ではちと役に立ちません。 USBや音楽が正しく動作するよう、以下の通り修正を加えました。

#ifndef _TURBO_H_
#define _TURBO_H_

// 24MHz/48MHz切替等設定I/Oポート
#define	port_P0x	(*(volatile unsigned char*)0x402D1)

// 16bitタイマn 制御レジスタ
#define reg_TC0		(*(volatile unsigned short int*)0x48186)
#define reg_TC1		(*(volatile unsigned short int*)0x4818E)
#define reg_TC4		(*(volatile unsigned short int*)0x481A6)

// 16bitタイマ0 コンペアデータB 設定レジスタ (1msタイマ) デフォルト=5999
#define reg_CR0B	(*(volatile unsigned short int*)0x48182)

// 16bitタイマx クロックコントロールレジスタ
#define reg_CC1	(*(volatile unsigned char*)0x40148)
#define reg_CC4	(*(volatile unsigned char*)0x4014B)

void TurboH_StopTimer(void){
	reg_TC0 &= ~4;  reg_TC1 &= ~4; reg_TC4 &= ~4;
}
void TurboH_StartTimer(void){
	reg_TC0 |= 4;   reg_TC1 |= 4;  reg_TC4 |= 4;
}

void TurboON(void){
	TurboH_StopTimer();	// カウント一時停止
	port_P0x &= ~0x80;	// ベースクロックを48MHzに.
				       // ベースクロック/分周比/コンペアデータ
	reg_CR0B = 11999;  		    	// 48MHz/4/12000 = 1kHz  (1msカウンタ)
	reg_CC1  = (reg_CC1 & ~0x7) | 1;	// 48MHz/2/750   = 32kHz (PWM音源用)
	reg_CC4  = (reg_CC4 & ~0x7) | 1;	// 48MHz/2/4     = 6MHz (USB用クロック)
	TurboH_StartTimer();	// カウント開始
}

void TurboOFF(void){
	TurboH_StopTimer();	// カウント一時停止
	port_P0x |=  0x80;	// ベースクロックを24MHzに.
	reg_CR0B = 5999;			// 24MHz/4/6000  = 1kHz  (1msカウンタ)
	reg_CC1  = (reg_CC1 & ~0x7) | 0;	// 24MHz/1/750   = 32kHz (PWM音源用)
	reg_CC4  = (reg_CC4 & ~0x7) | 0;	// 24MHz/1/4     = 6MHz (USB用クロック)
	TurboH_StartTimer();	// カウント開始
}

#endif
これで「おさんぽ綾香」は、48MHzモードでも無事正常に動くようになりました。めでたしめでたし。 でも、これじゃほんとに速いかどうか、わかんないよなぁ。というわけで、 ベンチマークっぽいものを下のように書いて見ました。

#include <stdio.h>
#include <stdlib.h>
#include <piece.h>
#include "turbo.h"

unsigned char vbuff[128*88];
static unsigned char draw;

void pceAppInit( void )
{
	pceLCDDispStop();
	pceLCDSetBuffer( vbuff );
	pceAppSetProcPeriod( 80 );	// 80ms毎に pceAppProc()を呼び出す 
	memset( vbuff, 0, 128*88 );
	pceCPUSetSpeed(0);
	pceLCDDispStart();
	draw = 1;
	TurboON();
}

void pceAppProc( int cnt )
{
	static mode = 2, old_mode=-1;
	static char name[4][8]={"48 MHz","24 MHz","12 MHz"," 6 MHz"};

	int i,count=0;
	unsigned long ct;

	// 10 ms でいくつ数えられるかカウント

	ct = pceTimerGetCount();
	while ( pceTimerGetCount() < ct + 10 ){
		count++;
	}

	// ボタンによる速度切り替え( 48MHz 〜 6MHz )

	if ( (pcePadGet() & TRG_LF) && mode > 0 )mode--;
	if ( (pcePadGet() & TRG_RI) && mode < 3 )mode++;
	if ( mode != old_mode ){
		old_mode = mode;
		switch(mode){
			case 0:
				TurboON(); pceCPUSetSpeed(0); break;
			case 1:
				TurboOFF(); pceCPUSetSpeed(0); break;
			case 2:
				TurboOFF(); pceCPUSetSpeed(1); break;
			case 3:
				TurboOFF(); pceCPUSetSpeed(2); break;
		}
	}

	// 結果を画面に出力

	pceFontSetPos( 0, 10);
	pceFontPrintf("%5d counts/10 ms",count);
	pceFontSetPos( 64, 20);
	pceFontPrintf("at %s",name[mode]);
	pceLCDTrans();

	// Bボタンで プログラム終了

	if( pcePadGet() & PAD_B ){
		pceAppReqExit(0);
	}
}

void pceAppExit( void )
{
	TurboOFF();
}

さてと、結果は、
クロックカウント
12 MHz1408
24 MHz2871
48 MHz3024
(゜Д゜)ハァ?
(アレの170ページ目に大ヒントが)
つづく

2002/02/01 P/ECEを48MHzで動かす(1/3)
この記事にはP/ECEの電子回路に過度の負担をかけるプログラムが記載されています。
真似してP/ECEを壊しても知りません :-)
P/ECEは24MHzで動作ってことになってます。が、回路図を眺めると、 ちょっとしたプログラムを書けば48MHz動作に切り替わるよう回路が設計されている感じです。 もちろん、本体の改造は一切不要です。 そこで、以下のソースをturbo.hという名前で作成、チュートリアル「おさんぽ綾香」をつくったフォルダに保存しました。

#ifndef _TURBO_H_
#define _TURBO_H_

#define port_P0x   (*(volatile unsigned char*)0x402D1)

void TurboON(void){
   port_P0x &= ~0x80;
}

void TurboOFF(void){
   port_P0x |= 0x80;
}

#endif
で、チュートリアルどおりに最後まで作った ayaka.c に、以下の行を追加、コンパイル。
  1. #include <piece.h> の次の行に、
    #include "turbo.h"
  2. void pceAppInit( void )内の、 vram = pceLCDSetBuffer(INVALIDPTR); の次の行に、
    TurboON();
  3. void pceAppExit( void )内の、 pceWaveStop(0); の次の行に、
    TurboOFF();
で、たとえ倍速で動いたとしても、P/ECEをぶっ壊しかねない諸刃の剣。 素人にはおすすめできない。と思いつつ実行...。
音程が2倍、演奏速度が2倍になったよ。(;´Д`) ハァハァ  
48MHzになっても、LCD周りはちゃんと動いてるみたいです。 でも、実行後はUSB経由でアクセス不能になってしまいました (電池を抜き差しすれば復活)。 まあ、USBのチップに一時的に2倍のクロックがかかってるのでこうなるのは予想範囲内の動作だけど。

▽ 2002年 1月のつぶやきへ
ここもリンクフリー ささお <junkbox@erato.dricas.com> Junk box | BBS
* リンクする時は、各項目の題名の部分をクリック(&リロード)した時に表示されるURLをつかうと便利。