目次: Zephyr
CONFIG_USE_SWITCHを有効にするとビルドエラーが発生しますので、都度対処します。
最初は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() はカーネル側で定義されるので、アーキテクチャ側では実装不要です。
// 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() が未定義だと言われます。
../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/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 | > | ||||
<< | < | 09 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | - | 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 | - | - | - |
合計:
本日:
管理者: 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.)