Changes between Version 7 and Version 8 of armv6_m_gcc


Ignore:
Timestamp:
Mar 17, 2020, 5:32:32 PM (4 years ago)
Author:
nmir-saito
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • armv6_m_gcc

    v7 v8  
    11= TOPPERS/SSP Kernel for ARMv6-M (separate package) =
    22
    3 ARMv6-Mプロセッサ向けTOPPERS/SSPカーネルの個別パッケージです.[[BR]]
    4 ターゲットボードとして [https://www.nxp.com/design/microcontrollers-developer-resources/lpc-microcontroller-utilities/lpc812-lpcxpresso-board:OM13053 LPC812-LPCXpresso Board] で動作確認しています.
    5 
    6 = 必要なもの =
    7 
    8 動作を確認するには,以下のものを用意してください.
    9 
    10 * [http://www.toppers.jp/ssp-kernel.html#d-download TOPPERS/SSPカーネル 1.3.0]
    11  * TOPPERS/SSPカーネルの非依存部個別パッケージです.
    12 * このプログラム(ARMv6-Mプロセッサ向け個別パッケージ)
    13  * subversion が使用できる場合,以下のコマンドで最新版を入手できます.
    14 {{{
    15 $ svn co http://dev.toppers.jp/svn_user/contrib/ssp_armv6_m_gcc/trunk
    16 }}}
    17  * または,ブラウザで [https://dev.toppers.jp/trac_user/contrib/browser/ssp_armv6_m_gcc/trunk ソースのブラウズ画面]を開き,画面下部にある"Download in other formats: Zip Archive" のリンクをクリックします.そうすると ZIPアーカイブしたソースコードをダウンロードすることが出来ます.
    18  * 入手したファイルの armv6_m_gcc および lpcxpresso_lpc812_gcc を,先に取得したSSPカーネルの arch および target ディレクトリの下に,それぞれ配置します.
    19 * [http://www.toppers.jp/cfg-download.html コンフィギュレータ]
    20  * カーネルのコンフィギュレーションに使用します.1.8.0での動作を確認しています.
    21  * 実行ファイルを <カーネルのトップディレクトリ>/cfg/cfg に配置するか,もしくは別の場所においた場合 configure スクリプトの実行時に -g オプションで cfg の実行ファイルの位置を指定することで使用できます.
    22 * [http://www.lpcware.com/lpcxpresso/home LPCXpresso IDE]
    23  * コンパイルやデバッグに使用します.コンパイルのために GCC だけが必要であれば [https://launchpad.net/gcc-arm-embedded/] からもダウンロードすることが出来ます.動作確認には GCC 4.9.3(LPCXpresso IDE 7.7.2) を使用しました.
    24 * UART通信モジュール.
    25  * サンプルプログラムはシリアルポートを使用しますのでPCとシリアル通信するために使用します.たとえば[http://akizukidenshi.com/catalog/g/gK-01977 こちら]のようなものがあればよいでしょう.[[BR]]
     3* ARMv6-Mプロセッサ向けTOPPERS/SSPカーネルの個別パッケージです.
     4* 動作確認済みターゲットボード
     5  * [https://www.nxp.com/design/microcontrollers-developer-resources/lpc-microcontroller-utilities/lpc812-lpcxpresso-board:OM13053 LPC812-LPCXpresso Board]
     6  * [https://www.nxp.com/design/microcontrollers-developer-resources/lpc-microcontroller-utilities/lpcxpresso812-max-board-for-lpc81x-family-mcus:OM13055 LPCXpresso812-MAX Board]
     7* 動作確認方法
     8  * [https://www.nxp.com/design/software/development-software/mcuxpresso-software-and-tools/mcuxpresso-integrated-development-environment-ide:MCUXpresso-IDE MCUXpresso IDE]を利用する方法
     9    * NXPが提供しているマイコン向けの統合開発環境です.上記のどちらのボードでも利用可能です.
     10  *  [http://openocd.org/ OpenOCD] + [https://www.gnu.org/software/gdb/ GDB] を利用する方法
     11    * LPCXpresso812-MAX ボードはCMSIS-DAPをサポートしたデバッグインタフェース回路を搭載しており,OpenOCDとGDBを利用してリモートデバッグできます.
     12
     13= ソースコードのセットアップ
     14== あらかじめ必要なもの
     15* [https://www.docker.com/ Docker] : 「コンテナ」と呼ばれる仮想環境を動かすために使います.仮想環境にLinuxプログラムの実行環境を構築します.[http://releases.ubuntu.com/xenial/ Ubuntu xenial] ベースのLinuxシステムをお使いの場合は手順2.で使用するスクリプトを直接実行することもできます.
     16* [https://git-scm.com/ Git] : バージョン管理システム.ここではDockerのスクリプトを取得するのに使います.コンテナ内でもGitを使用してソースコードを取得するのに利用しています.
     17* コマンドライン環境:コマンドの実行にbashシェルを使います.Mac ならターミナルアプリ,Windowsなら [https://docs.microsoft.com/en-us/windows/wsl/about Windows Subsystems for Linux]  などでも利用可能です.
     18
     19以下ではMacOSのターミナルアプリで作業する際の様子を示します.他のホストOSで使用する場合もほぼ同様と思います.行頭の '$' はプロンプトを示します.
     20
     21=== 1. Dockerコンテナの構築およびシェルの起動
     22==== 1-1 Dockerスクリプトの取得
     23カレントディレクトリに docker-toppers というディレクトリが作成されます.
     24{{{
     25$ git clone https://github.com/nmiri-nagoya-nsaito/docker-toppers.git
     26}}}
     27==== 1-2 スクリプトのディレクトリへ移動し,コンテナのシェルを起動(詳細はスクリプト参照)
     28{{{
     29$ cd docker-toppers
     30$ ./start_shell.sh
     31specified service: cli
     32Building cli
     33Step 1/19 : FROM ubuntu:xenial
     34xenial: Pulling from library/ubuntu
     35fe703b657a32: Pull complete
     36(略)
     37Step 19/19 : ENTRYPOINT ["sh", "-c", "./scripts/common/entrypoint.sh"]
     38 ---> Running in 47ee7ac43559
     39Removing intermediate container 47ee7ac43559
     40 ---> 18d4bf66fc44
     41Successfully built 18d4bf66fc44
     42Successfully tagged docker-toppers_cli:latest
     43Creating network "docker-toppers_default" with the default driver
     44Creating docker-toppers_cli_1 ... done
     45saito@06f7b820ab63:~$ ls
     46}}}
     47
     48この時点で Linux コンテナ内のシェルが起動しており,以降の作業はこのシェルで行います.次はカーネルのソースコードをセットアップおよびビルドします.
     49
     50=== 2. ソースコードのセットアップおよびビルド
     51==== 2-1 作業ディレクトリへ移動
     52{{{
     53saito@06f7b820ab63:~$ cd workdir
     54}}}
     55==== 2-2 本パッケージをダウンロード
     56ssp_armv6m というディレクトリにファイルがダウンロードされます.
     57{{{
     58saito@06f7b820ab63:~/workdir$ svn co http://dev.toppers.jp/svn_user/contrib/ssp_armv6_m_gcc/trunk ssp_armv6m
     59A    ssp_armv6m/install.sh
     60A    ssp_armv6m/armv6_m_gcc
     61A    ssp_armv6m/armv6_m_gcc/arm_m.h
     62(以下略)
     63}}}
     64==== 2-3 カーネルコードのセットアップ及びビルド
     65注意
     66* このスクリプトは$HOME/workdirが存在することを仮定
     67* dockerを使わずにスクリプトを実行する場合は,カレントディレクトリに toppers_workdirというディレクトリが作成され,作業が継続される
     68
     69{{{
     70saito@06f7b820ab63:~/workdir$ ssp_armv6m/build_ssp.sh
     71ヒット:1 http://archive.ubuntu.com/ubuntu xenial InRelease
     72取得:2 http://archive.ubuntu.com/ubuntu xenial-updates InRelease [109 kB]                                               
     73ヒット:3 http://security.ubuntu.com/ubuntu xenial-security InRelease
     74(略)
     75patching file target/cq_frk_fm3_gcc/Makefile.target
     76Generating Makefile from ../sample/Makefile.
     77ruby ../cfg/cfg.rb --pass 1 --kernel ssp -I. -I../include -I../arch  -I../target/lpcxpresso_lpc812_gcc -I../arch/armv6_m_gcc -I.. -I../sample -I./gen -I../tecs_kernel --api-table ../kernel/kernel_api.def --symval-table ../kernel/kernel_sym.def --symval-table ../syssvc/syssvc_sym.def  --symval-table ../target/lpcxpresso_lpc812_gcc/target_sym.def --symval-table ../arch/armv6_m_gcc/prc_sym.def \
     78                                        -M deps/cfg1_out_c.d ../target/lpcxpresso_lpc812_gcc/target_kernel.cfg ../sample/sample1.cfg
     79[cfg.rb] Generated cfg1_out.c
     80arm-none-eabi-gcc -c -MD -MP -MF deps/cfg1_out.d -O2 -Wall -g   -mcpu=cortex-m0 -mthumb -DTOPPERS_OMIT_TECS  -D__NEWLIB__ -DTOPPERS_LABEL_ASM  -I. -I../include -I../arch  -I../target/lpcxpresso_lpc812_gcc -I../arch/armv6_m_gcc -I.. -I../sample -I./gen -I../tecs_kernel -DTOPPERS_CB_TYPE_ONLY  -DALLFUNC  -fno-strict-aliasing -I../kernel -I ../extension  cfg1_out.c
     81arm-none-eabi-gcc -c -O2 -Wall -g   -mcpu=cortex-m0 -mthumb -DTOPPERS_OMIT_TECS  -D__NEWLIB__ -DTOPPERS_LABEL_ASM  -I. -I../include -I../arch  -I../target/lpcxpresso_lpc812_gcc -I../arch/armv6_m_gcc -I.. -I../sample -I./gen -I../tecs_kernel -DALLFUNC  -fno-strict-aliasing -I../kernel -I ../extension ../arch/armv6_m_gcc/start.S
     82(略)
     83arm-none-eabi-ranlib libkernel.a
     84arm-none-eabi-gcc -O2 -Wall -g   -mcpu=cortex-m0 -mthumb -DTOPPERS_OMIT_TECS  -D__NEWLIB__ -DTOPPERS_LABEL_ASM  -I. -I../include -I../arch  -I../target/lpcxpresso_lpc812_gcc -I../arch/armv6_m_gcc -I.. -I../sample -I./gen -I../tecs_kernel -nostdlib -nostdlib  --entry=_start  -T ../target/lpcxpresso_lpc812_gcc/lpcxpresso_lpc812.ld  -L. -o ssp \
     85                  sample1.o log_output.o vasyslog.o        banner.o serial.o syslog.o logtask.o  kernel_cfg.o  \
     86                -lkernel -lc  -lgcc 
     87arm-none-eabi-nm -n ssp > ssp.syms
     88arm-none-eabi-objcopy -O srec -S ssp ssp.srec
     89ruby ../cfg/cfg.rb --pass 3 --kernel ssp -O -I. -I../include -I../arch  -I../target/lpcxpresso_lpc812_gcc -I../arch/armv6_m_gcc -I.. -I../sample -I./gen -I../tecs_kernel -T ../target/lpcxpresso_lpc812_gcc/target_check.trb \
     90                        --rom-symbol ssp.syms --rom-image ssp.srec
     91configuration check passed
     92}}}
     93
     94以上まで終了すると <カレントディレクトリ>/ssp/build/ に実行プログラムファイル(ssp)が生成されます.
     95
     96= 実行確認
     97== 必要なもの
     98サンプルプログラムはシリアルポートを使用しますので,あらかじめ以下のものが必要です.
     99* UART通信モジュール
     100  * PCとシリアル通信するために使用します.たとえば[http://akizukidenshi.com/catalog/g/gK-01977 こちら]のようなものがあればよいでしょう
     101  * マイコンボード(LPC812)とUART通信モジュールとの結線:
     102    * LPC812ボードの GND, P0_0(RX), P0_4(TX) を使用
     103    * ブレッドボードを使用すると簡単に結線して試すことが出来ます.
     104  * '''ボードの入出力ピンの電圧は 3.3v''' であるため,UARTモジュール側の電圧もそれにあわせること
    26105* 端末エミュレータソフト.
    27  * シリアル通信結果を確認するために使用します.たとえば[http://osdn.jp/projects/ttssh2/ Tera Term]のようなものがあればよいと思います.
    28 
    29 = 手順 =
    30 
    31 * Makefile およびサンプルプログラムのセットアップをします.ビルドするディレクトリの場所はこの例の通りでなくても基本的には構いません.
    32 {{{
    33 $ cd <カーネルトップディレクトリ>
    34 $ mkdir build; cd build
    35 $ ../configure -T lpcxpresso_lpc812_gcc
    36 }}}
    37 
    38 * 次にビルドして実行プログラムを作成します.
    39  * コンパイル方法は他のTOPPERSカーネルと同様です.LPCXpresso IDE でビルドするか,もしくはコマンドラインで以下のように実行します.
    40 {{{
    41 $ make depend
    42 $ make
    43 }}}
    44 
    45 * プログラムのダウンロードまたはデバッグには LPCXpresso IDE を使用しました.使用方法についてはツール説明文書を参照してください.
    46  * この IDE は,メニュー「File --> Import」で開かれる Import ダイアログから 「Existing Code as Makefile Project」で Makefile を直接インポートすることが可能です.
    47 
    48 * マイコンボード(LPC812)とUART通信モジュールとは以下の条件で接続しました.
    49  * LPC812ボードの GND, P0_0(RX), P0_4(TX) を使用.ブレッドボードを使用すると簡単に結線して試すことが出来ます.
    50  * UART ピンの電圧は 3.3vで,シリアルUSBモジュールの端子電圧もそれにあわせること.
    51  * 通信条件 19200bps, 8bit, 1stop, parity-none, no-flow
     106  * シリアル通信結果を確認するために使用します.Windowsの場合,たとえば [http://osdn.jp/projects/ttssh2/ Tera Term] のようなものがあればよいと思います.
     107  * 通信条件 19200bps, 8bit, 1stop, parity-none, no-flow
     108
     109ターゲットボードへのプログラム転送および実行の方法として,MCUXpresso IDEを使う方法と,OpenOCD+GDBを使う方法があります.
     110
     111== [https://www.nxp.com/design/software/development-software/mcuxpresso-software-and-tools/mcuxpresso-integrated-development-environment-ide:MCUXpresso-IDE MCUXpresso IDE] を用いた動作確認
     112
     113ホスト上で MCUXpresso IDE を使用してビルド,デバッグします.docker-composeの設定により,コンテナのworkdir ディレクトリは共有されていてホストマシンから参照できますので,その中の ssp ディレクトリをIDEからインポートします.
     114
     115=== 必要なもの
     116* [https://www.nxp.com/design/software/development-software/mcuxpresso-software-and-tools/mcuxpresso-integrated-development-environment-ide:MCUXpresso-IDE MCUXpresso IDE]
     117 * コンパイルやデバッグに使用します.ダウンロードにはユーザ登録が必要です.またダウンロードの際はホストマシン上で動作するものを選びます.動作確認にはMCUXpresso IDE v11.1.1 を使用しました.
     118
     119=== プロジェクトのインポート
     120
     121* メニュー「File --> Import」でダイアログを開く.
     122* ダイアログで「Makefile Project with Existing Code」を選び,Nextを押す.
     123* 「Import Existing Code」ダイアログで設定を入力し,Finish を押す.するとプロジェクトが生成される.
     124  * Project Name :適当な名称をつける
     125  * Existing Code Location:「Browse」ボタンを押し,ssp ディレクトリを選択してOpen を押す.
     126  * Toolchain for Indexer Settings:NXP MCU Tools を選ぶ
     127* Project Explorer で作成したプロジェクトを選択し,メニュー「Project --> Properties」を選ぶ.するとプロジェクトのプロパティ設定ダイアログが開く.
     128* プロジェクト設定のダイアログで以下の設定をし,「Apply and Close」 ボタンを押す.
     129  * C/C++ Build
     130    * Build location の Build directory:「${workspace_loc:/ssp}/build」
     131  * C/C++ Build --> Environment に環境変数を追加
     132    * 変数名:「RUBYOPT」,値:「-EUTF-8」
     133  * C/C++ Build --> MCU Setteings
     134    * SDK MCUs から LPC812 を選択
     135
     136=== ビルド
     137* メニュー「Project --> Build Project」を選び,ビルドする.
     138
     139=== デバッグ設定
     140* メニュー「Run --> Debug Configurations」を選ぶ.ダイアログが表示される.
     141* ダイアログで,設定を行い,「Apply」で設定反映 および「Debug」を押してデバッグを開始する.
     142  * C/C++(NXP Semiconductors) MCU Application --> <デバッグ設定名>
     143    * 「Main」タブの「C/C++ Application」に実行ファイルを指定する
     144      * 「Search Project」ボタンを押し,一覧から「ssp」を選んでOKを押す.
     145    * 「GDB Debugger」タブの「GDB Debugger」が「arm-none-eabi-gdb」であることを確認
     146* デバッグ開始すると,デバッグ用プローブの選択ダイアログが表示される.「LPC11U3x CMSIS-DAP」を選択して「OK」を押す.
     147* プログラムの実行が開始される.
     148
     149ステップ実行やブレークポイントの設定,MTB(Micro Trace Buffer) など使用方法の詳細についてはツールの説明文書を参照してください.
     150
     151==  [http://openocd.org/ OpenOCD] + [https://www.gnu.org/software/gdb/ GDB] を用いた動作確認
     152
     153ホスト上でOpenOCDを起動し,それをGDBサーバとしてコンテナ内のGDBからリモート接続する方法です.
     154
     155=== 必要なもの
     156* [http://openocd.org/ OpenOCD]
     157  * ホストマシン上で動作し,ターゲットボードと接続して状態の確認やフラッシュメモリへの書き込みに使います.[https://www.gnu.org/software/gdb/ GDB] を利用したリモートデバッグではGDBサーバとしても機能します.
     158  * Linux(Ubuntu)の場合は APT, MacOS の場合は [https://brew.sh/index_ja HomeBrew]などのパッケージマネージャでインストールできます.
     159* ターゲット向けGDB(arm-none-eabi-gdb)
     160  * コンテナ内で動作し,ビルドした実行ファイルをOpenOCD経由でターゲットに転送および実行確認するのに使います.
     161
     162コンテナ環境でのソースのビルドは先の「2-3 カーネルコードのセットアップ及びビルド」の手順で完了しているので,ここではGDBでターゲットに転送する手順を示します.
     163
     164=== OpenOCDの起動
     165
     166カレントディレクトリが workdir ディレクトリであるとします.
     167{{{
     168$ openocd -f ssp/target/lpclpcxpresso_lpc812_gcc/openocd_lpc812max.cfg
     169Open On-Chip Debugger 0.10.0
     170Licensed under GNU GPL v2
     171For bug reports, read
     172        http://openocd.org/doc/doxygen/bugs.html
     173Info : auto-selecting first available session transport "swd". To override use 'transport select <transport>'.
     174adapter speed: 10 kHz
     175adapter_nsrst_delay: 200
     176cortex_m reset_config sysresetreq
     177Info : CMSIS-DAP: SWD  Supported
     178Info : CMSIS-DAP: Interface Initialised (SWD)
     179Info : CMSIS-DAP: FW Version = 1.10
     180Info : SWCLK/TCK = 1 SWDIO/TMS = 0 TDI = 0 TDO = 0 nTRST = 0 nRESET = 1
     181Info : CMSIS-DAP: Interface ready
     182Info : clock speed 10 kHz
     183Info : SWD DPIDR 0x0bc11477
     184Info : lpc8xx.cpu: hardware has 4 breakpoints, 2 watchpoints
     185}}}
     186
     187OpenOCD はこの状態でポート3333番で接続を待ち続けるため,コンテナからGDBで接続します.
     188終了する時は Ctrl-C を押します.
     189
     190=== ターゲット向けGDBの起動
     191
     192ssp/build に移動し,gdb を起動します.
     193{{{
     194saito@06f7b820ab63:~/workdir/ssp/build$ arm-none-eabi-gdb ssp
     195GNU gdb (GNU Tools for Arm Embedded Processors 9-2019-q4-major) 8.3.0.20190709-git
     196Copyright (C) 2019 Free Software Foundation, Inc.
     197License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
     198This is free software: you are free to change and redistribute it.
     199There is NO WARRANTY, to the extent permitted by law.
     200Type "show copying" and "show warranty" for details.
     201This GDB was configured as "--host=x86_64-apple-darwin10 --target=arm-none-eabi".
     202Type "show configuration" for configuration details.
     203For bug reporting instructions, please see:
     204<http://www.gnu.org/software/gdb/bugs/>.
     205Find the GDB manual and other documentation resources online at:
     206    <http://www.gnu.org/software/gdb/documentation/>.
     207
     208For help, type "help".
     209Type "apropos word" to search for commands related to "word"...
     210Reading symbols from ssp...
     211}}}
     212
     213=== ターゲットへの接続および実行プログラムの転送
     214==== 接続
     215{{{
     216(gdb) target remote localhost:3333
     217Remote debugging using localhost:3333
     218_kernel_prc_terminate () at ../arch/armv6_m_gcc/prc_config.c:198
     219198                     ;
     220}}}
     221
     222[https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds MacOSでコンテナ内部からホストに接続する際は特別なホスト名を使用します.]
     223
     224{{{
     225(gdb) target remote host.docker.internal:3333
     226Remote debugging using host.docker.internal:3333
     227_kernel_prc_terminate () at ../arch/armv6_m_gcc/prc_config.c:198
     228198                     ;
     229}}}
     230==== 設定
     231{{{
     232(gdb) set remotetimeout 10000
     233(gdb) monitor reset
     234(gdb) monitor halt
     235target halted due to debug-request, current mode: Thread
     236xPSR: 0x01000000 pc: 0x00000170 msp: 0x10000730
     237}}}
     238==== 転送
     239{{{
     240(gdb) load
     241Loading section .text, size 0x28d4 lma 0x0
     242Loading section .rodata, size 0x928 lma 0x28d4
     243Loading section .data, size 0x8 lma 0x31fc
     244Start address 0xc0, load size 12804
     245Transfer rate: 962 bytes/sec, 4268 bytes/write.
     246}}}
     247
     248=== 実行開始
     249{{{
     250(gdb) c
     251Continuing.
     252}}}
     253
     254プログラムの実行を止める時は Ctrl-C を押します.
     255また,GDBのプロンプトで quit コマンドを実行するとGDBを終了します.
     256
     257{{{
     258^C
     259Program received signal SIGINT, Interrupt.
     260_kernel_prc_terminate () at ../arch/armv6_m_gcc/prc_config.c:198
     261198                     ;
     262(gdb) q
     263A debugging session is active.
     264
     265        Inferior 1 [Remote target] will be detached.
     266
     267Quit anyway? (y or n) y
     268Detaching from program: /Users/saito/work/toppers/docker-toppers/workdir/ssp/build/ssp, Remote target
     269Ending remote debugging.
     270}}}
     271
     272== コンテナの終了および再開
     273
     274コンテナのシェルを抜ける場合は exit を実行します.
     275再度シェルを起動する場合は ./start_sherll.sh を実行します.
     276
     277{{{
     278saito@06f7b820ab63:~/workdir/ssp/build$ exit
     279ログアウト
     280$
     281}}}
     282
     283== 注意事項
     284* SSP-1.3.0 のパッケージに含まれるファイルの文字コードは EUC-JP でしたが,Ruby版コンフィギュレータを使用するために UTF-8 に変換しています.したがってファイルを追加,編集する場合は UTF-8 を使用してください.
     285* Windows版のgitで core.autocrlf が true に設定されている場合,シェルスクリプトの実行に失敗することがあるようです.その場合は `git config` コマンドで `core.autocrlf` を `false` に設定してみてください.