コグノスケ


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

link もっと前
2020年9月29日 >>> 2020年9月16日
link もっと後

2020年9月29日

Zephyr OSで遊ぼう その13 - SMP対応の準備、コンテキストスイッチの実装、前編、ラッパー関数まで実装

目次: Zephyr

CONFIG_USE_SWITCHを有効にするとビルドエラーが発生しますので、都度対処します。

arch_thread_return_value_set()

最初はarch_thread_return_value_set() が二重定義だと怒られます。

arch_thread_return_value_set() が二重定義
../kernel/include/kernel_internal.h: At top level:
../kernel/include/kernel_internal.h:84:1: error: redefinition of 'arch_thread_return_value_set'
 arch_thread_return_value_set(struct k_thread *thread, unsigned int value)
 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~

USE_SWITCHを有効にした場合、arch_thread_return_value_set() はカーネル側で定義されるので、アーキテクチャ側では実装不要です。

arch_thread_return_value_set() カーネル側の定義

// zephyr/arch/riscv/include/kernel_arch_func.h

static ALWAYS_INLINE void
arch_thread_return_value_set(struct k_thread *thread, unsigned int value)
{
	thread->arch.swap_return_value = value;
}


// zephyr/include/arch/riscv/thread.h

struct _thread_arch {
	uint32_t swap_return_value; /* Return value of z_swap() */
};


// zephyr/arch/riscv/core/offsets/offsets.c

GEN_OFFSET_SYM(_thread_arch_t, swap_return_value);

この辺りは要らないので #ifndef CONFIG_USE_SWITCHで囲って無効化します。

arch_switch

次はarch_switch() が未定義だと言われます。

arch_switch() が未定義
../kernel/include/kernel_arch_interface.h:126:20: warning: 'arch_switch' declared 'static' but never defined [-Wunused-function]
 static inline void arch_switch(void *switch_to, void **switched_from);
                    ^~~~~~~~~~~

この関数がUSE_SWITCHの本体です。他のアーキテクチャを見ると、arch_switch() はラッパー関数で、本体はアセンブラで書かれていることが多いようです。他の流儀に習っておきます。

arch_switch() ラッパー

// arch/riscv/include/kernel_arch_func.h

#ifdef CONFIG_USE_SWITCH
extern void z_riscv_switch(void *switch_to, void **switched_from);

static inline void arch_switch(void *switch_to, void **switched_from)
{
	z_riscv_switch(switch_to, switched_from);
}
#else

...

肝心の中身はまた今度実装します。

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

コメント一覧

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



2020年9月28日

Zephyr OSで遊ぼう その12 - SMP対応の準備、コンテキストスイッチのコンフィグ

目次: Zephyr

以前(2020年2月21日の日記参照)ご紹介したとおり、ZephyrのRISC-V向け実装はSMPに対応していません。Zephyrのマルチコア対応を有効にするコンフィグはCONFIG_SMPですが、有効にすると大量のエラーが出て、何から直したら良いのかわからなくなります。

コンフィグや実装を見た限りでは、下記の4つのステップで対応していくと良さそうです。

  • (今ここ)SMPの前提条件、新しいコンテキストスイッチ方式に対応する(CONFIG_USE_SWITCH, CONFIG_USE_SWITCH_SUPPORTED)
  • SMPに対応する(CONFIG_SMP)、ただしCPUコア数は1
  • 先頭ではないコア(mhartid != 0)で動作させる、ただしCPUコア数は1
  • CPUコア数を1以上にする(CONFIG_SMP)

このコンフィグを有効にすその前に対応すべきコンフィグがあります。CONFIG_USE_SWITCHとCONFIG_USE_SWITCH_SUPPORTEDです。

CONFIG_USE_SWITCH

// zephyr/kernel/Kconfig

config USE_SWITCH
	bool "Use new-style _arch_switch instead of arch_swap"
	depends on USE_SWITCH_SUPPORTED

...

config SMP
	bool "Enable symmetric multithreading support"
	depends on USE_SWITCH

既存の各アーキテクチャの対応状況を見ると、

CONFIG_USE_SWITCH対応状況(一例)

// ARM
// Aarch32はUSE_SWITCHは未サポート
// AArch64はCortex-AのみUSE_SWITCHをサポート

// zephyr/arch/arm/core/aarch64/Kconfig

config CPU_CORTEX_A
	bool
	select CPU_CORTEX
	select HAS_FLASH_LOAD_OFFSET
	select USE_SWITCH
	select USE_SWITCH_SUPPORTED


// ARC
// ARCV2はUSE_SWITCHをサポート

// zephyr/arch/arc/Kconfig

config CPU_ARCV2
	bool
	select ARCH_HAS_STACK_PROTECTION if ARC_HAS_STACK_CHECKING || ARC_MPU
	select ARCH_HAS_USERSPACE if ARC_MPU
	select USE_SWITCH
	select USE_SWITCH_SUPPORTED
	default y

他は載せませんがAArch64, ARC, x86_64, xtensaが対応しているようです。

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

Zephyrにはコンテキストスイッチが2種類存在しています。違いは下記の通りです。

  • arch_swap: シングルコア専用のコンテキストスイッチ、RISC-Vは対応済み
  • arch_switch: SMPに対応したコンテキストスイッチ、シングルコアだと若干効率が悪い、RISC-Vは未対応

CONFIG_USE_SWITCH_SUPPORTEDを有効にするにはarch_switchを実装する必要がありますが、RISC-Vではシングルコアもマルチコアもあり得ますから、CONFIG_USE_SWITCHを無条件に有効にするのは得策ではないと考えられます。

SoC側のKconfigで有効にしても良いですし、ユーザーにmenuconfigから選んでもらう手もあります。あまり悩んでも仕方ないので、ユーザーが選べるようにして先に進めます。RISC-VのKconfigにSMP対応かどうか?を選べるコンフィグを一つ追加します。

CONFIG_USE_SWITCHを有効にするRISC-V向けコンフィグを追加

// zephyr/arch/riscv/Kconfig

config RISCV_SMP
	bool "Does SOC has SMP"
	select USE_SWITCH
	select USE_SWITCH_SUPPORTED

有効にするとビルドエラーだらけになります。続きはまた今度。

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

コメント一覧

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



2020年9月22日

今Steamで3DMarkが安い

目次: ゲーム

Steamのセールで3DMarkが意味不明なほど安くなっていたので、買いました。Steamは突然90%OFFとか平然とやってくるので、定価とは……??という気分になります。


3DMarkセール中@Steam

新しいマシンを買う(もしくはパーツを買う)時に役に立ちそうです。

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

コメント一覧

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



2020年9月20日

ヘッドフォンが壊れた

以前(2012年11月8日の日記参照)買ったヘッドフォン(audio-technica ATH-TAD500)が壊れました。

イヤーパッドは無事ですが、ヘッドバンドの合皮部分が破れて、内部のプラスチックの芯が見えています。まさかイヤーパッドより先にヘッドバンドが壊れるとは思わなんだ。

8年もの長きにわたって頑張ってくれて本当にありがたかったです。とても良い製品でした。

ヘッドフォン探し

家や会社でいくつかヘッドフォンを使ってきてわかりましたが、長時間の使用において楽なのは圧倒的に「イヤーパッドが布地」のヘッドフォンです。合皮的な材質は汗で肌にくっついて嫌なのと、傷んでくるとバリバリ剥がれてきて不快です。

今使っているヘッドフォンの後継者としてはaudio-technica ATH-AD500X ですかね。上位グレードのATH-AD700X, ATH-AD900Xも布地のイヤーパッドで良さそうです。

しかし形が今使っているヘッドフォンとかなり似ているため、おそらく耳が痛くなる欠点も共通だろうと思われます。耳が痛いのは何とかしたいため、他社でも探すことにしました。

オーディオの世界は上を見るとキリがないですけど、10万とかするヘッドフォンは検討しません。違いが全くわからん。

新しいヘッドフォン

SENNHEISER HD 599を買いました。Amazonで22,000円くらいでした。以前購入(2020年8月1日の日記参照)したSONY MDR-HW700DSもそうでしたけど、購入に勇気が要るお値段です。

付け心地はとても軽く、耳も痛くなりません。耳が痛いのは辛かったので、非常にありがたいです。あと、色が良いですね。ヘッドフォンはたいてい真っ黒けですけど、HD 599は白と茶という面白い色です。


SENNHEISER HD 599

難点は長時間使っていると頭のてっぺんが痛くなることです。ヘッドバンドは柔らかいクッションが入っていますが、カーブが自分の頭の形と合わないようです。

耳の問題が解決したと思ったら、今度は頭が痛くなるとは……想定外でした。うーん。

音質

正直、音質は良いね!ってくらいしかわからんですが、ドスドスした低音や、キンキンした高音は目立たず、フラットな印象です。

キンキンした音は断然Superlux HD681B(2019年8月25日の日記参照)の方が強いですし、低音はaudio-technica ATH-TAD500の方がやや強いです。

鳴らないわけじゃなくて、目立たないバランスになっているだけなので、気に入らないならイコライザでいじれば好きなテイストにできます。能力は高いからカスタマイズ自由って感じですね。

編集者:すずき(2020/09/23 03:06)

コメント一覧

  • hdkさん(2020/09/23 12:26)
    うちのATH-AD300もやはり頭にプラスチックパーツが直に当たるようになりましたが、小一時間なら我慢できるのでそのまま使っています(^^; 布地のイヤーパッドは長持ちしていいですよね。
  • すずきさん(2020/09/24 00:23)
    ありゃー、同じ壊れ方ですね。
    新たなヘッドフォンは買わないんですか?
  • hdkさん(2020/09/24 21:43)
    最近は音楽聞く時やビデオ視聴時はミニコンポを使っているので、ヘッドフォンは仕事の電話会議にしか使っていないんですよね...
open/close この記事にコメントする



2020年9月19日

SHARPのマスク

今となっては、高級マスクになってしまったSHARP MA-1050が届きました。マスクはその辺で買えるので、もはやSHARPから購入する必要はないんですけど、まあ、一種の記念です。


SHARP MA-1050

参考までに、先日マツキヨで買った中国製のマスクは30枚入り1,000円程度で、1枚33円です。MA-1050は50枚入り2,980円(送料別)で、1枚60円ですから、かなり高級品の部類です。送料も含めると1枚80円近いです。

包装が綺麗すぎる

届いた箱を見たときに「異様に綺麗な段ボールだな……」って思いました。宛名シールも真っ直ぐはみ出ず貼ってあります。近所(千葉県)から送られていることも要因ですが、それにしても綺麗です。


段ボールがすごい綺麗

開けてさらにびっくりしたんですけど、段ボールとマスクの箱が全く同じ大きさでした。包装材は省けますけど、入れにくそうですね。


段ボールとマスクの箱の大きさがぴったり

DigiKeyくらいのマトモな海外セラーから買っても、段ボールなんて大抵ベコベコで汚ないし、宛名やインボイスも斜めに貼られてます。でも、中身が無事で、宛先に正しく届けば良いんですよ。段ボールは包装材なんですから。それ以上こだわる意味がありません。

日本人はどうでも良いところにこだわりすぎで、コスト高になってるんじゃないの……??なんてことを段ボールを片付けながら思いました。

編集者:すずき(2020/09/23 04:48)

コメント一覧

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



2020年9月18日

読みが違う

Google翻訳で「October」を翻訳すると、正しい訳の「10月」が出てくるのですが、


Octoberの英→日訳

残念ながら読みが間違っていて「じゅうがつ」ではなく「じゅうつき」になっています。惜しい!

「コミュニティ確認済み」のバッジが付いていますが、読みはチェック漏れ?ですかねえ?日本語は同じ文字でも読みが違って難しいですね。

編集者:すずき(2020/09/30 17:46)

コメント一覧

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



2020年9月17日

Zephyr SMP対応

目次: Zephyr

Zephyr RISC-V SMP対応にチャレンジしてます。

Zephyrは既に他のアーキテクチャでSMP対応されていますから、真似するだけの何がチャレンジなの?簡単でしょ?と思われるかもしれません。その考え方は間違ってないんですが、少なくとも私にとっては「余裕」と言えるほど簡単ではなさそうです。

RISC-V向けの実装はAArch32をパクっているようで「お前、シングルコアだろ?な?」的な実装がそこら中にあり、SMPを有効にした途端、猛烈にコンパイルエラーが出ます。

一個一個見てますが、先ほど、コンテキストスイッチから直さないとダメなことに気づきました。こりゃ先は長そうだ〜……。

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

コメント一覧

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



link もっと前
2020年9月29日 >>> 2020年9月16日
link もっと後

管理用メニュー

link 記事を新規作成

<2020>
<<<09>>>
--12345
6789101112
13141516171819
20212223242526
27282930---

最近のコメント5件

  • link 21年3月13日
    すずきさん (03/05 15:13)
    「あー、このプログラムがまずいんですね。ご...」
  • link 21年3月13日
    emkさん (03/05 12:44)
    「キャストでvolatileを外してアクセ...」
  • link 24年1月24日
    すずきさん (02/19 18:37)
    「簡単にできる方法はPowerShellの...」
  • link 24年1月24日
    KKKさん (02/19 02:30)
    「追伸です。\nネットで調べたらマイクロソ...」
  • link 24年1月24日
    KKKさん (02/19 02:25)
    「私もエラーで困ってます\n手動での回復パ...」

最近の記事3件

  • link 24年3月25日
    すずき (03/26 03:20)
    「[Might and Magic Book One TASのその後] 目次: Might and Magicファミコン版以前(...」
  • link 21年10月4日
    すずき (03/26 03:14)
    「[Might and Magicファミコン版 - まとめリンク] 目次: Might and Magicファミコン版TASに挑...」
  • link 24年3月19日
    すずき (03/20 02:52)
    「[モジュラージャックの規格] 古くは電話線で、今だとEthernetで良く見かけるモジュラージャックというコネクタとレセプタク...」
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

最終更新: 03/26 03:20