2009年12月9日水曜日
LM3S8962 Evaluation Kit プログラム作成 (GNU gcc)
Texas Instruments(LUMINARY MICRO)社 Cortex-M3 MCU LM3S8962 マクロプロセッサ評価ボード EKI-LM3S8962 について、キットに付随するサンプルプログラムをGNU gccでビルドし直しました。
1.サンプルプログラムの取り込み。
1)IAR Embedded Workbenchでサンプルワークスペースを開く。
①IAR Embedded Workbenchを立ち上げる。
②Example applications
③Lumirary/Stellaris/boads/dk-lm3s8962を選択
2)サンプルプログラムソースをコピー。
①開いている。ワークスペースのうち、とりあえず「driverlib」「blinky」「hello」「graphics」「uart_echo」のライブラリ、プログラムの File Propertisi... を調べる。
C:\Users\UserID**\Documents\IAR Embedded Workbench\arm\Luminary\Stellaris\src C:\Users\UserID**\Documents\IAR Embedded Workbench\arm\Luminary\Stellaris\boards\ek-lm3s8962\graphics
②プログラムソースをGNU gcc開発フォルダにコピーする。
「hello」の場合
IAR サンプル ソース ......\Stellaris\boards\ek-lm3s8962\hello\helloc.c を
GNU gcc 開発フォルダ(例) c:\Embedded\ARM_CortexM3\TI\Project\hello にコピー
③ライブラリソースをGNU gcc開発フォルダにコピーする。
・IAR ライブラリ ヘッダ
(共通ヘッダ)
......\Stellaris\asmdefs.h hw_adc.h hw_can.h hw_comp.h ......
(driverlib.a用)
......\Stellaris\inc\lm3s8962.h
......\Stellaris\src\adc.h can.h comp.h ......
(utilslib.a用)
......\Stellaris\utils\cmdline.h diag.h diagprintf.h ......
(glib.a用)
......\Stellaris\glib\canvas.h checkbox.h container.h ......
その他
......\Stellaris\glib\third_party以下のヘッダを適宜に。
・IAR ライブラリ ソース
(driverlib.a用)
......\Stellaris\src\adc.c can.c comp.c ......
(utilslib.a用)
......\Stellaris\utils\cmdline.h diag.h diagprintf.h ......
(glib.a用)
......\Stellaris\glib\canvas.c checkbox.c container.c ......
その他
......\Stellaris\glib\third_party以下のソースを適宜に。
・GNU gccライブラリ構成フォルダにコピー
(共通ヘッダ)
c:\Embedded\ARM_CortexM3\TI\Library\inc
(driverlib.a)
c:\Embedded\ARM_CortexM3\TI\Library\drivelib\inc
c:\Embedded\ARM_CortexM3\TI\Library\drivelib\src
(utilslib.a)
c:\Embedded\ARM_CortexM3\TI\Library\utilslib\inc
c:\Embedded\ARM_CortexM3\TI\Library\utilslib\src
(glib.a)
c:\Embedded\ARM_CortexM3\TI\Library\glib\inc
c:\Embedded\ARM_CortexM3\TI\Library\glib\src
その他 機能別に適宜にコピーする。
2.GNU gcc プログラム開発用環境構築 ライブラリ作成
1)Makefile作成 「drivelib」「glib」「utilslib」...
・開発環境は、数値(浮動小数点)演算プロセッサなし(ソフト数値演算)を選択。
・コンパイルオプション -mthumb -O0 -v (とりあえず)
2)メイク実行
3.各サンプルプログラムプロジェクト(ワークスペース)の整備
1)スタートアッププログラムソース(startup.S)、メモリ定義ファイルの(memory.def)、メイクファイル(Makefile)の入手し、各サンプルプログラムプロジェクトフォルダに置き、適宜に修正する。
・CQ出版Interface誌2008年11月号の記事「Thumb-2対応GCCクロス開発環境の構築」関連のソース等を同サイトからダウンロードする。
・ダウンロードファイル gcc_sample_20080830.tar.zip を展開
・展開したフォルダ gcc_sample_20080830.tar に Cygwin でアクセスする。
・Cygwin で コマンド 「tar -jxvf gcc_sample_20080830.tar.bz2」を実行してサンプルソース等を展開する。
・gcc_sample_20080830.tar/gcc_sample/cortex-m3 が今回利用するサンプルソースのフォルダです。
2)startup.sの修正。
-----------startup.s-------------------------
.text
.extern main
.extern _sdata_loadaddr
.extern _sp_base
.extern SysTick_Handler << コメント化
.extern XXX_handler << 割り込みハンドラー関数を宣言
# Top of Stack
.long _sp_base
# Reset Handler
.long _startup+1
.org 0x0C << コメント化
# HardFault
.long BreakPoint_Handler + 1 << コメント化
.org 0x3C << コメント化
# SysTick Handler
.long SysTick_Handler + 1 << コメント化
# USART1
.org 0xD4 << コメント化
.long USART_handler + 1 << コメント化
# 割り込み設定
.org 0xXX << 割り込み位置を指定
.long XXX_handler + 1 << 割り込みハンドラー関数を指定。(thumbモードなので+1)
.org 0xEC
.global _startup
_startup:
LDR r1, =_sdata_loadaddr
LDR r2, =_sdata
LDR r3, =_edata
__copy_loop:
LDRB r4, [r1]
STRB r4, [r2, #0]
ADD r1, r1, #1
ADD r2, r2, #1
CMP r3, r2
BGT __copy_loop
LDR R0, =main
LDR R1, =0x1
ORR R0, R1
BX R0
-----------startup.s---end-------------------
※割り込み位置 例UART0の場合
UART0の Interrupt Vector Number: 21
==> 21 X 4 = 84
==> 0x54
3)memory.defの修正。
memory_thumb.def を memory.defに
-----------memory.def------------------------
SECTIONS
{
.start 0x08000000 : { <<.start 0x00000000 に修正
_stext = .;
startup_thumb.o(.text)
_etext = .;
}
.text : {
_stext = .;
*(.text)
_etext = .;
}
.rdata : {
_srdata = .;
*(.rodata)
*(.rodata.str1.4)
_erdata = .;
}
.data 0x20000000: AT (LOADADDR(.rdata)+SIZEOF(.rdata)) {
_sdata_loadaddr = LOADADDR(.rdata)+SIZEOF(.rdata);
_sdata = .;
*(.data)
*(.zdata)
_edata = .;
}
.bss : { << 削除
_sbss = .; << 削除
*(.bss) << 削除
*(.comment) << 削除
_ebss = .; << 削除
} << 削除
_end = .;
. = ALIGN(0x4);
. += 0x200;
_sp_base = .;
}
-----------memory.def------------------------
4)Malkefileの修正。
Malkefileは 適宜に修正
Lumirary MicroR Flash Progremmer用のバイナリファイルのために
$(OBJCPY) -O binary gcc_sample_thumb gcc_sample_thumb.bin を使用する。
コンパイルオプションは
$(AS) -mcpu=cortex-m3 -mthumb --defsym THUMB=1 startup.s -o startup_thumb.o
$(CC) -mcpu=cortex-m3 -mthumb -c $< -o gcc_sample_thumb.o
を参考にする。
4.各サンプルプログラムプロジェクトのビルドおよび実行
1)「blinky」
・LED1の点滅を確認
2)「hello」
・表示メッセージを変更
・表示位置を変更
・表示明度を変更
3)「graphics」
・テロップ表示を変更
"This Aplication Developed by GNU gcc !" 写真はこのテロップの一部が表示された状態。
4)「uart_echo」
・PC ターミナルソフトからのキー入力を返す(エコーバック)を確認
・PC ターミナルソフトからのキー入力を表示するように変更
5.デモプログラムの復旧 ※2010.1.29追記
この評価キットのデモプログラム(ゲーム)の復旧は以下の手順で行う。
1)以下のデモプログラムの存在を確認 (ドライブCの場合)
C:\StellarisWare\boards\ek-lm3s8962\qs_ek-lm3s8962\gcc\qs_ek-lm3s8962.bin
*存在しない場合Luminary MicorのHPより、EK-LM3S8962 Firmware Development Packegeをダウンロード、インストール実行
2)Luminary MicorR Flash Programmerで上記のファイルを評価キットに書き込む。
①Configratoinタグ
Quick Setで「LM3S8962 Ethernet and CAN Evaluation Boad」を選択
②Programタグ
Select .bin fileで 上記ファイル「qs_ek-lm3s8962.bin」を選択
③Program実行
※IAR Embedded Workbenchによる開発 から GNU gccによる開発へ移行できなかった機能。
・cspy.cの持つ関数(Diag系関数)
※最初、生成したバイナリファイルXXX.binが500MB超えのファイルになった、確かにメモリマップを忠実にレイアウトすると、RAM領域0x20000000で512MB以上が確保されてしまう。始めは、仕方ないと思っていましたが、Flash Progremmerが受け付けないので色々試しているうちに、10KB前後のサイズになった。所定の機能が実現できたのでこれで良しと判断、結果オーライの感があり、少々不満。
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿