Nutx romfsと起動スクリプトrcS

13148 ワード

ARMシステムの電源投入後、システムはflashアドレスをゼロアドレスにマッピングし、プロセッサはゼロアドレスから最初の命令を実行します.一方、ゼロアドレスでは、一般にシステムリセット中断ベクトルであり、ここに格納されているのはジャンプ指命令であり、この変換命令によってプロセッサはリセットサービス関数を実行する.Cortext-Mシリーズの実装はやや異なり、ゼロアドレスに配置されたスタックポインタ、次いで複素サービス関数アドレスである.
リセットサービス関数の先頭はアセンブリ言語で記述され,アセンブリ関数を用いてC関数を呼び出し,システムをC関数に持ち込む.NutxのCエントリ関数はos_ですstart()はos_start()はオペレーティングシステムの初期化を実行します.
Nuttxオペレーティングシステムの初期化が完了すると、まず最初のプロセスが作成され、idleスレッドはこの最初のプロセスのスレッドです.最初のプロセスがあれば、システムは次にユーザープロセス、すなわちos_を作成します.bringup()関数でos_を呼び出すdo_appstart()はinitプロセスを作成します.Initプロセスの最初のデフォルトスレッドはnsh_です.main.nsh_main呼び出しnsh_consolemain()関数romfsファイルシステムの起動スクリプトを実行し、nsh_mainスレッドはnshインタラクティブインタフェースに入ります.これで、OSは完全に起動します.他のプロセス、またはスレッドは、スクリプトの起動によって実行されるか、nshによって起動されます.
デフォルトではnsh_mainスレッドはromfsの「/etc/init.d/rcS」という起動スクリプトのコマンドを実行します.romfs起動スクリプトには独自の構文があり、Nuttxのshはこれらの構文を解析し、関連するコマンドを実行することができます.これらのコマンドは、プロセス環境変数を設定したり、環境変数を読み出したり、他のスレッドを起動したりすることができます.
このセクションでは、Nutxがromfsを作成する方法について説明し、次に、nutxが起動中に作成した起動スクリプトを実行できるようにromfsをカスタマイズする方法について説明します.最後に、起動スクリプトの構文について簡単に説明します.
1.romfsの概要
romfsは、その名の通りromで実現されるファイルシステムであるlinux 2.1.21リリースでは、ファイルシステムが最初にサポートされています.このファイルシステムは、ブロック記憶媒体に基づく読み取り専用ファイルシステムであり、体積が小さく、読み取り速度が速く、信頼性が高いという利点がある.その欠点は、このファイルシステムは読み取り専用であり、ファイルの記述情報が少なく、アクセス権限の制限がないことです.
romfsは、通常、システムモジュール、読み取り専用ファイルなどを格納するために組み込みシステムで使用され、EEPROMまたは他のブロックストレージデバイスに配備される.
romfsファイルシステムのモジュール構造とプロトコル、およびドライバについては、オンラインで検索できます.
2.romfsの作成
linuxシステムの下でgenromfsツールを使用して、読み取り専用ファイルシステムとしてシステムにマウントできるromfsイメージファイルを生成します.
2.1 romfsの生成
ここではlinuxシステムの下でromfsファイルシステムの生成とマウントについて説明します.まず、ホストにromfsを生成するディレクトリとファイルを作成します.たとえば、ディレクトリromfs_dir.「tree」コマンドでディレクトリ構造を表示
$ tree romfs_dir
romfs
|——dir_a
|    |——a.txt   
|——dir_b
     |——b.txt

2 directories, 2 file

文字列「this is a.txt」からa.txtファイル、文字列「this is b.txt」からb.txtファイルに書き込む.
「genromfs」コマンドを使用してromfs_をdirフォルダはromfsイメージに作成され、システム'/mnt'にマウントされます.」genromfsコマンドの使用方法は、「genromfs-h」で表示できます.romfs_dirが存在するディレクトリの下でコマンドを実行します.
$ genromfs –f romfs.img –d romfs_dir –v –V “romfstest”

上のgenromfsコマンドツールはフォルダromfs_dirは入力でromfsを生成する.imgバイナリイメージファイル、イメージボリューム名「romfstest」-v」パラメータは、「genromfs」に詳細を出力させる.
生成したromfsを「mount」コマンドでシステム」/mntにマウントし、その内容が予想に合っているかどうかを確認します.
$ sudo mount romfs.img  /mnt –o loop
mount: warning: /mnt seems to be mounted read-only
$ tree /mnt
/mnt
|——dir_a
|    |——a.txt   
|——dir_b
     |——b.txt

2 directories, 2 file

2.2 romfsヘッダファイルの作成
Nuttxシステムにromfsファイルシステムを登録するには、romfsファイルシステムヘッダポインタが必要であり、ファイルシステムを実行可能ファイルにコンパイルリンクする必要がある.したがって、romfsイメージファイルをヘッダファイルに生成する必要があります.
Linuxシステムの「xxd」ツールコマンドは、標準入力または指定されたバイナリファイルをファイルまたは標準出力に出力することができる.「xxd」ツールコマンドの詳細な使用方法は、「xxd-h」コマンドまたは「manxd」コマンドで表示できます.「-i」パラメータを使用すると、「xxd」はC言語ヘッダファイル形式のファイルを出力します.
上記のセクションで生成したromfsイメージファイルは、nsh_という名前のC言語ヘッダファイルを作成します.romfsimg.h,ヘッダファイルnsh_romfsimg.hの配列名はromfs_img.コマンドは次のとおりです.
$ xxd –i romfs.img nsh_romfsimg.h

生成されたヘッダファイルの配列名は、入力されたromfsイメージファイル名によって決定され、ファイル名に含まれる場合」.区切り記号、では.に置き換えられます.
3.Nuttxシステムromfs実験
Nuttxシステムnsh_mainスレッドでnsh_を呼び出すinitialize()関数を呼び出し、nsh_を呼び出します.romfsetc()はromfsをシステムに登録し、デフォルトの場所'/etc'ディレクトリにマウントします.注意nsh_romfsetc()はCONFIG_を構成する必要がありますNSH_このオプションは、"make menuconfig"インタフェースで構成するか、直接設定することができる.configファイルで手動で構成します.また、ROMFS、すなわちCONFIG_をサポートするシステムも必要であるFS_ROMFSファイルシステムオプションを有効にする必要があります.
romfsヘッダファイルを生成する必要がありますシステムの場所に配置(デフォルトはapps/nshlibディレクトリ、CONFIG_NSH_ARCHROMFSが構成されている場合はconfig//inlcludeディレクトリ)に配置し、システムを再コンパイルします.生成したromfsヘッダファイルnsh_romfsimg.hをapps/nshlibディレクトリに配置し、ヘッダファイルnsh_romfsimg.hの配列名が「romfs_img」であることを確認し、ダウンロードシステムを再コンパイルして実行します.nsh端末で以下のことを検証します.
NuttxShell (NSH)
nsh> ls
/:
 dev/
 etc/
nsh> cd /etc
nsh> ls
/etc:
 .
 dir_a/
 dir_b/
nsh> cd dir_a
/etc/dir_a:
 .
 a.txt
nsh> cat a.txt
this is a.txt
nsh> 

4.起動スクリプトrcSの作成
前の2節でromfsファイルシステムの内容をカスタマイズできるようになったので、Nuttxシステムの起動スクリプトinitを作成します.d/rcSは手のひらを返すように簡単です.
コンロを再構築し、フォルダtopを作成します.dir、このフォルダの下にinitを作成します.dフォルダ、init.dフォルダの下にファイルrcSを作成し、ディレクトリ構造は以下の通りである.
$ tree top_dir
top_dir
|——init.d
     |——rcS

1 directory, 1 file

練習として、rcSファイルに簡単なコマンドを書き込むのは、procファイルシステムをマウントするだけです.注意:rcSファイルの「#」文字で始まる行は、shによって注釈行として解析されます.私たちのrcSファイルの内容は以下の通りです.
$ cat top_dir/init.d/rcS
# this is rcS file

mount –t procfs /proc

Procファイルシステムをマウントするには、NutxシステムがCONFIGを有効にする必要があります.FS_PROFFSファイルシステムオプション.
上記の2つのセクションの手順に従ってtop_dirディレクトリはromfsとして作成する.imgイメージファイルを生成し、nsh_を生成します.romfsimg.hのヘッダファイル、このヘッダファイルをapps/nshlibパスの下に配置し、コンパイルしてダウンロードして実行し、nsh端末は以下のように出力する.
NuttxShell (NSH)
nsh> ls
/:
 Dev/
 etc/
 proc/
nsh> cat /etc/init.d/rcS
# this is rcS file

mount –t procfs /proc

nsh> 

nsh端末の出力から、Nutxは/etc/initを実行することがわかる.d/rcSはスクリプトを起動し、procファイルシステムをシステムに正常にマウントします.最後に/etc/initも印刷する.d/rcSの内容は、すべて私たちの期待に合っています.
5.APMでromfsを生成
APMフライング制御を起動し、nsh端末から「/etc」ディレクトリを表示すると、bootloader、px 4 io、tones、initの4つのディレクトリが表示されます.d.bootloaderは、フライング制御のbootloaderを更新するために使用されます.px 4 ioは、フライング制御開始後にマスタ(stm 32 f 427)からioコントローラ(stm 32 f 103)にダウンロードされるフライング制御上のioコントローラのファームウェアである.tonesはブザーのアラーム音を制御するソースファイルです.最後のinitdフォルダの下にAPMの起動スクリプトrcSがあります.
コンパイルされたAPMのファームウェアコードがない、romfsを生成するフォルダにはtonesとinitしか含まれていない.d 2つのサブフォルダにはbootloaderとpx 4 ioはありません.この2つのフォルダはコンパイル時に生成されます.これは、px 4-io-v 2を例にmakefileファイルから見つけることができます.
px4-io-v2: $(PX4_ROOT)/Archives/px4io-v2.export
    $(v)+ $(MAKE) -C $(PX4_ROOT) -f $(PX4_ROOT)/Makefile.make px4io-v2_default EXTRADEFINES="-DARDUPILOT_BUILD"
    $(v) cp $(PX4_ROOT)/Images/px4io-v2_default.bin px4io-v2.bin
    $(v) cp $(PX4_ROOT)/Build/px4io-v2_default.build/firmware.elf px4io-v2.elf
    $(v) mkdir -p $(MK_DIR)/PX4/ROMFS/px4io/
    $(v) cp px4io-v2.bin $(MK_DIR)/PX4/ROMFS/px4io/px4io.bin
    $(v) mkdir -p $(MK_DIR)/PX4/ROMFS/bootloader/
       $(v) cp $(SKETCHBOOK)/mk/PX4/bootloader/px4fmuv2_bl.bin $(MK_DIR)/PX4/ROMFS/bootloader/fmu_bl.bin
    $(v) echo "PX4IOv2 Firmware is in px4io-v2.bin"

このMakefileで生成されるpx 4 io-v 2.BinファイルはPX 4/ROMFS/px 4 io/px 4 ioにコピーする.bin,PX 4/bootloader/px 4 fmuv 2_bl.binコピーPX 4/ROMFS/bootloader/fmu_bl.bin.
APM romfsのファイルを作成する準備ができたら、PX 4/ROMFSフォルダをromfsに作成する.imgバイナリイメージファイル.
# Generate the ROMFS image from the root
$(ROMFS_IMG): $(ROMFS_SCRATCH) $(ROMFS_DEPS) $(GLOBAL_DEPS)
    @$(ECHO) "ROMFS:   $@"
    $(Q) $(GENROMFS) -f $@ -d $(ROMFS_SCRATCH) -V "NSHInitVol"

そしてromfs.imgをromfsに変換する.oファイル
# Turn the ROMFS image into an object file
$(ROMFS_OBJ): $(ROMFS_IMG) $(GLOBAL_DEPS)
    $(call BIN_TO_OBJ,$<,$@,romfs_img)

最後にromfs.o実行可能ファイルにリンクするファームウェアfirmwareを生成する.px4.
6.起動スクリプトrcS構文の説明
rcS起動スクリプトは実質的にNutxで実装されるlinuxのshellスクリプトに似たスクリプトファイルであり、Nutxのshはこのスクリプトの構文と実行コマンドを説明することができる.このセクションでは、Nutxでサポートされているコマンドと基本構文について簡単に説明します.
6.1基本命令
Nutxのスクリプトでは、コマンドを実行したり、パラメータを付けたりできます.スクリプトがサポートするコマンドはshがサポートするコマンドで、nsh端末でhelpコマンドを入力してshがサポートするコマンドを表示できます.
nsh> help
help usage: help [-v] []
[               dirname     help            mh      set     unset
?               dd          hexdump     mount   sh      usleep
basename    df          kill            mv      sleep   xd
break       echo            ls          mw      test
cat         exec            mb          ps      time
cd          exit            mkdir       pwd     true
cp          false           mkfatfs     rm      uname
cmp         free            mkrd        rmdir   umount

コマンド「help-v」は、すべてのコマンドの詳細な使用フォーマットを表示し、単一のコマンドの詳細な使用フォーマットを表示し、コマンド「help–v[]」を使用します.たとえば、コマンド「ls」の詳細な使用フォーマットは「help–vls」です.
6.2文法
6.2.1 if…else…
if...else...条件文のフォーマットは次のとおりです.
if  
then
        [sequence of ]
else
        [sequence of ]
fi

の結果がtrueの場合、thenブランチが実行され、そうでない場合、elseブランチが実行されます.
6.2.2 whileサイクル
whileループフォーマットは次のとおりです.
while  
do
        [sequence of ]
done

条件がtrueに戻ると、do...done間の文がループします.
6.2.3 untilサイクル
untilループフォーマットは次のとおりです.
until  
do
        [sequence of ]
done

条件が真でない場合、do...done間の文をループします.これはwhileサイクルとは正反対です.