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

2010年7月20日火曜日

FreeRTOS for STM32F103 with gcc 4.4.x. (It don't use any evaluation software. It is based on open source software.)

A few days ago, I was checked with 'LED toggle demo program' on CQ-STARM board.
The board has STM32/Cortex-M3. It's not so good example.
(Hey! It's 32 bits MPU! Why don't you use the power of it!)

So, I decided to port FreeRTOS to the board.
http://www.freertos.org/
The clock is 72M[Hz], It can be pracical application.


The design of FreeRTOS is great.
It is easy to port to another platform.
Many demo projects in FreeRTOS uses evaluation software.
(e.g:Rowley CrossWorks, IAR, Keil, Red Suite)
So many users don't like evaluation software I know.
You can try this port if you don't like use it.

  • The environment is Ubuntu 10.04 with open source software.
    • It don't use any evaluation software. I don't like it :)
  • The demo project oriented from CORTEX_STM32F103_Primer_GCC.

The concept is 'Our environment should be free'.

(Download from here)

I hope to your helps!

2010年7月18日日曜日

CQ-STARMでFreeRTOSを動作させる。(arm-none-eabi-gcc)

先日の時点でCQ-STARMでLEDをチカチカさせることは確認済みです。
せっかくSTM32/Cortex-M3が搭載されている基板なのですから、これだけでは楽しくありません。

そこで調子に乗ってFreeRTOSの最新版をこの基板で動作させることにしました。
http://www.freertos.org/
クロックは72M[Hz]ですから、かなり実用的なアプリケーション開発ができそうです。


FreeRTOSは、その優れた設計思想のおかげでかなり楽にポーティングが可能なOSとなっています。昨夜から始めたポーティング作業が完了したのでファイルにまとめてアップロードしておきます。
何かの参考になれば幸いです。
  • ポーティングはUbuntu 10.04上にオープンソースなソフトウェアのみで行いました。
    • 制限の付いた商用ツールなどは使っていません。(あまり使う気になれない。)
  • DemoはCORTEX_STM32F103_Primer_GCCを元にしています。
皆さん様々なところで取り組まれているわけですが、 今回は商用ツールレスで実現しようというコンセプトでポーティング作業を行いました。

ダウンロードはこちらから(Download from here)

オープンソースソフトウェアを中心に構成した開発環境では情報が分散しがちです。
ダウンロード先にファイルが何らかのヒントになれば幸いです。

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年1月1日金曜日

AN1264

FreeRTOSでリンクされているMicorochipTechnology社のアプリケーションノートAN1264はPICを使用しない人にとってもわかりやすく整理された文書。

特に文中にあるダイアグラムはデザインアプローチとして参考になる。



それだけではなく、古典的な手法からRTOSを用いることのメリットや、グラフィック描画やタッチスクリーンに関する実例を挙げて詳しく説明してある。



お勧めのアプリケーションノート。

2009年10月14日水曜日

ATmega8でFreeRTOSを動かしてみる

さすがに8[KB]のフラッシュには載りきらない。
OSを載せてタスクを2つも立てれば領域を使い切ってしまう。
ちょっと実用的とは言えない。


でも逆に言うとこのくらいのサイズでも動くということ。

2009年10月12日月曜日

B037 : System tasks

システムのサービスを下にタスクアーキテクチャの概要を練って。
サービスを再度見直す。
サービスを見直したら再度タスクアーキテクチャを見て・・・

手直しをしながらサービスのどこをどのタスクが担うのか整理する。
FreeRTOSはシンプルな内部タスク通信と排他制御で開発者をサポートしてくれる。
デザインして純粋に楽しい。


2009年10月8日木曜日

Inter-task Communicationの続き

xSemaphoreHandleを使った排他制御、同期メカニズムのテストを実施。
うーん。これも良い感じ。素敵です。

次の作業としては・・・
  • タスクの関係を本番用に整理して図式化する。
  • インチキなUSARTドライバを廃止してFreeRTOSのserialドライバを拡張するようにする。
ということにしたい。

ところで、最近ジッタなどを計測するためにオシロの購入を検討しています。
LeCroyのWaveAceが素敵!と思ったら日本国内は一カ月で販売終了となっていました。
うーん。

http://www.lecroy.com/tm/products/scopes/WaveAce/

2009年10月7日水曜日

Inter-task Communication


FreeRTOSのInter-task Communicationを試す。

xQueueHandleに対してxQueueSendToBackでキューイング。
xQueueReceiveでキューから取り出せばいい。

なかなか良い感じ。


2009年9月19日土曜日

Taskの性質

FreeRTOS V4.0.0までのバージョンでは自立したタスク構造によるリアルタイムアプリケーションのみが提供されていた。これはRTOSスケジューラによる従来のモデルである。

概要:
RTOSを用いたリアルタイムアプリケーションは独立したタスクのセットにより構成することができる。それぞれのタスクは、システム内部の他のタスクやスケジューラ自身によって使用することのない自身のコンテキストを使って実行される。どの瞬間でも実行されるアプリケーションは1つで、リアルタイムスケジューラにはその決定をする責任がある。スケジューラはそれ故にアプリケーション実行に際して各タスクの開始と停止を繰り返し行なう。各タスクはスケジューラの活動について知らず、リアルタイムスケジューラの責任でプロセッサのコンテキスト(レジスタ値、スタック内容、その他)をスワップイン、スワップアウトする。これら各タスクのための保存は自身のスタックによって提供される。各タスクのスタックへコンテキストをセーブすることで、後で完全に復帰させることが可能になる。更なる情報は「FreeRTOSはどのように機能するのか?」を参照のこと。

Task要約
O単純
O使用時の制約なし
O完全なプリエンプション
O完全なプライオリティ付け
X各タスクがスタックを持つ結果RAM使用率が増加
Xプリエンプションを用いる場合再突入に関して十分な考慮が必要


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