link もっと前
   2020年 9月 4日 -
      2020年 8月 26日  
link もっと後

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

link permalink

link 編集する

FreeRTOS で遊ぼう その 2 - FreeRTOS を virt に移植(ドライバ準備編)

目次: FreeRTOS を調べる - まとめリンク

前回は既にあるデモアプリのビルドシステムを組み替えて RISC-V QEMU sifive_e マシン(SiFive HiFive1 相当)上で FreeRTOS を動かしました。今回は RISC-V QEMU virt マシン上で FreeRTOS を動かします。

マシンの違いですが、まず UART が違います。HiFive1 は SiFive UART、virt は 16550 です。UART を動かすための簡易的なドライバを書きます。

16550 の出力だけするドライバ

// freertos/FreeRTOS/Demo/RISC-V-Qemu-virt_GCC/ns16550.c

#include <stdint.h>

#include "ns16550.h"

/* register definitions */
#define REG_RBR		0x00 /* Receiver buffer reg. */
#define REG_THR		0x00 /* Transmitter holding reg. */
#define REG_IER		0x01 /* Interrupt enable reg. */
#define REG_IIR		0x02 /* Interrupt ID reg. */
#define REG_FCR		0x02 /* FIFO control reg. */
#define REG_LCR		0x03 /* Line control reg. */
#define REG_MCR		0x04 /* Modem control reg. */
#define REG_LSR		0x05 /* Line status reg. */
#define REG_MSR		0x06 /* Modem status reg. */
#define REG_SCR		0x07 /* Scratch reg. */
#define REG_BRDL	0x00 /* Divisor latch (LSB) */
#define REG_BRDH	0x01 /* Divisor latch (MSB) */

/* Line status */
#define LSR_DR			0x01 /* Data ready */
#define LSR_OE			0x02 /* Overrun error */
#define LSR_PE			0x04 /* Parity error */
#define LSR_FE			0x08 /* Framing error */
#define LSR_BI			0x10 /* Break interrupt */
#define LSR_THRE		0x20 /* Transmitter holding register empty */
#define LSR_TEMT		0x40 /* Transmitter empty */
#define LSR_EIRF		0x80 /* Error in RCVR FIFO */

uint8_t readb( uintptr_t addr )
{
	return *((uint8_t *) addr );
}

void writeb( uint8_t b, uintptr_t addr )
{
	*((uint8_t *) addr ) = b;
}

void ns16550_out( struct device *dev, unsigned char c )
{
	uintptr_t addr = dev->addr;

	while ( (readb( addr + REG_LSR ) & LSR_THRE) == 0 ) {
		/* busy wait */
	}

	writeb( c, addr + REG_THR );
}

このドライバは初期化も設定も何もせず、いきなり出力だけ行う手抜き実装です。QEMU では動きますが、おそらく実機では動かないでしょう。

main を書き換える

元のコードは main.c にSiFive UART 用のシリアルの出力コードが入っているので、これを削ります。また main.c と main_blinky.c, main_full.c に別れていますが、あまり複雑なデモは要りません。main_full.c の方は削って、main.c に統合します。

main.c(一部)

// freertos/FreeRTOS/Demo/RISC-V-Qemu-virt_GCC/main.c

static void prvQueueSendTask( void *pvParameters )
{
TickType_t xNextWakeTime;
const unsigned long ulValueToSend = 100UL;
BaseType_t xReturned;

	/* Remove compiler warning about unused parameter. */
	( void ) pvParameters;

	/* Initialise xNextWakeTime - this only needs to be done once. */
	xNextWakeTime = xTaskGetTickCount();

	for( ;; )
	{
		/* Place this task in the blocked state until it is time to run again. */
		vTaskDelayUntil( &xNextWakeTime, mainQUEUE_SEND_FREQUENCY_MS );

		/* Send to the queue - causing the queue receive task to unblock and
		toggle the LED.  0 is used as the block time so the sending operation
		will not block - it shouldn't need to block as the queue should always
		be empty at this point in the code. */
		xReturned = xQueueSend( xQueue, &ulValueToSend, 0U );
		configASSERT( xReturned == pdPASS );
	}
}

/*-----------------------------------------------------------*/

static void prvQueueReceiveTask( void *pvParameters )
{
unsigned long ulReceivedValue;
const unsigned long ulExpectedValue = 100UL;
const char * const pcPassMessage = "Blink\r\n";
const char * const pcFailMessage = "Unexpected value received\r\n";

	/* Remove compiler warning about unused parameter. */
	( void ) pvParameters;

	for( ;; )
	{
		/* Wait until something arrives in the queue - this task will block
		indefinitely provided INCLUDE_vTaskSuspend is set to 1 in
		FreeRTOSConfig.h. */
		xQueueReceive( xQueue, &ulReceivedValue, portMAX_DELAY );

		/*  To get here something must have been received from the queue, but
		is it the expected value?  If it is, toggle the LED. */
		if( ulReceivedValue == ulExpectedValue )
		{
			puts( pcPassMessage );
			ulReceivedValue = 0U;
		}
		else
		{
			puts( pcFailMessage );
		}
	}
}

/*-----------------------------------------------------------*/

int main( void )
{
	puts( "Hello FreeRTOS!" );

	/* Create the queue. */
	xQueue = xQueueCreate( mainQUEUE_LENGTH, sizeof( uint32_t ) );

	if( xQueue != NULL )
	{
		/* Start the two tasks as described in the comments at the top of this
		file. */
		xTaskCreate( prvQueueReceiveTask, "Rx", configMINIMAL_STACK_SIZE * 2U, NULL,
					mainQUEUE_RECEIVE_TASK_PRIORITY, NULL );
		xTaskCreate( prvQueueSendTask, "TX", configMINIMAL_STACK_SIZE * 2U, NULL,
					mainQUEUE_SEND_TASK_PRIORITY, NULL );
	}

	vTaskStartScheduler();

	return 0;
}


// freertos/FreeRTOS/Demo/RISC-V-Qemu-virt_GCC/riscv-virt.c

int puts( const char *s )
{
	struct device dev;
	size_t i;

	dev.addr = NS16550_ADDR;

	for (i = 0; i < strlen(s); i++)
	{
		ns16550_out( &dev, s[i] );
	}
	ns16550_out( &dev, '\n' );

	return 0;
}

別に POSIX 信者というわけでもないんですが、ついでに puts() もどきを実装しておきました。

続きはまた今度。

[編集者: すずき]
[更新: 2020年 9月 5日 22:39]

コメント一覧

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



link permalink

link 編集する

FreeRTOS で遊ぼう その 1 - FreeRTOS 入門

目次: FreeRTOS を調べる - まとめリンク

以前 RTOS 界の新星 Zephyr を調べて、新たな RISC-V ボードの定義を作りました。今回は RTOS の老舗 FreeRTOS を調べます。FreeRTOS は GPLv2 で開発されていましたが、Amazon が買収した後は MIT ライセンスになっています。IoT 分野での企業ユーザー(大抵コード公開を嫌がる)を重視したんでしょう。

FreeRTOS のコード取得
$ git clone https://github.com/FreeRTOS/FreeRTOS freertos

Cloning into 'freertos'...
remote: Enumerating objects: 149823, done.
Receiving objects:   0% (1/149823)
remote: Total 149823 (delta 0), reused 0 (delta 0), pack-reused 149823
Receiving objects: 100% (149823/149823), 115.38 MiB | 8.29 MiB/s, done.
Resolving deltas: 100% (107018/107018), done.
Updating files: 100% (12962/12962), done.

$ git submodule update --init --recursive

FreeRTOS のカーネルは FreeRTOS/Source に配置されており、リポジトリは https://github.com/FreeRTOS/FreeRTOS-Kernel です。

FreeRTOS 上で動く何かを作成する場合は freertos/FreeRTOS/Demo の下に作るルールになっているようです。たくさんのアーキテクチャ、ボード向けのコードが格納されています。統一感がなくて、どれを見たら良いのか良くわからないのが難点です。

ツールチェーンの準備

RISC-V 32ビット用でしたら、以前 Zephyr 用に作成したツールチェーン2020年 1月 31日の日記参照)が流用できます。ARM やそれ以外の環境でも Crosstool-NG を使えばたいてい作成できるはずです。

既存のデモを作り変える

Demo ディレクトリの下には RISC-V QEMU 向けのプロジェクト(正確には SiFive HiFive1 エミュレーション環境向け)が既に 1つあります。FreeRTOS/Demo/RISC-V-Qemu-sifive_e-Eclipse-GCC です。このデモは Eclipse 向けになっているので、Makefile 向けに作り直します。Eclipse 関連のファイルを削除して Makefile を作成するだけです。

Makefile

CROSS=riscv64-unknown-elf-
CC=$(CROSS)gcc
OBJCOPY=$(CROSS)objcopy
ARCH=$(CROSS)ar

RTOS_SOURCE_DIR=../../Source
DEMO_SOURCE_DIR=../Common/Minimal
LIBWRAP_SOURCE_DIR=./freedom-e-sdk/libwrap

CPPFLAGS = -g -O2 -Wall -march=rv32ima -mabi=ilp32 -mcmodel=medlow \
	-fmessage-length=0 \
	-ffunction-sections \
	-fdata-sections \
	-fno-builtin-printf \
	-DportasmHANDLE_INTERRUPT=handle_trap \
	-I . -I ../Common/include \
	-I $(RTOS_SOURCE_DIR)/include \
	-I $(RTOS_SOURCE_DIR)/portable/GCC/RISC-V \
	-I $(RTOS_SOURCE_DIR)/portable/GCC/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions \
	\
	-I freedom-e-sdk/include \
	-I freedom-e-sdk/env \
	-I freedom-e-sdk/env/freedom-e300-hifive1

CFLAGS =
ASFLAGS =
LDFLAGS = \
	-march=rv32ima -mabi=ilp32 -mcmodel=medlow \
	-Tfreedom-e-sdk/env/freedom-e300-hifive1/flash.lds \
	-Xlinker --gc-sections \
	-Xlinker --defsym=__stack_size=300

SRCS = \
	main.c \
	blinky_demo/main_blinky.c \
	$(DEMO_SOURCE_DIR)/EventGroupsDemo.c \
	$(DEMO_SOURCE_DIR)/TaskNotify.c \
	$(DEMO_SOURCE_DIR)/TimerDemo.c \
	$(DEMO_SOURCE_DIR)/blocktim.c \
	$(DEMO_SOURCE_DIR)/dynamic.c \
	$(DEMO_SOURCE_DIR)/recmutex.c \
	$(RTOS_SOURCE_DIR)/event_groups.c \
	$(RTOS_SOURCE_DIR)/list.c \
	$(RTOS_SOURCE_DIR)/queue.c \
	$(RTOS_SOURCE_DIR)/stream_buffer.c \
	$(RTOS_SOURCE_DIR)/tasks.c \
	$(RTOS_SOURCE_DIR)/timers.c \
	$(RTOS_SOURCE_DIR)/portable/MemMang/heap_4.c \
	$(RTOS_SOURCE_DIR)/portable/GCC/RISC-V/port.c

ASMS = \
	$(RTOS_SOURCE_DIR)/portable/GCC/RISC-V/portASM.S \
	\
	freedom-e-sdk/env/start.S \
	freedom-e-sdk/env/entry.S

OBJS = $(SRCS:.c=.o) $(ASMS:.S=.o)

a.out: $(OBJS) $(CRT0) Makefile
	$(CC) $(CFLAGS) $(LDFLAGS) $(OBJS) -nostartfiles $(CRT0) $(LINKER_FLAGS) -o $@

clean:
	rm -rf $(OBJS)

元のコードでは --defsym=__stack_size=350 なんですが、そのまま使うとなぜか下記のリンクエラーが出るので、少しだけ減らしています。

__stack_size=350 のときのリンクエラー
x-tools/riscv64-unknown-elf/lib/gcc/riscv64-unknown-elf/10.2.0/../../../../riscv64-unknown-elf/bin/ld: section .stack VMA [0000000080003e00,0000000080003fff] overlaps section .bss VMA [0000000080000440,0000000080003ebb]
collect2: error: ld returned 1 exit status
make: *** [Makefile:105: rtosdemo.elf] Error 1

リンカースクリプトを見る限り HiFive1 は RAM が 16KB しかないようで、あまり大きな領域を取ろうとするとすぐに溢れてしまいます。

リンカースクリプト

// freertos/FreeRTOS/Demo/RISC-V-Qemu-virt_GCC/freedom-e-sdk/env/freedom-e300-hifive1/flash.lds

MEMORY
{
  flash (rxai!w) : ORIGIN = 0x20400000, LENGTH = 512M
  ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K
}

Makefile を作ったら make し、動作確認します。

動作確認
$ qemu-system-riscv32 -nographic -machine sifive_e -net none -chardev stdio,id=con,mux=on -serial chardev:con -mon chardev=con,mode=readline -bios none -kernel a.out

StartingBlink
Blink
Blink
Blink
Blink
...

動作しました。QEMU を止めるまで Blink という文字が延々と出続けます。最初の Starting に改行が入っていないのは元々です。理由は良くわかりません、作った人がミスっただけかな?

[編集者: すずき]
[更新: 2020年 9月 5日 22:39]

コメント一覧

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



link permalink

link 編集する

Zephyr の 16550 シリアルドライバ その 2

目次: Zephyr を調べる - まとめリンク

以前、RISC-V QEMU の -machine virt で、シリアルドライバ 16550 を使う設定を作りましたが、Zephyr 2.3.0 で動かなくなってしまいました。悲しい。

変更点はレジスタアドレスシフト量の設定方法です。DT_NS16550_REG_SHIFT で設定する方式でしたが、デバイスツリーから設定するように変更されました。

NS16550 のコードを変えている Zephyr 本家のコミット
commit 70a0063b69b06812c5726077646cffae3b8e199c
Author: Kumar Gala <kumar.gala@linaro.org>
Date:   Fri Mar 27 06:03:59 2020 -0500

    drivers: serial: uart_ns16550: Convert to new DT_INST macros

    Convert older DT_INST_ macro use the new include/devicetree.h
    DT_INST macro APIs.

    Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
NS16550 のコードの変更内容

// zephyr/drivers/serial/uart_ns16550.c

-#ifdef DT_INST_0_NS16550_REG_SHIFT
-#define UART_REG_ADDR_INTERVAL (1<<DT_INST_0_NS16550_REG_SHIFT)
+#if DT_INST_NODE_HAS_PROP(0, reg_shift)
+#define UART_REG_ADDR_INTERVAL (1<<DT_INST_PROP(0, reg_shift))
 #endif

デバイスツリーに何を書けば良いのかは、デバイスツリーのドキュメント(ns16550.yaml)を見ましょう。プロパティ名と説明が書いてあります。

デバイスツリーの変更内容

// zephyr/dts/bindings/serial/ns16550.yaml

properties:
    reg:
      required: true

    reg-shift:
      type: int
      required: false
      description: quantity to shift the register offsets by


// zephyr/dts/riscv/riscv32-virt.dtsi

...

		uart0: serial@10000000 {
			compatible = "ns16550";
			reg = <0x10000000 0x100>;
			clock-frequency = <3686400>;
			label = "uart_0";
			current-speed = <115200>;
			reg-shift = <0>;    /* ★これを追加★ */
		};


// zephyr/soc/riscv/riscv-privilege/rv32-virt/soc.h

...

/* ★★下記定義は全て不要★★ */

#define DT_UART_NS16550_PORT_0_BASE_ADDR    DT_INST_0_NS16550_BASE_ADDRESS
#define DT_UART_NS16550_PORT_0_BAUD_RATE    DT_INST_0_NS16550_CURRENT_SPEED
#define DT_UART_NS16550_PORT_0_CLK_FREQ     DT_INST_0_NS16550_CLOCK_FREQUENCY
#define DT_UART_NS16550_PORT_0_NAME         DT_INST_0_NS16550_LABEL

#define DT_NS16550_REG_SHIFT                0

以上の修正を入れて動かします。

動作確認

$ qemu-system-riscv32 -nographic -machine virt -net none -chardev stdio,id=con,mux=on -serial chardev:con -mon chardev=con,mode=readline -kernel zephyr/zephyr.elf -bios none

*** Booting Zephyr OS build zephyr-v2.3.0-2350-g2f294fcc2da8  ***               
Hello World! QEMU RV32 virt board

動きました。良かった良かった。

[編集者: すずき]
[更新: 2020年 9月 2日 19:55]

コメント一覧

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



link permalink

link 編集する

Zephyr OS で遊ぼう その 11 - Zephyr 2.3.0 に対応する

目次: Zephyr を調べる - まとめリンク

Zephyr 2.3.0 にバージョンアップしたところ、また Hoge ボードのビルドが通らなくなりました。

一点目は UART ドライバの CMakeLists です。zephyr_library_sources_if_kconfig() がなくなったため、書き方が変わりました。

CMakeLists の書き方が変わった Zephyr 本家のコミット

commit 244f826e3c7333bb92fb53a65c50ee5cbd8a2ea0
Author: Carles Cufi <carles.cufi@nordicsemi.no>
Date:   Fri Jul 31 13:52:40 2020 +0200

    cmake: remove _if_kconfig() functions

    This set of functions seem to be there just because of historical
    reasons, stemming from Kbuild. They are non-obvious and prone to errors,
    so remove them in favor of the `_ifdef()` ones with an explicit
    `CONFIG_` condition.

    Script used:

    git grep -l _if_kconfig | xargs sed -E -i
    "s/_if_kconfig\(\s*(\w*)/_ifdef(CONFIG_\U\1\E \1/g"

    Signed-off-by: Carles Cufi <carles.cufi@nordicsemi.no>
CMakeLists の書き方を変更

# drivers/serial/CMakeLists.txt

zephyr_library_sources_if_kconfig(uart_spike.c)

下記に変更

zephyr_library_sources_ifdef(CONFIG_UART_SPIKE uart_spike.c)

二点目は整数型です。Zephyr は u8_t, u16_t, u32_t のような独自の整数型を持っていましたが、C99 の型に置き換えられました。drivers/serial/uart_spike.c の実装を書き換える必要があります。

C99 の型に置き換えた Zephyr 本家のコミット
commit a1b77fd589dbe7284c17b029f251426a724abd47
Author: Kumar Gala <kumar.gala@linaro.org>
Date:   Wed May 27 11:26:57 2020 -0500

    zephyr: replace zephyr integer types with C99 types

            git grep -l 'u\(8\|16\|32\|64\)_t' | \
                    xargs sed -i "s/u\(8\|16\|32\|64\)_t/uint\1_t/g"
            git grep -l 's\(8\|16\|32\|64\)_t' | \
                    xargs sed -i "s/s\(8\|16\|32\|64\)_t/int\1_t/g"

    Signed-off-by: Kumar Gala <kumar.gala@linaro.org>

三点目は DT_INST_0_SPIKE_UART_SPIKE_LABEL マクロです。こいつは元々、訳のわからない名前で直しようがないので、SiFive のシリアルドライバの履歴を参考に直します。履歴を見ると 2回ほど変わっています。

マクロ名のルールは DT_INST_<INSTANCE>_<COMPAT>_<PROP> だったみたいです。今初めて知りました。やっぱりこの書き方は意味不明と思ったのか、DT_INST_PROP(0, label) という形式になりました。さらに今は DT_INST_LABEL(0) という形式に落ち着いています。

マクロ名の変更を行った Zephyr 本家のコミット
★★DT_INST_PROP(0, label) になったコミット

commit 8f84520130a346957ac2e2bdff1d6a51bca13af0
Author: Kumar Gala <kumar.gala@linaro.org>
Date:   Tue Mar 10 17:24:43 2020 -0500

    drivers: serial: uart_sifive: convert to new DT API

    Use the new devicetree.h API instead of the legacy macros.

    Signed-off-by: Kumar Gala <kumar.gala@linaro.org>


★★DT_INST_LABEL(0) になったコミット

commit 74d459fb66b10a5a0614a582fb0375d8b4a78c9e
Author: Kumar Gala <kumar.gala@linaro.org>
Date:   Thu Apr 2 13:13:47 2020 -0500

    drivers: serial: sifive: use DT_INST_LABEL macro

    Replace a few cases that should have been DT_INST_LABEL instead.

    Signed-off-by: Kumar Gala <kumar.gala@linaro.org>

このマクロの罠はそれだけに留まらず、ソースコードの先頭に下記マクロを定義する必要があります。依然として訳がわかりません。Zephyr は DviceTree 周りの仕様が不安定です。

ソースコードの先頭に必要なマクロ定義

// zephyr/drivers/serial/uart_spike.c

#define DT_DRV_COMPAT spike_uart_spike

最後はリンカーです。これは元々のコードのコンフィグが間違っていたことに起因します。ROM 領域がないのに CONFIG_XIP が有効になっていました。

リンクエラー
$ ninja

...

x-tools/riscv64-zephyr-elf/lib/gcc/riscv64-zephyr-elf/8.3.0/../../../../riscv64-zephyr-elf/bin/ld: invalid origin for memory region ROM
collect2: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.

エラーメッセージからは何が原因か読み取れないですね。こういうときはビルドディレクトリのリンカースクリプト(zephyr/linker.cmd)をうまく行く場合と、うまく行かない場合で見比べます。

リンクエラーが起きないとき(qemu_riscv32)のリンカースクリプト

/* zephyr/build/zephyr/linker.cmd */

 OUTPUT_ARCH("riscv")
 OUTPUT_FORMAT("elf32-littleriscv")
MEMORY
{
    ROM (rx) : ORIGIN = 541065216, LENGTH = 12582912
    RAM (rwx) : ORIGIN = 0x80000000, LENGTH = ((16) << 10)
    IDT_LIST (wx) : ORIGIN = 0xFFFFF7FF, LENGTH = 2K
}
リンクエラーが起きるとき(Hoge ボード)のリンカースクリプト

/* zephyr/build/zephyr/linker.cmd */

 OUTPUT_ARCH("riscv")
 OUTPUT_FORMAT("elf32-littleriscv")
MEMORY
{
    ROM (rx) : ORIGIN = ROM_BASE, LENGTH = ROM_SIZE    /* ★★ここがおかしい★★ */
    RAM (rwx) : ORIGIN = 0x80000000, LENGTH = ((32) << 10)
    IDT_LIST (wx) : ORIGIN = 0xFFFFF7FF, LENGTH = 2K
}

このスクリプトは下記のファイルから生成されているようです。Hoge ボードは ROM 領域を使う前提ではないので、領域そのものが要りません。ROM 領域を葬るには CONFIG_XIP を n にすれば良さそうです。ファイルは boards/riscv/hoge/hoge_defconfig です。

RISC-V のリンカースクリプト

// include/arch/riscv/common/linker.ld

MEMORY
{
#ifdef CONFIG_XIP
#if DT_NODE_HAS_COMPAT_STATUS(DT_CHOSEN(zephyr_flash), soc_nv_flash, okay)
#define ROM_BASE DT_REG_ADDR(DT_CHOSEN(zephyr_flash))
#define ROM_SIZE DT_REG_SIZE(DT_CHOSEN(zephyr_flash))
#elif DT_NODE_HAS_COMPAT_STATUS(DT_CHOSEN(zephyr_flash), jedec_spi_nor, okay)
/* For jedec,spi-nor we expect the spi controller to memory map the flash
 * and for that mapping to be the second register property of the spi
 * controller.
 */
#define SPI_CTRL DT_PARENT(DT_CHOSEN(zephyr_flash))
#define ROM_BASE DT_REG_ADDR_BY_IDX(SPI_CTRL, 1)
#define ROM_SIZE DT_REG_SIZE_BY_IDX(SPI_CTRL, 1)
#endif
    ROM (rx)  : ORIGIN = ROM_BASE, LENGTH = ROM_SIZE    /* ★★ CONFIG_XIP が無効ならこの行ごと消える★★ */
#endif
    RAM (rwx) : ORIGIN = CONFIG_SRAM_BASE_ADDRESS, LENGTH = KB(CONFIG_SRAM_SIZE)
    /* Used by and documented in include/linker/intlist.ld */
    IDT_LIST  (wx)      : ORIGIN = 0xFFFFF7FF, LENGTH = 2K
}

以上の修正を入れて動かします。

動作確認

$ qemu-system-riscv32 -nographic -machine spike -net none -chardev stdio,id=con,mux=on -serial chardev:con -mon chardev=con,mode=readline -kernel zephyr/zephyr.elf -bios none

*** Booting Zephyr OS build zephyr-v2.3.0-2349-g0769bb760b2a  ***
Hello World! hoge

やっと動きました。良かった良かった。

[編集者: すずき]
[更新: 2020年 9月 2日 19:05]

コメント一覧

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



link permalink

link 編集する

Zephyr OS で遊ぼう その 10 - QEMU の変化に対応する

目次: Zephyr を調べる - まとめリンク

最近の RISC-V 向け QEMU で spike, virt を起動すると、下記のようなエラーで怒られてしまいます。

QEMU RISC-V の起動時に出るエラー
$ qemu-system-riscv32 -nographic -machine spike -net none -chardev stdio,id=con,mux=on -serial chardev:con -mon chardev=con,mode=readline -kernel zephyr/zephyr.elf

qemu-system-riscv32: Unable to load the RISC-V firmware "opensbi-riscv32-spike-fw_jump.elf"

このエラーの原因は QEMU RISC-V 向けの仕様変更によるものです。machine が spike, virt のときに、自由に BIOS を選べるように変わりました。ですが Zephyr を起動する際には、特に BIOS は必要ないため、none を指定すれば OK です。

QEMU RISC-V を BIOS なしで起動する
$ qemu-system-riscv32 -nographic -machine spike -net none -chardev stdio,id=con,mux=on -serial chardev:con -mon chardev=con,mode=readline -kernel zephyr/zephyr.elf -bios none

*** Booting Zephyr OS build v2.2.0-rc1-123-gcaca3f60b012  ***
Hello World! hoge

Zephyr だけでなく QEMU も日々進化しているのですね。

[編集者: すずき]
[更新: 2020年 9月 2日 19:07]

コメント一覧

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



link permalink

link 編集する

駐車場での事故

先週、突然知らない番号から電話が掛かってきました。何だか焦った様子でした。要約すると「アパートの駐車場で隣に駐車している者です、駐車しようとして、あなたの車にぶつけてしまいました」とのことでした。車の様子を確認したところ、見事にバンパーの右前が取れていました。ああー……。


レガシィのバンパーが取れた

後日、保険屋さんと修理屋さん(スーパーオートバックス)から電話があり、車を引き取りに来る日時等を決めました。そして今日、レガシィさんはフロントバンパー修理のため旅立っていきました。

修理屋さん曰く「右ライトも Assy 交換で新品になるだろう」とのこと。新品交換後の右ライトに対し、古ぼけた左ライトの明るさがアンバランスになるのはうまくないので、左ライトの研磨もお願いしました。残念ながら左ライトの研磨は保険が効かず自費になりそうですが、曇っていたライトが明るくなるから良しとしましょう。

代車

代車はホンダのフィットでした。


代車のフィット、外観


代車のフィット、インパネ

総じて良い車だと思います。レガシィとの違いとしては、

  • フロントがかなり斜めってる、真上の日差しがダッシュボードを照らし前が見えない
  • アクセルがフニャフニャ、踏んでもあまり速度が変わらない(遊びが大きい??)
  • ブレーキがある点から急激に効いて怖い

昔のフィットに乗ったときは、アクセルオフ時のエンブレが急で、車酔いしたので、正直好きな車ではなかったのですが、今のフィットは素敵な車です。新しい車って確実に良くなってますね。

ADAS(前車の車間検知、車線逸脱の警告)も搭載されていて面白いです。たまに誤検知?するのか、何もないところで突然ピー!と警告音が鳴ったり、車線逸脱の警告とともにハンドルがンゴゴー!って言い出すのはご愛敬です。

[編集者: すずき]
[更新: 2020年 8月 31日 00:55]

コメント一覧

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



link permalink

link 編集する

ROCK64 を Raspberry Pi 3 のケースに無理やり格納

先日 KADHAS VIM2, VIM3 を購入したため、ARM ボードがさらに増え置き場がなくなりました。既存のボードをコンパクトに収納できないかと画策し、目を付けたのが ROCK64 です。現在 ROCK64 は純正ケースに入れて使っていますが、ギリシャの神殿を思わせる立派な柱と、無駄にでかいアクリル板のせいで、すっっごい邪魔です。


ROCK64 の純正ケース

ROCK64 は Raspberry Pi 3 とほぼ同じ大きさですから、Raspberry Pi 3 のケースを流用できるはずです。

ケース選び

改造のベースになるケースは、TinkerBoard や Raspberry Pi 3 の格納で活躍している Physical Computing Lab の 3ple Decker Raspberry Pi ケース(公式サイトへのリンク)です。

Rasberry Pi 3 は電源が USB micro B ですが、ROCK64 は AC アダプタなので、全く形が合いません。アクリルケースの穴を削って広げる必要があります。もう一か所、ROCK64 の個体差か(or 単に設計の問題か?)ヘッドホンジャックがケースとズレていて、プラグが刺さらないため、これも直さないといけません。


電源コネクタ周辺(削る予定の部分を黒く塗っている)


ヘッドホンジャック周辺(削る予定の部分を黒く塗っている)

削り方はリューターにプラスチック用のビットを付けてゴリゴリ削るだけです。厚さも面積も大したことないので、力業でどうにでもなると思います。アクリルを削ると変なにおいがしますね。焦げてるのかな……?


加工後のケース

ケースを削り終わりました。ROCK64 の端子がちゃんと外から見えています。

細かい不都合

元より ROCK64 用のケースではないので、様々な不都合が発生します。

  • ROCK64 の 22pin のピンヘッダ(Pi P5+ Bus)がケースで隠れて配線できない
  • ROCK64 の PWR, RESET ボタンが押せない
  • ボードの固定が甘くなる

Pi P5+ Bus が使用不能になる点は諦めました。Rasberry Pi 3 にはないピンヘッダなので致し方無しです。このピンヘッダから引き出していた S/PDIF が利用不可能になりました。さよなら S/PDIF さん。

PWR, RESET ボタンはケースを開ければ押せますが、面倒です。今後は PWR ボタンに頼らない運用を考えるべきでしょう。

ボードが固定できない問題はどうにもなりませんでした。microSD の上部を抑えるケース側のツメがうまくハマりません。


ボードを固定するケース側のツメ

もう少しきちんと調べてみると、ROCK64 は Rasberry Pi 3 より microSD スロットに厚みがあるせいで、microSD の上部を抑えるケース側のツメがうまくハマらないようです。


Raspberry Pi 3 の場合


ROCK64 の場合

スロットの厚さはどうしようもないので、泣く泣くケース側のツメを折りました。

ツメがないので、microSD カードがケースに引っ掛かってギリギリケースに固定されている状態です。ROCK64 の 40pin のピンヘッダ(Pi-2 Bus)にジャンパケーブルを抜き差しすると、microSD にかなり力が掛かります。これは良くないですね……。

Pi-2 Bus へのケーブル抜き差しは結構固いため、そのうち microSD スロットが変形するか、microSD が折れて壊れると思います。幸いなことに、今は頻繁にピンヘッダのケーブル抜き差しはしませんから、しばらくこの状態でも使えるでしょう。

[編集者: すずき]
[更新: 2020年 8月 31日 00:52]

コメント一覧

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



link permalink

link 編集する

サーバ向けプロセッサでは最強の Intel

Twitter で Cavium Thunder X3 はサーバ向け汎用 ARM SoC ではなくなるかもしれない、という話を見かけました。Cavium(今は Marvell に買収されました)は独自 ARM CPU コアを作って頑張ってたメーカーです。

ARM 自体はまだまだめげることなく、サーバ向けに売りたい(Arm のサーバ向け戦略十年の計は実を結ぶか、新プロセッサ「Neoverse」 - MONOist)ようですが、肝心の ARM 系 SoC メーカーやサーバベンダーが ARM 系サーバで成功している様子がないです。

以前 Qualcomm Centriq も鳴り物入りでサーバ向け ARM SoC に参入しましたが、2018年にあっさり撤退Arm SoC の開発部門を秘かに閉鎖していた Qualcomm - EE Times Japan)しています。モバイルの王者 Qualcomm をもってしても困難な道のようです。

サーバ向けプロセッサは Intel が 9割取っているらしいので、崩すのはなかなか容易ではありませんね……。

ARM メニーコア系 SoC

サーバ向けとして発表されている ARM メニーコア系 SoC を列挙してみました。年代はチップがローンチされたおおよその時期です。間違ってたらごめんなさい。

  • Ampere Altra(2020, ARM Neoverse N1, 80コア)
  • Amazon Graviton 2(2020, ARM Neoverse N1, 64コア)
  • Huawei Kunpeng 920(2019, Hisilicon TSV110, 64コア)
  • Cavium Thunder X2(2018, Broadcom Vulkan, 32コア)
  • Amazon Graviton(2018, ARM Cortex-A72, 16コア)
  • Qualcomm Centriq(2017, Qualcomm Folker, 48コア)
  • Socionext SC2A11(2017, Cortex-A53, 24コア)
  • Cavium Thunder X1(2014, Cavium 独自, 48コア)

こんな感じですかね?SC2A11 はホームページでサーバ向けと謳っていたので、リストに入れてます。でも CA53 コアなので、性能的には Thunder X2 辺りと並べるのはちょっと厳しい……かな?

[編集者: すずき]
[更新: 2020年 8月 31日 01:42]

コメント一覧

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



link もっと前
   2020年 9月 4日 -
      2020年 8月 26日  
link もっと後

管理用メニュー

link 記事を新規作成

合計:  counter total
本日:  counter today

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

最終更新: 9/24 21:43

カレンダー

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

最近のコメント 5件

  • link 20年09月20日
    hdk 「最近は音楽聞く時やビデオ視聴時はミニコン...」
    (更新:09/24 21:43)
  • link 20年09月20日
    すずき 「ありゃー、同じ壊れ方ですね。\n新たなヘ...」
    (更新:09/24 00:23)
  • link 20年09月20日
    hdk 「うちのATH-AD300もやはり頭にプラ...」
    (更新:09/23 12:26)
  • link 20年07月10日
    すずき 「鳥のゲームは知りませんでした。色々やって...」
    (更新:08/11 18:59)
  • link 20年07月12日
    すずき 「小学生でサイトに投稿はスゴイです。そして...」
    (更新:08/11 18:59)

最近の記事 3件

link もっとみる
  • link 20年09月19日
    すずき 「[SHARP のマスク] 今となっては、高級マスクになってしまった...」
    (更新:09/23 04:48)
  • link 20年09月20日
    すずき 「[ヘッドフォンが壊れた] 以前(2012年 11月 8日の日記参照...」
    (更新:09/23 03:06)
  • link 20年09月22日
    すずき 「[3DMark] Steam のセールで 3DMark が意味不明...」
    (更新:09/23 02:55)

こんてんつ

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

その他の情報

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