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がブツブツ切れる件

archlinuxでWPA2 EnterpriseのWiFiにつなげるとき、 接続はできるがサイト等に接続すると、ブツブツ切れる現象が発生した。

対策1

ppppptpclientをインストールする。

対策2

DNSサーバを変更する。 resolveconf.confname_servers=8.8.8.8を追加。 resolve.confに書き、NetworkManagerdns=noneと書いても上書きされたため。

References

ArchWiki 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.hTestClass.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

その後書き込みたいtargettoolchainを設定する。

$ 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の始め方

内容

  1. EDK2のHelloサンプルを動かす。
  2. 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_PLATFORMTARGET_ARCHTOOL_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ができる。

次に、qemuUEFIを動作させるためのOVMFをビルドする。 ~/edk2/Conf/target.txtACTIVE_PLATFORMOvmfPkg/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

f:id:DeadBlue:20190311231408p:plain
qemu

実行後画像のようにするとefiファイルを実行できる。

また、実行したいefiファイルをhda-contents/EFI/BOOT/BOOTX64.EFIとすればqemuを立ち上げたときに実行される。

エコープログラム

次に実際にエコーさせるプログラムを書く。 UEFIプログラムはフルスクラッチで作る!UEFI ベアメタルプログラミング を参考にし、それをEDK2で動くようにした。

~/edk2/AppPkg/Applications/Echoを作り、そこにEcho.cEcho.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.txtACTIVE_PLATFORMAppPkg/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

References