LPC15xxのRTOSライブラリによるメモリマッピングついて

06 May 2014

現在、LPC15xxでRTOSライブラリを用いてコーディングしようとしています。 ところが、LPC15xxで mbed offical のRTOSライブラリをインポートしコーディングすると以下のコードにLPC15xxが定義されていない為ビルドエラーになります。その為、以下の変更を行ってみました。

RTX_Conf_CM.c RTX_CM_lib.h

RTX_Conf_CM.c を以下に変更 52行目

- # if defined(TARGET_LPC1768)|| defined(TARGET_LPC2368) || defined(TARGET_LPC4088) || defined(TARGET_LPC1347) || defined(TARGET_K64F) \

+ # if defined(TARGET_LPC1768)|| defined(TARGET_LPC1549) || defined(TARGET_LPC2368) || defined(TARGET_LPC4088) || defined(TARGET_LPC1347) || defined(TARGET_K64F) \

65行目

- # if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) || defined(TARGET_LPC4088) || defined(TARGET_LPC1347) || defined(TARGET_K64F) \

+ # if defined(TARGET_LPC1768) || defined(TARGET_LPC1549) || defined(TARGET_LPC2368) || defined(TARGET_LPC4088) || defined(TARGET_LPC1347) || defined(TARGET_K64F) \

115行目

- # elif defined(TARGET_LPC1347) || defined(TARGET_STM32F303VC)

+ # elif defined(TARGET_LPC1347) || defined(TARGET_STM32F303VC) || defined(TARGET_LPC1549)

また、RTX_CM_lib.hは - #if defined(TARGET_LPC1768)

  1. define INITIAL_SP (0x10008000UL)

+ #if defined(TARGET_LPC1768) || defined(TARGET_LPC1549)

  1. define INITIAL_SP (0x10008000UL)

でビルドは通りました。 ところが、LPC15XX.pdf (15/99P)と LPC1769_68_67_66_65_64_63.pdf (23/88P)で比較すると

LPC17xxではRTOSで使う場所を /media/uploads/kazu_zamasu/lpc17xx.png

LPC15xxでは /media/uploads/kazu_zamasu/lpc15xx.png

RTOSのLPC17xxは #define INITIAL_SP (0x10008000UL) ですので、MemMapとLPC17xx.h(mbedライブラリ>TARGET_LPC1768>LPC17xx.h)ではRTOSのcallocをこの領域からとっており、とっている場所はReserveの#define LPC_RAM_BASE (0x10000000UL) です。

同じく、LPC15xx.hも確認しましたがそちらではこの領域については定義しておらずGPIOから先しか記載がありませんでした。

この比較だと、どのReserve領域でLPC15xxのRTOS用のメモリマップするのが正解なんでしょうか?

RTOSはメモリ自体はboxで8byteづつとって管理はされているようで、今ところ不具合は出ていませんが・・・

一応、動かしてみたサンプルコードを添付しておきます。
#include "mbed.h"
#include "rtos.h"

DigitalOut led1(P0_29);

DigitalOut led2(P0_9);

Serial pc(USBTX, USBRX); tx, rx

int a;

void led2_thread(void const *argument) {

while (true) {

led2 = !led2;

a = a + 1;

Thread::wait(100);

}

}

int main() {

Thread thread(led2_thread);

while (true) {

pc.printf("\033[2J");

pc.printf("\033[1;1H");

pc.printf("%d",a);

led1 = !led1;

Thread::wait(200); }

}

29 Apr 2014

こんにちは。

残念ながら、現在の mbed LPC1549 SDK にRTOS対応は未だ含まれておりません。

使用するメモリ領域については、内蔵RAMの先頭なのでおそらく 0x02000000 となると思いますが、RTOS対応時に詳細な検証が必要だと思われます。

29 Apr 2014

0x10008000からとっているのが17xxでこっちは、LPC17xx.hの記載で0x10000000からがRAMになってるんですよ・・・ ただし、RTOSが使うのは0x10008000のreserveからです。 15xx.hにはその記載がなくてその辺りで悩む感じです。一応、インクルードして動いていはいるんですが、最終的には検証待ですね・・・ おなじ領域と見立てて、0x02009000のreserve領域で考えてみます。17xxはreserve領域でとっていたので。

ありがとうございます。

29 Apr 2014

大変失礼しました。RAM_BASEと勘違いしていました。 ご指摘のようにLPC1549の場合は、0x02009000になると思います。

-r ビルドして、libraries/tests/rtos のコードを走らせてテストします。 何か問題があれば、またご連絡します。

29 Apr 2014

RTOS関連のテストケースは全部通りましたので、Pull request 投げました。 https://github.com/mbedmicro/mbed/pull/283

お急ぎの場合は、こちらをご覧下さい。 https://github.com/toyowata/mbed/commit/e5a61c07c03c3d883469e251a71cd0d8c4876677

宜しくお願いします。

30 Apr 2014

ありがとうございます。こちらでもメモリマップ変更して動かしています。ライブラリ側が更新されればそれば最良ですので助かります。 ありがとうございました♪