コグノスケ


link 未来から過去へ表示(*)  link 過去から未来へ表示

link もっと前
2021年10月4日 >>> 2021年9月21日
link もっと後

2021年10月4日

Might and Magicファミコン版 - まとめリンク

目次: Might and Magicファミコン版

TASに挑んだ記録。

解析したときの情報。その他。

リンク集

Might and Magicの攻略、解析の参考になるサイトです。

目次: 一覧の一覧

編集者:すずき(2025/06/08 23:47)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2021年9月30日

携帯の遍歴

日記を漁って携帯の遍歴を書き出してみました。日記を書く習慣がなかった頃の機種や時期は不明です。

J-PHONE, Vodafone
  • 不明(2000年くらい?): SHARP J-SH04辺り?
  • 不明(2002年くらい?): TOSHIBA J-T06辺り?(ストレートだった気がする)
NTTドコモ、ガラケー
  • 2004年8月: Fujitsu F506i
  • 2005年6月: Fujitsu F506iマイク故障で交換
  • 2006年 ?月: NEC N902iS
  • 2008年 ?月: NEC N902iSのバッテリー交換
  • 2010年7月: Panasonic P-03B
NTTドコモ、スマホ
  • 2011年7月: Sony Ericsson Xperia acro SO-02C
  • 2014年3月: SHARP AQUOS PHONE ZETA SH-01F
SIMフリー、スマホ
  • 2016年11月: ASUS Zenfone 3 Deluxe
  • 2021年4月: Google Pixel 4a

(基本的には)長く使っていた機種は気に入っていた機種です。ガラケー時代はいずれも良い機種で、バッテリーが死ぬまで使ってました。最後のP-03Bだけ1年しか使っていませんが、不満があったわけではなく、知人に携帯を譲るため手放しました。たしか。

スマホ時代は国内メーカーの質は明らかに落ちました。SO-02Cはソツなく良かったんですけど、ストレージが少なすぎで買い替え直前は容量不足で挙動不審でした。SH-01Fは性能良いものの、電池がなくなるのが早く、本体が熱すぎでした。この機種で懲りてAndroidハイエンド機を買わなくなりました。

今になって調べてみたところ、この2機種はマシな部類だったようで、富士通ARROWSのように「カイロ機能搭載」「電話ができない」「メールがこない」など、怨嗟にまみれたレビューが未だに残っている機種もあります。悲惨です。

日本だけ異常にiPhone普及率が高い理由って、国内メーカーが2010年代初頭にやらかしたから……!?と思ってしまいました……。

メモ: 技術系の話はFacebookから転記しておくことにした。

編集者:すずき(2021/10/08 16:56)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2021年9月28日

マルチコアのブート処理

目次: RISC-V

メインCPUからサブCPUを起こすとき基本的には、

  • CPUのID(RISC-VであればCSRのmhartid)を見て、自身がメインかサブかを知る
  • サブ側は共有RAMをポーリングなどで見張り、メインCPUからの起動司令を受け取るまで待つ
  • メイン側は共有RAMに値を書いてサブCPUに起動司令を送る

RAMの初期値が不定であると仮定すると、サブCPUが下手にポーリングすると、不定値によって条件が成立してしまい、メインCPUからの起動司令がないのに勝手に起動してしまう事態に陥ります。

素朴な実装

先程書いた基本的な構造を素直に書くとこんなコードになるでしょう。

素朴なマルチコアのブート

/* メインCPUはHARTID=8, サブCPUはHARTID=0...3とする */

#define HARTID_MAIN         8
#define HARTID_SUB_START    0
#define HARTID_SUB_END      3

#define HARTID_MAX          9

struct {
	int boot_wait;
	int boot_done;
} init_core[HARTID_MAX] = {};

int get_hartid(void)
{
	int i;
	__asm__ volatile("csrr %0, mhartid" : "=r"(i));
	return i;
}

/* メインCPUが実行する */
void boot_main(void)
{
	for (int i = HARTID_SUB_START; i < HARTID_SUB_END; i++) {
		init_core[i].boot_wait = 1;
	}
}

/* サブCPUが実行する */
void boot_sub(void)
{
	int hartid = get_hartid();

	while (!init_core[hartid].boot_wait) {
		/* busy loop */
	}
}

残念ながらこのコードは正常に動作しません。共有RAMつまりinit_core[hartid].boot_waitの値が起動直後から != 0だったとき、boot_sub() はboot_main() からの起動司令を待つことなく起動してしまうからです。

不定値への対処

共有RAMの不定値に対処する方法を考えます。基本的にはサブCPUが変数を初期化(boot_wait = 0)してから待ちに入れば良いのですが、新たな問題が生じます。メインCPUとサブCPUの実行順序はどちらが先という保証はないため、

  • メインCPUからの起動司令boot_wait = 1
  • サブCPUで変数を初期化boot_wait = 0

以上の順で実行されるとメインCPU側の起動司令が消されてしまい、ハングアップする可能性があります。この問題の回避のため、変数を1つ追加し、サブCPUのブートが終わるまで、メインCPUは繰り返し起動司令を送るように変更します。

  • 変数を2つ用意する(boot_wait, boot_done)
  • メイン: boot_done = 0
  • メイン: サブから応答(boot_done != 0)があるまで、boot_wait = 1を書き続ける
  • サブ: boot_wait = 0
  • サブ: boot_done = 0
  • サブ: boot_wait == 0なら待つ
  • サブ: boot_done = 1

先程書いた基本的な構造を素直に書くとこんなコードになるでしょう。

不定値への対処を入れたコード

/* メインCPUはHARTID=8, サブCPUはHARTID=0...3とする */

#define HARTID_MAIN         8
#define HARTID_SUB_START    0
#define HARTID_SUB_END      3

#define HARTID_MAX          9

struct {
	int boot_wait;
	int boot_done;
} init_core[HARTID_MAX] = {};

int get_hartid(void)
{
	int i;
	__asm__ volatile("csrr %0, mhartid" : "=r"(i));
	return i;
}

/* メインCPUが実行する */
void boot_main(void)
{
	for (int i = HARTID_SUB_START; i < HARTID_SUB_END; i++) {
		init_core[i].boot_done = 0;
		while (!init_core[i].boot_done) {
			init_core[i].boot_wait = 1;
		}
	}
}

/* サブCPUが実行する */
void boot_sub(void)
{
	int hartid = get_hartid();

	init_core[hartid].boot_wait = 0;
	init_core[hartid].boot_done = 0;

	while (!init_core[hartid].boot_wait) {
		/* busy loop */
	}
	init_core[hartid].boot_done = 1;
}

残念ながらこのコードも正常に動作しません。共有RAMへの値の反映が他のCPUに即座に見えること(アトミック性)を暗に期待しているからです。

アトミック性への対処

今日のマルチコアシステムでは、boot_wait = 0としたときに、他のCPUにも即座に同じ値が見えているとは限りません。主な要因としては、

  • コンパイラによる並べ替え
  • CPUのパイプライン
  • CPUのデータキャッシュ、ライトバッファ

などがあります。通常の変数への代入、参照が他のCPUに即座に値が見えないことにより、おかしくなるパターンはいくつか考えられそうですが、ありがちなパターンとして、

  • サブCPU 0が起動したboot_done = 1
  • メインCPUにboot_done = 1が伝わらず、サブCPU 1の起動指令がいつまでも送られない

以上の順で実行されるとメインCPU側が起動司令を送らないまま、サブCPU側も何もできずハングアップする可能性があります。この問題の回避のため、通常の変数への代入、参照ではなく他のCPUにも値が見えるように初期化、代入(アトミックアクセスする)必要があります。

従来C言語でアトミックアクセスを行うためには、実装対象アーキテクチャの知識やアセンブラの記述を必要とするなど、やや困難が伴いました。ですがC11でアトミックアクセス用の定義stdatomic.hが追加されたことで、アトミックアクセスはかなり楽になりました。素敵ですね。

ひとまず速度を全く気にせず、全てのアクセスをアトミックアクセスに入れ替えると、こんなコードになるでしょう。

アトミック性への対処を入れたコード

/* メインCPUはHARTID=8, サブCPUはHARTID=0...3とする */

#define HARTID_MAIN         8
#define HARTID_SUB_START    0
#define HARTID_SUB_END      3

#define HARTID_MAX          9

struct {
	atomic_int boot_wait;
	atomic_int boot_done;
} init_core[HARTID_MAX] = {};

int get_hartid(void)
{
	int i;
	__asm__ volatile("csrr %0, mhartid" : "=r"(i));
	return i;
}

/* メインCPUが実行する */
void boot_main(void)
{
	for (int i = HARTID_SUB_START; i < HARTID_SUB_END; i++) {
		atomic_store(&init_core[i].boot_done, 0);
		while (!atomic_load(&init_core[i].boot_done)) {
			atomic_store(&init_core[i].boot_wait, 1);
		}
	}
}

/* サブCPUが実行する */
void boot_sub(void)
{
	int hartid = get_hartid();

	atomic_store(&init_core[hartid].boot_wait, 0);
	atomic_store(&init_core[hartid].boot_done, 0);

	while (!atomic_load(&init_core[hartid].boot_wait)) {
		/* busy loop */
	}
	atomic_store(&init_core[hartid].boot_done, 1);
}

C11のアトミックアクセスは何も指定しない場合、一番制限の強い(= 確実に他のCPUに見えるものの、アクセス速度は遅い)memory_order_seq_cstアクセスになります。マルチコアのブートを行うにあたって、常に制限が強いアクセスは必要ありませんが、とりあえずこれで動くはず。

編集者:すずき(2022/04/04 06:05)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2021年9月26日

xtermの256色端末

まれにxtermの256色指定エスケープシーケンスに対応していない端末があってvimの表示が変な色になってしまいます。チェック用のスクリプトを作っておきました。単純に背景色を変更するエスケープシーケンスと、空白文字、色を元に戻すエスケープシーケンスを連打するだけです。

xterm 256色指定エスケープシーケンステスト用スクリプト

#!/bin/sh

ESC_ORG="\e[0m"

print_colors()
{
	for i in ${*};
	do
		printf " %3d\e[%dm  " ${i} ${i};
		echo -n ${ESC_ORG}
	done
	echo
}

print_xterm_colors()
{
	for i in ${*};
	do
		printf " %3d\e[48;5;%dm  " ${i} ${i};
		echo -n ${ESC_ORG}
	done
	echo
}

echo "System colors (ESC[Nm):"
print_colors `seq 40 47`

echo
echo "xterm 256 colors (ESC[48;5;Nm):"
for i in `seq 0 8 248`;
do
	j=`expr ${i} + 7`
	print_xterm_colors `seq ${i} ${j}`
done

実行するとこんな感じになります。


スクリプトの実行結果

対応していない端末だとこうなりますと言いたいところでしたが、対応していない端末が見当たりませんでした。前はあった気がするんだけどなあ……?

編集者:すずき(2021/09/29 01:32)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2021年9月23日

耳年齢チェック

何kHzの音まで聞こえるかテストするサイト、聞こえチェック | Panasonic が、以前Twitterでちょっと話題になりました。

私の場合15kHzまでは聞こえますが、それ以上(17kHz, 19kHz)は全く聞こえません。鳴ってんのか?これ??

測ってみよう

まずブラウザの影響を排除するため、上記のサイトから音源をダウンロードします。WavではなくMP3ファイルでした。

直接オーディオプレイヤーで聞いても15kHz以外は聞こえません。ブラウザのせいじゃなかった。私の耳は全くあてにならないので、オシロスコープにご登場願います。


15kHz再生時の波形


17kHz再生時の波形


19kHz再生時の波形(グラフはキャプチャし忘れて17kHzのまま。右下の周波数表示が19kHzを示している)

いやあ、バッチリ綺麗にSin波が鳴ってます。私は全く聞こえませんね、これが老いかぁ……。

編集者:すずき(2021/09/29 00:21)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
2021年10月4日 >>> 2021年9月21日
link もっと後

管理用メニュー

link 記事を新規作成

<2021>
<<<10>>>
-----12
3456789
10111213141516
17181920212223
24252627282930
31------

最近のコメント5件

  • link 16年2月14日
    すずきさん (08/04 01:31)
    「お役に立ったようでしたら幸いです。」
  • link 16年2月14日
    enc28j60さん (08/03 17:40)
    「ちょうど詰まっていたところです。\n非常...」
  • link 25年7月20日
    すずきさん (07/30 00:10)
    「ギクシャクするのは減速時の2速シフトダウ...」
  • link 25年7月20日
    hdkさん (07/29 07:38)
    「2速発進でギクシャクするんですか? 面白...」
  • link 25年7月20日
    すずきさん (07/28 23:16)
    「なるほど。レガシィB4のATはDレンジで...」

最近の記事20件

  • link 23年6月1日
    すずき (08/21 01:43)
    「[自宅サーバー - まとめリンク] 目次: 自宅サーバーこの日記システム、Wikiの話。カウンターをPerlからPHPに移植日...」
  • link 13年5月10日
    すずき (08/21 01:43)
    「[Debian 7.0 Wheezyにアップデート] 目次: 自宅サーバーリリースノートを読みつつ、apt-get updat...」
  • link 15年4月30日
    すずき (08/21 01:42)
    「[Debian 8.0 Jessieにアップデート] 目次: 自宅サーバーDebianのアップデートが来ていたので、試しに職場...」
  • link 23年6月13日
    すずき (08/21 01:42)
    「[Debian 12 Bookwormにアップデート] 目次: 自宅サーバーDebianの更新はとても簡単でありがたいですが、...」
  • link 25年8月17日
    すずき (08/21 01:40)
    「[Debian 13 Trixieにアップデート] 目次: 自宅サーバー先日8/9にDebian 13がリリースされました。コ...」
  • link 25年8月20日
    すずき (08/21 01:38)
    「[パスポートのオンライン申請] 海外出張の予定が発生してパスポートが必要になりました。以前発行した10年パスポートの発行日を見...」
  • link 25年8月15日
    すずき (08/17 06:26)
    「[帰省終わり、東京へ] 帰ってきました。東京に降り立った瞬間に暑くてイヤになりました……。朝10時...」
  • link 25年8月11日
    すずき (08/17 06:20)
    「[帰省始まり、北海道へ] 北海道に帰省しました。今年は北海道も30℃超え連発で割と暑い年とはいえ、東京と決定的に違う点は湿度で...」
  • link 23年5月15日
    すずき (07/30 01:37)
    「[車 - まとめリンク] 目次: 車三菱FTOの話。群馬県へのドライブ1群馬県へのドライブ2将来車を買い替えるとしたら?FTO...」
  • link 25年7月25日
    すずき (07/30 01:36)
    「[電装系が微妙なジャガーさん] 目次: 車車を買い替えてから1週間くらい経ちました。通勤路以外は幹線道路や高速をメインにしばし...」
  • link 19年9月1日
    すずき (07/30 01:36)
    「[カーナビを買いました] 目次: 車一昨年にカーナビが壊れて(2017年9月3日の日記参照)以来、カーナビを使わず過ごしていま...」
  • link 25年7月20日
    すずき (07/22 01:56)
    「[ジャガーXE Sを買いました] 目次: 車車を買い替えました。ジャガーXE Sです。マイナー車すぎて会社の人たちもあまり知ら...」
  • link 24年7月7日
    すずき (07/22 00:00)
    「[PC - まとめリンク] 目次: PC一覧が欲しくなったので作りました。 スピーカーGX-D90故障ノートPCの内蔵サウンド...」
  • link 21年4月16日
    すずき (07/21 23:59)
    「[ドキュメントスキャナーで書類を電子化] 目次: PC我が家の本棚は広い方ではないのに、ほとんど参照しない書類が幅を取っていて...」
  • link 21年4月6日
    すずき (07/21 23:58)
    「[ディスプレイアーム] 目次: PC机の奥行きが60cmのためか、ディスプレイの足がキーボードとぶつかって若干邪魔なのと、前か...」
  • link 21年2月27日
    すずき (07/21 23:56)
    「[新キーボードMajestouch購入] 目次: PC先日の在宅勤務環境改善(2021年2月12日の日記参照)にて、デュアルデ...」
  • link 21年2月28日
    すずき (07/21 23:55)
    「[JIS配列キーボードとOADG配列キーボード] 目次: PC今まで、いわゆる日本語配列のキー配列のことを漠然とJIS配列と呼...」
  • link 21年3月6日
    すずき (07/21 23:54)
    「[気に入るマウスはどれ?] 目次: PC手に合うワイヤレスマウスを探し続け、高級製品、小さい製品、お手ごろ製品と買いまくり、一...」
  • link 21年3月7日
    すずき (07/21 23:53)
    「[電源タップの雷ガード] 目次: PC在宅勤務環境を整えようと、電源タップを物色していました。電源タップを見ていると大体3つに...」
  • link 21年2月12日
    すずき (07/21 23:50)
    「[在宅勤務環境改善] 目次: PCCOVID-19が流行し始めた昨年2月ころ、在宅勤務が主となりました。当時の気持ちを正直に言...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 2025年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDFファイル RSS 1.0

最終更新: 08/21 01:43