Sim's blog

電子工作はじめてみました

CCEの検証

2008-06-23 03:06:40 | MSP430
TIの無償開発ツールCode Composer Essentialsで使えるコードサイズについて調べてみました。
CCEのページには「CCE v3(MSP-CCE430)は無償で、最大 16K バイトのコード領域をサポートします。」と書かれています。コードとデータを合わせて16kバイトなのか、それともコードだけで16kなのか、よく分かりません。
言葉があいまいというか、コードサイズというとデータを含む場合もあったりします。わざわざコード領域という言葉を使っているということは、データ抜きの純粋なコードサイズのみで16kバイトという意味なのかもしれません。もしそうならラッキーです。


検証用に書いてみたコードは次のようなものです。
#include "msp430x42x0.h"

static const char x[0x6000] = {1};

main()
{
    int i;

    WDTCTL = WDTPW + WDTHOLD;
    P1DIR |= 0x01;

    while(1){
        for(i = 0; i < sizeof(x); i++){
            P1OUT ^= x[i];
        }
    }
}

ROM領域に24kバイトの配列がいます。先頭だけ1でそれ以外は0です。
コード自体はとても小さいですが、データは大きいプログラムです。
このプログラムはCCEで何の問題もなくコンパイルできて、さらにトラ技2007年1月号のMSP430-F4270基板で動きました。
デバッグ開始時のメッセージは以下のようなものでした。

MSP430: Program loaded. Code Size - Text: 254 bytes Data: 24608 bytes

CCEで制限されているコードサイズはTextの部分じゃないかと思います。

MSP430-F4270はROMが32kバイト(8000-ffff)、RAMが256バイト(200-2ff)です。配列xは8000-dfffの24kバイトでした。プログラムの先頭はe000でした。

とりあえずデータのサイズに制限がないなら事実上無制限といってよいくらいだと思います。


次に16kバイト以上のコードを作ってみます。
#include "msp430x42x0.h"

main()
{
    WDTCTL = WDTPW + WDTHOLD;
    P1DIR |= 0x01;
    
    while(1){
        P1OUT = 0x00; // LED点灯 (2000個)
        P1OUT = 0x00;
        省略
        P1OUT = 0x00;
        P1OUT = 0x00;

        P1OUT = 0x01; // LED消灯 (2037個)
        P1OUT = 0x01;
        省略
        P1OUT = 0x01;
        P1OUT = 0x01;
    }
}

ひたすらコピペして作りました。P1OUTに代入する行が4036個のときのコードサイズが16382バイトでした。つまり16kバイト-2バイトです。ちなみに1行毎に4バイトかかります。1行追加して16kバイトを2バイト超えたときにリンカーのエラーが出ました。エラーメッセージは次のようなものでした。

error: output file "test3.out" exceeds code size limit

コードサイズは16kバイトを超えられないようです。

試しに1024バイトの配列を参照するようにしてみました。デバッガでロードしたときのメッセージは

MSP430: Program loaded. Code Size - Text: 16384 bytes Data: 1054 bytes

になりました。TextセクションとDataセクションをあわせると16kバイトを超えていますが、コンパイルもリンクも問題なく通りました。


まとめると、CCEの無償版はデータを含まない純粋なコードは16kバイトを超えられないがデータのサイズに制限はなく、コードとデータを合わせて16kバイトも超えることはできる、ということになります。
とてもうれしい結果が出ました。