QtChartsをCMakeでビルドする方法
CMakeLists.txtに以下のように書く。
cmake_minimum_required(VERSION 2.8) project(Main) set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) find_package(Qt5 COMPONENTS Widgets Charts REQUIRED) add_executable(Main main.cpp) target_link_libraries(Main Qt5::Widgets) target_link_libraries(Main Qt5::Charts)
OpenBLASをビルド(Archlinux)
OpenBLASをビルドするのに手間取ったのでメモ書き
git clone https://github.com/xianyi/OpenBLAS cd OpenBLAS make USE_OPENMP=1 CC=gcc FC=gfortran make PREFIX=/usr install #これで/usr/lib/pkgconfigの中にopenblas.pcが作成される #export PKG_CONFIG_PATH=/usr/lib/pkgconfigはなくても良かった pkg-config -debug openblas
References
archlinuxでWPA2 Enterpriseがブツブツ切れる件
mbedのEclipse開発環境
プロジェクトの作成
まずmbed cliでプロジェクトを作成する。
$ mbed new TEST_PROJECT
main.cpp
ファイルを作成し、
一度mbed cliでコンパイルする。(おそらくこれをする必要はない)
$ cd /path/to/TEST_PROJECT
$ mbed target NUCLEO_F303RE
$ mbed toolchain GCC_ARM
$ mbed compile
コンパイルできることを確かめられたら、
$ mbed export -i eclipse_gcc_arm -m NUCLEO_F303RE
としてEclipse用のプロジェクトを作成する。
その後、Eclipseを起動して、
「File
-> import
-> C/C++
-> Existing Code as Makefile Project
」から作成した
プロジェクトを開きToolchain for Index Settings
は<none>
を選択して開く。
「Project
-> Build Project
」でコンパイルすることができる。
これでmbedをEclipseで開発することができる。
ファイルの分け方
C++
のクラス等を別のファイルに分けた場合、
Makefile
を編集する必要がある。
(エラーでundefinde referenc to
と出る。)
例えばTestClass.h
とTestClass.cpp
とファイルを分けた場合、
Makefile
に
OBJECTS += ./TestClass.o
を追加する必要がある。
小技
Eclipseでの開発環境でオンラインで公開されているライブラリを つかいた場合は、プロジェクトのディレクトリで
$ mbed add http://....
としてライブラリを追加したあとMakefile
を編集する必要がある。
どのようにMakefile
を編集すればわからない場合は
一度mbed cliで別のプロジェクトを作成しライブラリを追加した上でEclipse用に
export
し、この時作成されたMakefile
と見比べれば編集する箇所がわかる。
注意事項
一部ピンの名前がmbed公式ページと違うことがある。(offline環境に限らず) 困ったときは、Peripheral.cの中身をみて確認したほうが良い。
mbed cliの使い方
プロジェクトの作り方
まず、mbed のオフライン環境でプロジェクトを作る。
$ mbed new F446_test
書き込みたいマイコンをつなぎmbed detect
とすると検出される。
$ mbed detect [mbed] Working path "/path/to/F446_test" (program) [mbed] Detected NUCLEO_F446RE, port /dev/ttyACM0, mounted /path/to/NODE_F446RE, interface version 0221: [mbed] Supported toolchains for NUCLEO_F446RE | Target | mbed OS 2 | mbed OS 5 | uARM | IAR | ARM | GCC_ARM | ARMC5 | |---------------|-----------|-----------|-----------|-----------|-----------|-----------|-------| | NUCLEO_F446RE | Supported | Supported | Supported | Supported | Supported | Supported | - | Supported targets: 1 Supported toolchains: 4
その後書き込みたいtarget
とtoolchain
を設定する。
$ cd /path/to/F446_test
$ mbed target NUCLEO_F446RE
$ mbed toolchain GCC_ARM
main.cpp
を作成してコンパイルする。
/*main.cpp*/ #include "mbed.h" Serial pc(USBTX, USBRX); int i =0; int main(){ while(1){ pc.printf("i=%d\n\r", i); i++; wait(1); } }
$ mbed compile
その後書き込む。
$ lsusb Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 004: ID 8087:0a2b Intel Corp. Bus 001 Device 003: ID 5986:054c Acer, Inc Bus 001 Device 008: ID 0411:0110 BUFFALO INC. (formerly MelCo., Inc.) Bus 001 Device 006: ID 0483:374b STMicroelectronics ST-LINK/V2.1 Bus 001 Device 002: ID 056e:0107 Elecom Co., Ltd Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub $ df ファイルシス 1K-ブロック 使用 使用可 使用% マウント位置 dev 4026244 0 4026244 0% /dev run 4034656 1372 4033284 1% /run /dev/sda3 116064204 71743696 44320508 62% / tmpfs 4034656 36180 3998476 1% /dev/shm tmpfs 4034656 0 4034656 0% /sys/fs/cgroup tmpfs 4034656 4 4034652 1% /tmp /dev/sda1 523248 65376 457872 13% /boot tmpfs 806928 40 806888 1% /run/user/1000 /dev/sdc1 3979456 914368 3065088 23% /run/media/name/5480-6D35 /dev/sdb 540 8 532 2% /run/media/name/NODE_F446RE $ cp BUILD/NUCLEO_F446RE/GCC_ARM/F446_test.bin /run/media/name/NODE_F446RE/
デバッグ方法
再度コンパイルし、かきこむ
$ mbed compile --profile debug
$ cp BUILD/NUCLEO_F446RE/GCC_ARM-DEBUG/F446_test.bin /run/media/name/NODE_F446RE/
gdb-serverをたてる
$ sudo pyocd-gdbserver
$ arm-none-eabi-gdb BUILD/NUCLEO_F446RE/GCC_ARM-DEBUG/F446_test.elf GNU gdb (GDB) 8.2.1 Copyright (C) 2018 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "--host=x86_64-pc-linux-gnu --target=arm-none-eabi". Type "show configuration" for configuration details. For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help, type "help". Type "apropos word" to search for commands related to "word"... Reading symbols from BUILD/NUCLEO_F446RE/GCC_ARM-DEBUG/F446_test.elf...done. (gdb) target remote :3333 Remote debugging using :3333 warning: while parsing target memory map (at line 3): Required element <memory> is missing hal_sleep () at ./mbed-os/targets/TARGET_STM/sleep.c:142 142 core_util_critical_section_exit(); (gdb) load Loading section .text, size 0x13988 lma 0x8000000 Loading section .ARM.exidx, size 0x8 lma 0x8013988 Loading section .data, size 0xb78 lma 0x8013990 Start address 0x80074d0, load size 83208 Transfer rate: 8 KB/sec, 1891 bytes/write. (gdb) p i $1 = 327 (gdb)
EDK2の始め方
内容
- EDK2のHelloサンプルを動かす。
- EDK2でエコープログラムを作成。
開発環境
- Ubuntu18.04 (Archlinuxでも動いた)
- edk2
開発環境構築
edk2をダウンロードする。
git clone https://github.com/tianocore/edk2.git cd ~/edk2 source edksetup.sh
サンプルを動かす
Helloを表示するサンプルがあるのでまずそれを動かす。
~/edk2/Conf/target.txt
の中身のACTIVE_PLATFORM
、TARGET_ARCH
、TOOL_CHAIN_TAG
を以下のように変更する。
#target.txt ACTIVE_PLATFORM = AppPkg/AppPkg.dsc TARGET_ARCH = X64 TOOL_CHAIN_TAG = GCC5
変更したらコンパイルする。
cd ~/edk2
build
初めての場合、エラーが出ると思うが、エラーメッセージに従ってmakeしたあと再度コンパイルすれば通った。うまく行けば、~/edk2/Build/AppPkg/DEBUG_GCC5/X64
の中にHello.efi
ができる。
次に、qemuでUEFIを動作させるためのOVMFをビルドする。
~/edk2/Conf/target.txt
のACTIVE_PLATFORM
をOvmfPkg/OvmfPkgX64.dsc
に変更してbuild
コマンドを実行する。
この時にエラーが出たので以下の2つを実行し、再度ビルドした。
cd ~/edk2 git submodule update --init --recursive sudo apt install acpica-tools
無事ビルドに成功したらqemuで実行する。
mkdir -p ~/run-ovmf/hda-contents cd ~/run-ovmf cp ~/edk2/Build/OvmfX64/DEBUG_GCC5/FV/OVMF.fd . cp ~/edk2/Build/AppPkg/DEBUG_GCC5/X64/Hello.efi ./hda-contents/Hello.efi qemu-system-x86_64 --bios OVMF.fd -hda fat:rw:./hda-contents -net none
実行後画像のようにするとefiファイルを実行できる。
また、実行したいefiファイルをhda-contents/EFI/BOOT/BOOTX64.EFI
とすればqemuを立ち上げたときに実行される。
エコープログラム
次に実際にエコーさせるプログラムを書く。 UEFIプログラムはフルスクラッチで作る!UEFI ベアメタルプログラミング を参考にし、それをEDK2で動くようにした。
~/edk2/AppPkg/Applications/Echo
を作り、そこにEcho.c
とEcho.inf
を書く。
mkdir ~/edk2/AppPkg/Applications/Echo cd ~/edk2/AppPkg/Applications/Echo
FILE_GUID
の値はuuidgen
コマンドの結果をコピペする。
#Echo.inf [Defines] INF_VERSION = 0x00010006 BASE_NAME = Echo FILE_GUID = 9fa4079c-3c1c-44fd-b776-ff16fee37396 MODULE_TYPE = UEFI_APPLICATION VERSION_STRING = 0.1 ENTRY_POINT = UefiMain [Sources] Echo.c [Packages] MdePkg/MdePkg.dec [LibraryClasses] UefiLib UefiApplicationEntryPoint
#Echo.c #include <Uefi.h> #include <Library/UefiLib.h> EFI_STATUS EFIAPI UefiMain(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable){ SystemTable->ConOut->OutputString(SystemTable->ConOut,L"Hello EFI\n\r"); EFI_INPUT_KEY key; CHAR16 str[3]; UINTN waitIndex; while(1){ SystemTable->BootServices->WaitForEvent(1,&(SystemTable->ConIn->WaitForKey),&waitIndex);//入力があるまで待機 SystemTable->ConIn->ReadKeyStroke(SystemTable->ConIn,&key); if(key.UnicodeChar != '\r'){ str[0] = key.UnicodeChar; str[1] = L'\0'; }else{ str[0] = L'\n'; str[1] = L'\r'; str[2] = L'\0'; } SystemTable->ConOut->OutputString(SystemTable->ConOut,str); } return 0; }
次に~/edk2/AppPkg/AppPkg.dsc
の[Components]
のところに
AppPkg/Applications/Echo/Echo.inf
を追加する。
#AppPkg.dsc #### Sample Applications. AppPkg/Applications/Hello/Hello.inf # No LibC includes or functions. AppPkg/Applications/Main/Main.inf # Simple invocation. No other LibC functions. AppPkg/Applications/Enquire/Enquire.inf # AppPkg/Applications/ArithChk/ArithChk.inf # AppPkg/Applications/Echo/Echo.inf #追加
その後~/edk2/Conf/target.txt
のACTIVE_PLATFORM
をAppPkg/AppPkg.dsc
に変更しbuild
コマンドを実行する。
その後、以下のようにしてqemuで実行する。
cd ~/edk2 cp Build/AppPkg/DEBUG_GCC5/X64/Echo.efi ~/run-ovmf/hda-contents/ cd ~/run-ovmf qemu-system-x86_64 --bios OVMF.fd -hda fat:rw:hda-contents/ -net none