TOPPERS/FMPカーネルソース勉強会(1) start.S
<この項は書きかけです。順次追記します。>
アセンブラのソースコードの拡張子はSを使う。
最初に呼び出すコード。
~/workdir/RPi64Toppers/fmp/target/rpi_arm64_gcc/start.S
/*
* TOPPERS Software
* Toyohashi Open Platform for Embedded Real-Time Systems
*
* Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
* Toyohashi Univ. of Technology, JAPAN
* Copyright (C) 2005-2017 by Embedded and Real-Time Systems Laboratory
* Graduate School of Information Science, Nagoya Univ., JAPAN
*
* 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
* ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
* 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
* (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
* 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
* スコード中に含まれていること.
* (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
* 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
* 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
* の無保証規定を掲載すること.
* (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
* 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
* と.
* (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
* 作権表示,この利用条件および下記の無保証規定を掲載すること.
* (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
* 報告すること.
* (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
* 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
* また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
* 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
* 免責すること.
*
* 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
* よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
* に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
* @(#) $Id: start.S 1148 2016-01-08 08:15:59Z ertl-toshinaga $
*/
/*
* カーネル用のスタートアップモジュール(RPI-ARM64用)
*/
#define TOPPERS_MACRO_ONLY
#define UINT_C(val) (val) /* uint_t型の定数を作るマクロ */
#define ULONG_C(val) (val) /* ulong_t型の定数を作るマクロ */
#include "kernel_impl.h"
#include "target_asm.inc"
/*
* 同期用のマジックナンバー
*/
#define MAGIC_START 0x87654321
/*
* startのデバッグ
*/
//#define DEBUG_CORE0
#define DEBUG_JTAG
//#define DEBUG_MU
//#define DEBUG_STUB
ATEXT
AALIGN(2)
AGLOBAL(start)
ALABEL(start)
#ifdef DEBUG_CORE0
/*
* コア0だけ実行
*/
ALABEL(dbgcore0)
mrs x0, mpidr_el1
ldr x1, =MPIDR_AFF0_MASK
and x0, x0, x1
cmp x0, xzr
b.eq dbgcore0_exit
ALABEL(dbgcore0_sleep)
wfi
b dbgcore0_sleep
ALABEL(dbgcore0_exit)
#endif /* DEBUG_CORE0 */
#ifdef DEBUG_JTAG
/*
* JTAGの有効化
*/
ALABEL(dbgjtag)
mrs x0, mpidr_el1
ldr x1, =MPIDR_AFF0_MASK
and x0, x0, x1
cmp x0, xzr
b.ne dbgjtag_exit
ALABEL(dbgjtag_gpfsel)
ldr x0, =GPIO_GPFSEL2
ldr w1, [x0]
mov w3, #7 /* FSEL22 <= ALT4 */
lsl w3, w3, #6
mvn w3, w3
and w1, w1, w3
mov w3, #3
lsl w3, w3, #6
orr w1, w1, w3
mov w3, #7 /* FSEL23 <= ALT4 */
lsl w3, w3, #9
mvn w3, w3
and w1, w1, w3
mov w3, #3
lsl w3, w3, #9
orr w1, w1, w3
mov w3, #7 /* FSEL24 <= ALT4 */
lsl w3, w3, #12
mvn w3, w3
and w1, w1, w3
mov w3, #3
lsl w3, w3, #12
orr w1, w1, w3
mov w3, #7 /* FSEL25 <= ALT4 */
lsl w3, w3, #15
mvn w3, w3
and w1, w1, w3
mov w3, #3
lsl w3, w3, #15
orr w1, w1, w3
mov w3, #7 /* FSEL26 <= ALT4 */
lsl w3, w3, #18
mvn w3, w3
and w1, w1, w3
mov w3, #3
lsl w3, w3, #18
orr w1, w1, w3
mov w3, #7 /* FSEL27 <= ALT4 */
lsl w3, w3, #21
mvn w3, w3
and w1, w1, w3
mov w3, #3
lsl w3, w3, #21
orr w1, w1, w3
str w1, [x0]
dmb sy
ALABEL(dbgjtag_gppud)
ldr x0, =GPIO_GPPUD
ldr w1, =0x00000000
str w1, [x0]
dmb sy
mov w2, #150
ALABEL(dbgjtag_gppud_loop)
nop
sub w2, w2, #1
cmp w2, wzr
bne dbgjtag_gppud_loop
ALABEL(dbgjtag_gppudclk0)
ldr x0, =GPIO_GPPUDCLK0
ldr w1, =0x0fc00000
str w1, [x0]
dmb sy
mov w2, #150
ALABEL(dbgjtag_gppudclk0_loop)
nop
sub w2, w2, #1
cmp w2, wzr
bne dbgjtag_gppudclk0_loop
ALABEL(dbgjtag_clear_gppudclk0)
ldr x0, =GPIO_GPPUDCLK0
ldr w1, =0x00000000
str w1, [x0]
dmb sy
mov w2, #150
ALABEL(dbgjtag_clear_gppudclk0_loop)
nop
sub w2, w2, #1
cmp w2, wzr
bne dbgjtag_clear_gppudclk0_loop
ALABEL(dbgjtag_exit)
#endif /* DEBUG_JTAG */
#ifdef DEBUG_MU
/*
* Mini Uartを有効化
* config.txtにenable_uart=1を記載しても良い
*/
ALABEL(dbgmu)
mrs x0, mpidr_el1
ldr x1, =MPIDR_AFF0_MASK
and x0, x0, x1
cmp x0, xzr
b.ne dbgmu_exit
ALABEL(dbgmu_gpfsel)
ldr x0, =GPIO_GPFSEL1
ldr w1, [x0]
mov w3, #7 /* FSEL14 <= ALT5 */
lsl w3, w3, #12
mvn w3, w3
and w1, w1, w3
mov w3, #2
lsl w3, w3, #12
orr w1, w1, w3
mov w3, #7 /* FSEL15 <= ALT5 */
lsl w3, w3, #15
mvn w3, w3
and w1, w1, w3
mov w3, #2
lsl w3, w3, #15
orr w1, w1, w3
str w1, [x0]
dmb sy
ALABEL(dbgmu_gppud)
ldr x0, =GPIO_GPPUD
ldr w1, =0x00000000
str w1, [x0]
dmb sy
mov w2, #150
ALABEL(dbgmu_gppud_loop)
nop
sub w2, w2, #1
cmp w2, wzr
bne dbgmu_gppud_loop
ALABEL(dbgmu_gppudclk0)
ldr x0, =GPIO_GPPUDCLK0
ldr w1, =0x0fc00000
str w1, [x0]
dmb sy
mov w2, #150
ALABEL(dbgmu_gppudclk0_loop)
nop
sub w2, w2, #1
cmp w2, wzr
bne dbgmu_gppudclk0_loop
ALABEL(dbgmu_clear_gppudclk0)
ldr x0, =GPIO_GPPUDCLK0
mov w1, #0x0
str w1, [x0]
dmb sy
mov w2, #150
ALABEL(dbgmu_clear_gppudclk0_loop)
nop
sub w2, w2, #1
cmp w2, wzr
bne dbgmu_clear_gppudclk0_loop
ALABEL(dbgmu_regcfg)
ldr x0, =AUX_ENABLES
ldr w1, [x0]
orr w1, w1, #AUX_ENABLES_MU_EN_BIT
str w1, [x0]
ldr x0, =MU_BAUD
mov w1, #((250000000 / (115200 * 8)) - 1)
str w1, [x0]
dmb sy
ALABEL(dbgmu_test)
ldr x1, =MU_LSR
ldr w0, [x1]
mov w2, #MU_LSR_TX_EMPTY_BIT
and w0, w0, w2
cmp w0, #MU_LSR_TX_EMPTY_BIT
b.ne dbgmu_test
ldr x1, =MU_IO
mov w0, #0x41
str w0, [x1]
ALABEL(dbgmu_exit)
#endif /* DEBUG_MU */
#ifdef DEBUG_STUB
/*
* stubを配置
*/
ALABEL(dbgstub_loop)
b dbgstub_loop
#endif /* DEBUG_STUB */
/*
* FIQ / IRQの禁止
*/
mov x0, #(DAIF_F_BIT AOR DAIF_I_BIT)
msr daif, x0
/*
* 現在のELによって処理を変える
*/
mrs x0, CurrentEL
and x0, x0, #(CURRENTEL_EL_MASK)
#ifdef INIT_MONITOR
cmp x0, #(CURRENTEL_EL_EL3)
b.eq start_el3
#endif /* INIT_MONITOR */
#ifdef INIT_HYPERVISOR
cmp x0, #(CURRENTEL_EL_EL2)
b.eq start_el2
#endif /* INIT_HYPERVISOR */
cmp x0, #(CURRENTEL_EL_EL1)
b.eq start_el1
#ifdef INIT_MONITOR
/*
* EL3の処理
*/
ALABEL(start_el3)
/*
* EL3の設定
* EL2 をAArch64に設定,セキュアタイマ,セキュリティ状態の設定
*/
//#ifdef TOPPERS_SAFEG_SECURE
// mov w0, #(SCR_RW_BIT | SCR_ST_BIT)
//#else /* TOPPERS_SAFEG_SECURE */
mov w0, #(SCR_RW_BIT | SCR_NS_BIT)
//#endif /* TOPPERS_SAFEG_SECURE */
msr scr_el3, x0
isb
/*
* スタックポインタと,フレームポインタの初期化
*/
my_istkpt x0, x1 /* FMP */
mov sp, x0
mov x29, xzr /* フレームポインタ(r29) */
/*
* target_mon_initializeの呼び出し
*
* EL3で行う初期化を実行
*/
bl target_mon_initialize
/*
* EL2へドロップ
*/
ALABEL(drop_el2)
//#ifdef TOPPERS_SAFEG_SECURE
// adr x0, start_el1
// msr elr_el3, x0
// mov x0, #(DAIF_F_BIT AOR DAIF_I_BIT AOR MODE_AARCH64_EL1H)
// msr spsr_el3, x0
//#else /* TOPPERS_SAFEG_SECURE */
adr x0, start_el2
msr elr_el3, x0
mov x0, #(DAIF_F_BIT AOR DAIF_I_BIT AOR MODE_AARCH64_EL2H)
msr spsr_el3, x0
//#endif /* TOPPERS_SAFEG_SECURE */
eret
#endif /* INIT_MONITOR */
#ifdef INIT_HYPERVISOR
/*
* EL2の処理
*/
ALABEL(start_el2)
/*
* EL2の設定
* EL1とEL0 をAArch64に設定
*/
mov x0, #(HCR_RW_BIT)
msr hcr_el2, x0
isb
/*
* スタックポインタと,フレームポインタの初期化
*/
my_istkpt x0, x1 /* FMP */
mov sp, x0
mov x29, xzr /* フレームポインタ(r29) */
/*
* target_hyp_initializeの呼び出し
*
* EL2で行う初期化を実行
*/
bl target_hyp_initialize
/*
* EL1へドロップ
*/
ALABEL(drop_el1)
adr x0, start_el1
msr elr_el2, x0
mov x0, #(DAIF_F_BIT AOR DAIF_I_BIT AOR MODE_AARCH64_EL1H)
msr spsr_el2, x0
eret
#endif /* INIT_HYPERVISOR */
/*
* EL1の処理
*/
ALABEL(start_el1)
/*
* スタックポインタと,フレームポインタの初期化
*/
my_istkpt x0, x1 /* FMP */
mov sp, x0
mov x29, xzr /* フレームポインタ(r29) */
/*
* hardware_init_hookの呼び出し (0でない場合)
*
* ターゲットハードウェアに依存して必要な初期化処理がある場合
* は,hardware_init_hook という関数を用意する
*/
ldr x0, =hardware_init_hook
cmp x0, #0x00
b.eq start_1
blr x0
ALABEL(start_1)
/*
* マスタプロセッサ以外は初期化待ち
*/
my_core_index x0, x1
cmp x0, #(TOPPERS_MASTER_PRCID - 1)
b.ne slave_wait
/*
* マスタプロセッサは変数を初期化
*/
ldr x0, =start_sync
str wzr, [x0]
#ifndef TOPPERS_OMIT_BSS_INIT
/*
* bssセクションのクリア
*/
ldr x1, =BSS_START
ldr x2, =BSS_END
cmp x1, x2
b.hs start_3
ALABEL(start_2)
str xzr, [x1], #8
cmp x1, x2
b.lo start_2
#endif /* TOPPERS_OMIT_BSS_INIT */
ALABEL(start_3)
#ifndef TOPPERS_OMIT_DATA_INIT
/*
* dataセクションの初期化(ROM化対応)
* IDATA_START から IDATA_END までを,DATA_START 以降に
* コピーする
*/
ldr x1, =IDATA_START
ldr x3, =IDATA_END
cmp x1, x3
b.hs start_5
ldr x2, =DATA_START
ALABEL(start_4)
ldr x0, [x1], #8
str x0, [x2], #8
cmp x1, x3
b.lo start_4
#endif /* TOPPERS_OMIT_DATA_INIT */
/*
* software_init_hook を呼出し(0 でない場合)
*
* ソフトウェア環境(特にライブラリ)に依存して必要な初期化処
* 理がある場合は,software_init_hook という関数を用意すれば
* よい.
*/
ALABEL(start_5)
ldr x0, =software_init_hook
cmp x0, xzr
b.eq start_6
blr x0
/*
* target_mprc_initialize の呼び出し
*
* sta_ker 以前にマスタプロセッサのみで行う必要のある初期化を実行
*/
ALABEL(start_6)
bl target_mprc_initialize
/*
* カーネルを起動する
*/
ALABEL(start_7)
ldr x0, =start_sync
ldr w1, =MAGIC_START
mov x2, xzr
ALABEL(start_8)
str w1, [x0, x2]
add x2, x2, #4
cmp x2, #(TNUM_PRCID * 4)
b.ne start_8
/* 全コアに通知 */
sev
/* マスタプロセッサ用のstart_syncを初期化 */
my_core_index x1, x3
lsl x1, x1, #3
str w2, [x0, x1]
bl sta_ker
/*
* マスタプロセッサ以外の初期化待ちルーチン
*/
ALABEL(slave_wait)
my_core_index x0, x1
lsl x0, x0, #2
ldr x1, =start_sync
ALABEL(slave_wait_1)
ldr w2, =MAGIC_START
ldr w3, [x1, x0]
cmp w3, w2
b.ne slave_wait_1
str wzr, [x1, x0]
bl sta_ker
* Copyright (C) 2005-2017 by Embedded and Real-Time Systems Laboratory
* Graduate School of Information Science, Nagoya Univ., JAPAN
名古屋大学で作成。
* @(#) $Id: start.S 1148 2016-01-08 08:15:59Z ertl-toshinaga $
toshinaga さんが登録。
#include "kernel_impl.h"
#include "target_asm.inc"
kernel_impl.hは
~/workdir/RPi64Toppers/fmp/kernel/kernel_impl.h
/*
* TOPPERS/FMP Kernel
* Toyohashi Open Platform for Embedded Real-Time Systems/
* Flexible MultiProcessor Kernel
*
* Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
* Toyohashi Univ. of Technology, JAPAN
* Copyright (C) 2004-2014 by Embedded and Real-Time Systems Laboratory
* Graduate School of Information Science, Nagoya Univ., JAPAN
*
* 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
* ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
* 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
* (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
* 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
* スコード中に含まれていること.
* (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
* 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
* 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
* の無保証規定を掲載すること.
* (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
* 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
* と.
* (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
* 作権表示,この利用条件および下記の無保証規定を掲載すること.
* (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
* 報告すること.
* (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
* 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
* また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
* 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
* 免責すること.
*
* 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
* よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
* に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
* @(#) $Id: kernel_impl.h 1080 2014-12-25 15:25:16Z ertl-honda $
*/
/*
* TOPPERS/FMPカーネル内部向け標準ヘッダファイル
*
* このヘッダファイルは,カーネルを構成するプログラムのソースファイル
* で必ずインクルードするべき標準ヘッダファイルである.
*
* アセンブリ言語のソースファイルからこのファイルをインクルードする時
* は,TOPPERS_MACRO_ONLYを定義しておく.これにより,マクロ定義以外を
* 除くようになっている.
*/
#ifndef TOPPERS_KERNEL_IMPL_H
#define TOPPERS_KERNEL_IMPL_H
/*
* カーネルの内部識別名のリネーム
*/
#include "kernel_rename.h"
/*
* アプリケーションと共通のヘッダファイル
*/
#include <kernel.h>
/*
* システムログ機能のための定義
*/
#include <t_syslog.h>
/*
* 型キャストを行うマクロの定義
*/
#ifndef CAST
#define CAST(type, val) ((type)(val))
#endif /* CAST */
/*
* プロセッサIDの最小値の定義
*/
#define TMIN_PRCID 1 /* プロセッサIDの最小値 */
/*
* オブジェクトIDの最小値の定義
*/
#define TMIN_TSKID 1 /* タスクIDの最小値 */
#define TMIN_SEMID 1 /* セマフォIDの最小値 */
#define TMIN_FLGID 1 /* フラグIDの最小値 */
#define TMIN_DTQID 1 /* データキューIDの最小値 */
#define TMIN_PDQID 1 /* 優先度データキューIDの最小値 */
#define TMIN_MBXID 1 /* メールボックスIDの最小値 */
#define TMIN_MPFID 1 /* 固定長メモリプールIDの最小値 */
#define TMIN_CYCID 1 /* 周期ハンドラIDの最小値 */
#define TMIN_ALMID 1 /* アラームハンドラIDの最小値 */
#define TMIN_SPNID 1 /* スピンロックIDの最小値 */
/*
* 優先度の段階数の定義
*/
#define TNUM_TPRI (TMAX_TPRI - TMIN_TPRI + 1)
#define TNUM_MPRI (TMAX_MPRI - TMIN_MPRI + 1)
#define TNUM_INTPRI (TMAX_INTPRI - TMIN_INTPRI + 1)
/*
* PCB関連の定義
*/
#include "pcb.h"
/*
* ターゲット依存情報の定義
*/
#include "target_config.h"
/*
* すべての関数をコンパイルするための定義
*/
#ifdef ALLFUNC
#include "allfunc.h"
#endif /* ALLFUNC */
/*
* ビットフィールドでの符号無し整数型
*
* 8ビット以下の幅のビットフィールドで,符号無し整数値を保持したい場合
* に用いるべきデータ型.ANSI Cでは,ビットフィールドのデータ型には
* intとunsigned intしか許されないため,デフォルトの定義はunsigned
* intとしているが,ターゲットおよびツール依存で,unsigned charまたは
* unsigned shortに定義した方が効率が良い場合がある.
*/
#ifndef BIT_FIELD_UINT
#define BIT_FIELD_UINT unsigned int
#endif /* BIT_FIELD_UINT */
/*
* ビットフィールドでのブール型
*
* 1ビット幅のビットフィールドで,ブール値を保持したい場合に用いるべき
* データ型.デフォルトではBIT_FIELD_UINTと同一に定義しているが,ブー
* ル値を保持することを明示するために別の名称としている.
*/
#ifndef BIT_FIELD_BOOL
#define BIT_FIELD_BOOL BIT_FIELD_UINT
#endif /* BIT_FIELD_BOOL */
/*
* ヘッダファイルを持たないモジュールの関数・変数の宣言
*/
#ifndef TOPPERS_MACRO_ONLY
/*
* 各モジュールの初期化(kernel_cfg.c)
*/
extern void initialize_object(void);
/*
* グローバル初期化ルーチンの実行(kernel_cfg.c)
*/
extern void call_global_inirtn(void);
/*
* ローカル初期化ルーチンの実行(kernel_cfg.c)
*/
extern void call_local_inirtn(void);
/*
* グローバル終了処理ルーチンの実行(kernel_cfg.c)
*/
extern void call_global_terrtn(void);
/*
* ローカル終了処理ルーチンの実行(kernel_cfg.c)
*/
extern void call_local_terrtn(void);
/*
* 非タスクコンテキスト用のスタック領域(kernel_cfg.c)
*/
extern const SIZE istksz_table[]; /* スタック領域のサイズ(丸めた値) */
extern STK_T *const istk_table[]; /* スタック領域の先頭番地 */
#ifdef TOPPERS_ISTKPT
extern STK_T *const istkpt_table[]; /* スタックポインタの初期値 */
#endif /* TOPPERS_ISTKPT */
/*
* カーネルの起動(startup.c)
*/
extern void sta_ker(void);
/*
* カーネルの終了処理(startup.c)
*/
extern void exit_kernel(void);
#endif /* TOPPERS_MACRO_ONLY */
#endif /* TOPPERS_KERNEL_IMPL_H */
#include "kernel_rename.h"
/* アプリケーションと共通のヘッダファイル */
#include <kernel.h>
~/workdir/RPi64Toppers/fmp/kernel/kernel_rename.h
/* This file is generated from kernel_rename.def by genrename. */
#ifndef TOPPERS_KERNEL_RENAME_H
#define TOPPERS_KERNEL_RENAME_H
/*
* startup.c
*/
#define exit_kernel _kernel_exit_kernel
/*
* mp.c
*/
#define giant_lock _kernel_giant_lock
#define ext_ker_reqflg _kernel_ext_ker_reqflg
#define ipi_handler _kernel_ipi_handler
#define dispatch_request _kernel_dispatch_request
#define ext_ker_request _kernel_ext_ker_request
#define initialize_pcb _kernel_initialize_pcb
#define barrier_sync _kernel_barrier_sync
#define t_acquire_tsk_lock_prcid _kernel_t_acquire_tsk_lock_prcid
#define t_acquire_tsk_lock_self _kernel_t_acquire_tsk_lock_self
#define t_acquire_tsk_lock_self_without_runnable_check _kernel_t_acquire_tsk_lock_self_without_runnable_check
#define t_acquire_nested_tsk_lock_self _kernel_t_acquire_nested_tsk_lock_self
#define t_acquire_tsk_lock _kernel_t_acquire_tsk_lock
#define t_acquire_tsk_lock_alm _kernel_t_acquire_tsk_lock_alm
#define t_acquire_tsk_lock_cyc _kernel_t_acquire_tsk_lock_cyc
#define i_acquire_tsk_lock_prcid _kernel_i_acquire_tsk_lock_prcid
#define i_acquire_tsk_lock_self _kernel_i_acquire_tsk_lock_self
#define i_acquire_tsk_lock _kernel_i_acquire_tsk_lock
#define i_acquire_tsk_lock_alm _kernel_i_acquire_tsk_lock_alm
#define t_acquire_obj_lock _kernel_t_acquire_obj_lock
#define i_acquire_obj_lock _kernel_i_acquire_obj_lock
#define release_tsk_lock _kernel_release_tsk_lock
#define release_nested_tsk_lock _kernel_release_nested_tsk_lock
#define release_dual_tsk_lock _kernel_release_dual_tsk_lock
#define release_obj_lock _kernel_release_obj_lock
#define acquire_tsk_lock_without_preemption_self _kernel_acquire_tsk_lock_without_preemption_self
#define acquire_nested_tsk_lock_without_preemption _kernel_acquire_nested_tsk_lock_without_preemption
#define t_acquire_nested_tsk_lock _kernel_t_acquire_nested_tsk_lock
#define t_acquire_dual_tsk_lock _kernel_t_acquire_dual_tsk_lock
#define t_acquire_dual_tsk_lock_alm _kernel_t_acquire_dual_tsk_lock_alm
#define t_acquire_dual_tsk_lock_cyc _kernel_t_acquire_dual_tsk_lock_cyc
#define t_acquire_nested_dual_tsk_lock _kernel_t_acquire_nested_dual_tsk_lock
#define i_acquire_nested_tsk_lock _kernel_i_acquire_nested_tsk_lock
#define i_acquire_dual_tsk_lock _kernel_i_acquire_dual_tsk_lock
#define i_acquire_dual_tsk_lock_alm _kernel_i_acquire_dual_tsk_lock_alm
/*
* task.c
*/
#define initialize_task _kernel_initialize_task
#define search_schedtsk _kernel_search_schedtsk
#define make_runnable _kernel_make_runnable
#define make_non_runnable _kernel_make_non_runnable
#define make_dormant _kernel_make_dormant
#define make_active _kernel_make_active
#define change_priority _kernel_change_priority
#define rotate_ready_queue _kernel_rotate_ready_queue
#define call_texrtn _kernel_call_texrtn
#define dispatch_call_texrtn _kernel_dispatch_call_texrtn
#define calltex _kernel_calltex
#define migrate_self _kernel_migrate_self
#define exit_and_migrate_self _kernel_exit_and_migrate_self
#define set_lowest_precedence _kernel_set_lowest_precedence
/*
* wait.c
*/
#define make_wait_tmout _kernel_make_wait_tmout
#define wait_complete _kernel_wait_complete
#define wait_tmout _kernel_wait_tmout
#define wait_tmout_ok _kernel_wait_tmout_ok
#define wait_release _kernel_wait_release
#define wobj_make_wait _kernel_wobj_make_wait
#define wobj_make_wait_tmout _kernel_wobj_make_wait_tmout
#define init_wait_queue _kernel_init_wait_queue
/*
* time_event.c
*/
#define current_time _kernel_current_time
#define min_time _kernel_min_time
#define next_time _kernel_next_time
#define next_subtime _kernel_next_subtime
#define last_index _kernel_last_index
#define initialize_tmevt _kernel_initialize_tmevt
#define tmevt_up _kernel_tmevt_up
#define tmevt_down _kernel_tmevt_down
#define tmevtb_insert _kernel_tmevtb_insert
#define tmevtb_delete _kernel_tmevtb_delete
#define tmevt_lefttim _kernel_tmevt_lefttim
#define signal_time _kernel_signal_time
#define get_my_current_time _kernel_get_my_current_time
/*
* semaphore.c
*/
#define initialize_semaphore _kernel_initialize_semaphore
/*
* eventflag.c
*/
#define initialize_eventflag _kernel_initialize_eventflag
#define check_flg_cond _kernel_check_flg_cond
/*
* dataqueue.c
*/
#define initialize_dataqueue _kernel_initialize_dataqueue
#define enqueue_data _kernel_enqueue_data
#define force_enqueue_data _kernel_force_enqueue_data
#define dequeue_data _kernel_dequeue_data
#define send_data _kernel_send_data
#define force_send_data _kernel_force_send_data
#define receive_data _kernel_receive_data
/*
* pridataq.c
*/
#define initialize_pridataq _kernel_initialize_pridataq
#define enqueue_pridata _kernel_enqueue_pridata
#define dequeue_pridata _kernel_dequeue_pridata
#define send_pridata _kernel_send_pridata
#define receive_pridata _kernel_receive_pridata
/*
* mailbox.c
*/
#define initialize_mailbox _kernel_initialize_mailbox
/*
* mempfix.c
*/
#define initialize_mempfix _kernel_initialize_mempfix
#define get_mpf_block _kernel_get_mpf_block
/*
* cyclic.c
*/
#define initialize_cyclic _kernel_initialize_cyclic
#define call_cychdr _kernel_call_cychdr
/*
* alarm.c
*/
#define initialize_alarm _kernel_initialize_alarm
#define call_almhdr _kernel_call_almhdr
/*
* spin_lock.c
*/
#define initialize_spin_lock _kernel_initialize_spin_lock
#define force_unlock_spin _kernel_force_unlock_spin
/*
* interrupt.c
*/
#define initialize_interrupt _kernel_initialize_interrupt
/*
* exception.c
*/
#define initialize_exception _kernel_initialize_exception
/*
* kernel_cfg.c
*/
#define p_pcb_table _kernel_p_pcb_table
#define initialize_object _kernel_initialize_object
#define call_global_inirtn _kernel_call_global_inirtn
#define call_local_inirtn _kernel_call_local_inirtn
#define call_global_terrtn _kernel_call_global_terrtn
#define call_local_terrtn _kernel_call_local_terrtn
#define tmax_tskid _kernel_tmax_tskid
#define tinib_table _kernel_tinib_table
#define torder_table _kernel_torder_table
#define tcb_table _kernel_tcb_table
#define p_tcb_table _kernel_p_tcb_table
#define tmax_semid _kernel_tmax_semid
#define seminib_table _kernel_seminib_table
#define semcb_table _kernel_semcb_table
#define p_semcb_table _kernel_p_semcb_table
#define tmax_flgid _kernel_tmax_flgid
#define flginib_table _kernel_flginib_table
#define flgcb_table _kernel_flgcb_table
#define p_flgcb_table _kernel_p_flgcb_table
#define tmax_dtqid _kernel_tmax_dtqid
#define dtqcb_table _kernel_dtqcb_table
#define dtqinib_table _kernel_dtqinib_table
#define p_dtqcb_table _kernel_p_dtqcb_table
#define tmax_pdqid _kernel_tmax_pdqid
#define pdqcb_table _kernel_pdqcb_table
#define pdqinib_table _kernel_pdqinib_table
#define p_pdqcb_table _kernel_p_pdqcb_table
#define tmax_mbxid _kernel_tmax_mbxid
#define mbxinib_table _kernel_mbxinib_table
#define p_mbxcb_table _kernel_p_mbxcb_table
#define tmax_mpfid _kernel_tmax_mpfid
#define mpfinib_table _kernel_mpfinib_table
#define mpfcb_table _kernel_mpfcb_table
#define p_mpfcb_table _kernel_p_mpfcb_table
#define tmax_cycid _kernel_tmax_cycid
#define cycinib_table _kernel_cycinib_table
#define cyccb_table _kernel_cyccb_table
#define p_cyccb_table _kernel_p_cyccb_table
#define tmax_almid _kernel_tmax_almid
#define alminib_table _kernel_alminib_table
#define almcb_table _kernel_almcb_table
#define p_almcb_table _kernel_p_almcb_table
#define tmax_spnid _kernel_tmax_spnid
#define spninib_table _kernel_spninib_table
#define spncb_table _kernel_spncb_table
#define p_spncb_table _kernel_p_spncb_table
#define tnum_inhno _kernel_tnum_inhno
#define inhinib_table _kernel_inhinib_table
#define tnum_intno _kernel_tnum_intno
#define intinib_table _kernel_intinib_table
#define tnum_excno _kernel_tnum_excno
#define excinib_table _kernel_excinib_table
#define tmevt_heap _kernel_tmevt_heap
#define p_tevtcb_table _kernel_p_tevtcb_table
#define p_tmevt_heap_table _kernel_p_tmevt_heap_table
#define tevtcb _kernel_tevtcb
#define istksz_table _kernel_istksz_table
#define istk_table _kernel_istk_table
#define istkpt_table _kernel_istkpt_table
/*
* syslog.c
*/
#define p_syslogcb_table _kernel_p_syslogcb_table
#ifdef TOPPERS_LABEL_ASM
/*
* startup.c
*/
#define _exit_kernel __kernel_exit_kernel
/*
* mp.c
*/
#define _giant_lock __kernel_giant_lock
#define _ext_ker_reqflg __kernel_ext_ker_reqflg
#define _ipi_handler __kernel_ipi_handler
#define _dispatch_request __kernel_dispatch_request
#define _ext_ker_request __kernel_ext_ker_request
#define _initialize_pcb __kernel_initialize_pcb
#define _barrier_sync __kernel_barrier_sync
#define _t_acquire_tsk_lock_prcid __kernel_t_acquire_tsk_lock_prcid
#define _t_acquire_tsk_lock_self __kernel_t_acquire_tsk_lock_self
#define _t_acquire_tsk_lock_self_without_runnable_check __kernel_t_acquire_tsk_lock_self_without_runnable_check
#define _t_acquire_nested_tsk_lock_self __kernel_t_acquire_nested_tsk_lock_self
#define _t_acquire_tsk_lock __kernel_t_acquire_tsk_lock
#define _t_acquire_tsk_lock_alm __kernel_t_acquire_tsk_lock_alm
#define _t_acquire_tsk_lock_cyc __kernel_t_acquire_tsk_lock_cyc
#define _i_acquire_tsk_lock_prcid __kernel_i_acquire_tsk_lock_prcid
#define _i_acquire_tsk_lock_self __kernel_i_acquire_tsk_lock_self
#define _i_acquire_tsk_lock __kernel_i_acquire_tsk_lock
#define _i_acquire_tsk_lock_alm __kernel_i_acquire_tsk_lock_alm
#define _t_acquire_obj_lock __kernel_t_acquire_obj_lock
#define _i_acquire_obj_lock __kernel_i_acquire_obj_lock
#define _release_tsk_lock __kernel_release_tsk_lock
#define _release_nested_tsk_lock __kernel_release_nested_tsk_lock
#define _release_dual_tsk_lock __kernel_release_dual_tsk_lock
#define _release_obj_lock __kernel_release_obj_lock
#define _acquire_tsk_lock_without_preemption_self __kernel_acquire_tsk_lock_without_preemption_self
#define _acquire_nested_tsk_lock_without_preemption __kernel_acquire_nested_tsk_lock_without_preemption
#define _t_acquire_nested_tsk_lock __kernel_t_acquire_nested_tsk_lock
#define _t_acquire_dual_tsk_lock __kernel_t_acquire_dual_tsk_lock
#define _t_acquire_dual_tsk_lock_alm __kernel_t_acquire_dual_tsk_lock_alm
#define _t_acquire_dual_tsk_lock_cyc __kernel_t_acquire_dual_tsk_lock_cyc
#define _t_acquire_nested_dual_tsk_lock __kernel_t_acquire_nested_dual_tsk_lock
#define _i_acquire_nested_tsk_lock __kernel_i_acquire_nested_tsk_lock
#define _i_acquire_dual_tsk_lock __kernel_i_acquire_dual_tsk_lock
#define _i_acquire_dual_tsk_lock_alm __kernel_i_acquire_dual_tsk_lock_alm
/*
* task.c
*/
#define _initialize_task __kernel_initialize_task
#define _search_schedtsk __kernel_search_schedtsk
#define _make_runnable __kernel_make_runnable
#define _make_non_runnable __kernel_make_non_runnable
#define _make_dormant __kernel_make_dormant
#define _make_active __kernel_make_active
#define _change_priority __kernel_change_priority
#define _rotate_ready_queue __kernel_rotate_ready_queue
#define _call_texrtn __kernel_call_texrtn
#define _dispatch_call_texrtn __kernel_dispatch_call_texrtn
#define _calltex __kernel_calltex
#define _migrate_self __kernel_migrate_self
#define _exit_and_migrate_self __kernel_exit_and_migrate_self
#define _set_lowest_precedence __kernel_set_lowest_precedence
/*
* wait.c
*/
#define _make_wait_tmout __kernel_make_wait_tmout
#define _wait_complete __kernel_wait_complete
#define _wait_tmout __kernel_wait_tmout
#define _wait_tmout_ok __kernel_wait_tmout_ok
#define _wait_release __kernel_wait_release
#define _wobj_make_wait __kernel_wobj_make_wait
#define _wobj_make_wait_tmout __kernel_wobj_make_wait_tmout
#define _init_wait_queue __kernel_init_wait_queue
/*
* time_event.c
*/
#define _current_time __kernel_current_time
#define _min_time __kernel_min_time
#define _next_time __kernel_next_time
#define _next_subtime __kernel_next_subtime
#define _last_index __kernel_last_index
#define _initialize_tmevt __kernel_initialize_tmevt
#define _tmevt_up __kernel_tmevt_up
#define _tmevt_down __kernel_tmevt_down
#define _tmevtb_insert __kernel_tmevtb_insert
#define _tmevtb_delete __kernel_tmevtb_delete
#define _tmevt_lefttim __kernel_tmevt_lefttim
#define _signal_time __kernel_signal_time
#define _get_my_current_time __kernel_get_my_current_time
/*
* semaphore.c
*/
#define _initialize_semaphore __kernel_initialize_semaphore
/*
* eventflag.c
*/
#define _initialize_eventflag __kernel_initialize_eventflag
#define _check_flg_cond __kernel_check_flg_cond
/*
* dataqueue.c
*/
#define _initialize_dataqueue __kernel_initialize_dataqueue
#define _enqueue_data __kernel_enqueue_data
#define _force_enqueue_data __kernel_force_enqueue_data
#define _dequeue_data __kernel_dequeue_data
#define _send_data __kernel_send_data
#define _force_send_data __kernel_force_send_data
#define _receive_data __kernel_receive_data
/*
* pridataq.c
*/
#define _initialize_pridataq __kernel_initialize_pridataq
#define _enqueue_pridata __kernel_enqueue_pridata
#define _dequeue_pridata __kernel_dequeue_pridata
#define _send_pridata __kernel_send_pridata
#define _receive_pridata __kernel_receive_pridata
/*
* mailbox.c
*/
#define _initialize_mailbox __kernel_initialize_mailbox
/*
* mempfix.c
*/
#define _initialize_mempfix __kernel_initialize_mempfix
#define _get_mpf_block __kernel_get_mpf_block
/*
* cyclic.c
*/
#define _initialize_cyclic __kernel_initialize_cyclic
#define _call_cychdr __kernel_call_cychdr
/*
* alarm.c
*/
#define _initialize_alarm __kernel_initialize_alarm
#define _call_almhdr __kernel_call_almhdr
/*
* spin_lock.c
*/
#define _initialize_spin_lock __kernel_initialize_spin_lock
#define _force_unlock_spin __kernel_force_unlock_spin
/*
* interrupt.c
*/
#define _initialize_interrupt __kernel_initialize_interrupt
/*
* exception.c
*/
#define _initialize_exception __kernel_initialize_exception
/*
* kernel_cfg.c
*/
#define _p_pcb_table __kernel_p_pcb_table
#define _initialize_object __kernel_initialize_object
#define _call_global_inirtn __kernel_call_global_inirtn
#define _call_local_inirtn __kernel_call_local_inirtn
#define _call_global_terrtn __kernel_call_global_terrtn
#define _call_local_terrtn __kernel_call_local_terrtn
#define _tmax_tskid __kernel_tmax_tskid
#define _tinib_table __kernel_tinib_table
#define _torder_table __kernel_torder_table
#define _tcb_table __kernel_tcb_table
#define _p_tcb_table __kernel_p_tcb_table
#define _tmax_semid __kernel_tmax_semid
#define _seminib_table __kernel_seminib_table
#define _semcb_table __kernel_semcb_table
#define _p_semcb_table __kernel_p_semcb_table
#define _tmax_flgid __kernel_tmax_flgid
#define _flginib_table __kernel_flginib_table
#define _flgcb_table __kernel_flgcb_table
#define _p_flgcb_table __kernel_p_flgcb_table
#define _tmax_dtqid __kernel_tmax_dtqid
#define _dtqcb_table __kernel_dtqcb_table
#define _dtqinib_table __kernel_dtqinib_table
#define _p_dtqcb_table __kernel_p_dtqcb_table
#define _tmax_pdqid __kernel_tmax_pdqid
#define _pdqcb_table __kernel_pdqcb_table
#define _pdqinib_table __kernel_pdqinib_table
#define _p_pdqcb_table __kernel_p_pdqcb_table
#define _tmax_mbxid __kernel_tmax_mbxid
#define _mbxinib_table __kernel_mbxinib_table
#define _p_mbxcb_table __kernel_p_mbxcb_table
#define _tmax_mpfid __kernel_tmax_mpfid
#define _mpfinib_table __kernel_mpfinib_table
#define _mpfcb_table __kernel_mpfcb_table
#define _p_mpfcb_table __kernel_p_mpfcb_table
#define _tmax_cycid __kernel_tmax_cycid
#define _cycinib_table __kernel_cycinib_table
#define _cyccb_table __kernel_cyccb_table
#define _p_cyccb_table __kernel_p_cyccb_table
#define _tmax_almid __kernel_tmax_almid
#define _alminib_table __kernel_alminib_table
#define _almcb_table __kernel_almcb_table
#define _p_almcb_table __kernel_p_almcb_table
#define _tmax_spnid __kernel_tmax_spnid
#define _spninib_table __kernel_spninib_table
#define _spncb_table __kernel_spncb_table
#define _p_spncb_table __kernel_p_spncb_table
#define _tnum_inhno __kernel_tnum_inhno
#define _inhinib_table __kernel_inhinib_table
#define _tnum_intno __kernel_tnum_intno
#define _intinib_table __kernel_intinib_table
#define _tnum_excno __kernel_tnum_excno
#define _excinib_table __kernel_excinib_table
#define _tmevt_heap __kernel_tmevt_heap
#define _p_tevtcb_table __kernel_p_tevtcb_table
#define _p_tmevt_heap_table __kernel_p_tmevt_heap_table
#define _tevtcb __kernel_tevtcb
#define _istksz_table __kernel_istksz_table
#define _istk_table __kernel_istk_table
#define _istkpt_table __kernel_istkpt_table
/*
* syslog.c
*/
#define _p_syslogcb_table __kernel_p_syslogcb_table
#endif /* TOPPERS_LABEL_ASM */
#include "target_rename.h"
#endif /* TOPPERS_KERNEL_RENAME_H */
~/workdir/RPi64Toppers/fmp/target/rpi_arm64_gcc/target_rename.h
/* This file is generated from target_rename.def by genrename. */
#ifndef TOPPERS_TARGET_RENAME_H
#define TOPPERS_TARGET_RENAME_H
/*
* start.S
*/
#define start_sync _kernel_start_sync
/*
* target_config.c
*/
#define target_mon_initialize _kernel_target_mon_initialize
#define target_hyp_initialize _kernel_target_hyp_initialize
#define target_mprc_initialize _kernel_target_mprc_initialize
#define target_mmu_init _kernel_target_mmu_init
#define target_initialize _kernel_target_initialize
#define target_exit _kernel_target_exit
#ifdef TOPPERS_LABEL_ASM
/*
* start.S
*/
#define _start_sync __kernel_start_sync
/*
* target_config.c
*/
#define _target_mon_initialize __kernel_target_mon_initialize
#define _target_hyp_initialize __kernel_target_hyp_initialize
#define _target_mprc_initialize __kernel_target_mprc_initialize
#define _target_mmu_init __kernel_target_mmu_init
#define _target_initialize __kernel_target_initialize
#define _target_exit __kernel_target_exit
#endif /* TOPPERS_LABEL_ASM */
#include "arm64_gcc/bcm283x/chip_rename.h"
#endif /* TOPPERS_TARGET_RENAME_H */
~/workdir/RPi64Toppers/fmp/kernel/kernel.h
target_asm.incは
~/workdir/RPi64Toppers/fmp/target/rpi_arm64_gcc/target_asm.inc
#ifndef TOPPERS_TARGET_ASM_INC
#define TOPPERS_TARGET_ASM_INC
/*
* チップ依存モジュール(BCM283X用)
*/
#include "chip_asm.inc"
#endif /* TOPPERS_TARGET_ASM_INC */
~/workdir/RPi64Toppers/fmp/arch/arm64_gcc/bcm283x/chip_asm.inc
/*
* TOPPERS/FMP Kernel
* Toyohashi Open Platform for Embedded Real-Time Systems/
* Flexible MultiProcessor Kernel
*
* Copyright (C) 2007-2012 by Embedded and Real-Time Systems Laboratory
* Graduate School of Information Science, Nagoya Univ., JAPAN
*
* 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
* ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
* 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
* (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
* 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
* スコード中に含まれていること.
* (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
* 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
* 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
* の無保証規定を掲載すること.
* (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
* 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
* と.
* (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
* 作権表示,この利用条件および下記の無保証規定を掲載すること.
* (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
* 報告すること.
* (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
* 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
* また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
* 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
* 免責すること.
*
* 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
* よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
* に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
* @(#) $Id: chip_asm.inc 1149 2016-01-08 08:19:14Z ertl-toshinaga $
*/
#ifndef TOPPERS_CHIP_ASM_INC
#define TOPPERS_CHIP_ASM_INC
.macro my_core_index re_reg sc_reg1
mrs \re_reg, mpidr_el1
and \re_reg, \re_reg, #MPIDR_AFF0_MASK
.endm
#ifdef USE_THREAD_ID_PCB
.macro my_pcb re_reg sc_reg1
mrs \re_reg, tpidr_el1
.endm
#else /* USE_THREAD_ID_PCB */
.macro my_pcb re_reg sc_reg1
mrs \re_reg, mpidr_el1
and \sc_reg1, \re_reg, #MPIDR_AFF0_MASK
ldr \re_reg, =p_pcb_table
ldr \re_reg, [\re_reg, \sc_reg1, lsl #3]
.endm
#endif /* USE_THREAD_ID_PCB */
.macro my_istkpt re_reg sc_reg1
mrs \re_reg, mpidr_el1
and \sc_reg1, \re_reg, #MPIDR_AFF0_MASK
ldr \re_reg, =_kernel_istkpt_table
ldr \re_reg, [\re_reg, \sc_reg1, lsl #3]
.endm
#include "arm64_gcc/common/core_asm.inc"
#endif /* TOPPERS_CHIP_ASM_INC */
<この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。>
文書履歴
2018年03月13日 初版 1.00
2018年03月19日 1.01 誤植訂正
@khsk さんから編集要請 start.S
enalbe → enable
khsk 2018年03月19日 13時10分 (JST)
-
- config.txtにenalbe_uart=1を記載しても良い
-
- config.txtにenable_uart=1を記載しても良い
---Typo
- config.txtにenable_uart=1を記載しても良い
最後までおよみいただきありがとうございました。
いいね 💚、フォローをお願いします。
Thank you very much for reading to the last sentence.
Please press the like icon 💚 and follow me for your happy life.