2018年12月23日

nim言語:STM32のヘッダファイルをc2nimした時のメモ 2018

nim言語:STM32のヘッダファイルをc2nimした時のメモ 2018
c2nimは、c言語のソースとヘッダファイルをnim言語ソースに変換してしまうツール。
$ nimble install c2nim
でインストールできる。

$ c2nim foo.c $ c2nim boo.h $ c2nim --cpp moo.cpp
等で変換できる。 でも、中身がC言語で拡張子が*.cppファイルのソースはうまくいかない感じ。 その場合、拡張子を*.cにするとOKだった。orz 以下は、STM32マイコンのヘッダファイルを変換したときの記録。 STM32CubeMXで生成された「Nucleo-F030R8」用のプロジェクトフォルダ以下にある、 Drivers\CMSIS\Device\ST\STM32F0xx\Include\stm32f030x8.h というヘッダファイル。 5500行くらいあるんだけど、これをc2nimで変換してみました。 そのままではエラーで変換できないので「手動」で修正しました。 以下その時の記録。 誰かが変換スクリプトを作るのを期待したい。 (1) [置換対応] 「__IO」は「volatile」に置換。 (2) c2nimの実行時オプションに --skipincludeを追加。 これは#include文をimport文に変換しないオプション。 手動でやってもたいした違いはない。 (3) [置換対応] 先頭が一つ以上のアンダースコアで始まる名前はアンダースコアをカットする。
例: __FOO_BAR ---> FOO_BAR _FOO_FUZZ ---> FOO_FUZZ
この手のプレフィックスについては、コマンドラインオプションで --prefix:__ --prefix:_を追加で自動カットできそう。(試してないけど) これで「c2nim」が通るはず。 次は変換されたnimファイルを実際にインポートして出たエラーを潰していきます。 (4pre) volatileは結局エラーになるので全部カット。 (1)の時点で__IOをカットしたほうがよかったか。 (4)[置換対応] unin32_t、uint16_t、uint8_tはそれぞれuint32、uint16、uint8に置換 これらはサフィックスをカットする--suffix:_tオプションで 自動カットできるかも。(試してない) (5) キャストエラーを修正する。数カ所。
const CRC_IDR_IDR* = (cast[uint8_t](0x000000FF)) ## !< General-purpose 8-bit data register bits
const CRC_IDR_IDR* = (0x000000FF.uint8) ## !< General-purpose 8-bit data register bits
uint16版のエラーも出るのでそれも同様に修正する。 (6)名前の衝突エラーを修正する。 これはnimが「_」(アンダースコア)を無視して"識別子を認識する"ことに由来している場合と、 c2nimのバグの可能性と2種類ある様ですが、対処します。 例えば以下の行はエラーになるが、なぜエラーなのは不明。
GPIO_MODER_MODER10* = GPIO_MODER_MODER10_Msk
しかたがないので、単にコメントアウトします。(適当なサフィックスを付けて残す手もある)
# GPIO_MODER_MODER10* = GPIO_MODER_MODER10_Msk
これは名前の衝突の例:コメントアウトします。 WWDG_CR_T0* = WWDG_CR_T_0 (7) 未定義の識別子をコメントアウトする。 RCC_AHBENR_TSCEN等々が未定義エラーになるのでコメントにする。 (8) 外部参照の関数名もコメントアウト 今のところ対処法が不明なので全部コメントアウトします。 例えば、ADC1_IRQHandlerは割り込みハンドラーなので外部ファイルに存在するが、 インポート方法がわからないので全部when文でカット。 リネームしているだけなので不要かと。
when false: const ADC1_COMP_IRQHandler* = ADC1_IRQHandler ... ...
実際に使った例 実際には、core_cm0.hを変換したものをインクルードして使っています。 ここで使ったもの。 nim言語でNucleo-F030R8を動かした時のメモ 2018/12


posted by Copyright (C) avrin All Rights Reserved. at 11:55| Comment(0) | nim言語 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。