目次: Zephyr
前回はCONFIG_SMPのビルドエラーと実行時エラーに対応しました。以前書いたとおり、SMP対応は下記の手順で進めていますので、再掲します。
前回までで2番目の項目が終わったところです。今回はコア数を増やして先頭以外のコアで実行します。
Zephyrを書き換える前に、変更した効果が確認できる環境を作りましょう。サンプルのsynchronizationを少し改造してHART IDを表示します。
// zephyr/samples/synchronization/src/main.c
void helloLoop(const char *my_name,
struct k_sem *my_sem, struct k_sem *other_sem)
{
const char *tname;
while (1) {
int id = z_riscv_hart_id(); //★HART IDを取得★
/* take my semaphore */
k_sem_take(my_sem, K_FOREVER);
/* say "hello" */
tname = k_thread_name_get(k_current_get());
if (tname != NULL && tname[0] != '\0') {
printk("%d: %s: Hello World from %s!\n",
id, tname, CONFIG_BOARD); //★HART IDを一緒に表示する★
} else {
printk("%d: %s: Hello World from %s!\n",
id, my_name, CONFIG_BOARD); //★HART IDを一緒に表示する★
}
今回は変更してもしなくても構わないですが、カーネルコンフィグを変えるとk_thread_name_get() でスレッド名が取得できるようになります。スレッドを多数作成したときに便利です。
$ ninja menuconfig General Kernel Options ---> Kernel Debugging and Metrics ---> [*] Thread name [EXPERIMENTAL]
動作させると下記のような表示になるはずです。
$ mkdir build $ cd build $ cmake -G Ninja -DBOARD=qemu_rv32_virt ../samples/synchronization/ ... $ ninja ... $ 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 -cpu rv32 -smp cpus=1 -bios none ** Booting Zephyr OS build zephyr-v2.4.0-546-g720718653f92 *** 0: thread_a: Hello World from QEMU RV32 virt board! 0: thread_b: Hello World from QEMU RV32 virt board! 0: thread_a: Hello World from QEMU RV32 virt board! 0: thread_b: Hello World from QEMU RV32 virt board! ...
HART ID = 0で実行されていることがわかります。
続きは次回です。
< | 2020 | > | ||||
<< | < | 10 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | - | - | - | 1 | 2 | 3 |
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
合計:
本日:
管理者: Katsuhiro Suzuki(katsuhiro( a t )katsuster.net)
This is Simple Diary 1.0
Copyright(C) Katsuhiro Suzuki 2006-2023.
Powered by PHP 8.2.15.
using GD bundled (2.1.0 compatible)(png support.)