Sim's blog

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

Code Composer Essentials V3を使ってみました。

2008-06-22 23:49:34 | MSP430
Code Composer EssentialsTIMSP430用のCコンパイラです。6/5に開催されたTIのMSP430入門セミナー2008に参加したとき無料版があることを知りました。ダウンロードするのにmy.TI accountに登録する必要があります。
バージョンは3.2.1.1.5です。

「CCE v3(MSP-CCE430)は無償で、最大 16K バイトのコード領域をサポートします。」と書かれています。以前使ったIARはアセンブラなら無制限、Cなら4kバイトでした。このあたりは要検証です。

IDEはEclipseです。日本語化されていないのでメニューとかは英語です。設定を変えるとソースに日本語をいれることもできます。逆に言うと設定を変えないと日本語がいれれません。

on chip debugもサポートしています。eZ430やトラ技2007/1のJTAGデバッガが使えます。hamayanさん設計のデバッガの基板はマルツで入手できます(リンク)。一応、どちらも動作することを確認しました。

eZ430用のLEDチカチカです(<が全角になっています)。
#include "msp430x20x3.h"

main()
{
    int i;
        
    WDTCTL = WDTPW + WDTHOLD;
    P1DIR |= 0x01;              // P1.0出力

    while(1){
        P1OUT ^= 0x01;
        for(i = 0; i < 10000; i++) ;
    }
}

debugモードでbuildすると、そのままで動きます。releaseモードでbuildすると最適化のせいでforがなくなってしまってウェイトなしになります。超高速で点滅しているので、ずっと点いているように見えます。forループに_nop();をいれるとループが消えることはなくなります。
最適化でループが消えるときの常道はvolatile宣言にすることです。変数iをvolatile int i;のように宣言すると、ループが消えることはなくなります。ただし変数がメモリの上に取られるようになるので結構遅いコードになります。

debugモードでも変数iをregister宣言すると(register int i;)、律儀にレジスタに割り付けてくれます。releaseモードだとregister宣言がなくてもレジスタに割り付けてくれます。ただしループが消えるのでreleaseモードのときは_nop();付きです。
volatile宣言すると、debugモードでもreleaseモードでも変数iはメモリに割り付けられました。試しにregister volatile int i;という宣言をしてみましたが、メモリに割り付けられました。
結構かしこいです。