コグノスケ


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

link もっと前
2021年9月13日 >>> 2021年8月17日
link もっと後

2021年9月13日

Zephyrのコンテキストスイッチ

目次: Zephyr

RISC-V向けZephyrの新しいコンテキストスイッチ(CONFIG_USE_SWITCH=y)を実装しているのですが、浮動小数点演算つまりFPUを使うスレッドを生成するとハングします。調べてみると、私が実装している場所の外にある、新しいコンテキストスイッチ(zephyr/kernel/include/kswap.hのdo_swap() 関数)の実装が今まで(CONFIG_USE_SWITCH=n)と違うように見えます。まだ確証はないですけど。

従来の処理arch_swap() では、現在のスレッド(_kernel.current)がコンテキストスイッチ(arch_swap() 内のシステムコール)の内部で旧 → 新に置き換えます。つまりcurrentは切替「前」のスレッドを指している状態でコンテキストスイッチが始まります。

ところがdo_swap() の場合、現在のスレッド(_kernel.current)がコンテキストスイッチ(arch_switch() 関数)を呼ぶ「前」に旧 → 新スレッドに置き換えます。つまりcurrentは切替「後」のスレッドを指している状態でコンテキストスイッチが始まります。

ハングに至るメカニズム

RISC-V Zephyr(他のアーキテクチャも同じかな?)ではFPU使えるスレッドと使えないスレッドを使い分けることができます。コンテキストスイッチ処理では、currentスレッドがFPUを使うか使わないかにより処理を変えています。

  • FPUを使う: currentの浮動小数点レジスタをスタックに退避する処理を実行
  • FPUを使わない: 退避する処理はスキップされる

私が実装したコンテキストスイッチも当然同じように実装したのですが……。先ほど説明したようにdo_swap() はcurrentを切替「後」のスレッドに設定するため、こんな悲劇が起きます。

  • 旧スレッド(FPU使用不可)→ 新スレッド(FPU使用可)の明示的コンテキストスイッチを行う
  • do_swap() がcurrentを新スレッド(FPU使用可)に変える
  • コンテキストスイッチ
  • 旧スレッド(FPU使用不可)で実行しているのに、currentは新スレッド(FPU使用可)になっている
  • 浮動小数点レジスタを退避しようとして「不正命令例外」で死ぬ

原因の一端は掴めたものの、どうして他のアーキテクチャは困っていないのか?do_swap() の実装は意図的なのか?良くわかりません……。

編集者:すずき(2023/09/24 12:03)

コメント一覧

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



2021年9月10日

C言語の標準的な標準ではない機能

目次: C言語とlibc

C言語のmath.hヘッダには、円周率πを表すマクロM_PIが定義されています。しかしこのマクロ、コンパイラに -std=c99やc11を指定すると使えなくなるんですね。C言語通には常識かもしれませんが、個人的にハマったのでメモしておきます。

M_PIを使ったプログラム

#include <math.h>

int main(void)
{
	return M_PI;
}
C99としてコンパイルするとM_PIは宣言されていないと言われる
$ gcc -Wall -std=c99 a.c

a.c: In function ‘main’:
a.c:5:9: error: ‘M_PI’ undeclared (first use in this function)
    5 |  return M_PI;
      |         ^~~~
a.c:5:9: note: each undeclared identifier is reported only once for each function it appears in

もしc99やc11でもM_PIを使いたい場合は、math.hをインクルードする前に_DEFAULT_SOURCE(_GNU_SOURCEでも良いです)をdefineすると使えるようになります。

M_PIを使ったプログラム、C99でも動く版

#define _DEFAULT_SOURCE

#include <math.h>

int main(void)
{
	return M_PI;
}

使えるようになりました。

編集者:すずき(2023/02/04 20:27)

コメント一覧

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



2021年9月5日

ゲーム用のPCを作りたいが、高い

目次: ゲーム

普段PCで何か作業する場合WindowsのノートPCを使っていて、マイコンボードでの実験や開発はLinuxのデスクトップPCにリモートアクセスして行っています。通常の作業には申し分ない性能と使い勝手が実現できています。

が、ゲームとなると話がやや違ってきます。ゲームは大抵Windowsを要求してくるので、我が家の唯一のWindows PCであるノートPCで遊ぶしかないんですけども、最近の3Dを多用したゲームは重すぎて、そのうちGPUが燃える(物理的に)んじゃないかと心配になってきます。

GPUが高すぎる

しばらく前に在宅勤務環境を整えた(2021年2月12日の日記参照)こともあり、机近辺に新たなPCを置けそうな場所ができました。Windowsをインストールしたゲーム用PCを新たに作りたいところですが、最近はあまりにもGPUが高すぎて購入に踏み切れません……。

いわゆるミドルエンドと呼ばれるTDP 200W以下(※)クラスは、今だとRadeon RX 6600 XTもしくはGeForce RTX 3060辺りだと思うんですが、Radeonはそもそも売り切れていて手に入りませんし、RTX 3060はお値段が6万円オーバーとあまりにも高すぎます。

GPUの値段はまだまだ下がらないようですし、諦めて買うしかないんですかねえ?

(※)補助電源8pin x 1くらいのカードをイメージしてます。GPUに供給可能な電力はPCIeカードエッジ(75W)+ 補助電源8pin x 1(150W)= Max 225Wです。

編集者:すずき(2023/09/24 13:34)

コメント一覧

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



2021年9月4日

Zephyr on HiFive Unmatched/HiFive Unleashed

目次: Zephyr

ZephyrのHiFive UnmatchedとHiFive Unleashedへのポーティングが本家のmainにマージ(※)されました。2.7.0のマージウインドウが終わるまで、メンテナーチームは忙しそうだったので、もうしばらく放置かな?と思っていましたが、昨日突然マージされました。

これは以前トライしていたZephyrのHiFive Unleashedへの移植(2021年6月6日の日記参照)に加え、HiFive Unmatchedへの移植(2021年8月20日の日記参照)も追加したものです。RISC-Vはメンテナーが少ないこともあって割と放置気味になりがちなんですよね……。

ポーティングといっても、最低限の設定+とりあえず起動するだけで、ほぼ何にも使えない(UARTとSPIくらいしか動きません)から、まだまだこれからだな。うん。

(※)最近はmasterという単語はダメだねってことで、既存のリポジトリもmaster → mainに置き換えられたプロジェクトが増えてます。

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

編集者:すずき(2023/09/24 12:07)

コメント一覧

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



2021年8月31日

開発環境としてのHiFive Unmatched

目次: RISC-V

最近はHiFive Unmatched(HiFive Unleashedも使い勝手はほぼ同じ)を使っていることが多いのですが、このボードは開発環境としてはなかなか魅力的です。素敵なところをいくつか挙げると、

  • USBケーブル1本でJTAGとUARTが同時に使える(JTAGの箱が要らない)
  • 元々Linux用のボードなので、1GHzクラスのRV64IMAC 1コア+RV64GC 4コア、USB、PCIe、GPIO、SPIなど重厚なハードが揃っている
  • SoCの仕様書が公開されていて、誰でもアクセスできる

他社のボードもいくつか使いましたけど、USB-JTAGチップ搭載のボードはあまり見かけません。通常はJTAGを使いたいと思ったら、JTAGの箱(私はSEGGER J-LINK EDUを使っています)が必要です。が、HiFive系のボードはJTAGの箱が不要です。これは地味に嬉しいです。

製品では切り捨てられがちなJTAG

JTAGはベアメタルやブートローダのようなローレベル開発で重宝しますが、製品のボードにはまず搭載されることはないです。理由は単純。JTAGはデバッグ用の機能で、正常動作しているときには全く使わないからです。ボードのコストアップにしかならず、製品用の設計では真っ先に切られる機能です。以前、メーカーに居た時もデバッグ機能はソフトハード関わらず真っ先に切られていました。

利用者目線から見ると、デバッグ機能を切って安くあげるのは大正義です。利用者はまずデバッグ機能なんて使いませんし、デバッグ機能を悪用して機器に侵入するなどの被害を防ぐ効果もあります。

とはいえ開発者目線から見るとデバッグ機能のないボードやSoCは、トラブったとき解析しづらくて困ります……。なので、SoCレベルではデバッグ機能ON、ボードレベルではOFFにしておいて、不具合解析の際は特殊な治具を繋いでボードレベルのデバッグ機能をONにする設計を良く見かけます。

編集者:すずき(2021/09/06 21:05)

コメント一覧

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



2021年8月29日

ノートPCでゲームは辛いよ

目次: ゲーム

最近のPCゲームは画面がとてもキレイですね。シミュレーションゲームなど画質とゲーム性があまり関係ないものであっても、こだわりを感じます。海外レーベルのゲームにリアルな画作りが多い印象です。

画面が美しいのはありがたいですけど、我が家のノートPCに積まれてるディスクリートGPU(Radeon RX 550 Mobile)はあまり性能が高い方ではなく、画質をかなり下げないと「コマ送りかな……??」といわんばかりの描画速度になります。

我が家の重いゲーム、上位三傑

そもそもシミュレーションゲーム好きで、画質や動き重視のゲームは持ってないですが、それでもノートPCには荷が重いゲームたちがいます。

No.1はThe Hunter: Call of the Wildです。画質を上げると景色の描写が非常に美しいです。描画の処理もべらぼうに重いです。我が家のPCでは画質をほぼ最低ランクにしても、草むらなどのオブジェクトの多い場所に突っ込むと、画面がガクガクしてライフルの狙いがつけられません。無駄に難易度が上がる……。

不思議なことに七面鳥だけ、動物の大きさの割に描画が異常に遅くて、描画範囲に入った瞬間に画面がガクガクし始めます。直接見なくても居ることだけはわかるエスパーになれます。

No.2はDyson Sphere Programです。ダイソン球の浮かぶ宇宙、開発中の惑星の景色が素晴らしくキレイです。ゲームの序盤はノートPCでも何ともないんですけど、ゲームの中盤(別の星系に進出する時期)あたりの惑星状に大量の建築物がある状態だと遅くなります。

ジェットで空高く飛び上がったり、惑星間航行で惑星に着陸するときなど、地表の建物が大量に視界に入ってくると、途端に画面がガクガクしてあらぬ方向に飛んでいきます。どこいくんだー。

No.3はAssetto Corsaです。車やコースの描写が非常に美しいです。レースゲームはPlayStation 3あたりで実写と見紛うばかりの画質になりましたが、さらに進化していると思います。ただこのゲーム、最適化を相当頑張っているのか、見た目の綺麗さから想像するより描画の負荷が軽くて驚きます。ロードは遅いけど……。

適当に走るくらいならノートPCでも遊べますが、レースゲームは他のゲームに比較してコマ落ちが致命的ですからね。ノートPCのGPUで遊ぶのは精神衛生上良くないですね。

編集者:すずき(2023/09/24 13:35)

コメント一覧

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



2021年8月26日

ワクチン1回目

自治体の接種会場に行きました。ワクチンはファイザー製でした。

入り口には警備員さんがいましたが、予約システムの予約票は確認されないため「予約してまーす」って言ったら誰でも入れそうでした。が、多少嘘つきが混ざる程度は特に問題ないでしょう。

会場に入れないほど混んだり、1人も来ないなどの事態さえ発生しなければ、別に誰に打ったって良いわけですから。

医療従事者のみなさま

ワクチン接種会場には毎日嫌になるほど人が来ていると思いますが、看護師を始めとした医療従事者の皆様は非常に親切かつ効率的に働いていました。日本の医療は最高だよ、ありがてぇ。

午後だったせいなのか、問診の先生はかなりお疲れモードで、半分目が死んでました。お疲れ様です、無理はしないでください……。

肩が痛い

ワクチンを打った後は、肩こりみたいな痛さ、とか、肩にパンチを食らったような痛さ、と言われてますが、体験したら意味がわかりました。これは痛い……。

編集者:すずき(2021/09/17 01:55)

コメント一覧

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



2021年8月21日

インフラの民営化

上水道を売り払う自治体が出ました(下水道はこれまでもあった)。宮城県、水道3事業の運営権を売却へ 国内で初めて - 日経新聞。過疎地は水道維持費が大赤字と思われるので、速攻で廃止され昔ながらの井戸に戻るでしょう。

井戸=危険ではないですが、井戸の水質は「自己責任」でケチって検査せず使い続ける人達を止められないという点は気になるところです。自治体の基準としても「飲用井戸の衛生確保は、原則として設置者の自己責任」とあります(飲用井戸の衛生管理について - 千葉県より)。

汚染された井戸から疫病が発生、過疎地から都市部に大流行……なんて未来は笑えません。が、昔の日本や今の後進国では起きてた話ですし十分ありえますね。令和は昭和へ回帰する時代かもしれません。国の衰退、生活レベルの低下、衛生面の悪化といった悪い点でね……。

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

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

コメント一覧

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



2021年8月20日

Zephyr on HiFive Unmatched

目次: Zephyr

最近ZephyrをHiFive Unmatchedに移植しています。基本的にはUnmatchedとUnleashedは似ています。メモリマップなどの大枠の仕様はほぼ同じですが、クロック周りを初めとして仕様が違う部分もあります。今日気づいたのは、

違うところUnmatchedUnleashed
外付けの水晶発振器の周波数26MHz33MHz
ペリフェラルクロックhfpclk_pllcore_pllの1/2
DDR領域リセット直後は使えないリセット直後から使える

安易にUnleashedから実装をコピーして楽しようとしたらハマりました……。

ロードする場所

HiFive Unleashedはリセット直後からDDRにアクセスできるかなり変わったボードで、ZephyrはDDRにロードしてしまえば動きました。しかしHiFive UnmatchedのDDRは初期化しないと使えないため、ZephyrをDDRにロードする作戦は使えません。代わりとしては、

  • DTIM(Data Tightly-Integrated Memory)
  • L2-LIM(Loosely Integrated Memory)

DTIMはアクセスが一定速度かつ高速(1ワード、2クロック)で、リセット直後から使用可能で、RTOSにとって理想的なメモリ領域ですが、サイズが8KiBしかありません。Zephyrはデータ領域は10KB前後、コード領域は50KB超えることもザラで、DTIMにはどうやっても載りません。

ZephyrってRTOSの中では割とデカい部類なのでしょうか?Flash ROMに書き込んでXIP(eXecution In Place)する使い方が前提だから、コード領域のサイズはあまり気にしていないのかもしれませんけど。

L2-LIMはL2キャッシュがRAM代わりになる機能です。試してみるとリセット直後から読めますし、サイズも2MBと十分な大きさです。L2-LIMの弱点はL2キャッシュの動作モードをキャッシュモードに変更すると、二度とL2-LIMとして使えなくなることです。本来の使い方としてはDDRを初期化するまでの「一時的なデータ&コード置き場」が役目です。

今のところZephyrで高速コアのU74は動かさないでしょうし、L2キャッシュを有効にすることはないでしょう。たぶん。L2-LIMにZephyrのメインメモリ領域として活躍していただくことにしましょう。

編集者:すずき(2023/09/24 12:07)

コメント一覧

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



2021年8月18日

HiFive Unmatchedの動作周波数

目次: RISC-V

以前HiFive Unleashedの動作周波数を調べました(2019年7月4日の日記参照)。今回はHiFive Unmatchedの動作周波数を調べます。Unmatchedに元々書き込んであるLinuxを起動したあと、PRCIレジスタ領域を見てみました。ダンプすると下記のようになっています。

PRCIレジスタ領域のダンプ
0x10000000:     0xc0000000      0x820544c2      0x00000000      0x820d1180
0x10000010:     0x80000000      0x00000000      0x00000000      0x8206b982
0x10000020:     0x80000000      0x00000000      0x0000006f      0x00000004
0x10000030:     0x00000000      0x00000000      0x030187c1      0x00000000
0x10000040:     0x00000000      0x00000000      0x00000000      0x00000000
0x10000050:     0x82063bc2      0x80000000      0x00000000      0x00000000
0x10000060:     0x00000000      0x00000000      0x00000000      0x00000000

ビット31がPLL enableですので、オフセット0x4:core_pll, 0xc: ddr_pll, 0x1c: gemgxl_pll, 0x50: hfpclk_pllの設定が有効になっているようです。

いずれのPLL設定もビットフィールドの意味は同じで、[5:0] divr, [14:6] divf, [17:15] divqです。ビットフィールドが4bit境界にないので、PythonなどでPLLの設定値を表示させると楽だと思います。

SiFive U740の仕様書(7. Clocking and Reset)を見ると、PLLの出力周波数foutは
fout = fin / (div_r + 1) * 2 * (div_f + 1) / 2 ^ (div_q)
とのこと。PLLの入力finはいずれのPLLも同じでhfclkという26MHzの外部クロックです。

各PLL設定の意味
>> def dump(val):
...     r = val & 0x3f
...     f = (val >> 6) & 0x1ff
...     q = (val >> 15) & 0x7
...     o = 26 / (r + 1) * 2 * (f + 1) / pow(2, q)
...     print("r", r, "f", f, "q", q, "freq", o)

>>> dump(0x820544c2)
r 2 f 275 q 2 freq 1196.0

>>> dump(0x820d1180)
r 0 f 70 q 2 freq 923.0

>>> dump(0x8206b982)
r 2 f 230 q 5 freq 125.12499999999999

>>> dump(0x82063bc2)
r 2 f 239 q 4 freq 260.0

出力結果を見るとcore_pll:1196MHz, ddr_pll:923MHz, gemgxl_pll:125.125MHz, hfpclk_pll: 260MHzという設定です。どうしてこの値なのかはわからないですけど、参考になります。

rangeフィールドの意味

PLL設定に [20:18] rangeというフィールドがあるのですが、SiFiveの仕様書には説明が書かれていません。クロック周りはAnalog Bitsという会社のCLN28HPC Wide Range PLLを使っているようですが、PLLの詳細仕様はNDAを結ばないと知ることができません。うーむ、不親切……。

しかしSiFiveの人たちはLinuxのクロックドライバを作ってくれており、実装からPLLの仕様を窺い知ることができます。ドライバはlinux/drivers/clk/analogbits/wrpll-cln28hpc.cにあります。

PLLのrange設定の実装

/**
 * __wrpll_calc_filter_range() - determine PLL loop filter bandwidth
 * @post_divr_freq: input clock rate after the R divider
 *
 * Select the value to be presented to the PLL RANGE input signals, based
 * on the input clock frequency after the post-R-divider @post_divr_freq.
 * This code follows the recommendations in the PLL datasheet for filter
 * range selection.
 *
 * Return: The RANGE value to be presented to the PLL configuration inputs,
 *         or a negative return code upon error.
 */
static int __wrpll_calc_filter_range(unsigned long post_divr_freq)
{
	if (post_divr_freq < MIN_POST_DIVR_FREQ ||
	    post_divr_freq > MAX_POST_DIVR_FREQ) {
		WARN(1, "%s: post-divider reference freq out of range: %lu",
		     __func__, post_divr_freq);
		return -ERANGE;
	}

	switch (post_divr_freq) {
	case 0 ... 10999999:
		return 1;
	case 11000000 ... 17999999:
		return 2;
	case 18000000 ... 29999999:
		return 3;
	case 30000000 ... 49999999:
		return 4;
	case 50000000 ... 79999999:
		return 5;
	case 80000000 ... 129999999:
		return 6;
	}

	return 7;
}

単純に入力をswitch文で見ているだけです。説明を見るとpost-R-dividerとあるのでfin / (divr + 1) の周波数を見て決めれば良さそうですね。この情報を公開していただけるのは非常にありがたいのですが、NDAは大丈夫なんですかね……?大した情報ではないとはいえ、ちょっと心配になってしまいます。

編集者:すずき(2021/08/21 02:42)

コメント一覧

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



link もっと前
2021年9月13日 >>> 2021年8月17日
link もっと後

管理用メニュー

link 記事を新規作成

<2021>
<<<09>>>
---1234
567891011
12131415161718
19202122232425
2627282930--

最近のコメント5件

  • link 02年8月4日
    lxbfYeaaさん (07/12 10:11)
    「555」
  • link 24年6月17日
    すずきさん (06/23 00:12)
    「ありがとうございます。バルコニーではない...」
  • link 24年6月17日
    hdkさん (06/22 22:08)
    「GPSの最初の同期を取る時は見晴らしのい...」
  • link 24年5月16日
    すずきさん (05/21 11:41)
    「あー、確かにdpkg-reconfigu...」
  • link 24年5月16日
    hdkさん (05/21 08:55)
    「システム全体のlocale設定はDebi...」

最近の記事3件

  • link 24年8月10日
    すずき (08/12 16:23)
    「[Linuxを調べる - initrdとカーネル引数] 目次: Linux今どき(?)のinitrdとカーネル引数の渡し方を知...」
  • link 23年4月10日
    すずき (08/12 15:08)
    「[Linux - まとめリンク] 目次: Linuxカーネル、ドライバ関連。Linuxのstruct pageって何?Linu...」
  • link 24年8月5日
    すずき (08/11 23:27)
    「[debootstrapと他アーキテクチャバイナリとbinfmt_misc] 目次: Linux以前、Debianのrootf...」
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 過去日記について

その他の情報

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

合計:  counter total
本日:  counter today

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

最終更新: 08/12 16:23