Raisonance Ride7 & ARM Tools (24) アセンブリコードの条件ディレクティブ2015年08月09日 14時03分20秒

Ride7 AS.Defines
Ride7 を使っていて、以前から漠然とアセンブリコードの条件ディレクティブがうまくいかないと思っていた。今まではファイル内で
.if (1)
....
.endif
のように固定値を使っていた。
しかし、既にあるプロジェクトのアセンブリソースに条件ディレクティブが組み込まれている場合は書き換えるのも手間だ。そこで、なんとか Ride7 でも動くようにしてみようと言うわけだ。

まず、現在のコマンドラインを調べてみることにする。記述してあるのは "AS.config" だ。

 

これを実際のコマンドラインに展開すると
"C:\Program Files\Raisonance\Ride\arm-gcc\bin\arm-none-eabi-gcc.exe" 
-MD -D_STM32F103xB_ -D_STM32x_ -D_STM32F1x_ -mcpu=cortex-m3 
"C:\Keil\ARM\GNU\TEST\CrossWorks\STM32F10X\STM32_Startup.s" -o 
"C:\Keil\ARM\GNU\TEST\CrossWorks\STM32F10X\out\STM32_Startup.o" 
-I "." -I "C:\Program Files\Raisonance\Ride\Lib\ARM\include" 
-c -Wa,-EL  -DSTM32F10X_MD=1    -mthumb  
define の指定に -D を使っている所を見ると、プリプロセッサを使った後アセンブラに引き渡したいらしい。
しかし、assembler-with-cpp の指定が無いのでソースファイルはそのままアセンブラに引きわたしてしまう。
と言うわけでせっかく指定している Define が生かされていないのだった。そこで -x assembler-with-cpp の指定を追加。

 

結果 ... 問題ない。
Defines で指定したものが有効になっている。
しかし、困ったこともある。アセンブリソースファイルには条件ディレクティブをプリプロセッサで処理するタイプの物とアセンブラで処理するタイプの物があるのだ。
Keil ARMGCC などはアセンブラで処理するタイプなので、そのためのソースは書き換える必要がある。

ちなみに上記キャプチャー画面のプロパティー AS assembler Defines は今回のテストのために追加したものでコマンドラインに展開すると -D が付け加えられる。


さて、それではアセンブラに引き渡すタイプのソースの場合どうすればよいのだろう?
スクリプトファイルを元に戻し AS assembler Additional options で -Wa,--defsym STM32F10X_MD=1 を指定してみる。
arm-none-eabi-gcc.exe: error: STM32F10X_MD=1: No such file or directory
とエラーになってしまう。
もうアセンブラを直接呼び出すしか無いだろう。

 

結果 ... うまくいった。
しかし、ソースによりスクリプトファイルを切り替えることは多分できないと思うのでどちらを選択するのか考えどころだ。
いや、プロパティで選択できるようにすればよいのかな?


そうそう、直接アセンブラを呼び出した場合
Raisonance\Ride\Config\ExternalTools\PC-lint\ARM\lint_cmac.h
が読み込まれないようなのでこれも問題だ。




環境: Ride7 version 7.30.10.0169
    + RKit-ARM version 1.30.10.0356
    + GCC ARM/embedded-4_9-branch revision 218278

Raisonance Ride7 & ARM Tools (23)2015年07月30日 23時18分54秒

The process does not respond. Do you want to terminate this tool now?
いつの頃かコンパイルすると "The process does not respond. Do you want to terminate this tool now?" というメッセージが出るようになった。
これを毎回クリックしなければならないので煩わしい事この上ない。
何とかならないかと思って検索してみると、ありました。そのものだ。Build Process Timeout
LD.config の2行目 TimeOut="360000" を TimeOut="720000" にしてみたが変化なし。
TimeOut を削除しても変化なし。
TimeOut="1" にすると頻繁にポップアップが出てくるので関係ないわけではなさそうだ。
今の所、未解決だがメモだけしておこう。



環境: Ride7 version 7.30.10.0169
    + RKit-ARM version 1.30.10.0356
    + GCC ARM/embedded-4_9-branch revision 218278

Raisonance Ride7 & ARM Tools (22)2015年05月31日 11時12分14秒

Web 上に STM32L4 のライブラリがあったので Ride7 のプロジェクトジェネレータに加えることにする。
正しいものかどうか分からないが、間違っていたとしてもベクターテーブルだけの問題だろう。
スタートアップは startup_stm32l4xx.s で登録していたので以下の名称に対応するようにスクリプトを変更する。
startup_stm32l471xx.s
startup_stm32l476xx.s
startup_stm32l486xx.s
    if(processor.substr(0, 7) == "STM32L4")
       startupfile = defaultlibdir + "\\startup_" + processor.substr(0, 9) + "xx.o" ;
コンパイルしてみたが特に問題は無いと思う。


環境: Ride7 version 7.30.10.0169
    + RKit-ARM version 1.30.10.0356
    + GCC ARM/embedded-4_9-branch revision 218278

Raisonance Ride7 & ARM Tools (21)2015年05月24日 09時49分15秒

STMicroelectronics を覗くと STM32F7xx のライブラリがリリースされていた。
先日 Ride7 で STM32F7xx を使えるようにしたばかりだが、正式なものが発表されたのなら Startup などを新しいものに交換したい。
スタートアップの名称は
startup_stm32f745xx.s
startup_stm32f746xx.s
startup_stm32f756xx.s
中身はベクターテーブルと Cortex-M7 の指定があるかどうかの違いだけだった。


導入済みのスタートアップは startup_stm32f7xx.s なので上記の名前に合うようにスクリプトを変更しなければならない。
これがけっこう面倒だ... と思っていたが、そうでもなかった。
    startupfile = defaultlibdir + "\\startup_" + processor.substr(0, 9) + "xx.o" ;
STM32F7 の部分、上記一行だけですんだ。
そして Startup の中の
    bl __libc_init_array
をコメントにしてコンパイルした物を defaultlibdir にコピーすれば出来上がりだ。


しかし、ひまな時にでも __libc_init_array を使えるようにしておこう。


環境: Ride7 version 7.30.10.0169
    + RKit-ARM version 1.30.10.0356
    + GCC ARM/embedded-4_9-branch revision 218278

Keil MDK-ARM v5.14 Project Generator (2)2015年05月10日 18時04分23秒

File Extensions, Books and Environment
Keil.STM32F2xx_DFP.2.2.0.pack を使うためのプロジェクトを前回 GCC 用で作ったが今回は ARMCC 用で作ることにする。
さて、GCC からどうやって切り替えよう...。
Project Generator の中に選択項目はなかったのでダミーのプロジェクトを読み込みその中でコンパイラの選択をすることから始める。
ダミーのプロジェクトを読み込み File Extensions, Books and Environment の Folders/Extensions Use ARM Compiler にチェックを入れる。(既にチェックが入っている場合は Use GCC にチェックを入れて一旦閉じてからやり直す)
この操作を何とかしたい所だがなんともならない。

さあ、準備ができたので GCC の時と同じように新規プロジェクトを作る。
ARMCC Test Project
できあがったプロジェクトを見てみると ARMCC のプロジェクトになっている。
どうやらプロジェクトを作る前に使いたいコンパイラの環境を設定しなければならないようだ。

それでは Source Group 1 にダミーの main を入れてコンパイルしてみる。
RTE\Device\STM32F205RBTx\system_stm32f2xx.c(65): error:  #5: cannot open source input file "stm32f2xx_hal.h": No such file or directory
Path が通っていない。
Project の Options C/C++ Tab Include Paths に
C:\Keil_v5\ARM\PACK\Keil\STM32F2xx_DFP\2.2.0\Drivers\STM32F2xx_HAL_Driver\Inc を追加。


再度コンパイル
C:\Keil_v5\ARM\PACK\Keil\STM32F2xx_DFP\2.2.0\Drivers\STM32F2xx_HAL_Driver\Inc\stm32f2xx_hal.h(48): error:  #5: cannot open source input file "stm32f2xx_hal_conf.h": No such file or directory
C:\Keil_v5\ARM\GNU\TEST\STM32\armcc\RTE\stm32f2xx_hal_conf.h
stm32f2xx_hal_conf.h が無い。GCC で使ったものをコピーして使うことにする。


再再度コンパイル
コンパイルが通る。


GCC に比べると追加する項目は少ないが、やはりパスを追加しなければならない。
パスの追加はできるのだろうか?


参照:
 MDK5 Software Packs
環境:Keil MDK-ARM V5.14
    + GCC ARM/embedded-4_9-branch revision 218278
    + Keil.STM32F2xx_DFP.2.2.0.pack

Keil MDK-ARM v5.14 Project Generator (1)2015年05月01日 21時22分04秒

Keil.STM32F2xx_DFP.2.2.0.pack
MDK5 Software Packs の一部は GCC がサポートされている。
今回はそれをどうやって使うのか調べてみよう。
テストのために使うだけなのでできるだけ小さなパッケージにしたい。
Keil.STM32F2xx_DFP.2.2.0.pack が 67,991,464 と比較的小さいのでこれにしよう。
さっそく Pack Installer から Keil.STM32F2xx_DFP をインストール。
ちなみに Keil.STM32F2xx_DFP.2.0.0.pack から STMicroelectronics STM32CubeF2 Firmware Package がベースになっている。

さてインストールが終わったので New uVision Project で新規プロジェクトを作成する。
デバイスは STM32F205RBTx だ。
STM32F205RBTx


OK をクリックすると Run-Time Environment の画面になる。
特に ARMCC と GCC の選択項目はない。
どこで切り替えるのだろう。
CMSIS CORE と Device Startup にチェックして OK 。
STM32F205RBTx


startup_stm32f205xx.s と system_stm32f2xx.c がプロジェクトに入っている。
Project の Options for Target を見ると GCC になっている。デフォルトが GCC なのだろうか?
それとも何か設定を見逃したのか?
Test Project


Source Group 1 にダミーの main を入れてコンパイルしてみる。
いつものエラーだ。
RTE/Device/STM32F205RBTx/system_stm32f2xx.c(1): error: target CPU does not support ARM mode
Project の Options CC Tab Compile Thumb Code にチェックを入れる。


再度コンパイル
RTE/Device/STM32F205RBTx/system_stm32f2xx.c(65): error: fatal error: 
stm32f2xx_hal.h: No such file or directory
どうやら Path が通っていないらしい。
Project の Options CC Tab Include Paths に
C:\Keil_v5\ARM\PACK\Keil\STM32F2xx_DFP\2.2.0\Drivers\STM32F2xx_HAL_Driver\Inc を追加。


再再度コンパイル
C:/Keil_v5/ARM/PACK/Keil/STM32F2xx_DFP/2.2.0/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal.h:48:32: fatal error: 
stm32f2xx_hal_conf.h: No such file or directory
stm32f2xx_hal_conf.h が無い。これは自分で用意しなければならないらしい。
C:\Keil_v5\ARM\Pack\Keil\STM32F2xx_DFP\2.2.0\Drivers\STM32F2xx_HAL_Driver\Inc に stm32f2xx_hal_conf_template.h があるので名前を変えてそのまま使うことにしよう。


再再再度コンパイル
C:/Keil_v5/ARM/PACK/Keil/STM32F2xx_DFP/2.2.0/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_def.h:48:23: fatal error: 
stm32f2xx.h: No such file or directory
Path が通っていない。
Project の Options CC Tab Include Paths に
C:\Keil_v5\ARM\PACK\Keil\STM32F2xx_DFP\2.2.0\Drivers\CMSIS\Device\ST\STM32F2xx\Include を追加。


再再再再度コンパイル
c:/program files/raisonance/ride/arm-gcc/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/bin/ld.exe: 
warning: cannot find entry symbol _start; defaulting to 00008000
これはリンカースクリプトが無いときのエラーだ。
Project の Options Linker Tab Linker Script File: に stm32_flash.ld を登録。

 





再再再再再度コンパイル
c:/program files/raisonance/ride/arm-gcc/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libc.a(lib_a-init.o): In function `__libc_init_array':
init.c:(.text.__libc_init_array+0x20): undefined reference to `_init'
Project の Options Linker Tab [Do not use Standard System Startup Files] のチェックをはずし
Misc controls に -Xlinker --gc-sections を指定する。


再再再再再再度コンパイル
コンパイルが通る。


プロジェクトジェネレータに GCC が復活したのはいいことだが、パスとデファインとリンカースクリプトを何とかしたいところだ。
そして、ARMCC と GCC の切り替え方法はどうなっているんだ?


参照:
 MDK5 Software Packs
環境:Keil MDK-ARM V5.14
    + GCC ARM/embedded-4_9-branch revision 218278
    + Keil.STM32F2xx_DFP.2.2.0.pack

Raisonance Ride7 & ARM Tools (20)2015年04月14日 21時09分42秒

Ride7 で STM32F746xE
RKit-ARM が STM32F7 をサポートしたので私の環境でも動作確認をしてみる。
RKit-ARM_1.58.15.0093 がサポートしているのは以下の MPU 。
STM32F746xE
STM32F746xG
STM32F756xE
STM32F756xG

スクリプトを書き換え HFARM.XML と registry と sim に STM32F746xE を追加する。
スタートアップは startup_stm32f7xx.s の .cpu を cortex-m7 に変更するだけにしておこう。
さっそく New Project で STM32F746xE のプロジェクトを作り、ダミーの main を入れコンパイルしてみる。
問題なくコンパイルが通る。

こういう場合うまく行っているように見えてけっこういろいろ問題があったりするものだ。
まず ApplicationDirectory の中を見ていこう。
リンカースクリプトは
sections_FLASH.ld
STM32F746_512K_192K_DEF.ld
STM32F746_512K_192K_FLASH.ld
STM32F74x_COMMON.ld
ができている。
中身も問題ないようだ。

次に Application0.elf.ld (ApplicationName.elf.ld)を見るとライブラリが
"smallprintf_thumb.a"
"STM32x_io_putchar_thumb.a"
になっている。ここは
"smallprintf_thumb_fpu.a"
"STM32x_io_putchar_thumb_fpu.a"
でなければならないはずだ。
まだスクリプトにおかしな所があるようだ。
GNUtools.js を調べてみると (corename=="Cortex-M4+FPU") はあるのに (corename=="Cortex-M7+FPU") が無い。

(corename=="Cortex-M7+FPU") を追加する。
ところで、ライブラリは Cortex-M4 で作ってあるが Cortex-M7 と共通と見てよいのだろうか?
そうでなければ Cortex-M7 用にライブラリの種類を増やさなければならない。
それ以前に、そもそも io_putchar と small_printf は STM32F7xx で動くのだろうか?

振り返ってみれば Raisonance は何かと抜けていることが多い。
このコアチェックの部分では corename と core をチェックしているが registry には core の項目が無いので有効なのは corename だけだ。
こういったちぐはぐな所がいたるところにある。
だいたい デバイスに関係する物が HFARM.XML 、sim file 、registry と多すぎるのも問題だ。

今回のテストでは Cortex-M7 の設定でコンパイルが通ったと言うことだけでそれ以外の部分は見直しが必要だろう。
いや、ローカルライブラリを使わない設定ならば問題ないのかもしれない。

この際ついでなので STM32L476xC も試してみよう。
同様に関係する部分のスクリプトを書き換え HFARM.XML と registry と sim に STM32L476xC を追加する。
スタートアップは startup_stm32f4xx.s をリネームして startup_stm32l4xx.s にし .cpu を cortex-m4 に変更する。(この際 startup_stm32f4xx.s も cortex-m4 に修正しておこう)
STM32L4x_COMMON.ld を作成して C:\Program Files\Raisonance\Ride\lib\ARM に入れる。

確認のため New Project で STM32L476xC のプロジェクトを作り、ダミーの main を入れコンパイルしてみる。
問題なくコンパイルが通る。

というわけで STM32 の場合 Raisonance が力を入れていることもあってデバイスの追加も比較的簡単だ。

GNU Tools for ARM Embedded Processors2015年04月12日 12時22分06秒

Linker Options
さあ newlib-nano を使ってみよう。
使うために printf と syscall ぐらい入れておこう。

テストする環境は
Keil MDK-ARM V4.53
ARM GCC/embedded 4.9.3 revision 218278
Startup は Atollic の startup_LPC11xx.s
Linker script は RAISONANCE Ride7 を使い LPC1114FHN33 で 自動生成したもの
syscall と SystemInit はダミー
Optimization は default


さて、この後どうすればよいの?
とりあえず
Raisonance\Ride\arm-gcc\share\doc\gcc-arm-none-eabi\readme.txt を読んでみる。

どうやらリンク時に
--specs=nano.specs
を付ければよいらしい。
やってみる。
hex file で 18,092 bytes だった。
もともとが newlib で 103,846 bytes だったからかなり小さくなった。
この状態では Integer only なので %f を使うためにはコマンドオプション -u _printf_float を追加する。(scanf の場合は -u _scanf_float)
hex file で 61,038 bytes になった。

ちなみに、Optimization を Level2(Size) にすると
18,047 ( --specs=nano.specs)
60,993 ( --specs=nano.specs -u _printf_float)
103,817 ()
サイズは Optimization default とたいして変わらない。

newlib-nano test


結果:
以前テストした CooCox や LPCXpresso の printf に比べても nano はすこし大きいことが分かる。
しかし、手間を考えると便利かもしれない。

Raisonance Ride7 & ARM Tools (19)2015年04月10日 22時46分04秒

Ride 7.54.15.0083 RKit-ARM 1.58.15.0093
Raisonance の tool がバージョンアップしていた。
RKit-ARM 1.58.15.0093
Ride 7.54.15.0083

release note を見てみると STM32F7 がサポートされているのと GCC が 4.9.3 になっている。
STMicroelectronics の STM32F7 サポートは Raisonance が最初かもしれない。
面白そうなのでこのバージョンもインストールしてみる。

少し中をのぞいてみよう。
今回からサポートされた STM32F7 の startup を見る。
startup_stm32f7xx.s と startup_stm32f4xx.s が同じ内容だ。
後で修正するつもりなのか?それとも同じで正しいのか?

さて、もう一度 release note を見てみる。
コンパイラは
4.9.3 20141119 (release) [ARM/embedded-4_9-branch revision 218278]
ということなのでいつからか分からないが Sourcery g++ から Launchpad に変わったようだ。
そして lib_nano が使える。
nano と言うぐらいだから 小さくなっているのだろう。
これは試してみたい。


参照:
  Raisonance

STM32 OptionBytes2015年04月04日 22時21分19秒

Option bytes とは?
ライトプロテクト又はリードアウトプロテクト又は RAMBoot の禁止が設定できるものらしい。
NXP の CRP と似た機能だろう。
サンプルは私の環境だと Ride7 と MDK-ARM の中にある。
C:\Program Files\Raisonance\Ride\lib\ARM\STM32xxx_OptionBytes.c
C:\Keil\ARM\Boards\Keil\MCBSTM32\Blinky\STM32F10xOPT.s
C:\Keil\ARM\Boards\Keil\MCBSTM32F200\Blinky\STM32F2xx_OPT.s
C:\Keil\ARM\Boards\ST\STM32L152-EVAL\Blinky\STM32L1xx_MD_OPT.s
そのほか Web 上を探してもほとんど見当たらない。
書き込むバイト数は 12バイトから64バイトまである。(ほかのパターンもあるのかもしれない)
MPUによって書き込む場所もサイズも異なるので調べるのも大変だ。
手元にあるサンプルからデフォルトの値を書き出してみると以下のようになる。
STM32F0    AA55FF00 FF00FF00 FF00FF00
STM32F1    A55AFF00 FF00FF00 FF00FF00 FF00FF00
STM32F2    FFAA0055 FFAA0055 FF3F00C0 FF3F00C0
STM32F3    AA55FF00 FF00FF00 FF00FF00 FF00FF00
STM32F41   FFAA0055 FFAA0055 FF3F00C0 FF3F00C0
STM32F43   EFAA1055 EFAA1055 FF3F00C0 FF3F00C0
STM32L0    AA0055FF 70808F7F 0000FFFF 0000FFFF
STM32L1MD  AA0055FF 780087FF 0000FFFF 0000FFFF
STM32L1MD+ AA0055FF 780087FF 0000FFFF 0000FFFF 0000FFFF 0000FFFF 0000FFFF 0000FFFF
STM32L1HD  AA0055FF 780087FF 0000FFFF 0000FFFF 0000FFFF 0000FFFF 0000FFFF 0000FFFF
           AA005500 78008700 0000FFFF 0000FFFF 0000FFFF 0000FFFF 0000FFFF 0000FFFF
STM32W1    A55AFF00 FF00FF00 FF00FF00 FF00FF00
実際にこの機能を使う時は ST-LINK や DfuSe を使うのだろう。

というわけでこの機能も私には必要ないものだった。