2022年10月25日火曜日

TOPPERS/ASP - MSP430版 その3

前回からの続きです。

このテーマを最初からご覧になる場合はこちらからどうぞ。


開発環境の構築(IDE編)

続きまして、MSP430用のIDEのインストールを行います。

IDEは、TI社純正の「Code Composer Studio」というものを使用します。

以下のページでダウンロードします。


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

右上の「ダウンロード」というボタンをクリックすると…


以下の場所まで移動しますので、「CCSTUDIO - Code Composer Studio 統合開発環境」の右の「ダウンロードオプション」ボタンをクリックしましょう。


以下の表示が出たら、目的のタイプのコンパイラを選択します。

このブログでは「Windows single file (offline) installer for Code Composer Studio IDE (all features, devices)」をダウンロードしたものとして説明します。


ダウンロードが完了すると「CCS12.x.x.xxxxx_win64.zip」というファイルが生成されますので、これを解凍します。

解凍されて生成された「CCS12.x.x.xxxxx_win64」ディレクトリの中に「ccs_setup_12.x.x.xxxxx.exe」というファイルがあります。

これがインストーラー本体ですので、ダブルクリック!


以下のように、インストーラーが起動しますので「Next」ボタンをクリックです。


以下の表示は、もはや儀式。

I accept the agreement」を選択して「Next」ボタンをクリックします。


この画面は、特に何もする必要がなく「Next」ボタンをクリック。


ここで以下の警告、「ペンディングされた再起動があるから、続けるならPCを再起動してけろ…」って、よく分からないが…とりあえず「OK」ボタンをクリックしましょう。


自動的に再起動食らうのでは?と思いましたが、そういうこともなく以下の表示が出ます。

続けて良いんだよな?

ならば「Next」ボタンをクリックしましょう。


この画面も、特に何もする必要がなく「Next」ボタンをクリック。


以下の表示は、このIDEで使用するマイコンのアーキテクチャを選択する画面です。

今回は、MSP430で使用しますので「MSP430 ultra-low power MCUs」のみをチェックして「Next」ボタンをクリックしましょう。


その後は、特に何もする必要がないので「Next」ボタンを連打です。



ようやくインストールが始まりました。

完了までは、かなりの時間がかかります(序盤は順調にプログレスバーが進むが、終盤にグズグズする)。


インストールが完了すると、再び以下の警告が!

何やら「このインストールを完了するには再起動してけろ…」だって。

よっぽど再起動して欲しいらしい…わかったよ。

とりあえず「OK」ボタンをクリック。


以下の表示が出れば、インストールは完了です。

Finish」ボタンをクリックしてください。


さて、インストールされた「Code Composer Studio」をすぐにでも起動させてみたいところですが、散々再起動しろ!って言われたので、ここで一旦PCを再起動しましょう。

こういうのは従っておいた方が、後々トラブルに遭う可能性が少なくなるんで。


再起動後は、デスクトップに「Code Composer Studio」ショートカットが出来ているはずなので、それをダブルクリックしてIDEを起動してみましょう。

以下のようなスプラッシュ画面が表示されます。


しばらくすると、以下の表示が。

ここでベテランさんはピンと来ているハズ。

この「Code Composer Studio」って「Eclipse」ベースじゃね!?

…正解!

前回の「Arduino Mega2560版」で使用した「Microchip Studio」は「Visual Studio」がベースでしたが、今回は「Eclipse」ベースなのです。

マイコンベンダー各社は、もはや自前でIDEを作らなくなっちゃったんですかね。

企業の側でもIDEの開発工数を削減できるし、客側もベースとなったIDEを使った経験があればそれを活かせるし、メリットが多いのでしょう。

でもどうせなら、やたらと重い「Visual Studio」や、やや陳腐化している「Eclipse」などより、「Visual Studio Code」をベースにしてくれた方が軽くてナウい気がするんですけどね。

話を戻して…。

この表示で、ワークスペースのディレクトリを選択します。

特に拘りがなければ、そのままで「Launch」ボタンをクリックしてください。


以下の画面が出れば「Code Composer Studio」は正しくインストールできています。

やっぱ「Eclipse」だね~。


さて、次回は、この「Code Composer Studio」上でTOPPERS/ASPカーネルを動かすためのプロジェクトを作っていきましょう。


<続く>

TOPPERS/ASP - MSP430版 その2

前回からの続きです。


開発環境の構築(コンパイラ編)

何はともあれ、まずはMSP430用のコンパイラのインストールを行いましょう。

以下のページでダウンロードします。


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

右上の「ダウンロード」というボタンをクリックすると…


以下の場所まで移動しますので、「MSP430-GCC-OPENSOURCE」の方の「ダウンロードオプション」ボタンをクリックしましょう。

もう一方の「MSP432-GCC-OPENSOURCE」の方だと、ARMのコンパイラのダウンロードになっちゃうので注意。


以下の表示が出たら、目的のアーキテクチャ用のコンパイラを選択します。

このブログでは「Mitto Systems GCC Windows installer incl. support files」をダウンロードしたものとして説明します。


ダウンロードが完了すると「msp430-gcc-full-windows-installer-x.x.x.x.exe」というファイルが生成されますので、これをダブルクリック!

程なくして、以下の表示が出ます。

実行できない!?…と焦らずに「詳細情報」というリンクをクリックします。


そうすれば、ちゃんと「実行」ボタンがあらわれますので、これをクリック。


以降、インストーラーが起動し、しばらくは「Next」ボタンを連打です。




インストールが始まりましたね?


インストールが完了したら「Finish」ボタンをクリック。

これでコンパイラがインストールされました!


今回使うMSP430用のツールチェーンの環境変数の設定を行います。

ツールチェーンは、先程のインストール作業により既に以下のディレクトリにセットアップされているはずです。


C:\ti\msp430-gcc\bin


環境変数の設定方法は、このページ(TOPPERS/ASPのビルドからデバッグまで~GNUツールチェーンの導入)の「環境変数の設定」の項目を御覧ください。

ただし、パスは…


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


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


C:\ti\msp430-gcc\bin


に置き換えてください。

こんな感じ…。


また、このページの「パスの確認」の項目で打ち込むコマンドも、以下のように変わります。


> msp430-elf-gcc --version


続きまして「Cygwin」のインストールを行います。

このページ(TOPPERS/ASPのビルドからデバッグまで~Cygwinの導入)を参考にしてください。


「Cygwin」がインストールできたら、ここまでの作業が上手くいっているかどうか確認しておきましょう。

次のページ(TOPPERS/ASPのビルドからデバッグまで~サンプルプロジェクトのビルド)を参照してください。

ただし、今回使用するソースコードはこのページの冒頭の「NUCLEO-F401RE STM32 Nucleo-64」開発ボード用のTOPPERS/ASPカーネル簡易パッケージではなく、「MSP430」用のものを使います。

ソースコードのダウンロードはこちらからどうぞ。

また、「Github」を使いたい方は以下のコマンドでソースコードのクローンを行います。


$ git clone https://github.com/RyutaroMorita/asp_msp430_gcc.git


ダウンロードとGithub、いずれの場合も「asp_msp430_gcc」というディレクトリの名前を「asp_1.9.2」などと改名すると、上記のページと同じ状況になります。

また、今回は「OBJ」ディレクトリを作成する必要はありません。

これは既に用意されていますので、そのまま「OBJ」ディレクトリに移動し「make~」コマンドを実行してください。


コマンドライン環境で正しくビルドができることを確認したら、次回はTI社のIDEである「Code Composer Studio」のインストールを行っていきます。


<続く>

2022年10月16日日曜日

TOPPERS/ASP - Arduino Mega2560版 その6

前回からの続きです。

このテーマを最初からご覧になる場合はこちらからどうぞ。


サンプルプロジェクトの説明

このページ(TOPPERS/ASPのビルドからデバッグまで~サンプルプロジェクトで遊ぼう)を参照してください。


Arduino Mega2560版カーネルについて

以下、このカーネルにおける備考です。


●ArduinoIDEやライブラリは使用不可

このカーネルを使った時点で、ArduinoはArduinoでなくなります。

当然、便利なArduinoIDEや、それに付随する豊富なライブラリは使用できなくなります。

但し、「ATMega2560」チップのペリフェラル用のデバイスドライバなどは「Microchip Studio」導入時にサンプルプログラムのインストールを選択していれば、豊富なサンプルコードが手に入るはずです。

少々手間ですが、これらをカーネル上で動くように移植することは難しくないと思います。

また、TOPPERS/ASPカーネルで動作しながらArduinoのライブラリを使えるような「TOPPERS/R2CA」(凄い!)という実装も存在します。

この場合はターゲットが「Arduino Mega2560」ではなく、ARMコアの「Arduino M0」になりますが、極めて有意義な実装です。


●割り込み優先度の設定不可

このカーネルでは、割り込み優先度の設定はできません。

コンフィグレーションファイルなどにおいて、他のアーキテクチャからの移植性を考慮して、-1(優先度最低)から-6(優先度最高)を設定してもエラーが起きないようになっていますが、実際の動作に反映しません。

これは「ATMega2560」チップに搭載されている割り込みコントローラーがシンプルな設計であり、割り込み優先度を変更する機能が存在しないためです。

「ATMega2560」チップにおける割り込み優先度は、割り込み番号が若いほど優先度が高くなるように固定されています。


●多重割り込みには未対応

デフォルトでは、割り込みハンドラやタスクコンテキスト以外のプログラムのための(非タスクコンテキスト用)スタック領域は、0x200(512バイト)としています。

これは「..\target\arduino_mega2560_gcc\target_config.h」の以下の箇所で「DEFAULT_ISTKSZ」という名前で定義されています。

  1. /*
  2.  * デフォルトの非タスクコンテキスト用のスタック領域の定義
  3.  */
  4. #define DEFAULT_ISTKSZ  0x200U
  5. #define DEFAULT_ISTK    (void *)(0x00002200U - DEFAULT_ISTKSZ - 1)


このスタックサイズは、Arduino Mega2560に搭載されている「ATMega2560」チップのRAMのサイズがわずか8KBであることを考えれば、妥当と考えています。

しかし、これにより多重割り込みのサポートを諦めています。

0x200(512バイト)というスタックサイズでは、割り込みをネストするのには十分ではなく、あっという間に暴走してしまう危険性が高くなりますので、そのリスクを避けました。

もっとも、多重割り込みが必要なほどの処理がシビアなアプリケーションには、このターゲットは使われないだろうと判断した結果です。


●例外ハンドラは未対応

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

理由は「ATMega2560」チップに例外処理が存在しないためです。


●一部サービスコールは未対応

割り込みIDを指定して、これを有効/無効化するための「ena_int()」と「dis_int()」サービスコールはサポートしていません。

これは「ATMega2560」チップに搭載されている割り込みコントローラーがシンプルな設計であり、割り込み要因ごとに有効/無効化するためのフラグを設けていないためです。

どうしても一時的に割り込みを有効/無効化したい場合は、各ペリフェラルのレジスタを設定するか、CPU全体の割り込みを一括で設定しても良いのであれば、以下のような処理で代用してください。

  1. /* すべての割込みの許可 */
  2. Asm("sei");
  1. /* すべての割込みの禁止 */
  2. Asm("cli");


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


参考資料

Arduino Mega2560に搭載されている「ATMega2560」チップに関する詳細な情報は、メーカーであるMicrochip社のWebページはもちろんのこと、「AVR日本語情報サイト」をご覧頂くことをお勧めします。

特に後者のページは、ディスパッチャやデバイスドライバの実装の際に大変にお世話になりました。

こんな場で恐縮ですが、心より感謝を申し上げたい。

ありがとうございました!

このページは、日本におけるAVRマイコンのシェアを大きく伸ばしたものと思います。

但し、条項が厳しいため(相当イヤな目に遭ったみたい…)、こちらのサイトへの直接リンクを張ることはできませんので、お手数ですが検索してお読みください。


ライセンスについて

このカーネルは「TOPPERSライセンス」で配布しております。

無償ですが、使用に関しては自己責任です。

まず居ないとは思いますが…万が一、このカーネルを商用利用するような無茶をやる場合は、このリンク先の条項に従ってください。

あと、その場合は必須ではありませんが、当方に連絡いただければ、ちゃんとソースコード見直します。

…怖いから!


<終わり>

TOPPERS/ASPのビルドからデバッグまで その8

続きを書きました。

サンプルプロジェクトで遊ぼう編です。


投稿とページの使い分けがイマイチ良く分かりません。

読み辛かったらゴメンナサイ。

2022年10月12日水曜日

TOPPERS/ASP - MSP430版 その1

TOPPERS/ASP - MSP430版 概要

まだマイコンに低消費電力が今ほどうるさく求められていなかった1990年代初頭(今から30年くらい前!)に、この分野にいち早く目を付けた先進的な製品がTexas Instruments(以下「TI」)のMSP430です。


今では、MSP432というARM(Cortex-M4)コアにMSP430のペリフェラル(周辺機器)をそのまま搭載した後継機種が出ております。

MSP432の方が性能(クロック当たりの演算スコア)が高いのは当然ですが、それほど高い処理能力は必要とせず、コスト重視、且つとにかく低い消費電力が求められるシーンでは、MSP430もまだまだ現役です。

当初はROMやRAMも小さい容量の型番しかありませんでしたが、時代とともに進化し、今では十分にRTOSの搭載も検討できる容量ラインナップも増えてきました。

そこで、このMSP430に「μITRON4.0」準拠のRTOS(リアルタイムOS)であるTOPPERS/ASPを移植してみました。

かなりメジャーなマイコンなので、公式でリリースされていないのは不思議ですけどね。

MSP430は16ビットのマイコンで、独自コアのRISCです。

GCC系のコンパイラが提供されており、TIの開発環境やサンプルプログラムも充実しています。

MSP430最大の売りである低消費電力を保持しつつ、TOPPERS/ASPを実装することが今回のキモになります。

さて、上手く実装できるでしょうか?


必要なもの

TIは、自社のマイコンを搭載した評価ボードのラインナップが豊富です。

今回は、MSP430の「MSP430F5529」を搭載した「MSP-EXP430F5529LP」という評価ボードを使います。

こちらで買うと、2,500円くらいですね。


他の型番への移植も可能ですが、TOPPERS/ASPを搭載して動作させるならROM:128KB/RAM:8KB以上の容量を持つ型番を選びましょう。

また「MSP-EXP430F5529LP」を使用する場合、デバッガーは必要ありません。

この評価ボードには既にデバッガーも実装されています。

「MSP-EXP430F5529LP」を使用しない場合は「MSP-FET」というMSP430に対応したTIのデバッガを使用する必要があります。

こちらで買うと、22,000円くらいですね。


高すぎてやってられません。

ですので、それを搭載している「MSP-EXP430F5529LP」が如何にお買い得かが分かりますね。

このブログでは「MSP-EXP430F5529LP」を使用した場合の例を説明していきたいと思います。


ダウンロード/GitHub

ソースコードの入手は、こちらからどうぞ。

なるべく定期的にメンテナンスするようにしていますので、動きがおかしいな?という場合は最新版に更新をお願いします。

それでもダメな場合はコメントください。


では、次回からは、開発環境の構築やビルド方法を見ていきましょう!


<続く>

2022年10月9日日曜日

TOPPERS/ASP - Arduino Mega2560版 その5

前回からの続きです。

このテーマを最初からご覧になる場合はこちらからどうぞ。


デバッガとArduinoの配線

結論から言いましょう。

なまら面倒くさいです!

デバッガの「Atmel-ICE」と「Arduino Mega 2560」の間で、こんな感じの配線をしなければなりません。


「Atmel-ICE」には2種類のケーブルが同梱されているはずです。

そのうちの6ピンのものは、Arduinoの「ICSP」というピンにそのまま挿すだけです。

出っ張り部分をCPU側にして、こんな感じ。


問題はもう一方のケーブル、10ピンがバラバラに出てるやつです。

それをこのように配線しなければならないのが大変なんです。


ピン配は「Arduino --- 10ピンケーブル・ピン番」で以下の通り。


RESET --- 8ピン

5V --- 4ピン

GND --- 2ピン

A4 --- 1ピン

A5 --- 5ピン

A6 --- 3ピン

A7 --- 9ピン


以上、計7ピン。

面倒だけど仕方ない、繋ぐか~…と思った矢先に更なる試練が!

どっちもメスじゃん!?

こういうケースで私がよくやる手は以下の通りです。

まず、工具箱の底の方に転がっている、こんな感じのピンヘッダ。


この金属のピンの部分をラジオペンチで樹脂から引き抜きます。

そして、引き抜いたピンを以下のようにピンソケットに挿しておきます。


これで擬似的にオスーメスの状況を作れますが、嵌合は緩く接触不良の懸念がありますので、あまりオススメしません。

これをやる場合は、配線したらマスキングテープで留めておきましょう。


AVRマイコンのヒューズ設定

「Arduino Mega 2560」に搭載されているAVRマイコン。

このシリーズには、ヒューズ設定というものがあります。

例えば、クロックは何処から取るのか?そのクロックの分周比はどのくらいか?ウォッチドッグを使うかどうか?…などといった、CPUの基本的な動作を設定するレジスタのようなものです。

その中の設定の一つに「JTAGを使うかどうか?」というものがあります。

今回、デバッガとして「Atmel-ICE」を使うことを前提に記事を書いていますが、この「Atmel-ICE」にはターゲットに対して2つの接続モードがあります。


1つ目は、ヒューズの設定やプログラムの書き込みなど、比較的シンプルな操作を行うための「ISP」モード

2つ目は、「ISP」モードの機能に加え、ブレークポイントを仕掛けてプログラムをデバッグするなどの高度な操作を行うための「JTAG」モード


配線の時に、2つケーブルを接続したでしょう?

6ピンの方は「ISP」モード用、バラバラ10ピンの方は「JTAG」モード用の配線なのです。

問題なのは「Arduino Mega 2560」(というかAVRマイコン全般)はデフォルトのヒューズ設定では「JTAG」モードを使用できないということです。

但し「ISP」モードは使えますし、これでヒューズの設定を変えることもできます。

ですので、これを使って「JTAG」モードを使えるようにヒューズ設定を変更しましょう。

「Atmel-ICE」高いんだから、最大限に役に立ってもらわなければ!

早速、「ISP」モードでパソコンと「Atmel-ICE」をUSBで繋ぎましょう。

「Atmel-ICE」に接続するケーブルは、6ピンの方です。

バラバラ10ピンの方は、とりあえず放置。

同時に「Arduino Mega 2560」もUSBでパソコンに繋ぎます。

(「Atmel-ICE」側は「SAM」ではなくて「AVR」の方のコネクタに接続してください。)


次は、ソフトウェア側の操作です。

「Microchip Studio」でプロジェクトを作成した前回の状況から始めます。

以下の画面が表示されたら、上部にある「ATmega2569」というタブをクリックしてください。


すると、以下の表示に切り替わりますので、すかさず左のリストから「Tool」をクリックしてください。


以下のような画面に切り替わります。

Selected debugger/programmer」のコンボボックスに接続中の「Atmel-ICE」がID番号付きで表示されていますか?

(「J41800113804」というIDは私のですね。)

表示されていない場合は、コンボボックスをクリックして、あなたの「Atmel-ICE」(「J41800113804」以外のもの)を選択してください。

加えて「Interface」は必ず「ISP」を選択してください。


この設定を保存しましょう。

画面上部の保存アイコンをクリックしてください。

(いいよね~フロッピーディスクのアイコン。)


次に、「Microchip Studio」のメニューから「Tools」->「Device Programming」をクリックします。


以下のような画面が表示されたら、「Tool 」は Atmel-ICE、「Device」はATmega2560、「Interface」はISP、それぞれの設定を確認の上「Apply」をクリックしてください。


以下のような画面が表示されたら、左側のリストから「Fuses」をクリックします。


以下のような画面が表示されれば、「ISP」モードにより正常にCPUからヒューズ設定を読み出せた証です。

これが現在のヒューズ設定です。


ここから、以下のようにヒューズ設定を変更します。

これらを変更すると、画面下部の「HIGH」の値が変わります。

この値は、各々のヒューズ設定をビット化し、それをHEXで表したものだからです。

・「HIGH.JTAGEN」のチェックを入れる

・「HIGH.EESAVE」のチェックを入れる

・「HIGH.BOOTRST」をチェックを外す


画面下部の「HIGH」の値が「0x91」になればOKです。

Program」ボタンをクリックして、新しいヒューズ設定をCPUに書き込みましょう。


以下の警告が出ます。

「JTAGEN」のチェックを外すとJTAG使えなくなるぞ!…って、知ってるし、今回チェックしたし、デフォルトで使わせてくれないからこうやって余計な作業をしているわけだが…。

Continue」をクリックです!


以下のように、画面最下部に「Verify registers ... OK」の表示が出れば、無事ヒューズ設定の更新は完了です。

Close」ボタンをクリックして、画面を閉じましょう。


これで「Atmel-ICE」で「JTAG」モードを使える設定になっているはずです。

確かめてみましょう。

「JTAG」モードでパソコンと「Atmel-ICE」をUSBで繋ぎましょう。

「Atmel-ICE」に接続するケーブルは、バラバラ10ピンの方です。

「ISP」モード用の6ピンのケーブルと繋ぎ替えてください。


「Microchip Studio」の方は、以下の画面に戻りましょう。

この画面の「Interface」のコンボボックスには、今度は「JTAG」を選択します。


おっと、保存もお忘れなく!


「Microchip Studio」のメニューから「Tools」->「Device Programming」をクリックします。

今度は「JTAG」を選択して「Apply」!


以下のように「JTAG」モードでも先程設定した通りのヒューズ設定が表示されれば大成功!

これでデバッガが使えるようになりました!


プログラムの転送とデバッグ

さて、JTAGが使えるようになったので、早速サンプルプログラムを転送して実行してみましょう。

その前に「TeraTerm」のご用意を。

インストールしていない方は、このページ(TOPPERS/ASPのビルドからデバッグまで~サンプルプロジェクトのデバッグ)の「TeraTermの導入」の項目を参考にしてください。

もちろん、シリアル通信のターミナルであれば、他のものもお使いいただけます。

「Arduino Mega 2560」はパソコンにUSB接続すると、擬似的なシリアルポートとして認識されます。

今回のTOPPERS/ASPのサンプルプログラムは、シリアル通信のメッセージを出力しますので、認識されたシリアルポート番号でターミナルを立ち上げておきましょう。

設定は、こんな感じです。

ボーレートは「9600」です。

(私のパソコンは、Arduinoをポート10として認識していますね。)


さて、「Microchip Studio」に戻りましょう。

プログラムのビルドと実行を行います。

画面上部の「」ボタンをクリックします。


しばらくすると、立ち上げておいたターミナルに以下のような表示が出ていると思います。

TOPPERS/ASPカーネルとそのサンプルプログラムの転送と実行に成功です。


ブレークポイントを試してみましょう。

動作中のプログラムを停止します。

画面上部の「」ボタンをクリックします。



ブレークポイントを仕掛けましょう。

画面右の「Solution Explorer」のソースコードリストの中から「sample1.c」をダブルクリックし、ソースコードを表示します。

このソースコードの丁度中盤くらい、メインタスクの始めに仕掛けましょうか。

ブレークポイントは、ソースコードビューの左端をクリックすると赤丸が表示され、セットされていることを表します。

仮に、これを再びクリックするとブレークポイントが解除され赤丸も消えます。


では、ブレークポイントを仕掛けた状態で、プログラムを再び実行してみます。

上手く引っかかってくれるでしょうか…。


以下のようにプログラムが停止すれば成功です!

ここからは、「F10」キーでステップオーバー、「F11」キーでステップインなど、おなじみの操作が使用できます。

因みに、ステップオーバーやステップインなどを行っている時に命令が飛んでしまったり前後したりする場合は、最適化のせいです。

デバッグ時は、このページ(TOPPERS/ASPのビルドからデバッグまで~サンプルプロジェクトのデバッグ)の「サンプルプログラムのデバッグ」の項目を参考に最適化を解除しましょう。


ここまでの作業、本当にお疲れさまでした。

さて、次回はサンプルプログラムの動きの説明や、今回のArduino MEGA2560用ASPカーネルのちょっと込み入った情報を書いていきます。


<続く>

BSD 4-Clause License

  名称:「四条項BSDライセンス」(BSD-4-clause) タイプ: ・コピーレフト…× ・ライセンス文の掲示…〇 ・コピーライト(著作権)の掲示…〇 ・その他…〇 原文: Copyright (c) <year>, <copyright holde...