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

link もっと前
   2020年 9月 29日 ---> 2020年 9月 20日
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

...

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

編集者: すずき(更新: 2020年 10月 9日 00:29)

コメント一覧

  • コメントはありません。
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

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

編集者: すずき(更新: 2020年 10月 14日 20:02)

コメント一覧

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



2020年 9月 22日

3DMark

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


3DMark セール中@Steam

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

編集者: すずき(更新: 2020年 9月 23日 02:55)

コメント一覧

  • コメントはありません。
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年 9月 23日 03:06)

コメント一覧

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



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

管理用メニュー

link 記事を新規作成

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDF ファイル RSS 1.0
QR コード QR コード

最終更新: 9/24 14:00

カレンダー

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

最近のコメント 5件

  • link 21年03月03日
    すずき 「お役に立てたようで幸いです。」
    (更新:06/17 17:24)
  • link 21年03月03日
    Shige 「とても参考になりました。\nGood!!...」
    (更新:06/17 13:28)
  • link 20年12月19日
    すずき 「なるほど、地元愛 No.1 は福岡なんで...」
    (更新:05/02 00:08)
  • link 20年12月19日
    Twitterから 「> 大学時代に知り合った人たちを思...」
    (更新:04/28 13:38)
  • link 21年04月12日
    すずき 「コメントありがとうございます。ご参考にな...」
    (更新:04/18 22:39)

最近の記事 3件

link もっとみる
  • link 21年04月05日
    すずき 「[GCC を調べる - GCC 8.3 の folding バ] ...」
    (更新:09/24 14:00)
  • link 21年09月20日
    すずき 「[RISC-V の cmodel] 目次: RISC-V - まと...」
    (更新:09/21 23:04)
  • link 21年06月18日
    すずき 「[RISC-V まとめリンク] 目次: RISC-V - まとめリ...」
    (更新:09/21 23:01)

こんてんつ

open/close wiki
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 過去日記について

その他の情報

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