ラベル MicroBlaze の投稿を表示しています。 すべての投稿を表示
ラベル MicroBlaze の投稿を表示しています。 すべての投稿を表示

2010年6月25日金曜日

EDKの評価ライセンスが切れました・・・。


FreeRTOSのサンプルコード(EDK 7.1版)のEDK 12.1へのポーティング作業が終了し、これからデバッグというところでBRAMのサイズ制約にひっかかり、あえなくライセンス切れ。
動かしてみたいのですがこればかりは何ともなりません。

2010年6月22日火曜日

MicroBlaze上でFreeRTOSを動作させるための作業10

BRAMに収まらないのではないかと書きましたが、案の定何やらメッセージが出ています。

/cygdrive/c/Xilinx/12.1/ISE_DS/EDK/gnu/microblaze/nt/bin/../lib/gcc/microblaze-xilinx-elf/4.1.2/../../../../microblaze-xilinx-elf/bin/ld: region ilmb_cntlr_dlmb_cntlr is full (freertos_0.elf section .bss)
/cygdrive/c/Xilinx/12.1/ISE_DS/EDK/gnu/microblaze/nt/bin/../lib/gcc/microblaze-xilinx-elf/4.1.2/../../../../microblaze-xilinx-elf/bin/ld: section .heap [00000050 -> 0000044f] overlaps section .text [00000050 -> 00003637]
/cygdrive/c/Xilinx/12.1/ISE_DS/EDK/gnu/microblaze/nt/bin/../lib/gcc/microblaze-xilinx-elf/4.1.2/../../../../microblaze-xilinx-elf/bin/ld: section .stack [00000450 -> 0000084f] overlaps section .text [00000050 -> 00003637]
/cygdrive/c/Xilinx/12.1/ISE_DS/EDK/gnu/microblaze/nt/bin/../lib/gcc/microblaze-xilinx-elf/4.1.2/../../../../microblaze-xilinx-elf/bin/ld: region ilmb_cntlr_dlmb_cntlr is full (freertos_0.elf section .bss)

ilmb_cntlr_dlmb_cntlr領域とは


LMB(Local Memory Bus)に接続されたメモリコントローラが管理する領域で、実態はBRAMインターフェースコントローラです。
メモリ空間はどういうサイズ設定にしたのかを確認すると


16Kのサイズで設定してあります。

では「これを倍にしてしまえ!」という話になりますが、32KにするとXC3S200では

ERROR:Pack:2310 - Too many comps of type "RAMB16" found to fit this device.
ERROR:Map:237 - The design is too large to fit the device. Please check the
Design Summary section to see which resource requirement for your design
exceeds the resources available in the device. Note that the number of slices
reported may not be reflected accurately as their packing might not have been
completed.

となりデバイスに収まりきりません。

EDK評価ライセンスも後2日と表示が出ています。
あと少しの作業で実機動作確認というところまで辿り着いたのですが困りました。

MicroBlaze上でFreeRTOSを動作させるための作業8

リファレンスが見つからない件は以下のような結果でした。
EDK 7.1からEDK 12.1への乗り換え時に参考になるかもしれません。

./src/port.o: In function `prvSetupTimerInterrupt':
../src/port.c:278: undefined reference to `XTmrCtr_mDisable'
../src/port.c:280: undefined reference to `XTmrCtr_mSetLoadReg'
../src/port.c:281: undefined reference to `XTmrCtr_mSetControlStatusReg'
../src/port.c:290: undefined reference to `XTmrCtr_mSetControlStatusReg'
../src/port.c:291: undefined reference to `XIntc_mAckIntr'

「XXX_mXXX」は「XXX_XXX」にした。命名規則を変更したようだ。

./src/port.o: In function `vTaskISRHandler':
../src/port.c:322: undefined reference to `XIntc_mAckIntr'
../src/port.c:328: undefined reference to `XIntc_mAckIntr'

「XXX_mXXX」は「XXX_XXX」にした。命名規則を変更したようだ。

./src/port.o: In function `vTickISR':
../src/port.c:345: undefined reference to `XTmrCtr_mGetControlStatusReg'
../src/port.c:346: undefined reference to `XTmrCtr_mSetControlStatusReg'

「XXX_mXXX」は「XXX_XXX」にした。命名規則を変更したようだ。

./src/serial.o: In function `xSerialPortInitMinimal':
../src/serial.c:96: undefined reference to `XUartLite_mDisableIntr'
../src/serial.c:99: undefined reference to `XIo_In32'
../src/serial.c:100: undefined reference to `XIo_Out32'
../src/serial.c:105: undefined reference to `XUartLite_mEnableIntr'
../src/serial.c:112: undefined reference to `XIntc_mAckIntr'

#include "xio.h"を追加した。
「XXX_mXXX」は「XXX_XXX」にした。命名規則を変更したようだ。

./src/serial.o: In function `xSerialPutChar':
../src/serial.c:145: undefined reference to `XUartLite_mIsTransmitFull'
../src/serial.c:167: undefined reference to `XIo_Out32'

#include "xio.h"を追加した。
「XXX_mXXX」は「XXX_XXX」にした。命名規則を変更したようだ。

./src/serial.o: In function `vSerialISR':
../src/serial.c:190: undefined reference to `XIo_In32'
../src/serial.c:197: undefined reference to `XIo_In32'
../src/serial.c:208: undefined reference to `XIo_Out32'

#include "xio.h"を追加した。
「XXX_mXXX」は「XXX_XXX」にした。命名規則を変更したようだ。

ということでほとんど実質変更なしといった結果でした。
EDKの評価ライセンスは後2日。
うーん。

2010年6月20日日曜日

MicroBlaze上でFreeRTOSを動作させるための作業7

ペリフェラルのベースアドレスや割り込みマスクの定義を今回のハードウェア用に書き直しました。
結果的にコンパイルは通るようになりましたが、幾つかのAPIは名称変更や機能変更があるようです。

./src/port.o: In function `prvSetupTimerInterrupt':
../src/port.c:278: undefined reference to `XTmrCtr_mDisable'
../src/port.c:280: undefined reference to `XTmrCtr_mSetLoadReg'
../src/port.c:281: undefined reference to `XTmrCtr_mSetControlStatusReg'
../src/port.c:290: undefined reference to `XTmrCtr_mSetControlStatusReg'
../src/port.c:291: undefined reference to `XIntc_mAckIntr'

./src/port.o: In function `vTaskISRHandler':
../src/port.c:322: undefined reference to `XIntc_mAckIntr'
../src/port.c:328: undefined reference to `XIntc_mAckIntr'

./src/port.o: In function `vTickISR':
../src/port.c:345: undefined reference to `XTmrCtr_mGetControlStatusReg'
../src/port.c:346: undefined reference to `XTmrCtr_mSetControlStatusReg'

./src/serial.o: In function `xSerialPortInitMinimal':
../src/serial.c:96: undefined reference to `XUartLite_mDisableIntr'
../src/serial.c:99: undefined reference to `XIo_In32'
../src/serial.c:100: undefined reference to `XIo_Out32'
../src/serial.c:105: undefined reference to `XUartLite_mEnableIntr'
../src/serial.c:112: undefined reference to `XIntc_mAckIntr'

./src/serial.o: In function `xSerialPutChar':
../src/serial.c:145: undefined reference to `XUartLite_mIsTransmitFull'
../src/serial.c:167: undefined reference to `XIo_Out32'

./src/serial.o: In function `vSerialISR':
../src/serial.c:190: undefined reference to `XIo_In32'
../src/serial.c:197: undefined reference to `XIo_In32'
../src/serial.c:208: undefined reference to `XIo_Out32'

それだけではなく「.textと.bssが一杯だ」と警告も出ています。
「あれ?リンカスクリプトなんてどこで作ったっけ?」という感じです。

ポーティングもその辺のケアが必要な段階まで進んできたということですね。

MicroBlaze上でFreeRTOSを動作させるための作業6

Xilinx Software Development Kit 12.1を使ってコンパイルするところまで到達。

../src/port.c: In function ‘vPortYield’:
../src/port.c:257: error: conflicting type qualifiers for ‘uxCriticalNesting’
../src/port.c:89: error: previous definition of ‘uxCriticalNesting’ was here
../src/port.c: In function ‘prvSetupTimerInterrupt’:
../src/port.c:277: warning: implicit declaration of function ‘XTmrCtr_mDisable’
../src/port.c:277: error: ‘XPAR_OPB_TIMER_1_BASEADDR’ undeclared (first use in this function)
../src/port.c:277: error: (Each undeclared identifier is reported only once
../src/port.c:277: error: for each function it appears in.)
../src/port.c:277: error: ‘XPAR_OPB_TIMER_1_DEVICE_ID’ undeclared (first use in this function)
../src/port.c:279: warning: implicit declaration of function ‘XTmrCtr_mSetLoadReg’
../src/port.c:280: warning: implicit declaration of function ‘XTmrCtr_mSetControlStatusReg’
../src/port.c:284: error: ‘XPAR_OPB_INTC_0_BASEADDR’ undeclared (first use in this function)
../src/port.c:285: error: ‘XPAR_OPB_TIMER_1_INTERRUPT_MASK’ undeclared (first use in this function)
../src/port.c:290: warning: implicit declaration of function ‘XIntc_mAckIntr’
../src/port.c: In function ‘vTickISR’:
../src/port.c:344: warning: implicit declaration of function ‘XTmrCtr_mGetControlStatusReg’
../src/port.c:344: error: ‘XPAR_OPB_TIMER_1_BASEADDR’ undeclared (first use in this function)
make: *** [src/port.o] Error 1

こんな風に順調にエラーを出してくれてます。
カーネルソースの部分についてはティックタイマー(とその割り込みコントローラ)のエラーだけです。

2010年6月19日土曜日

MicroBlaze上でFreeRTOSを動作させるための作業5

FreeRTOSのデモプロジェクトにあるMicroBlazeポートで割り込みコントローラがどのように使われているのかを調べました。
system.mhsを見ると以下のようになっています。

BEGIN opb_intc
PARAMETER INSTANCE = opb_intc_0
PARAMETER HW_VER = 1.00.c
PARAMETER C_BASEADDR = 0x41200000
PARAMETER C_HIGHADDR = 0x4120ffff
PARAMETER C_HAS_IPR = 0
BUS_INTERFACE SOPB = mb_opb
PORT Irq = Interrupt
PORT Intr = RS232_Uart_Interrupt & opb_timer_1_Interrupt
END

この事から一つの割り込みコントローラでRS-232CとTimer1の割り込みを制御していることがわかります。そこで「Ports」タブにあるxps_intr_0のIntrを下記のように設定しました。


同時にsystem.mhsからTimerのパラメータも確認しておきます。
BEGIN opb_timer
PARAMETER INSTANCE = opb_timer_1
PARAMETER HW_VER = 1.00.b
PARAMETER C_COUNT_WIDTH = 32
PARAMETER C_ONE_TIMER_ONLY = 1
PARAMETER C_BASEADDR = 0x41c00000
PARAMETER C_HIGHADDR = 0x41c0ffff
BUS_INTERFACE SOPB = mb_opb
PORT OPB_Clk = sys_clk_s
PORT Interrupt = opb_timer_1_Interrupt
END
32ビットカウンタで1つのタイマーを設定しています。

MicroBlaze上でFreeRTOSを動作させるための作業4

ハードウェアコンフィギュレーションのステップを整理します。
Xilinx Platform Studioのバージョンは12.1です。

バスインターフェースを設定します。
バスインターフェース設定画面に対する編集はsystem.mhsに反映されます。


アドレスを設定します。
アドレス設定画面に対する編集はmicroblaze_0/include/xparameters.hに反映されます。


ポートを設定します。
ポート設定画面に対する編集はsystem.mhsに反映されます。


これら3つの設定でひとまずハードウェアコンフィギュレーションとしては完了です。
あとはUCFを設定したりするだけ。
ツールのこの辺りの動作は信頼できそうです。

割り込みハンドラなどは別途設定が必要。
これは別途記載する予定。

MicroBlaze上でFreeRTOSを動作させるための作業2

昨日は手始めに既存のFreeRTOSデモプロジェクトをXilinx Platform Studio 12.1で開いてみました。
このデモプロジェクトはかなり以前のバージョンのツールで作られているようです。
期待通り変換は大失敗し、プロジェクトファイルとして成立しませんでした。
聞くところによるとMicroBlazeのPLB(Processor Local Bus)の仕様もどこかの時点で変更されたとのことです。

適当にホイホイやってもうまくいかなそうなので現状を整理してみました。

まず、デモプロジェクトで使用しているボードはXilinxが提供しているML403というなかなか豪華なボードです。まぁ、使うのはUSARTやGPIO(LED点灯用)、それにプロセッサのタイマーなので気にしなくても良いでしょう。

次に使っているペリフェラルを見てみます。
先日のプロジェクト変換リポートから情報を抽出します。

矢印が付いているものは見つかったハードウェアコアのバージョンが更新されているもの。
?が付いているものは見つからないハードウェアコアです。

lmb_bram_if_cntlr 1.00.b -> 2.10.b
opb_mdm?
opb_v20 1.10.c -> 1.10.d
microblaze 4.00.a -> 7.30.a
opb_uartlite?
opb_gpio?
opb_intc?
opb_timer?
intc 1.00.c -> 2.00.a
tmrctr 1.00.b -> 2.00.a
gpio 2.00.a -> 2.00.a
uartlite 1.00.b -> 2.00.a
bram 1.00.a -> 2.00.a
opbarb 1.02.a -> 1.12.b

opb_xxxという不明なハードウェアコアがあります。
調べたところOPB(On-chip Peripheral Bus)というのはPLB以前のプロセッサ内部バスのようです。
opb_xxxはハードウェアコア(ペリフェラル)とバスの接続モジュール(ブリッジ?)のようです。
既にこの仕様はPLB(Processor Local Bus)に代わったものですので無視して良さそうです。

ハードウェアコアとしてブロックラムも使用しているようです。
以前のMicroBlazeはRAM周辺の扱いも異なっていたのでしょう。
最近のバージョンではプロセッサが使用するラムはプロセッサの作成時に定義するようになっています。
この点からブロックラムのハードウェアコアについても気にすることはなさそうです。

FreeRTOSをMicroBlazeへポーティングするのに必要となるのは
・MicroBlaze本体
・割り込みコントローラ
・カーネルティック用タイマー
・USART
です。

これから考えるとハードウェアとしては
・microblaze 7.30.a
・intc 2.00.a
・tmrctr 2.00.a
・usartlite 2.00.a
だけ用意すれば事足りそうです。


戦略としては
・空のプロジェクトを作成する。
・ハードウェアコアを追加する。
・ハードウェアテストコードを作成する。
・ハードウェア動作を確認する。
・FreeRTOSのコードを移植する。
という方向で行きたいと思います。

こんな感じで調べながらのポーティング。
探偵か何かになった気分でなかなか楽しいです。

2010年6月18日金曜日

MicroBlaze上でFreeRTOSを動作させるための作業1

FreeRTOSのデモにあるプロジェクトは随分古いバージョンのEDKで作られているようです。
system.mhsを見るとEDK 7.1となっていますので、2004年頃のポーティングのようです。

考えあぐねても進まないので12.1を使ってプロジェクトをアップデートしてみました。


案の定・・・沢山のコアが見つからないと叫んでいます。(This is from Version_Changes.log)
The following files will be modified:
system.mhs
system.mss

--------------------------------------
The following changes will be made:
Core dcm_module 1.00.a will be replaced by 1.00.e

Driver cpu 1.00.a will be replaced by 1.12.b
--------------------------------------
The following changes need to be made manually by the user:

Core lmb_bram_if_cntlr 1.00.b needs to be replaced by 2.10.b
No core by the name of opb_mdm was found.
Please check the mhs file and repository.
Core opb_v20 1.10.c needs to be replaced by 1.10.d
Core microblaze 4.00.a needs to be replaced by 7.30.a
No core by the name of opb_uartlite was found.
Please check the mhs file and repository.
No core by the name of opb_gpio was found.
Please check the mhs file and repository.
No core by the name of opb_intc was found.
Please check the mhs file and repository.
No core by the name of opb_timer was found.
Please check the mhs file and repository.
Driver intc 1.00.c needs to be replaced by 2.00.a
Driver tmrctr 1.00.b needs to be replaced by 2.00.a
Driver gpio 2.00.a needs to be replaced by 2.00.a
Driver uartlite 1.00.b needs to be replaced by 2.00.a
Driver bram 1.00.a needs to be replaced by 2.00.a
Driver opbarb 1.02.a needs to be replaced by 1.12.b
この中で特に注意したいのは
No core by the name of opb_mdm was found.
No core by the name of opb_uartlite was found.
No core by the name of opb_gpio was found.
No core by the name of opb_intc was found.
No core by the name of opb_timer was found.
ですかね。
まぁ、まだよく見ていないのでわかりませんが。

MicroBlazeが動作し始めたので調子に乗って進める予定。
カーネルソースの中から使っているコアと用途を整理して一つずつポートするのが良いでしょう。

評価用ライセンスは後6日。

2010年6月17日木曜日

DIGILENTのSPARTAN-3 starter kitでビットストリームを流してもdoneしない件の解決編

先日のビットストリームを流してもdoneしない件は凡ミスでした。
ボードのFPGAコンフィギュレーションモードの設定を間違っていました。
ビットストリームを流し込むのですから正しくは以下赤枠の設定です。


つまらないコードですが以下で動作を確認。
#include "xparameters.h"
#include "xgpio_l.h"

int main(void)
{
int num = 0x55;
while (1) {
XGpio_WriteReg(XPAR_LED_BASEADDR, 0, num & 0xff);
}
}


LED点灯。
GPIOはUCFで8個並んだLEDに割り当てています。

これにGPIOの入力を組み合わせてみます。

#include "xparameters.h"
#include "xgpio_l.h"

int main(void)
{
int val;
while (1) {
val = XGpio_ReadReg(XPAR_TGLSW_BASEADDR, 0);
XGpio_WriteReg(XPAR_LED_BASEADDR, 0, val);
}
}

入力GPIOはボード右下にあるスライドスイッチに割り当ててあります。
これでスライドスイッチの状態に合わせてLEDが点灯するデモの出来上がりです。

さて次はOSの搭載ですかね。
えーと、EDKの評価ライセンスは後7日です。
遊びながらなのでかなり厳しいです。

2010年6月12日土曜日

DIGILENTのSPARTAN-3 starter kitでビットストリームを流してもdoneしない

EDKを使ってMicroBlazeを動作させるための準備。
エンベデッドシステム開発のテキストを参考に、まずはTestApp_Memory_microblaze_0を動作させる。


・・・doneしない。

ビットストリーム作成までの手順にバグがありそうだ。
EDK 12.1からはDigilent社製のSpartan-3 Starter BoardがBSPから外れている。
仕方が無いのでデバイスの選択から作成している。

これはあちこち追うことになりそう。

AltStyle によって変換されたページ (->オリジナル) /