2015年12月5日土曜日

【STM8S】 CコンパイラをRaisonance→Cosmicへ変更するかったるさ

ひどく久しぶりのSTM8Sシリーズです.STM8Sというのは8bitマイコンです.STM8S-discoveryというプリント基板が数100円で売られているのを見かけたり、買ったことのある方が居ると思います.(raspberry pi zeroが普及したらSTM8S discoveryもお役ご免という気がする)
このSTM8S discoveryですが、STM8マイコンの普及を狙ってホビースト向けにも販売しているものと推測しますが、ホービースト向けにしては開発環境に難ありなんです.
コンパイラが2社から提供されています.RaisonanceとCosmicです.そのコンパイラを買うと10万円ぐらいしちゃうのでホビーストには手出しが難しい.そこで、機能制限版のコンパイラがフリーで提供されているのですが、このポリシーがしばしば変わるんです.

記憶を辿って5年より前は、
(1) Cosmic    バイナリサイズ16KB制限フリー版を提供  (いまいち小さい)
(2) Raisonance フリー版を提供せず

5年ぐらい前に、
(1) Cosmic    フリー版を提供せず
(2) Raisonance  バイナリサイズ制限無しフリー版を提供  (こいつはGOODだ)

現在、
(1) Cosmic    バイナリサイズ32KB制限フリー版を提供  (よかよか)
(2) Raisonance  フリー版を提供せず              (アウトォォォ!)

この振り子のような往復運動にはあきれるばかり.わざとホビーユーザーの離反を誘っているのか? gccのクロスコンパイラがあればなぁと思ったらSDCCというのがあるみたいですねぇ.今度試してみようそうしよう.

その振り子運動に揺さぶられまくりなわたしの遍歴では、最初はCosmic16Kを使っていて、5年前にRaisonanceの無制限版に乗り換えて、いまでもRaisonanceを使えるんですけど古くて使わなくなったノートPCでしか動きません.なので、現在となってはCosmic32Kに乗り換えなくちゃいけないわけなんです.(両社共、メールにてライセンスファイルを取得する必要があります)

RaisonanceとCosmicのコンパイラを行き来するときに、STVDのプロジェクトファイルには互換がありませんし、ソースを少し書き換えなくちゃいけませんからかったるい.以下、Raisonance → Cosmicへの変更点についてメモっておきます.

(0)workspaceを新規作成
STVDの既存workspaceのコンパイラ設定だけを変更できれば無問題なのだが、やってみるとそれはできないので、新規workspaceを作って、必要なソースファイルを追加してやらねばならない.

(1)割り込みルーチンの記述
【Raisonance】
void Tim3Update(void) interrupt 15
【Cosmic】
@far @interrupt void Tim3Update(void)

(2)Cosmicの割り込みベクタへの登録
【Raisonance】
不要 (上記のinterrupt 15で済んでしまうから)

【Cosmic】
stm8_interrupt_vector.cを書き換える必要がある.
①externで関数プロトタイプを追加
②関数名を上書き

①extern @far @interrupt void Tim3Update(void);

struct interrupt_vector const _vectab[] = {
{0x82, (interrupt_handler_t)_stext}, /* reset */
     省略
{0x82, NonHandledInterrupt}, /* irq14 */
{0x82, Tim3Update},          /* irq15 */
{0x82, NonHandledInterrupt}, /* irq16 */
     省略
};

(3)Cosmicの割り込みルーチンは@farであるべきか、@nearではダメなのか?
【Raisonance】
farかnearかについて、悩んだことはない.
【Cosmic】
manualによるとバイナリサイズ<64kBならば@nearでよいはずなのだが、理由は不明だが@farでないと割り込みルーチンへ飛んで行かなかった.なので@farで決め打ちにしました.

(4)割り込みルーチンの返り値
【Raisonance】
voidと明示しないと怒られる
【Cosmic】
怒られはしないがintにしたぞとwarningが出る

いずれにせよvoidにしておくのが無難であろう.

(5)mainルーチンの末尾
【Raisonance】
while()にし、returnするなとmanualに書かれている
【Cosmic】
main(){;} あるいは main(){return;} にしてみたところ、コンパイルは通りました.FLASHに焼いたらどういう動作をするのかまでは試していません.

いずれにせよwhile()にしておくのが無難であろう.

(6)書式指定のキャスト
【Cosmic】
printf()などの書式指定が、
  uint8 i;
  printf("%02x",(int)i);
のようにキャストしないと表示数値が化けるんだけど、それってオレだけ? つまり%dや%xにintでない整数を突っ込むと化けるのだが、それでいて(warningを表示させても)warningが出ない.


投了してSDCCに乗り換えたら幸福かも.

かしこ


=== STMのアフィリエイト始めました ===
STM32のwelcome-kitです
        
試用レポはいずれまた...



人気ブログランキングへ

0 件のコメント:

コメントを投稿