Help us understand the problem. What is going on with this article?

組込み開発 cheat sheet

Linuxコマンド

検索

ファイル検索

find / -name "*.h"  2>/dev/null
find / -name "*.h"  2>/dev/null -ls

拡張子を指定して再帰的にgrep

find /usr -name "*.h" -or -name "*.hpp" | xargs grep -n -2 "jpeg_destroy_decompress"

行数表示してcat

cat -n XXX

最近更新されたファイル

find . -mmin -1 -ls
find . -type d -mmin -1 -ls
find . -type f -mmin -1 -ls

ファイルのアップロード/ダウンロード

同期

rsync -auv dirOnHost  pi@192.168.1.88:/home/pi/mirror/

ホスト⇒ターゲットへコピー (don't forget dot(.))

scp fileOnHost.txt pi@192.168.1.88:.
scp -r dirOnHost pi@192.168.1.88:.

ターゲット⇒ホストへコピー (don't forget dot(.))

scp pi@192.168.1.88:~/fileOnTarget.txt .
scp -r pi@192.168.1.88:~/dirOnTarget .

sftp

sftp pi@192.168.1.88
> put fileOnHost.txt
> get fileOnHost.txt

その他

# 受付中ポート確認
netstat -nlt

# 簡易webサーバ
python -m http.server

# 頻繁にRSA keyが変わるターゲットへのssh
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null root@192.168.1.87

ライブラリのパス追加

カレントディレクトリや実行ファイルと同じ場所にあるsoファイルをロードしたいとき。

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./:

画面の出力先を変える

SSHからログインして操作しているが、画面はデバイスに接続されたHDMIに出力したいとき

export DISPLAY=:0

ARM用クロスコンパイラ

  • Linux, armel(浮動小数点演算ハードウェア非搭載), 用gcc
    • sudo apt-get install gcc-arm-linux-gnueabi
    • sudo apt-get install g++-arm-linux-gnueabi
  • Linux, armhf(浮動小数点演算ハードウェア搭載), 用gcc
    • sudo apt-get install gcc-arm-linux-gnueabihf
    • sudo apt-get install g++-arm-linux-gnueabihf
  • ベアメタル用gcc
    • sudo apt-get install gcc-arm-none-eabi

コンパイラ名はarm-linux-gnueabi-gccとかになる
(arm-linux-gnueabi-g++というものは存在しないのかな?)

Linuxコマンド (Target)

ターゲット上でよく使うコマンド。メモリ使用量とか

ps aux | grep XX
kill -9 464

cat /proc/cpuinfo
cat /proc/interrupts
cat /proc/meminfo
cat /proc/464/maps  # プロセスのアドレスマップ
cat /proc/464/status    # プロセスのステータス
cat /proc/464/stack # 今現在のスタック情報
cat /proc/464/status | grep Vm      # スタックなどのメモリ使用量

strace ./a.out

dmesg

C/C++

環境を調べる

includeパスを調べる

実際にどこのヘッダが使われているかの調査

gcc main.cpp -v

makeで実行されている内容の詳細を表示する

make V=1

使用されているコンパイラ等の場所を取得

makefile等をたどっていけば分かるけど、面倒な時

調査中。コード中のマクロやpragmaで何かないかと思ったけど、環境変数を見るくらいしかなさそう。

ビルドオプションは、make VERBOSE=1でみられる
gccでインクルードパスを見るには、g++ main.cpp -H

バイナリ解析

クロスコンパイルの時は、コンパイラ(arm-linux-gnueabihf-gcc)と同じプリフィックスを持ったツールを使うこと。

逆アセンブル

objdump -S a.out
objdump -S module.o

セクション情報

readelf -S a.out
objdump -h a.out

コードサイズ取得

size a.out

シンボル表示

nm main.o

使用するライブラリの表示

ldd a.out

addr2line

Exceptionした時のPC(プログラムカウンタ)から、問題のコードの場所を探す

addr2line a.out 0x110a4

コーディング

Enter入力を待たずにgetcharする 1

デバッグコマンド入力や、即時エコーバックが必要な時。

Windowsなら、conio.hをインクルードして、getch()getche()_getch()
Linuxなら、curses.h

それ以外なら、バッファを無効にしてしまう。

    setvbuf(stdin, NULL, _IONBF, 0);
    while(1){
        char c = getchar();
        LOG("input = %c\n", c);
    }

Enter入力を待たずにgetcharする 2

Linuxのみ

#include <stdio.h>
#include <stdlib.h>
#include <termios.h>
#include <fcntl.h>

static int getchar_nowait()
{
    static int s_isInitialized = 0;
    if (s_isInitialized == 0) {
        struct termios settings;
        tcgetattr(fileno(stdin), &settings);
        // settings.c_lflag &= ~(ECHO | ICANON);    // no echoback & do not wait LF
        // settings.c_lflag &= ~(ECHO); // no echoback
        settings.c_lflag &= ~(ICANON);  // do not wait LF
        tcsetattr(fileno(stdin), TCSANOW, &settings);
        fcntl(fileno(stdin), F_SETFL, O_NONBLOCK);
        s_isInitialized = 1;
    }
    return getchar();
}

int main() {
    printf("\033[2J");  // clear screen
    for (int i = 0; ; i++) {
        printf("\033[0;0H");    // move to 0, 0
        printf("%09d", i);
        fflush(stdout);
        int c = getchar_nowait();
        if (c == 'c') {
            printf("\033[2J");  // clear screen
            i = 0;
        }
        if (c == 'q') break;
    }
    return 0;
}

gdb

-g3オプションをつけてコンパイルする

 コマンド

quit    # 終了
start   # b main, runと同じ
b main  # 関数の先頭にブレークポイント
b file.c:10 # ファイルの指定行にブレークポイント
b ClassA::funcA # クラスのメンバ関数の先頭にブレークポイント
run     # run
c   # 実行再開
n   # 関数飛ばし実行
s   # ステップ実行
finish  # 関数を抜けるまで実行

i b # ブレークポイント一覧表示
d XXX   # ブレークポイント削除

p var # 変数表示
p var = XXX # 変数に値を代入

i locals    # ローカル変数一覧
i args      # 引数一覧

f   # 現在の場所
where   # 現在の場所
up  # スタックフレームを上げる (呼び出し元のレベルにする)
down    # スタックフレームを下げる
l   # ソースコード表示
bt  # バックトレース表示

実行中プロセスへのアタッチ

ps aux | grep a.out
gdb -p 1012

コアダンプの解析

ulimit -c unlimited
gdb ./a.out core.dump
bt

Raspberry Pi

よく使うコマンド

sudo shutdown -h now
sudo reboot yes
crontab -e
crontab -l
crontab -r

ヘッドレスセットアップ

  • wifi設定
    • /boot/wpa_supplicant.conf に以下を追加
wpa_supplicant.conf`
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
    ssid="hoge"
    psk="fuga"
    key_mgmt=WPA-PSK
    scan_ssid=1
}
  • ssh
    • /boot/ に、ssh というファイルを作る

スワップ

sudo nano /etc/dphys-swapfile 
sudo /etc/init.d/dphys-swapfile restart

Python

virtualenv

sudo pip install virtualenv
sudo pip install virtualenvwrapper

# ↓はOpenCV用
#sudo apt-get install libatlas3-base libwebp6 libtiff5 libjasper1 libilmbase12 libopenexr22 libilmbase12 libgstreamer1.0-0 libavcodec57 libavformat57 libavutil55 libswscale4 libqtgui4 libqt4-test libqtcore4

nano ~/.bashrc 
>>> 以下を追加
export LC_ALL="en_US.UTF-8"
export LC_CTYPE="en_US.UTF-8"
### Virtualenvwrapper
if [ -f /usr/local/bin/virtualenvwrapper.sh ]; then
    export WORKON_HOME=$HOME/.virtualenvs
    source /usr/local/bin/virtualenvwrapper.sh
fi
<<<
# ターミナル再起動

mkvirtualenv --python=python3 py3_env1
deactivate
workon py3_env1

pip install --upgrade setuptools
pip install opencv-python

ハードウェア

Active High/Low Reset

ここでいうActiveとはリセットをかけるということ。回路がActiveになるということではない。そのため、

  • Active High Reset
    • High("1")にすることでリセットがかかる。通常時はLow("0")にすることでリセットが解除され、回路が通常動作する。
  • Active Low Reset
    • ↑の逆

TeraTerm

todo

その他

2進数のビット数から10進数の桁数に変換

n-bitの2進数は、10進数だと、N = n x 0.3010299桁になる(小数は繰り上げ)。
(N = log_10(2^n) = log_2(2^n) / log_2(10) = n / log_2(10) = n * log_10(2) = n * 0.3010299)

Jetson Nano

USBメモリを好きな場所に自動マウントする

https://www.youtube.com/watch?v=ihCzhNmj4eM のやり方でもいいけど、マウント先を変えたいので自分でやった。
標準だと、USBメモリは/media/takeshi/usbm に自動マウントされる。
この場所を変えてみる。
(/dev/sda1 等を使うと、場合によっては変わってしまう可能性があるので、UUIDで指定する)

# USBメモリのUUIDを探す
sudo blkid | grep sda
> /dev/sda1: LABEL="usbm" UUID="89d03081-d990-4d51-8f53-5ef4df35fb44" TYPE="ext4" PARTUUID="babe5f12-01"

# 既存のマウントを解除し、新しいマウントポイントを作成
sudo umount /media/takeshi/usbm
sudo mkdir /mnt/usbm

# とりあえず手動でマウント
# sudo mount /dev/sda1 /mnt/usbm/ -t ext4
sudo mount UUID="89d03081-d990-4d51-8f53-5ef4df35fb44" /mnt/usbm -t ext4

# 自動マウントさせる
sudo nano /etc/fstab
>>> 以下を追加
UUID=89d03081-d990-4d51-8f53-5ef4df35fb44 /mnt/usbm ext4 defaults 0 0

Swap設定

https://www.jetsonhacks.com/2019/04/14/jetson-nano-use-more-memory/

インストール~環境設定、Python関係

https://developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit
https://docs.nvidia.com/deeplearning/dgx/install-tf-xavier/index.html
https://qiita.com/take-iwiw/items/a3bd8d0527dec431ef0f

Python仮想環境インストール~Tensorflowインストールまで
sudo apt-get install python3-opencv
sudo apt-get install libhdf5-serial-dev hdf5-tools
sudo apt-get install zlib1g-dev zip libjpeg8-dev libhdf5-dev 
sudo apt-get install python-pip python3-pip
sudo pip install virtualenv
sudo pip install virtualenvwrapper

nano ~/.bashrc 
>>> 以下を追加
### Virtualenvwrapper
if [ -f /usr/local/bin/virtualenvwrapper.sh ]; then
    export WORKON_HOME=$HOME/.virtualenvs
    export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
    export VIRTUALENVWRAPPER_VIRTUALENV=/usr/local/bin/virtualenv
    source /usr/local/bin/virtualenvwrapper.sh
fi
<<<
# ターミナル再起動

mkvirtualenv --python=python3.6 env_py36_tfgpu_01

pip install --upgrade setuptools
pip install numpy grpcio absl-py py-cpuinfo psutil portpicker grpcio six mock requests gast h5py astor termcolor
pip install --pre --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v42 tensorflow-gpu
pip install Pillow

python
>>> import tensorflow as tf
>>> tf.__version__

Python3用OpenCV3インストール

JetPackの場合、OpenCV3は最初から入っている。ただし、Python2とC用ライブラリ(/usr/lib/libopencv_core.so.3.3.1)のみ。
Python3用には別途インストールが必要(sudo apt-get install python3-opencv)
また、仮想環境からうまく呼ぶことが出来なかったので、手動でシンボリックリンクを張る (参照: https://qiita.com/hiiguruma/items/3876db288e5233250ee4)
コピー先は仮想環境名に応じて適宜書き換え

find / -name "*cv2*"  2>/dev/null    # 念のため元の場所を探す
ln -s /usr/lib/python3/dist-packages/cv2.cpython-36m-aarch64-linux-gnu.so ~/.virtualenvs/py3_env1/lib/python3.6/site-packages/cv2.so

aptインストールでエラー

E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily unavailable)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?

といったエラーが出る場合は、aptの定期アップデートが邪魔している可能性有。
以下コマンドで自動アップデートを無効にする

apt自動アップデート無効
sudo systemctl disable apt-daily-upgrade.service
sudo systemctl disable apt-daily-upgrade.timer
sudo systemctl disable apt-daily.timer
sudo nano /etc/apt/apt.conf.d/20auto-upgrades    # 0に書き換え

X11 Forwardingでアプリケーション画面を転送する

TeraTermから接続する場合

  • 普通通りにssh接続する
  • Setup -> SSH Forwarding -> X ForwardingのDisplay remote X application on local X server にチェック
  • Setup -> Save setupで設定を保存する(TERATERM.INI)
  • 一度切断して、再度SSH接続する
  • xeyes & などで画面がWindows側に飛ぶ
    • DISPLAY設定は無くて大丈夫だった

MSYS, GitBashなどから接続する場合(Linuxも同じ)

ホストPCのターミナル(MSYSなど)
export DISPLAY=localhost:0.0  # 接続前にローカルのターミナルで設定する。なくても良いかも
ssh -X -Y takeshi@192.168.1.115
xeyes &

うまくいかないときはssh設定(/etc/ssh/sshd_config) を見てみる
(デフォルト設定で大丈夫だった。#X11DisplayOffset 10 もコメントアウトされてた。けど、DISPLAY番号の「10」はどこから来たのだろう。
とりあえずnetstat -at で確認したら6010ポートだったから、6000+10で10にしてみたけど、この「10」がどこから来たのか不明)

ホストがUbuntuなどのLinux PCの場合は、Xサーバソフトのインストールは不要

WindowsのSSHターミナルからchromium-browserを実行したら、うまく飛んでくれなかった。 Linuxからは出来たので、リモート側(Jetson側)というよりかは、ローカル側(vcxsrv)に原因があるのかも。 export LIBGL_ALWAYS_INDIRECT=1 してもダメだった。

VSCodeインストール

https://devtalk.nvidia.com/default/topic/1049448/jetson-nano/quick-build-guide-for-visual-studio-code-on-the-nano/

sudo apt install curl

# Yarn package repo
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list

# Install packages
sudo apt update
sudo apt install -y libx11-dev libxkbfile-dev libsecret-1-dev fakeroot npm curl nodejs nodejs-dev yarn

# Clone repo
git clone https://github.com/Microsoft/vscode.git

pushd vscode

# Reduce max_old_space_size
sed -i 's/4095/2048/g' package.json

# Kill the UI to free up memory ### WARNING THIS WILL DROP YOU TO A CONSOLE
sudo systemctl isolate multi-user

# Fetch deps, build, and create deb
yarn
yarn run gulp vscode-linux-arm64-min
yarn run gulp vscode-linux-arm64-build-deb
sudo dpkg -i ./.build/linux/deb/arm64/deb/code-oss_1.??.?-*_arm64.deb

# Reboot
code-oss

sudo nano /usr/share/code-oss/resources/app/product.json
>>> 以下を追記
    "extensionsGallery": {
        "serviceUrl": "https://marketplace.visualstudio.com/_apis/public/gallery",
        "cacheUrl": "https://vscode.blob.core.windows.net/gallery/index",
        "itemUrl": "https://marketplace.visualstudio.com/items"
    }

メモ

  • JetPack(Jetson Nano Developer KitのSDカードイメージ) を使用する場合は、NVIDIA SDK Managerは不要
  • GPU使用率は、tegrastats コマンドのGR3D_FREQ の右のパーセンテージの数字

Google Coral Dev Board (Edge TPU)

インストール(Ubuntu on VirtualBox)

  • Virtual Boxからでも問題なくインストールできた。
  • シリアルはWindows側接続(TeraTermなど)でOK (要: CP210x_Universal_Windows_Driver)
  • fastbootのときは、FSL USB download gadget [9999] をUbuntu側に接続する
    • 念のため、設定->USB デバイスフィルタに追加
  • ファームアップ後、MDTを使うときは、Google,LLC Mendel [0409] をUbuntu側に接続する

Windowsからでもがんばればできそうだけど、必要なのはインストール時だけなので、素直にUbuntuでインストールした

OpenCV

sudo apt install libopencv-dev

ネットワーク関係

  • ifconfig の代わりにip address
  • WiFi設定は、nmtui

SSHにパスワードログインする

デフォルトだと公開鍵/秘密鍵のペアをMDTに作って、秘密鍵を登録しているホストからじゃないとSSH接続できない。

Dev Boardターミナル上で、sudo nano /etc/ssh/sshd_config をして、 PasswordAuthentication yes に書き換える
セキュリティが気になる場合は、新規ユーザを追加して、mendelを削除

ssh mendel@192.168.1.36

動作クロック最大化

sudo apt install -y cpufrequtils
sudo cpufreq-set -g performance
# sudo cpufreq-set -f 1.5GHz
cpufreq-info
sudo cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq

TPU

TPU一覧と指定

from edgetpu.basic.basic_engine import BasicEngine
from edgetpu.basic import edgetpu_utils
edgetpu_utils.ListEdgeTpuPaths(edgetpu_utils.EDGE_TPU_STATE_NONE)
('/dev/apex_0', '/sys/bus/usb/devices/2-1')

# engine = BasicEngine(MODEL_NAME, "/dev/apex_0")              # Internal TPU
engine = BasicEngine(MODEL_NAME, "/sys/bus/usb/devices/2-1")   # USB TPU

OpenCV

OpenCVインストール for ARMボード(native)

https://medium.com/@balaji_85683/installing-opencv-4-0-on-google-coral-dev-board-5c3a69d7f52f

OpenCVインストール全コマンド
sudo apt-get install -y build-essential cmake unzip pkg-config
sudo apt-get install -y libjpeg-dev libpng-dev libtiff-dev
sudo apt-get install -y libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt-get install -y libxvidcore-dev libx264-dev
sudo apt-get install -y libgtk-3-dev
sudo apt-get install -y libatlas-base-dev gfortran
sudo apt-get install -y python-dev python3-dev

## Create swapfile
# sudo fallocate -l 1G /swapfile
# sudo chmod 600 /swapfile
# sudo mkswap /swapfile
# sudo swapon /swapfile

## Format SD card
# sudo mkfs /dev/mmcblk1

## Mount SD card
# sudo mount /dev/mmcblk1 /mnt
# sudo chmod go+w /mnt/

# Get source code
cd /mnt
wget -O opencv.zip https://github.com/opencv/opencv/archive/4.0.0.zip
unzip opencv.zip
cd opencv-4.0.0
mkdir build
cd build

# Build
cmake \
 -D CMAKE_BUILD_TYPE=RELEASE \
 -D CMAKE_INSTALL_PREFIX=/usr/local \
 -D ENABLE_NEON=ON \
 -D WITH_LIBV4L=ON \
 -D WITH_V4L=ON \
 -D BUILD_opencv_python2=ON \
 -D BUILD_opencv_python3=ON \
 -D OPENCV_PYTHON2_INSTALL_PATH=/usr/local/lib/python2.7/dist-packages \
 -D OPENCV_PYTHON3_INSTALL_PATH=/usr/local/lib/python3.5/dist-packages \
 -D INSTALL_PYTHON_EXAMPLES=ON \
 ..

make -j4
sudo make install
sudo ldconfig

OpenCV Build for Android (Cross Compile on Windows)

  • Requirements
    • Python environment (eg. Anaconda)
    • Android SDK
    • Android NDK
    • Download opencv and opencv_contrib
  • Python端末上で、ダウンロードしたopencvソースのopencv\platforms\android へcd
  • 以下コマンドを実行 (Miniconda Powershellの場合)
python .\build_sdk.py `
--ndk_path C:\Users\aaa\AppData\Local\Android\sdk\ndk\21.3.6528147 `
--sdk_path C:\Users\aaa\AppData\Local\Android\sdk `
--extra_modules_path C:\devel\opencv_contrib\modules `
--no_samples_build true
iwatake2222
クソコード、放置するのも、同罪です (自分への戒め)
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした