TOPPERS/ASP - MSP430版

※この記事は、[筆者自身のブログ](https://www.madogiwakoubou.com/)に連載していたものを読みやすく1ページにまとめたダイジェスト版です。無断転載などではありませんのでご了承ください。

# 概要
まだマイコンに低消費電力が今ほどうるさく求められていなかった1990年代初頭（今から30年くらい前！）に、この分野にいち早く目を付けた先進的な製品がTexas Instruments（以下「TI」）の<font color="Red">MSP430</font>です。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/458e524e-53a1-6571-40c4-ef203f71ee13.jpeg">

今では、MSP432というARM（Cortex-M4）コアにMSP430のペリフェラル（周辺機器）をそのまま搭載した後継機種が出ております。
MSP432の方が性能（クロック当たりの演算スコア）が高いのは当然ですが、それほど高い処理能力は必要とせず、コスト重視、且つとにかく低い消費電力が求められるシーンでは、MSP430もまだまだ現役です。
当初はROMやRAMも小さい容量の型番しかありませんでしたが、時代とともに進化し、今では十分にRTOSの搭載も検討できる容量ラインナップも増えてきました。
そこで、このMSP430に「μITRON4.0」準拠のRTOS（リアルタイムOS）である[TOPPERS/ASP](https://www.toppers.jp/asp-kernel.html)を移植してみました。
かなりメジャーなマイコンなので、公式でリリースされていないのは不思議ですけどね。
MSP430は16ビットのマイコンで、独自コアのRISCです。
GCC系のコンパイラが提供されており、TIの開発環境やサンプルプログラムも充実しています。
MSP430最大の売りである低消費電力を保持しつつ、TOPPERS/ASPを実装することが今回のキモになります。
さて、上手く実装できるでしょうか？

# 必要なもの
TIは、自社のマイコンを搭載した評価ボードのラインナップが豊富です。
今回は、MSP430の「<font color="Red">MSP430F5529</font>」を搭載した「<font color="Red">MSP-EXP430F5529LP</font>」という評価ボードを使います。
[こちら](https://www.digikey.jp/ja/products/detail/texas-instruments/MSP-EXP430F5529LP/4311683?utm_adgroup=General&utm_source=google&utm_medium=cpc&utm_campaign=PMax%20Shopping_Supplier_Texas%20Instruments&utm_term=&productid=4311683&gclid=Cj0KCQjwy5maBhDdARIsAMxrkw1oMpe09hB1sivmQhER_4q2vI-A8hsgUrSAgjS4nRW7VnlnQFM-yUYaAspXEALw_wcB)で買うと、<font color="Red">2,500円</font>くらいですね。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/acf42e09-8b81-8280-3022-dafc4b4de963.jpeg">

他の型番への移植も可能ですが、TOPPERS/ASPを搭載して動作させるならROM：128KB／RAM：8KB以上の容量を持つ型番を選びましょう。
また<font color="Red">「MSP-EXP430F5529LP」を使用する場合、デバッガーは必要ありません。</font>
この評価ボードには既にデバッガーも実装されています。
「MSP-EXP430F5529LP」を使用しない場合は「<font color="Red">MSP-FET</font>」というMSP430に対応したTIのデバッガを使用する必要があります。
[こちら](https://www.digikey.jp/ja/products/detail/texas-instruments/MSP-FET/4914406?utm_adgroup=General&utm_source=google&utm_medium=cpc&utm_campaign=PMax%20Shopping_Supplier_Texas%20Instruments&utm_term=&productid=4914406&gclid=Cj0KCQjwy5maBhDdARIsAMxrkw1riOPozahzdUa2s4Fn2UIYr3XmdCQWzG_FleH4XFJfJjoVAwdl9pwaAsvlEALw_wcB)で買うと、<font color="Red">22,000円</font>くらいですね。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/eedcbcbc-8537-cd0f-55f4-afa60dd0f515.jpeg">

<font color="Red">高すぎてやってられません。</font>
ですので、それを搭載している「MSP-EXP430F5529LP」が如何にお買い得かが分かりますね。
このブログでは「MSP-EXP430F5529LP」を使用した場合の例を説明していきたいと思います。

# ダウンロード／GitHub
ソースコードの入手は、[こちら](https://github.com/RyutaroMorita/asp_arduino_msp430_gcc)からどうぞ。
なるべく定期的にメンテナンスするようにしていますので、動きがおかしいな？という場合は最新版に更新をお願いします。
それでもダメな場合はコメントください。

# コンパイラのインストール
何はともあれ、まずはMSP430用のコンパイラのインストールを行いましょう。
以下のページでダウンロードします。

https://www.ti.com/tool/ja-jp/MSP430-GCC-OPENSOURCE

右上の「<font color="Red">ダウンロード</font>」というボタンをクリックすると…
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/6fdcc942-04d9-f662-f831-f0f1283dd2c1.png">

以下の場所まで移動しますので、「MSP<font color="Red">430</font>-GCC-OPENSOURCE」の方の「ダウンロードオプション」ボタンをクリックしましょう。
もう一方の「MSP<font color="Red">432</font>-GCC-OPENSOURCE」の方だと、ARMのコンパイラのダウンロードになっちゃうので注意。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/dcb61eb9-a67c-b5b5-896f-ed72fb9fdc03.png">

以下の表示が出たら、目的のアーキテクチャ用のコンパイラを選択します。
このブログでは「<font color="Red">Mitto Systems GCC Windows installer incl. support files</font>」をダウンロードしたものとして説明します。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/61bcab5d-e9ae-1db1-86e5-82384a03a12c.png">

ダウンロードが完了すると「<font color="Red">msp430-gcc-full-windows-installer-x.x.x.x.exe</font>」というファイルが生成されますので、これをダブルクリック！
程なくして、以下の表示が出ます。
実行できない！？…と焦らずに「<font color="Red">詳細情報</font>」というリンクをクリックします。
<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/0d76afb3-5af3-a8df-b67a-9c4bc19b71b6.png">

そうすれば、ちゃんと「<font color="Red">実行</font>」ボタンがあらわれますので、これをクリック。
<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/391a5ef4-8d12-39d2-03b3-6ad479aff09e.png">

以降、インストーラーが起動し、しばらくは「<font color="Red">Next</font>」ボタンを連打です。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/812ecbbe-5071-acd5-5626-572648276d47.png">

<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/7fa467df-6164-47e9-415b-a6fe68e9b4d3.png">

<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/b8696da1-32e7-de04-6976-87b571a9d985.png">

インストールが始まりましたね？
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/e955ef5e-2ed2-285f-eb61-b744c7f66178.png">

インストールが完了したら「<font color="Red">Finish</font>」ボタンをクリック。
これでコンパイラがインストールされました！
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/e3bf88eb-d92f-6dde-0d9c-8a607b977dad.png">

今回使うMSP430用のツールチェーンの環境変数の設定を行います。
ツールチェーンは、先程のインストール作業により既に以下のディレクトリにセットアップされているはずです。

**C:\ti\msp430-gcc\bin**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/ffb0ae43-17e4-8aaa-7576-0d1f2058cff7.png">

環境変数の設定方法は他のページで調べていただくか、あるいは手前味噌で恐縮ですが、私のブログのページ（[TOPPERS/ASPのビルドからデバッグまで～GNUツールチェーンの導入](https://www.madogiwakoubou.com/p/toppersaspgnu.html)）の「[環境変数の設定](https://www.madogiwakoubou.com/p/toppersaspgnu.html#path)」の項目を御覧ください。
ただし、パスは…

**C:\Program Files (x86)\GNU Tools ARM Embedded\7 2017-q4-major\bin**

…となっているところを…

**C:\ti\msp430-gcc\bin**

に置き換えてください。
こんな感じ…。
<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/532d3349-ef99-e37a-2a49-d5ccccc505ad.png">

また、このページの「[パスの確認](https://www.madogiwakoubou.com/p/toppersaspgnu.html#check)」の項目で打ち込むコマンドも、以下のように変わります。

**＞ msp430-elf-gcc --version**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/93f97f11-b25a-c18d-a4bf-e90773b99384.png">

続きまして「<font color="Red">Cygwin</font>」のインストールを行います。
基本的には「gcc-core」、「make」、「diffutils」、「perl」と「git」の5つのパッケージを含むようなCygwin環境を構築すれば良いです。
もしよろしければ、私のブログのページ（[TOPPERS/ASPのビルドからデバッグまで～Cygwinの導入](https://www.madogiwakoubou.com/p/toppersaspcygwin.html)）を参考にしてください。
「Cygwin」がインストールできたら、ここまでの作業が上手くいっているかどうか確認しておきましょう。
次のページ（[TOPPERS/ASPのビルドからデバッグまで～サンプルプロジェクトのビルド](https://www.madogiwakoubou.com/p/toppersasptoppers.html)）を参照してください。
ただし、今回使用するソースコードはこのページの冒頭の<font color="Red">「NUCLEO-F401RE STM32 Nucleo-64」開発ボード用のTOPPERS/ASPカーネル簡易パッケージではなく、「MSP430」用のものを使います。</font>
以下のコマンドでソースコードのクローンを行います。

**$ git clone https://github.com/RyutaroMorita/asp_msp430_gcc.git**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/f2afa733-f907-03ce-9297-8991049e2d2c.png">

ダウンロードとGithub、いずれの場合も「asp_msp430_gcc」というディレクトリの名前を「asp_1.9.2」などと改名すると、上記のページと同じ状況になります。
また、今回は<font color="Red">「OBJ」ディレクトリを作成する必要はありません。</font>
これは既に用意されていますので、そのまま「OBJ」ディレクトリに移動し「make～」コマンドを実行してください。

# 統合開発環境のインストール
続きまして、MSP430用のIDEのインストールを行います。
IDEは、TI社純正の「<font color="red">Code Composer Studio</font>」というものを使用します。
以下のページでダウンロードします。

https://www.ti.com/tool/ja-jp/CCSTUDIO

右上の「<font color="red">ダウンロード</font>」というボタンをクリックすると…
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/4d1b17a3-0857-1e16-4996-6a46cb1e61e0.png">

以下の場所まで移動しますので、「CCSTUDIO - Code Composer Studio 統合開発環境」の右の「<font color="red">ダウンロードオプション</font>」ボタンをクリックしましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/254cf86d-df10-ce13-5037-919d44b22654.png">

以下の表示が出たら、目的のタイプのコンパイラを選択します。
このブログでは「<font color="red">Windows single file (offline) installer for Code Composer Studio IDE (all features, devices)</font>」をダウンロードしたものとして説明します。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/5850341d-1afb-7082-904a-1c969780d1c7.png">

ダウンロードが完了すると「<font color="red">CCS12.x.x.xxxxx_win64.zip</font>」というファイルが生成されますので、これを解凍します。
解凍されて生成された「<font color="red">CCS12.x.x.xxxxx_win64</font>」ディレクトリの中に「<font color="red">ccs_setup_12.x.x.xxxxx.exe</font>」というファイルがあります。
これがインストーラー本体ですので、ダブルクリック！
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/7523e475-5e3d-f610-033f-f1bb965c9b3f.png">

以下のように、インストーラーが起動しますので「<font color="red">Next</font>」ボタンをクリックです。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/74b646e4-d118-88dc-1a1f-1e6707448a52.png">

以下の表示は、もはや儀式。
「<font color="red">I accept the agreement</font>」を選択して「<font color="red">Next</font>」ボタンをクリックします。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/774799e5-9620-12ea-76e3-8c6814f82d62.png">

この画面は、特に何もする必要がなく「<font color="red">Next</font>」ボタンをクリック。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/3a1a9f7e-3a10-05fe-87a0-c7a8cffd7380.png">

ここで以下の警告、「ペンディングされた再起動があるから、続けるならPCを再起動してけろ…」って、よく分からないが…とりあえず「<font color="red">OK</font>」ボタンをクリックしましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/a1e8a7e8-831b-10ca-1244-9222cab13840.png">

自動的に再起動食らうのでは？と思いましたが、そういうこともなく以下の表示が出ます。
続けて良いんだよな？
ならば「<font color="red">Next</font>」ボタンをクリックしましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/1b726e80-f5ae-dd75-772d-acd072165dcd.png">

この画面も、特に何もする必要がなく「<font color="red">Next</font>」ボタンをクリック。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/a0f3b359-943e-fd64-6d34-1a92ebfa23c6.png">

以下の表示は、このIDEで使用するマイコンのアーキテクチャを選択する画面です。
今回は、MSP430で使用しますので「<font color="red">MSP430 ultra-low power MCUs</font>」のみをチェックして「<font color="red">Next</font>」ボタンをクリックしましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/8862f0ca-3000-5acb-aad5-fd11e4f39b16.png">

その後は、特に何もする必要がないので「<font color="red">Next</font>」ボタンを連打です。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/fc255f42-72db-0238-4596-8290addf0e6c.png">

<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/9ab833c4-277f-3454-9155-66bbfc0955dc.png">

ようやくインストールが始まりました。
完了までは、かなりの時間がかかります（序盤は順調にプログレスバーが進むが、終盤にグズグズする）。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/caa92fa3-db3a-5c56-1d96-44440fb64700.png">

インストールが完了すると、再び以下の警告が！
何やら「このインストールを完了するには再起動してけろ…」だって。
よっぽど再起動して欲しいらしい…わかったよ。
とりあえず「<font color="red">OK</font>」ボタンをクリック。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/4eb3543e-84d4-862b-b67d-e81ed351ae69.png">

以下の表示が出れば、インストールは完了です。
「<font color="red">Finish</font>」ボタンをクリックしてください。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/4fdae6ac-0599-dedd-0b2f-a46931002db4.png">

さて、インストールされた「Code Composer Studio」をすぐにでも起動させてみたいところですが、散々再起動しろ！って言われたので、<font color="red">ここで一旦PCを再起動</font>しましょう。
こういうのは従っておいた方が、後々トラブルに遭う可能性が少なくなるんで。

再起動後は、デスクトップに「Code Composer Studio」ショートカットが出来ているはずなので、それをダブルクリックしてIDEを起動してみましょう。
以下のようなスプラッシュ画面が表示されます。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/80e99b12-0ce1-eedd-00a2-f93e9a050bca.png">

しばらくすると、以下の表示が。
ここでベテランさんはピンと来ているハズ。
<font color="red">この「Code Composer Studio」って「Eclipse」ベースじゃね！？</font>
…正解！
前回の「Arduino Mega2560版」で使用した「Microchip Studio」は「Visual Studio」がベースでしたが、今回は「Eclipse」ベースなのです。
マイコンベンダー各社は、もはや自前でIDEを作らなくなっちゃったんですかね。
企業の側でもIDEの開発工数を削減できるし、客側もベースとなったIDEを使った経験があればそれを活かせるし、メリットが多いのでしょう。
でもどうせなら、やたらと重い「Visual Studio」や、やや陳腐化している「Eclipse」などより、「[Visual Studio Code](https://ja.wikipedia.org/wiki/Visual_Studio_Code)」をベースにしてくれた方が軽くてナウい気がするんですけどね。
話を戻して…。
この表示で、ワークスペースのディレクトリを選択します。
特に拘りがなければ、そのままで「<font color="red">Launch</font>」ボタンをクリックしてください。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/0ba8dd7f-c5e7-83e1-9141-17b85e0d76e7.png">

以下の画面が出れば「Code Composer Studio」は正しくインストールできています。
やっぱ「Eclipse」だね～。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/25c5388f-45d6-72fa-763d-b310b0596b32.png">

# プロジェクトの作成
[コンパイラのインストール](#コンパイラのインストール)までの作業で、開発環境をインストールし、MSP430版TOPPERS/ASPのソースコードをダウンロードし、それをコマンドラインでビルドするまでを行いました。
そして、[統合開発環境のインストール](#統合開発環境のインストール)ではTI社のIDEであるCode Composer Studioのインストールを行いました。
そこで、お次はこのIDE上でビルドが行えるようにプロジェクトを作成しましょう。
先程のCode Composer Studioを立ち上げた状態から、画面左上のメニューから「File」→「New」→「<font color="red">Project</font>」の順にクリックしていきましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/3db1ba1f-cd53-b014-0f2b-7d80ce8ae210.png">

すると、以下のダイアログが表示されますので、中央のリストから「C/C++」ディレクトリをクリックして、その中の「<font color="red">Makefile Project with Existing Code</font>」を選択し「<font color="red">Next</font>」ボタンをクリックします。
<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/08497bc5-164d-d652-db4d-6aa9b37bb018.png">

以下のダイアログが表示されたら必要事項を入力します。
ここでは、以下の通り。

**Project Name：＜任意のプロジェクト名（ここでは「asp_1.9.2」）＞**
**Existing Code Location：C:\cygwin64\home\＜ユーザ名＞\asp_1.9.2**
**Toolchain for Indexer Settings：＜none＞**

入力が終わったら「<font color="red">Finish</font>」ボタンをクリックします。
<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/d07b5443-ddd6-e5ed-fda1-aab17679d0df.png">

その後は元の画面に戻ります。
何の変化もないようですが、<font color="red">画面左端の重なったウィンドウマーク（？）</font>を二箇所クリックしてみてください。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/7ed35d2a-0361-13bc-a610-8bdea205b4df.png">

以下のように2つのウィンドウが現れ、そのうち「Project Explorer」の方には先程入力したプロジェクト名のディレクトリが表示されているはずです。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/2926c7b8-3ce7-cd24-19b1-aa16b9db948f.png">

次に、画面上部のメニューから「Window」→「Show View」→「<font color="red">Other...</font>」の順にクリックしていきましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/1257ca73-9115-930c-1ca4-54e11f69a5d6.png">

すると、以下のようなダイアログが表示されるので、中央のリストから「Make」ディレクトリ直下の「<font color="red">Build Targets</font>」を選択し、「<font color="red">Open</font>」ボタンをクリック！
<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/a9775e23-0dd0-f9cc-68ae-e27c9fd04d83.png">

これにより、画面下部のウィンドウに「<font color="red">Build Targets</font>」タブが追加されたはずです。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/0fecd388-f8d4-9b3d-fd2c-9acf2929c00c.png">

配置場所が気持ち悪いので「<font color="red">Build Targets</font>」タブをマウスでドラッグして左に移動させましょうか…。
（個人の好みで結構ですよ。）
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/34fb7d34-ae56-c640-f9f6-8a435cfad932.png">

以降の作業は、このページ（[TOPPERS/ASPのビルドからデバッグまで～サンプルプロジェクトのデバッグ](https://www.madogiwakoubou.com/p/toppersasp_21.html)）の「[プロジェクトのクリーンとビルド](https://www.madogiwakoubou.com/p/toppersasp_21.html#clean_build)」の項目を参考に続行してください。
（自分のブログへの誘導みたいになっちゃっててすいません…。）
このCode Composer Studioは、Eclipseベースなので、上記のページと同じ方法で作業を続行できます、
<font color="red">但し、文中の「Makeターゲット」タブは、先程表示させた「Build Targets」タブに置き換えてお読みください。</font>
名称は違いますが、これらのタブは同じ働きをするものです。
Code Composer Studioの画面右側に以下のようなアイコンが表示されて、これらをダブルクリックすることによりビルドができるまでを確認してください。
<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/1c403417-1728-e4ef-468e-a6bc5990b9b1.png">

これまでの作業を行っていると「<font color="red">Console</font>」タブが気持ち悪い場所に表示されていますね。
スペースの無駄なので、すぐ上のウィンドウと統合してしまいましょう。
「<font color="red">Console</font>」タブをマウスで上のウィンドウへドラッグ＆ドロップしてください。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/010bb099-a973-5154-93c0-97566a5327c5.png">

こんな感じ。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/13ca093e-9362-ac3b-ac33-35f2421a844b.png">

このように、各タブの表示位置は個人のお好みに応じて変えていってくださいね～。

# プログラムの転送とデバッグ
まずは、評価ボード「MSP-EXP430F5529LP」をUSB経由で開発用のパソコンと接続しましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/64f5e8fa-a4a2-2d0c-9b8e-dd85f5cc3373.jpeg">

次にパソコン上でデバイスマネージャーを開きます。
ポート（COMとLPT）のサブカテゴリーとして「<font color="red">MSP Application UART1</font>」と「<font color="red">MSP Debug Interface</font>」というポートが追加されているはずです。
（私のパソコンでは、それぞれ「COM13」と「COM12」として認識されていますね。）
今回は、その内で「<font color="red">MSP Application UART1</font>」の方に注目してください。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/47bb911f-061f-38bf-967c-67cf2f139bad.png">

次に「<font color="red">TeraTerm</font>」をご用意ください。
インストールしていない方は、このページ（[TOPPERS/ASPのビルドからデバッグまで～サンプルプロジェクトのデバッグ](https://www.madogiwakoubou.com/p/toppersasp_21.html)）の「[TeraTermの導入](https://www.madogiwakoubou.com/p/toppersasp_21.html#teraterm)」の項目を参考にしてください。
もちろん、シリアル通信のターミナルであれば、他のものもお使いいただけます。
今回のTOPPERS/ASPのサンプルプログラムは、シリアル通信のメッセージを出力しますので、先程「<font color="red">MSP Application UART1</font>」として認識されたシリアルポート番号でターミナルを立ち上げておきましょう。
設定は、こんな感じです。
ボーレートは「9600」です。
（私のパソコンは、「<font color="red">MSP Application UART1</font>」をCOM13として認識していました。）
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/41c710da-4a6d-acd3-a816-926258e45afb.png">

さて、Code Composer Studioに戻りましょう。
まだサンプルプログラムをビルドしていない場合は、画面右側の「Build Targets」タブの中、「OBJ」ディレクトリ直下の「<font color="red">all</font>」をダブルクリックして、ビルドを完了させましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/38ba3f96-a1c8-206b-a1de-25397cd52226.png">

次にデバッガの設定を行います。
画面上部にある緑色の「<font color="green">虫マーク</font>」。
その脇に「▼」ボタンがありますので、それをクリック。
そこで現れた「<font color="red">Debug Configurations...</font>」という項目をクリックしましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/ed2d1390-01fb-49f1-2201-128507b8cf68.png">

すると以下のようなダイアログが現れます。
左側のリストから「<font color="red">Code Composer Studio - Device Debugging</font>」という項目をダブルクリックしてください。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/d0e90185-e7cf-daf6-6e9e-115113b26790.png">

ダイアログ右側がガラリと変わりましたね？
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/d10c6dfa-2703-92ba-1f82-d61d4ac3ce12.png">

まずは上部の「Name:」の部分に、このデバッグ設定の分かりやすい名前を付けてあげましょう。
（例では「<font color="red">OBJ</font>」としています。）
続いて「<font color="red">Use default target configuration</font>」のチェックボックスをクリックしてチェック状態にします。
それと同時に中央のリストボックスに「<font color="red">MSP430</font>」というチェックボックスがチェック状態で表示されることを確認しておいてください。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/f075f08c-f892-dd21-f2a4-863649237556.png">

さて、お次は現在の「Main」タブから「<font color="red">Program</font>」タブへ切り替えます。
クリックです。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/54d387be-a296-29cd-f892-07036811c4d6.png">

まずは、プロジェクトを指定します。
「Project」テキストボックスの右端の「<font color="red">Workspace...</font>」ボタンをクリックします。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/ae8ef8f3-7a2c-2ef0-8949-78e9b0ba972f.png">

以下のようなダイアログが表示されますので、これから実機に転送するプログラムのプロジェクトを選択します。
今回の場合は、この記事の通りに作業いただいた場合は「<font color="red">asp_1.9.2</font>」（<font color="red">もし他の名称でプロジェクトを作成した方は、そのプロジェクト名</font>）一つしか無いはずですので、これをクリックした後「<font color="red">OK</font>」ボタンをクリックします。
<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/66628d06-0c0b-8f63-c9f2-3fdb31a12b9a.png">

次に、実機に転送するプログラムを指定します。
「Program」テキストボックスの右端の「<font color="red">File System...</font>」ボタンをクリックします。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/0579032e-ad55-f268-1c85-3d50d444cd39.png">

以下のように、ファイル選択ダイアログが開きますので、プログラムが保存されている場所に移動しましょう。
これまで、この記事の通りに作業いただいた場合は以下のパスにあるはず…

**C:\cygwin64\home\＜ユーザ名＞\asp_1.9.2\OBJ**

<font color="red">…って、無いじゃん！</font>
そう、ファイル選択ダイアログで上記のパスに移動しても「targetConfigs」ディレクトリ以外は、<font color="red">デフォルトでは何も表示されないのです。</font>
なので、ダイアログ右下の「<font color="red">Program Files</font>」のドロップダウンリストをクリックしてください。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/95e21dd1-4b0e-75cd-bd9c-2b4dbf25579d.png">

ここで「<font color="red">All Files (*)</font>」を選択してください。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/8a7c6d00-546c-3881-980c-1e786ab060e8.png">

そうすると色々なファイルが表示されるようになります。
この中で「<font color="red">asp.exe</font>」というのが、ビルドして今回実機に転送したいプログラムの実体なのですが、拡張子が「.exe」と特殊なので、デフォルトのフィルタに引っかからなくて表示されなかっただけなんです。
実はこの「<font color="red">asp.exe</font>」、拡張子こそ「.exe」ですが、中身はまんま「.elf」ファイルです。
もし「<font color="red">asp.exe</font>」が見つからない場合は、まだビルドされていない可能性が考えられますので、再度ビルド作業を行なってください。
見つかった場合は「<font color="red">asp.exe</font>」を選択して「<font color="red">開く</font>」ボタンをクリックします。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/64392f57-d628-2f6d-17a0-51bf0fd3f890.png">

さて、以上で設定は終わりです。
ダイアログ下部の「<font color="red">Apply</font>」ボタン、「<font color="red">Debug</font>」ボタンの順にクリックするとデバッガが起動します。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/4b2d5660-d64a-44e3-e425-7a5985f6dc08.png">

以下のような表示が出ることがあります。
気にせずに「<font color="red">Proceed</font>」ボタンをクリックしてください。
毎度出てきて鬱陶しい！と思う方は「<font color="red">Always launch without asking</font>」チェックボックスにチェックを入れちゃってください。
もう二度と聞かれなくなります。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/878c4f78-e04f-0ae3-e806-9f438c9cb242.png">

デバッグ設定中らしいです。
地味に時間がかかります。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/23e9a2f4-2d5c-aacd-9453-f65cf5d170c9.png">

プログラムの転送と書き込みが始まりましたかね？
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/5b2aade5-cc46-485a-ff4b-452fe96fdeac.png">

プログラムの転送と書き込みが完了すると、以下のような画面の状態になるはずです。
「<font color="red">View Disassembly...</font>」というボタンをクリックしてみましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/8e09b735-5f99-0acf-9b55-5690dad53860.png">

左側に「<font color="red">Disassembly</font>」タブが追加され、アセンブラのリストが表示されます。
そして、どうやら<font color="red">004400</font>というアドレスでプログラムが停止しているようですね。
これで良いんです！
<font color="red">004400</font>というのはMSP430マイコンの<font color="red">スタートアップアドレス</font>です。
ターゲットである「MSP-EXP430F5529LP」評価ボードに「asp.exe」というプログラムが転送され、それが書き込まれた後にリセットが発生し、それによって現在<font color="red">004400</font>番地で処理が停まっている様子がコレです。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/997bde43-ec51-f312-b95e-7293c367da32.png">

さて、この状態から実際にプログラムを続行させてみましょう。
画面上部の「<font color="red">▶</font>」ボタンをクリックすると、プログラムが続行されます。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/89bd5ff1-ee8b-bd7d-1348-984916184f2e.png">

はい、ここで長らく放置していた「TeraTerm」を見てみましょう。
以下のように、サンプルプログラムが動作していることが確認できます。
（…ん？ちょっと出力に違和感あるよ？という方は、後ほど[コチラ](https://www.madogiwakoubou.com/2022/11/toppersasp-msp430_28.html)を御覧ください）
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/3ca29bd5-f312-f3db-d22e-a6fc0e34999b.png">

プログラムを停止する場合は、画面上部の「<font color="red">■</font>」ボタンをクリックします。
停止させてみましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/10eb98ae-a24a-ca4b-6ac8-e04d47107811.png">

ブレークポイントを仕掛けましょう。
画面右の「Project Explorer」のソースコードリストの中から「<font color="red">sample1.c</font>」をダブルクリックし、ソースコードを表示します。
このソースコードの丁度中盤くらい、メインタスクの始めに仕掛けましょうか。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/3277a702-eec8-29da-dd2e-789ade82b795.png">

ブレークポイントは、ソースコードビューの左端をダブルクリックすると丸が表示され、セットできる…って思うでしょう？
ところが、このCode Composer Studioでは通用しないようです。
ブレークポイントを仕掛けるには、ソースコードビューの左端を右クリックして出てきたメニューの「Brakepoint(Code Composer Studio)」→「<font color="red">Brakepoint</font>」を順にクリックしなければいけません。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/84fd69b5-22bf-b0b6-6262-70c410cc3d2c.png">

すると、以下のように該当のソースコードの左端に丸マークが表示されて、ブレークポイントが設定されたことが分かります。
と同時に「<font color="red">Brakepoint</font>」タブが画面上部に出現し、該当のソースコードがリストアップされます。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/fd26e801-1c0c-5936-af7d-b5d6e5f97e91.png">

<font color="red">めんどくさ…。</font>
因みに、普通にソースコードビューの左端をダブルクリックしてブレークポイントを設定しようとすると、丸マークも正しく表示されて一見問題ないように見えますが…。
実際にデバッグしてみると、<font color="red">見事に空振りする</font>ので注意です。
ともあれ、これで本当にブレークポイントがかかるのか、試してみましょう。
画面上部にある緑色の「<font color="green">虫マーク</font>」。
（ほんとコレ、何虫がモデルなんだ？…<font color="green">カメムシ</font>？）
その脇に「▼」ボタンがありますので、それをクリック。
すると今後は、さっき色々と入力した「<font color="red">OBJ</font>」のデバッグ設定が登録されていますので、これをクリックすると、デバッガが起動します。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/0b6f5b08-ab5d-87c3-9cb7-a4ba485c1022.png">

しばらくして、プログラムの転送と書き込みが完了すると、前と同じように004400番地でプログラムが停止しますので、画面上部の「<font color="red">▶</font>」ボタンをクリックして、プログラムを続行させます。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/6f479662-2025-8fa4-4150-0aff33173efa.png">

程なくして、以下のように正しくブレークポイントを仕掛けた位置でプログラムが停止するはずです。
ここからは、「F6」キーでステップオーバー、「F5」キーでステップインなど、おなじみの操作が使用できます。
因みに、ステップオーバーやステップインなどを行っている時に命令が飛んでしまったり前後したりする場合は、最適化のせいです。
デバッグ時は、このページ（[TOPPERS/ASPのビルドからデバッグまで～サンプルプロジェクトのデバッグ](https://www.madogiwakoubou.com/p/toppersasp_21.html)）の「[サンプルプログラムのデバッグ](https://www.madogiwakoubou.com/p/toppersasp_21.html#debug)」の項目を参考に最適化を解除しましょう。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/ad5c6f40-a4a2-be45-f8fd-7d6fed347200.png">

# サンプルプロジェクトの説明
興味のある方は、このページ（[TOPPERS/ASPのビルドからデバッグまで～サンプルプロジェクトで遊ぼう](https://www.madogiwakoubou.com/p/toppersasp_16.html)）を参照してください。

# MSP430版カーネルについて
以下、このカーネルにおける備考です。

## 割り込み優先度の設定不可
このカーネルでは、割り込み優先度の設定はできません。
コンフィグレーションファイルなどにおいて、他のアーキテクチャからの移植性を考慮して、<font color="red">-1（優先度最低）</font>から<font color="red">-6（優先度最高）</font>を設定してもエラーが起きないようになっていますが、実際の動作に反映しません。
これはMSP430に搭載されている割り込みコントローラーがシンプルな設計であり、割り込み優先度を変更する機能が存在しないためです。
MSP430における割り込み優先度は、<font color="red">割り込み番号が大きいほど優先度が高くなる</font>ように固定されています。
![91.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/0c6f07b2-65df-6e7a-8774-5820acd6eccc.png)

当然「System Reset」が最優先ですが、マスカブル（マスクできる割り込み）ではアナログ電圧コンパレータの「Comp_B」の割り込み優先度が高いですね。
割り込み番号の定義は「..\arch\msp430x_gcc\include_gcc\msp430f5529.h」にあり、以下の通りです。
上の表と上下逆ですが一致するでしょう？
````
/************************************************************
* Interrupt Vectors (offset from 0xFF80)
************************************************************/
 
 
#define RTC_VECTOR              (42)                     /* 0xFFD2 RTC */
#define PORT2_VECTOR            (43)                     /* 0xFFD4 Port 2 */
#define TIMER2_A1_VECTOR        (44)                     /* 0xFFD6 Timer2_A5 CC1-4, TA */
#define TIMER2_A0_VECTOR        (45)                     /* 0xFFD8 Timer2_A5 CC0 */
#define USCI_B1_VECTOR          (46)                     /* 0xFFDA USCI B1 Receive/Transmit */
#define USCI_A1_VECTOR          (47)                     /* 0xFFDC USCI A1 Receive/Transmit */
#define PORT1_VECTOR            (48)                     /* 0xFFDE Port 1 */
#define TIMER1_A1_VECTOR        (49)                     /* 0xFFE0 Timer1_A3 CC1-2, TA1 */
#define TIMER1_A0_VECTOR        (50)                     /* 0xFFE2 Timer1_A3 CC0 */
#define DMA_VECTOR              (51)                     /* 0xFFE4 DMA */
#define USB_UBM_VECTOR          (52)                     /* 0xFFE6 USB Timer / cable event / USB reset */
#define TIMER0_A1_VECTOR        (53)                     /* 0xFFE8 Timer0_A5 CC1-4, TA */
#define TIMER0_A0_VECTOR        (54)                     /* 0xFFEA Timer0_A5 CC0 */
#define ADC12_VECTOR            (55)                     /* 0xFFEC ADC */
#define USCI_B0_VECTOR          (56)                     /* 0xFFEE USCI B0 Receive/Transmit */
#define USCI_A0_VECTOR          (57)                     /* 0xFFF0 USCI A0 Receive/Transmit */
#define WDT_VECTOR              (58)                     /* 0xFFF2 Watchdog Timer */
#define TIMER0_B1_VECTOR        (59)                     /* 0xFFF4 Timer0_B7 CC1-6, TB */
#define TIMER0_B0_VECTOR        (60)                     /* 0xFFF6 Timer0_B7 CC0 */
#define COMP_B_VECTOR           (61)                     /* 0xFFF8 Comparator B */
#define UNMI_VECTOR             (62)                     /* 0xFFFA User Non-maskable */
#define SYSNMI_VECTOR           (63)                     /* 0xFFFC System Non-maskable */
#define RESET_VECTOR            ("reset")                /* 0xFFFE Reset [Highest Priority] */
````

## 割り込み番号の指定方法
たとえば、「CFG_INT」などで割り込み番号を指定する場合は、上記の割り込み番号の定義から<font color="red">-1</font>した値を入れてください。

例としては、OSタイマーの「..\target\msp_exp430f5529lp_gcc\target_timer.h」が分かり易いでしょうか。

OSタイマーは「<font color="red">TIMER0_A0_VECTOR</font>」を使っているのですが、以下のように<font color="red">-1</font>しています。

ここで定義された「<font color="red">INTNO_TIMER</font>」が「..\target\msp_exp430f5529lp_gcc\target_timer.cfg」によって、コンフィグレーションとして使われているのです。
````
/*
 *  タイマ割込みハンドラ登録のための定数
 */
#define INHNO_TIMER     (TIMER0_A0_VECTOR - 1)  /* 割込みハンドラ番号 */
#define INTNO_TIMER     (TIMER0_A0_VECTOR - 1)  /* 割込み番号 */
#define INTPRI_TIMER    (-6)                    /* 割込み優先度 */
#define INTATR_TIMER    TA_EDGE                 /* 割込み属性 */
````

## 多重割り込みには未対応
デフォルトでは、割り込みハンドラやタスクコンテキスト以外のプログラムのための（非タスクコンテキスト用）スタック領域は、<font color="red">0x200（512バイト）</font>としています。
これは「..\target\msp_exp430f5529lp_gcc\target_config.h」の以下の箇所で「DEFAULT_ISTKSZ」という名前で定義されています。
````
/*
 *  デフォルトの非タスクコンテキスト用のスタック領域の定義
 */
#define DEFAULT_ISTKSZ		0x200U
#define DEFAULT_ISTK		(void *)(0x00004400U - DEFAULT_ISTKSZ)
````
このスタックサイズは、今回使った評価ボード「MSP-EXP430F5529LP」に搭載されている「MSP430F5529」チップのRAMのサイズがわずか8KBであることを考えれば、妥当と考えています。
しかし、これにより多重割り込みのサポートを諦めています。
0x200（512バイト）というスタックサイズでは、割り込みをネストするのには十分ではなく、あっという間に暴走してしまう危険性が高くなりますので、そのリスクを避けました。
もっとも、多重割り込みが必要なほどの処理がシビアなアプリケーションには、このターゲットは使われないだろうと判断した結果です。

## 例外ハンドラは未対応
コンフィグレーションファイルなどにおいて、他のアーキテクチャからの移植性を考慮して、例外ハンドラの作成はできるようになっているものの動作はしません。
理由はMSP430に例外処理が存在しないためです。

## 一部サービスコールは未対応
割り込みIDを指定して、これを有効／無効化するための「<font color="red">ena_int()</font>」と「<font color="red">dis_int()</font>」サービスコールはサポートしていません。
これはMSP430に搭載されている割り込みコントローラーがシンプルな設計であり、割り込み要因ごとに有効／無効化するためのフラグを設けていないためです。
どうしても一時的に割り込みを有効／無効化したい場合は、各ペリフェラルのレジスタを設定するか、CPU全体の割り込みを一括で設定しても良いのであれば、以下のような処理で代用してください。
````
/* すべての割込みの禁止 */
Asm("nop");
Asm("dint");
Asm("nop");
````
````
/* すべての割込みの許可 */
Asm("nop");
Asm("eint");
Asm("nop");
````

または、以下のようなマクロが使えますが、その場合はこれを使用するソースに「#include <msp430.h>」を一行加えてあげてください。
````
_disable_interrupts();  /* すべての割込みの禁止 */
_enable_interrupts();   /* すべての割込みの許可 */
````

また、性能評価用システム時刻取得のための「<font color="red">get_utm()</font>」サービスコールは未実装です。

## 内蔵フラッシュROMのメモリマップ
この「MSP430F5529」というモデル、フラッシュメモリのマッピングが変です。
というよりMSP430シリーズの中で内蔵フラッシュが60KB以上の型番は、ちょっと癖があります。
内蔵フラッシュのメモリマップを以下に示します。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/6c1835a8-23b8-ae3f-b6b5-5f19166f5283.png">

内蔵フラッシュ領域の中盤にベクタテーブル（VECTORS）が配置されています。
そして、<font color="red">このベクタテーブルは固定されており自由に移動させることができません。</font>
すなわち、これはベクタテーブルのせいで、<font color="red">読み取り専用データセクション（.rodata）</font>やプログラムコードのための<font color="red">テキストセクション（.text）</font>に使用するための領域が上下2つに分断されていることを意味します。
で、これら3つの領域の総和である128KBが「MSP430F5529」の内蔵フラッシュの容量ですよ～と言っているわけです。
これは「../target/msp430f5529.ld」のリンカスクリプトでも確認できます。
````
MEMORY {
  SFR              : ORIGIN = 0x0000, LENGTH = 0x0010 /* END=0x0010, size 16 */
  BSL              : ORIGIN = 0x1000, LENGTH = 0x0800
  RAM              : ORIGIN = 0x2400, LENGTH = 0x2000 /* END=0x43FF, size 8192 */
  USBRAM           : ORIGIN = 0x1C00, LENGTH = 0x0800
  INFOMEM          : ORIGIN = 0x1800, LENGTH = 0x0200 /* END=0x19FF, size 512 as 4 128-byte segments */
  INFOA            : ORIGIN = 0x1980, LENGTH = 0x0080 /* END=0x19FF, size 128 */
  INFOB            : ORIGIN = 0x1900, LENGTH = 0x0080 /* END=0x197F, size 128 */
  INFOC            : ORIGIN = 0x1880, LENGTH = 0x0080 /* END=0x18FF, size 128 */
  INFOD            : ORIGIN = 0x1800, LENGTH = 0x0080 /* END=0x187F, size 128 */
  ROM (rx)         : ORIGIN = 0x4400, LENGTH = 0xBB80 /* END=0xFF7F, size 48000 */
  VECTORS          : ORIGIN = 0xFF80, LENGTH = 0x0080
  HIROM (rx)       : ORIGIN = 0x00010000, LENGTH = 0x00014400
}
````

今回のMSP430版カーネルは、<font color="red">テキストセクション（.text）をHIROM領域</font>に（一般的に.rodataよりも.textの方が容量が大きくなるため、容量の大きいHIROMを選択）、<font color="red">読み取り専用データセクション（.rodata）をROM領域</font>に配置するように設計しています。
HIROM領域に収まる程度のそれほど大きくないアプリケーションならば問題はありませんが、もし一杯になってしまったら？
当然、読み取り専用データセクション（.rodata）が格納されているROM領域に空きがあれば、その領域を使いたいですよね？
内蔵フラッシュ領域がリニアでない場合、こういう時に面倒くさいことになりますが、以下のようなテクニックでやり過ごしましょう。
仮に以下のような関数をアプリケーションに追加したいとします。
````
int8_t add(int8_t a, int8_t b)
{
    return a + b;
}
````

でも、HIROM領域が一杯でこの関数が入らないので、これをROM領域に配置したいと考えます。
これはあくまで例ですので小さな関数ですが、もっと大きい関数でもやり方は同じです。
````
int8_t __attribute__ ((section (".subtext"))) add(int8_t a, int8_t b)
{
    return a + b;
}
````

このように「\_\_attribute\_\_ ((section ("<font color="red">.subtext</font>")))」を関数名の前に追記してあげます。
この記述によって、この関数を「<font color="red">.subtext</font>」というセクションに配置してください…ってリンカにお願いをすることになります。
では「<font color="red">.subtext</font>」ってセクションはどっから出てきたのか？
それは「../target/msp430f5529.ld」のリンカスクリプトを参照してください。
````
SECTIONS
{
	.handlers : {} > ROM
 
	.rodata :
	{
		*(.rodata)
		*(.rodata.*)
		*(.eh_frame_hdr)
		KEEP (*(.eh_frame))
	} > ROM
 
	.subtext : {} > ROM    /* 「.subtext」はここで定義されています！ */
 
	__idata_start = . ;
	.data : AT(__idata_start)
	{
		__data_start = . ;
		*(.data)
		*(.data*)
		__data_end = .;
	} > RAM
	__idata_end = __idata_start + SIZEOF(.data) ;
 
	.vectors : {} > VECTORS
 
	.text :
	{
		*(.text)
		*(.text.*)    /* .text.libgcc */
	    _etext = . ;
	} > HIROM
````

中盤辺りで「<font color="red">.subtext</font>」セクションの定義を行っています。
これでビルドを行えば「add()」関数は、本来のHIROM領域ではなく、ROM領域に配置されることになります。
関数の呼び出し方は、ROM領域に配置されたからといって特に変わることはなく、通常通りに行えます。
面倒くさくて申し訳ありませんが、こんな感じでどーでっしゃろ？

## LPM（ローパワーモード）への対応
さて、MSP430を使用する上で最も重要なのが低消費電力化です。
今回使用した「MSP430F5529」には、以下の通り「Active」、「LPM0」～「LPM4」まで全部で6種類の動作モードがあります。
（「LPM3.5」と「LPM4.5」については今回は割愛します。）
通常…ていうかフルパワーで動作している状態が「Active」であり、「LPMx」はｘの数が多いほど低消費電力のローパワーモードとなります。
![92.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/ae893a5a-b67c-0bf2-d101-d30f0936a896.png)

この表を読んでみると、CPUの中で動いている様々なクロックを「LPMx」の段階に応じて停止させることにより低消費電力化を実現していることが分かります。
今回使用した「MSP430F5529」とは違う型番のデータですが、MSP430の動作モードと消費電力の関係は以下のグラフで表されます。
（多分「MSP430F5529」は全体的にもっと電力を食う…。）
![image-6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/f40935b6-1a35-e67b-f804-923744ef092c.jpeg)

CPUの中で動いているクロックは、ざっくり3つあります。

**●MCLK…CPUのコアを動作させるクロック**
**●SMCLK…周辺機器を動作させるクロック（高速）**
**●ACLK…周辺機器を動作させるクロック（低速）**

さて、OSというものは一定の間隔で割り込みを受け取り、それを基準にディスパッチなどの処理を行っています。
この一定の間隔を生み出すために、CPUに内蔵されているタイマーなどの周辺機器を使用するのが一般的で、このMSP430版カーネルでも同様です。
タイマーの精度はリアルタイムOSそのものの精度に直結するため、それを駆動するソースクロックは、ある程度高速であることが求められます。
したがって、このMSP430版カーネルでは低速のACLKではなく、高速のSMCLKをソースクロックとするタイマーを使用しました。
その結果、<font color="red">MSP430版カーネルでは「LPM1」までしかローパワーモードを下げられない</font>ことになってしまいました。
上の動作モードの表をもう一度ご覧ください。
![93.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917131/5620eb21-b006-6e37-d6ab-19f2672abe8d.png)

OSが使用するタイマーのソースクロックはSMCLKですから「LPM2」まで下げてしまうとタイマーが停まりカーネルが動かなくなってしまいます。
ならばタイマーのソースクロックをACLKに変更すれば「LPM3」まで下げられるのでは？
…実際やってみましたがACLKの周波数が遅すぎて（32.768kHz）精度に難がある結果となってしまいました。
またSMCLKはデバッグ用のシリアル通信でも使用しているため、これをACLKに置き換えた場合、9600bpsのボーレートでも動作が怪しくなります。
となれば、SMCLKは使わざるを得ず「LPM1」までで妥協するしかないか…。
したがって、このMSP430版カーネルではタスクが一つも動作していないアイドル状態の時には、ぼぼ「LPM1」の状態までに留まります。
（正確にはタイマーの割り込み処理の間だけ定期的に「Active」モードになる。）

<font color="red">しかし、カーネルを停めても良いのであれば手はありまぁす！</font>

ここから更に低消費電力化を図ろうとするならば、アプリケーションに以下のインクルードと、任意の場所にコードを記述してください。
````
#include <msp430.h>
 
__bis_SR_register(LPM3_bits + GIE);
````

これによりCPUは即座に「LPM3」に移行します。
処理はこの行で停止し、当然カーネルも動きを停めます。
これ以降は、<font color="red">ACLKで動作する周辺機器からの割り込み</font>か、そもそも<font color="red">クロックに依存しないGPIOなどからの割り込み</font>が発生するまで「Active」には戻りません。
割り込みが発生して「Active」に戻れば次の行から処理は再開され、カーネルも動作を再開します。
ソースクロックをACLKに指定したRTCなどを動作させて、一定の時間毎に割り込みを発生させて起床するようなアプリケーションでは、このモードが有効です。
更に以下のコードでは「LPM4」に移行します。
````
#include <msp430.h>
 
__bis_SR_register(LPM4_bits + GIE);
````

「LPM4」ではACLKすらも停止しますので、実質的に<font color="red">クロックに依存しないGPIOなどからの割り込み</font>でなければ復帰しません。
GPIOに繋がれたスイッチを押すと起床するようなアプリケーションでは、このモードが有効です。
「LPM1」よりも更に低消費電力化が必要な場合は、カーネルは停まってしまいますが、上記の方法をお試しください。

# ライセンスについて
このカーネルは「[TOPPERSライセンス](https://www.toppers.jp/license.html)」で配布しております。
無償ですが、使用に関しては自己責任です。
このカーネルを商用利用する~~もの好きな方~~場合は、このリンク先の条項に従ってください。