前申したプロジェクトの公開だけど、著作権侵害などが怖いので、とりあえず延期しました。
前回に引き続き、STM32のデバッグネタ。
前回の続きで、stm32のエラー修正ネタTIPS。
ちょっとだけエラー対策に慣れてきたので、報告します。
1 ファイルの重複エラーまたは宣言の重複エラーと出てきた場合
(1)「Search」タブ→「file」で、プロジェクト全部から、同じワードを使っているものを調べる。
(2)その言葉(定義、関数など)をなぞり、右クリック。→「Open declearation」とすると、定義が出てくる。
(3)その言葉(定義、関数など)をなぞり、右クリック。→「Open Call Hierarchy」とすると、その関数や定義を使った関数などを探せる。→関数の利用関係が分かる。
これらのファイル横断検索をする方法が、CoIDEさんすばらしい。
(4)通常は、宣言の重複エラーと出る場合には、違った2か所の場所に同じ宣言がされているものだが、初心者が.cファイルを引用してしまった場合、まったく同じ箇所で、重複していますというわけのわからないえらが出てしまう。この場合、.hファイルへも関数宣言を書き、.hファイルをインクルードする。このときくれぐれも、インクルードを循環させないように注意する。
(5)#IFDEF~#ENDIFを効果的に使う。同じファイルを引用しているが、2つの引用先が同時に使うはずがない場合、#IFDEF~#ENDIFを用いて、片方のみをコンパイルさせるように制御する。
例えば、USBOTGのHOSTと、DEVICEは、前者がマスター、後者がスレーブのような役割になるけれども、HOSTライブラリー、DEVICEライブラリーは同時に使う可能性はほとんどなく、これらを同時に、プロジェクトに入れていると重複エラーが生じやすいが、適切な定義を追加すれば、エラーを減らせる。
2 引数が違うなどとのエラー
(1)原因としては、ソースコードのバージョンが違うことが多い。
特に、FATFSは少しずつ改良されているので、
元のソースにないソースは、FATFSの元サイトを当たるしかないが、引数が変わっている場合がある。
これは、もとの関数か、利用先の引数を修正するしかない。
(2)上記1(4)、(5)で引数を確認する。
3 未定義等のエラー
(1)原因としては、上位のプログラムから外部変数やdefineなどで定義するはずが、
その上位プログラムとセットとなっていないため、定義していない。
例えば、FATFSの中のdiskio.cの中で、
USB_OTG_COREなどという定義は、構造体(複数の定数等のセット)の型(INTも型の1つ)なのだけれども、定義されていないとのエラーが出る。
ここは、usbh_core.cで、diskio.cをOTG用に改造した、同内容のvoid USBH_Connect (void *pdev)があり、
USB_OTG_CORE_HANDLE *ppdev = pdev;などと定義があるので、こちらのファイルを使い、
diskio.cは使わない。
(2)このようなファイルの依存関係は、上記1(4)、(5)で引数を確認して分かったことである。
サーチや定義のサーチを駆使すれば、未定義などのエラーをかなり消滅できる。
(3)IFDEFによる定義の分岐
例えば、OTGモードは、3者択一モードに分かれており、
スレーブ側?というべきデバイスモードと、
マスター側というべきホストモード、デバイスと直接やり取りするOTGモードがある。
デバイスモードは、PCではない別のデバイスと通信するが、
「USE_OTG_MODE」を定義するときは、USE_DEVICE_MODEは定義されておらず、
したがって、構造体USB_OTG_handleの要素としてのdevという構成員は定義されていないことになる。
typedef struct USB_OTG_handle
{
USB_OTG_CORE_CFGS cfg;
USB_OTG_CORE_REGS regs;
#ifdef USE_DEVICE_MODE
DCD_DEV dev;
#endif
#ifdef USE_HOST_MODE
HCD_DEV host;
#endif
#ifdef USE_OTG_MODE
OTG_DEV otg;
#endif
}
USB_OTG_CORE_HANDLE , *PUSB_OTG_CORE_HANDLE;
4 C言語のポインタ、構造体を理解する。
上記のtypedefによる構造体の定義は、INTと同じようにUSB_OTG_handleという型を定義し、その型の1つの名称として、USB_OTG_CORE_HANDLEおよびそのポインタ*PUSB_OTG_CORE_HANDLEを定義するというもので、
USB_OTG_handle USB_OTG_CORE_HANDLE, *PUSB_OTG_CORE_HANDLE;はUSB_OTG_handle型の2つの構造体を定義している。
int a,b;と同じ感覚である。上記のtypedefによる構造体の定義は多用されている。
構造体であるか、関数であるかぐらいは読めないと、ファイルを理解できない。
後は、「ポインタ完全制覇」という本で勉強した。
5 デバッグについて
CoIDEでは、そのうえでそのまま、ボードへのプログラムのインストール「DOWNLOAD COAD TO FLASH」とソースコード上でのデバッグができるが、
The program is not being run.というエラーが出て困った。
上記インストールすることは当然の前提として、デバッグのボタンを押し、しばらく待っている中にエラーが多発するときは、パソコンを立ち上げなおすのが一策と分かった。
デバッグの準備が出来ても、直ちに、printfが使えるのではなくて(USARTなどは不要だが)、
「CoIDEを使ってSTM32F4 DiscoveryでTDD(Unity)をやってみた – Qiita」のサイトなどを参考に改造すべきことが分かった。