SW4STM32での謎の不具合

Windows版のSW4STM32でデバッグを実行しようとすると、「OpenOCD Binary not found」というエラーが発生した。

f:id:licheng:20200416110632p:plain

いろいろ試行錯誤したところ、デバッグの構成で「OpenOCD Command」の指定に拡張子「.exe」を付ければ解決した。

「.exe」が無いとエラーが発生。
f:id:licheng:20200416111053p:plain:w500

「.exe」を付けると正常に動作する。
f:id:licheng:20200416111106p:plain:w500

でも、なんでやねん???

メモ:追加のボードマネージャのURL

Arduino IDEサードパーティー製ボードのパッケージをインストールするためのボードマネージャのURLをメモ。 (2021/11/23 追記)

M5Stack
https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json
ESP32
https://dl.espressif.com/dl/package_esp32_index.json
ESP8266
https://arduino.esp8266.com/stable/package_esp8266com_index.json
chipKIT (PIC32)
https://github.com/chipKIT32/chipKIT-core/raw/master/package_chipkit_index.json
Nucleo (STM32)
https://github.com/stm32duino/BoardManagerFiles/raw/master/STM32/package_stm_index.json
https://github.com/stm32duino/BoardManagerFiles/raw/main/package_stmicroelectronics_index.json
Adafuit系
https://www.adafruit.com/package_adafruit_index.json
Raspberry Pi Pico (Arduino公式版) → URL設定不要 (Arduino Mbed OS RF2040 Boards)
Raspberry Pi Pico (Earle Philhower版)
https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json
Seeed系
https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json

https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json
https://dl.espressif.com/dl/package_esp32_index.json
https://arduino.esp8266.com/stable/package_esp8266com_index.json
https://github.com/chipKIT32/chipKIT-core/raw/master/package_chipkit_index.json
https://github.com/stm32duino/BoardManagerFiles/raw/main/package_stmicroelectronics_index.json
https://www.adafruit.com/package_adafruit_index.json
https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json
https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json

メモ:Eclipse CDTでMakefile生成を抑制

Eclipse CDT系のマイコン開発環境であるSW4STM32でMbed OS5のプロジェクトをビルドすると、毎回Makefileの生成が行われ数分を要するということがある。Mbed OS5のソースファイル数が膨大なためである。

f:id:licheng:20200414094627p:plain:w480

このMakefile生成を次回から省略するには、プロジェクトのPropertiesの「C/C++ Build」の「Builder Settings」の「Generate Makefiles automatically」のチェックを外す。

f:id:licheng:20200414101426p:plain:w640

ただし、プロジェクトをクリーンするとMakefileも削除されてしまうので、そのときはここにチェックを入れてからビルドする。

メモ:MBED_COMPILER_BARRIERでビルドエラー

Mbed OS5 からSW4STM32にエクポートしてビルドすると、mbed_toolchain.hの下記の行で「'asm' undeclared」というエラーが発生する。

#define MBED_COMPILER_BARRIER() asm volatile("" : : : "memory")

ビルドに用いるコンパイラの違いによるものである。下記のように修正するとビルドが通るようになる。

#define MBED_COMPILER_BARRIER() __asm__ __volatile__("" : : : "memory")

 
【ネタ元】

メモ: 未使用変数の警告を回避するマクロ (C言語)

コンパイル時に未使用変数の警告を出してくれるのは有用であるが、特定の変数が未使用であることを許容したい場合もある。そのような場合に下記のようなマクロを用意しておくと便利である。

#define UNUSED(x) (void)(x)

例えば下記のように使う。これによって警告を回避できる。

#define UNUSED(x) (void)(x)

int main(void)
{
    int hoge;
    UNUSED(hoge);
    return 0;
}

Androidアプリのレイアウトを動的に変化

やりたいこと

Androidアプリの画面(Activity)のレイアウトの一部を実行時に動的に変化させたい

やりかた

Activityのレイアウトで、動的に変化させたい部分のLayout要素に名前(id)を付けておく。ここでは hoge とする。

    <LinearLayout
        android:id="@+id/hoge"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal">
    </LinearLayout>

この部分に動的に挿入する内容のレイアウトを別ファイルで作る。ここでは piyo.xml というファイル名とする。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/piyo"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >
    (ここに内容を入れる)
</LinearLayout>

実行時に下記のコードでhogeの部分をpiyo.xmlの内容に変化させる。

    // hogeのLayoutを取得
    LinearLayout layout = (LinearLayout)findViewById(R.id.hoge);
    // hogeの内容を全て消去
    layout.removeAllViews();
    // piyo.xmlの内容を挿入する
    getLayoutInflater().inflate(R.layout.piyo, layout);

注意点

上記のコードのinflateメソッドを実行したすぐ後で、piyo.xmlの内容のViewの高さや幅を取得してもゼロが返ってくることがある。これは、その時点ではまだinflateの処理が完了していないためである。そこで、そのViewないしその親Viewを監視するViewTreeObserverを取得して、レイアウト変化の完了をonGlobalLayoutイベントで知らせてもらう。ただし、このイベントは頻繁に発生する場合があるので、用がすんだらイベントリスナーは削除しておくこと。

// piyoViewというViewを監視するViewTreeObserverを取得
ViewTreeObserver vto = piyoView.getViewTreeObserver();
// レイアウト変化時のイベントリスナを登録
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        // ここにレイアウト変化時の処理を記述
        ;
        // 用がすんだらこのイベントリスナを削除
        vto.removeOnGlobalLayoutListener(this);
    }
});

メモ:adbでプリファレンスを読み出す方法

Androidアプリで設定データを保存するにはプリファレンス(SharedPreferences)を用いるのが簡単で一般的だが、その実体はXML形式のファイルで保存されており、以下の手順で内容を確認できる。

たとえば、net.lipoyang.hoge というパッケージ名のアプリの、Piyo という名前(getSharedPreferencesの第一引数)のプリファレンスの内容を確認する場合、

  1. コマンドラインで adb shell
  2. run-as net.lipoyang.hoge
  3. cd shared_prefs
  4. cat Piyo.xml