KEIL μVision
2014/01/03
MDK-ARM(μVision)を入手したのでメモ。
入手したのはシングルライセンス版でUSBドングルでライセンス管理するタイプ。
インストール
画面に赤いラインが出てきた
μVision4のプロジェクトでエラー発生
MCB1800を使う
ARMの開発環境
Debug (printf) Viewerの使い方
物理アドレスに直接アクセスする方法
プロジェクト作成
ソフトのCDは付いてこないんで、ネットからDLする。
インストール方法の詳細はここ。
まずここ https://www.keil.com/install/ でDLしてインストールする。
DLするときに Serial Number が必要だ。厚紙に書いてあるやつ。
インストールして試しに実行してみた。
コンパイルまでは行くけどリンクでエラーになる。
んじゃμVisionにライセンス登録してみようと思ったら、その前にUSBドングルのドライバが必要なんだそうだ。
ここ http://www.safenet-inc.com/support-downloads/sentinel-drivers/ で Sentinel Protection Installer ってのをDLしてインストールした。
で、このUSBドングルを差し込んでからμVision5を起動してライセンス登録。
再度ビルドしたら、無事にリンクまで行きデバッガも動作OK。
このライセンスで100台のPCにインストール可能で、ドングルの差し替え回数には制限無しとのこと。
オイラ、普段の開発はデスクトップPCを使い、現場でのデバッグはノートPCなんで、こんなライセンス形式のを入手しました。
エディタでコードを入力すると、あちこちに赤いアンダーラインが出てくるようになった。
最初は平気だったんだけど、あるときから急に出現。
Edit-ConfigurationのSyntax Checkを外して解決。
色々やったけど分からなかったんで、横河のサポートにメールで質問したら、チョー親切に教えてくれました。
2014/01/30
μVision4のプロジェクトでエラー発生
μVision4で作ったプロジェクトをそのままμVision5でコンパイルしたらリンク時にエラー発生。
こんなエラー "error: L6002U: Could not open file mbed/LPC1768/ARM/capi.ar:
No such file or directory"
で、ネットで検索したら、要するにバイナリーのライブラリが合ってないとからしい。
解決策は、オンラインのmbedコンパイラで再度ビルドしたのをExportして、それを使えば良いってことのようだ。
自分の場合はUsbMouseのライブラリを使ってるんだけど、一度オンラインコンパイラでビルドし、ビルドした物をuVision4形式(μVision5形式は現時点では存在しない)でExportしたのをμVision5でビルドしたら無事にリンクも成功した。
MDK-ARMとセットでMCB1800とULINK2も入手した。
MCB1800ちゅうのは実験用のボード。
ULINK2ってのはJTAGデバッガ(ULINKproならトレースメモリが入ってるけど定価15万とからしい)。
で、早速動かしてみた。
今回使ったのは、ちょいワケアリでμVision4.7の無料版だ(32K以下なのでこれで動く)。
まずは動いたんで一安心じゃ。
次はまじめに自分でコツコツとプロジェクトを設定してみようかな。
ARMって、あちこちのメーカーにCPUコア(の回路図)を出してるんだと。
で、このCPUコアを買ったメーカーが周辺I/Oを足して独自CPUやボードとして売り出してるってことなのだ。
ARMが一次問屋とすれば、NXPやSTMicroは二次問屋・・・実はルネサスも二次問屋をやってる・・・しかもDS-5(Linux向け開発ツール)が一年間無料だと。
で、更にこの二次問屋からCPUを買ってきて部品を付け足して売ってる小売店みたいな会社もある。EA(Embedded Artists)社とか・・・
例えば二次問屋のNXP社。
ここで出してるCPUには、LPC-xxxxと言う名前が付いてる。
例えば二次問屋のSTMicro社。
ここで出してるCPUには、STMxxxxと言う名前が付いてる。mbed対応ボードもある。
例えば小売店のEA社。
ここで出してるボードには、LPC4088 QUICKSTART BOARDやLPC1769 LPCXPRESSO BOARDなどがある。
以上がCPU製造系の会社だ。
次は開発ツール(IDE)を売ってる会社だ。
IDEを作ってる会社は、大所でKEIL社(今はARMに買収された)とIAR社がある。
KEIL社=ARM社のIDEの名称はμVisionと言う。
IAR社のIDEの名称はIAR Embedded Workbench(EWARM)と言う。
GCCで無料開発もできるらしい。
<デバッグ環境>
ARMのCPUにはCoreSightという名前のデバッグ用のハードウエアが載ってるんだそうだ。
このハードウエアを使うと、JTAGと同じようなことが電線の本数を減らしても可能なんだと。で、これをSWD(シリアル・ワイヤ・デバッグ)と言う。ここのP6
シリアルで通信と聞くと「遅い」と思うでしょ? でも早いんだなこれが。実際に動かしてみたけどJTAGと体感速度に差は無い。実例
SWDの利点としては電線の本数を減らせることなんだ。
SWDで使う線は、通信データとCLKの2本だけで良いんだけど、実際にはVCCとGND、それにRESETも繋いだ方がデバッグしやすい。
結局JTAGの7本が5本になるってこと・・・あれ?そんだけ?
ピン数の多いCPUを使うならどうでもいいことけど、ま、長い物には巻かれた方がお得なんでここはSWDで参りましょ。
と言うわけでSWD(正確にはJTAG/SWD)なのだ。
ARM純正のJTAG/SWDデバッガはULINKと言う。
ULINKには値段の高いのから安いのまであるんだけど(値段表)、一番高いULINKproはトレースが可能で、お値段は14万円。
一番安いのはULINK-MEで、お値段は7千円。
オラの持ってる中途半端なULINK2は4万円。
なんだけど、実はもっともっと安いのが有る。
これ。LPC−Link2。2千円。大好きな秋月(^^;
こいつはファームを入れ替えるとμVisionでもCodeRedでも使えるらしい。LPC-Link2とJTAGの接続方法。詳細。
ところで、同じような値段でこんなんもある。得意のeBay。例えばこれは$15で送料無料 ← 2014/03/05現在
ちょいワケアリでヤフオクから落札したんだけど動く。実際に動かしてみた。ただバスが弱い感じでマジメに繋がないとです。
さらに秋月にULINK2コンパチのもあるみたいだ。これ。1700円。MDK-ARMと接続可能って書いてある。
2014/04/01
Debug (printf) Viewer
これがまた使い方が分からなかったな〜
ここに書いてあったのね・・・どこになにが書いてあるのか調べるだけで大変だよ。検索しても出てくるのはこんなんだしさ。
なんだかμVisionよりもEWARM(IARの開発環境)の方が良かったかも。日本語の資料がしっかり揃ってるんだもん。これ(ITMとはなにか)とかこれ(EWARMの使い方)とかこれなんてとても結構なり。
表示速度だけど、普通のUARTを115200bpsで使うより5倍ほど速い。ここのP26-27。
ところでDebug printf だけど、printfを使わずに直接一文字表示するだけなら ITM_SendChar(c) でOK・・・この方が簡単で良いかもね。ここのP60。
以下のコードをmainの上にでも入れてやる。 |
#include <stdio.h> // これが必要 #define ITM_Port8(n) (*((volatile unsigned char *)(0xE0000000+4*n))) #define ITM_Port16(n) (*((volatile unsigned short*)(0xE0000000+4*n))) #define ITM_Port32(n) (*((volatile unsigned long *)(0xE0000000+4*n))) #define DEMCR (*((volatile unsigned long *)(0xE000EDFC))) #define TRCENA 0x01000000 struct __FILE { int handle; /* Add whatever needed */ }; FILE __stdout; FILE __stdin; int fputc(int ch, FILE *f) { if (DEMCR & TRCENA) { while (ITM_Port32(0) == 0); ITM_Port8(0) = ch; } return(ch); } //------------------------------------------- // ここからmain //------------------------------------------- int main (void) { printf("===== blinky start =====\n"); while (1); } |
ProjectのOptionをいじる。 |
![]() |
Debugモードに入ってからViewerを表示させておいてRunすれば出る。 |
![]() |
2014/04/01
物理アドレスに直接アクセスする
こうするんだと。
例1:#define IOPIN0 (*((volatile unsigned long *) 0x10000000))
例2:int var1 __attribute__((at(0x10001000))); // __attribute__は外部変数のみに使用可能
両方試してみたけど、例2はコンパイルは通るけどなんか変。
例えばこうする
int var1 __attribute__((at(0x10001000)));
int var2 __attribute__((at(0x10001000)));
var1 = 1;
var2 = 2;
var1もvar2も同じアドレスに書き込んでるのに、メモリ表示で見ると4番地ずれて書き込まれる。
これって同じアドレスに同じ変数が割り当てられないように自動的にずらしてるらしい。
むむ〜便利なような不便なような。
例1の方は普通の書き方だけど、こっちが無難そうだな。
覚え書きTOP