$ vim [1] 37147 killed vim
みたいになってエラーも出ず、一切起動しない。ビルドした src/vim は起動するが、make install 後のバイナリでこの現象が起こる。ファイルサイズも異なるなるのでインストールプロセスを疑ったところ strip を OS 標準のものにしたら正常に起動するようになった。
$ vim [1] 37147 killed vim
みたいになってエラーも出ず、一切起動しない。ビルドした src/vim は起動するが、make install 後のバイナリでこの現象が起こる。ファイルサイズも異なるなるのでインストールプロセスを疑ったところ strip を OS 標準のものにしたら正常に起動するようになった。
STM32F103C8 のやっすいボード (bluepill などと呼ばれているらしい) については数年前に書いた STM32F103 C8 T6 の安いボードでLチカ (platformio + mbed) が、これを題材にして ChibiOS の環境を用意する。
適当に git repo を作って ChibiOS を submodule に追加する。もちろんただダウンロードしてきてコピーしても良いがとにかくレポジトリ内に全コードを入れておく
mkdir foo cd foo git init git submodule add git@github.com:ChibiOS/ChibiOS.git
できれば同じ MCU のボードだと変更点がすくなくてよい。Bluepill は Maplemini というののクローンの一種らしいので、そこからコピーしてくる。
cp -r ChibiOS/demos/STM32/RT-STM32F103-MAPLEMINI/* .
CHIBIOS := ./ChibiOS
手元にあるボードと、既にあるボード定義はだいたい一致していないので、修正する必要がある。
Makefile に以下のような行がある。
include $(CHIBIOS)/os/hal/boards/MAPLEMINI_STM32_F103/board.mk
このディレクトリをまるっと自分のディレクトリにコピーする
cp -r ChibiOS/os/hal/boards/MAPLEMINI_STM32_F103 STM32F103_BLUEPILL
board.mk を編集する。まずはパスを変更したディレクトリにあわせるだけ。
# List of all the board related files. BOARDSRC = STM32F103_BLUEPILL/board.c # Required include directories BOARDINC = STM32F103_BLUEPILL # Shared variables ALLCSRC += $(BOARDSRC) ALLINC += $(BOARDINC)
board.h を確認して、必要であれば編集する。
まずクロック設定があっているか確認する。実際の基板のものとあってないと何もかもがおかしくなる。後述する mcuconf.h と組合せてよくチェックする。
#define STM32_LSECLK 32768 #define STM32_HSECLK 8000000
VAL_GPIOACRL など、GPIO の初期設定を必要に応じて変更する。とはいえアプリケーションコード (main.c) で、palSetPadMode などで、あとから変えることもできるので必須ではない。
ここまででベースはおわり。make は通るはず
入力として使う alternate function は、ピンに特別な設定は必要なく、PAL_MODE_INPUT などにして、ペリフェラル側の設定を有効にするだけで良い。
出力として使う alternate function は、ピンにもPAL_MODE_STM32_ALTERNATE_PUSHPULL を指定する必要がある。
(STM32F401 などとは設定方法が違う)
ChibiOS の HAL ドライバのインターフェイスは MCU ごとに柔軟に設定できるようになっている。裏をかえすと、基本的に MCU ごとに設定方法を変えなければならない。
一番簡単なのは定義を読むことで、ChibiOS/os のディレクトリで git grep したりして、必要なソースコードを読むのがてっとりばやい。ChibiOS は幸い、あまり変なコードはなく素直に読みくだせるようになっている。
特殊なことをしないなら HAL ドライバを使ったほうが圧倒的に楽だが、もちろん利用せずに自力でレジスタを設定しても良い。データシートを読みながらペリフェラルを設定する場合は結局こうすることになる。その場合 mcuconf.h で利用するペリフェラルのドライバは無効にすること。
できたものは https://github.com/cho45/STM32F103C8-ChibiOS
STM32 の開発環境で悩んでいて、ちょうどよく気にいるものがなかなくていろいろ試している。STM32 デバイスでの例が多く抽象化やビルドシステムもちょうどよく手に収まる感じで、今のところいい感じ。
ChibiOS は RTOS のライセンスがGPLであるのが若干やっかいだが、OSS ならまぁ GPL 採用すればいいので気にしないことにする。
以下をいれるととりあえずおさまる。ccls と相性が悪い??
let g:lsp_insert_text_enabled = 0 let g:lsp_text_edit_enabled = 0
あとラベルが勝手に補完に含まれるのはinitialization_optionsになんか指定するとよいらしい?
au User lsp_setup call lsp#register_server({
\ 'name': 'ccls',
\ 'cmd': {server_info->['ccls']},
\ 'root_uri': {server_info->lsp#utils#path_to_uri(lsp#utils#find_nearest_parent_file_directory(lsp#utils#get_buffer_path(), 'compile_commands.json'))},
\ 'initialization_options': #{
\ cache: #{directory : '/tmp/ccls_cache'},
\ completion: #{detailedLabel: v:false}
\ },
\ 'whitelist': ['c', 'cpp', 'objc', 'objcpp', 'cc'],
\ })