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前後のサイズになった。所定の機能が実現できたのでこれで良しと判断、結果オーライの感があり、少々不満。

0 件のコメント:

コメントを投稿