ENGLISH 简体中文 日本語 한국어  



   
 
キーワードまたは型番を入力    




アプリケーションノート 3550

DS80C400のためのIARコンパイラの使用

要約:DS80C400マイクロコントローラのROMの機能には、8051アセンブリ、C、またはJava™で記述されたプログラムからアクセスすることができます。このROMとダラスセミコンダクタが開発したソフトウェアライブラリを使用することによって、多くのアプリケーションを構築することができます。このアプリケーションノートでは、8051 IAR Embedded Workbench™を使用して、DS80C400向けのアプリケーションをCで構築する方法について説明します。簡単なHTTPサーバを実装することによってDS80C400のROMの機能を説明します。

以下も参照:

はじめに

DS80C400マイクロコントローラのROMには、8051アセンブリ、C、またはJavaで記述されたプログラムからアクセスすることが可能な一連の機能が含まれています。DS80C400のROMは、実績のあるTINI®のネットワークスタック、プロセススケジューラ、およびメモリマネージャを備え、Cとアセンブリによるプログラムを作成するための出発点として優れています。単純なプログラムにはアセンブリ言語で十分です。ただし、より複雑なプログラムについては、C言語を使用することで、ROMに含まれるコンポーネントとダラスセミコンダクタ提供のソフトウェアライブラリを活用することができます。これらのライブラリは、Keil µVision2®、SDCC、およびIAR 8051コンパイラを使用してアプリケーションを構築する場合に役立ちます。

このアプリケーションノートでは、8051 IAR Embedded Workbenchを使用し、CでDS80C400用のアプリケーションを構築する方法について説明します。また、簡単なHTTPサーバを実装することによってDS80C400のROMの機能を使用する方法についても実際に説明します。ここで説明した開発はすべて、TINIm400検証モジュールと8051 IAR Embedded Workbench (Cコンパイラのバージョン6.11Aを同梱)を用いて行いました。

8051 IAR Embedded Workbenchのインストール

この項では、IAR Embedded Workbenchツールスイートを使用し、単純なHello WorldプログラムをCで作成する方法を説明します。これは、ユーザにとって初めてのDS80C400用アプリケーションとなります。
  1. IAR Embedded Workbenchをインストールします。
  2. [File][New][Workspace]の順に選択します。ワークスペースウィンドウにワークスペースの名前「appnote」を入力します。
  3. [Project][Create New Project]の順に選択します。表示されるダイアログボックスにプロジェクトの名前「hellowworld」を入力します。8051がツールチェーンとして選択されていることを確認します。
  4. プロジェクトウィンドウが左に表示されたら、[Project][Add Files...]の順に選択します。ポップアップダイアログボックスで、[files of type]を[Assembler Files]に変更します。Cstartup.s51というファイルを追加します。このファイルは、ZIPファイルです:ダウンロード
  5. ファイルCstartup.s51をダブルクリックして開きます。セグメント宣言RSEG CSTART:CODE:ROOT (0)を見つけます。ここはコードセグメントが開始される場所です。各セグメントの開始アドレスはファイルlink51ew_400.xclで宣言されています。コードの開始は、このファイルの0 × 400000hで宣言されています。また、「DB 'TINI'」という行、およびこれに続いて、「Target Bank」というコメントが付いた「DB, high (?INIT)'」行があるはずです。これによって、アプリケーションは、TINIm400上のフラッシュの先頭と一致することになります。
  6. 新しいファイルmain.cを作成します。このファイルに以下の内容を記述します:
    #include <stdio.h>
    #include <printf.c>
    void main ()
    {
    printf("Test program using IAR compiler");
    while (1)
    {
    }
    }
    
    このファイルを保存します。[Project][Add Files]の順に選択し、ファイルダイアログでmain.cを選択することによって、先ほど作成したファイルをプロジェクトhellowworldに追加します。必ず、作成したmain.cを追加してください。同じ名前の別のファイルがデフォルトディレクトリに存在する可能性が十分にあるからです。
  7. 同様に、low_level_init.s51およびputchar.cというファイルをプロジェクトに追加します。low_level_init.s51ファイルには低水準のDS80C400初期化ルーチン、putchar.cにはデフォルトコンソールに文字を出力する低水準ルーチンが含まれます。
  8. ROM initializationライブラリファイルをhttp://files.dalsemi.com/tini/ds80c400/c_libraries/iar/bin/init.zipから同じディレクトリにコピーし、解凍します。rominit.r51ライブラリファイルをプロジェクトに追加します。
  9. Hello_Worldアプリケーションをコンパイルする前に、DS80C400ターゲットに合わせてIARツールチェーンを構成する必要があります。
    1. [Project][Options][General]の順に選択します。
      • [Target]タブをクリックし、[Derivative]に対してDS80C400を選択します。[Extended stack at:]の値を0xFFDC00に変更します。これは、IARのスタートアップコードがDS80C40ハードウェアスタックを0xFFDC00に再配置するためです。これらの設定については図1を参照してください。
      • [Data Pointer]タブをクリックします。[Number of DPTRs = 1]を選択します。これは、ダラスセミコンダクタが供給するライブラリがこのオプションで作成されているからです。


      図1. 新しいIAR 8051プロジェクトについて[Target]のオプションを選択
      図1. 新しいIAR 8051プロジェクトについて[Target]のオプションを選択

    2. [Project][Options][ICC8051]の順に選択します。
      • [Code]タブをクリックします。[Optimizations][Size][None]を選択します。
      • [List]タブをクリックします。[Output List File][Output assembler File]を有効にします。
      • [Preprocessor]タブをクリックします。インクルードパスとして以下の行を記述します。
        $TOOLKIT_DIR$\INC\
        $TOOLKIT_DIR$\INC\CLIB
        $TOOLKIT_DIR$\src\lib
        $TOOLKIT_DIR$\src\lib\clib
        ..\include\
        
        上記の最後の行はライブラリのヘッダファイル(*[$].h)があるインクルードパスです。上記で指定したパスにヘッダファイルがあることを確認してください。$TOOLKIT_DIR$はIARのインストール先のパスを指します(たとえば、c:/program files/iar systems/embedded workbench 3.n/8051)。
    3. [Project][Options][A8051]の順に選択します。
      • [List]タブをクリックします。[Output List File]を有効にします。
      • [Preprocessor]タブをクリックします。インクルードパスとして以下の行を記述します:
        $TOOLKIT_DIR$\INC\
        $TOOLKIT_DIR$\src\lib
        ..\include\
        
        上記の最後の行はライブラリのヘッダファイル(*.h;*.inc)があるインクルードパスです。上記で指定したパスにヘッダファイルがあることを確認してください。
    4. [Project][Options][XLINK]の順に選択します。
      • [Output]タブをクリックします。
        • [Output file]グループで、[Override default]を有効にし、文字列を[hello_world.hex]に変更します。
        • [Format]グループで、[Other]を有効にし、選択肢から[Intel Extended]を選択します。詳細については図2を参照してください。
      • [List]タブをクリックします。[Generate Linker Listing]を有効にします。
      • [include]タブをクリックします。図3を参照してください。
        • [Ignore CSTARTUP in Library]を有効にします。
        • [Override default]をクリックし、ファイル名を$TOOLKIT_DIR$\config\lnk51ew_400.xclに変更します。$TOOLKIT_DIR$はIARのインストール先のパスを指します(たとえば、c:/program files/iar systems/embedded workbench 3.n/8051)。lnk51ew_400.xcl and lnk_base_400.xclというファイルが指定したパスにあることを確認してください。これらのファイルは、ZIPファイルです:ダウンロード
図2. 新しいIAR 8051プロジェクトについて[XLINK]の[Output]オプションを選択
図2. 新しいIAR 8051プロジェクトについて[XLINK]の[Output]オプションを選択

図3. 新しいIAR 8051プロジェクトについて[XLINK]の[Include]オプションを選択
図3. 新しいIAR 8051プロジェクトについて[XLINK]の[Include]オプションを選択

Hello_Worldアプリケーションを構築します。すべてが正しく行われていれば、エラーや警告なしにアプリケーションが構築され、<project_dir>/debug/exeディレクトリにhello_world.hexが生成されます。プロジェクトの構成がReleaseの場合、16進ファイルが<project_dir>/release/exeディレクトリに作成されます。

実行ファイルができたため、TINIm400モジュールにアプリケーションをダウンロードし、実行する必要があります。

サンプルアプリケーションをTINIm400モジュールにロード

この項では、マキシム/ダラスセミコンダクタが提供するツール「マイクロコントローラツールキット(MTK)」を使用して、IARコンパイラによって生成された16進ファイルをTINIm400検証モジュールにロードする方法を説明します。MTKの最新版はWindowsにしか対応していません。開発環境がWindowsでない場合、「JavaKit」アプリケーションを使用することで、アプリケーションをダウンロードして実行することができます。JavaKitを使用するには、Javaランタイム環境¹(バージョン1.2以降)とJava Communications API²がインストールされていなければなりません。JavaKitツールはTINIソフトウェア開発キット(SDK)に同梱されています。TINI SDKをダウンロードします。このアプリケーションノートの執筆時点では、ファームウェアのバージョン1.15がリリースされている最新のファームウェアでした。JavaKitの起動の手引きについては、TINI SDKのdocsディレクトリにあるRunning_JavaKit.txtというファイルに記載されています。MTKまたはJavaKitの実行で技術的な問題が発生した場合、誰かがすでに類似の問題を抱え、その問題についてダラスセミコンダクタのディスカッションボードに掲載されているかもしれません。既存の書き込みを検索することができます(さらに新しく書き込むこともできます)。

MTKアプリケーションの最新版をダウンロードすることができます。MTKをインストールするには、インストールファイルを実行し、指示にしたがいます。インストールが正常に完了すれば、新しいメニューグループである、[Start][All Programs][Dallas Semiconductor MTK]が追加されます。MTKを起動すると、図4に示すようなダイアログボックスが表示されます。

図4. 起動時のMTKオプション
図4. 起動時のMTKオプション

TINIm400評価ボードで使用するオプション[TINI]を選択します。

[TINI]を選択すると、MTKのメインウィンドウが開きます。[Options][Configure Serial Port]メニューオプションから、TINIm400との通信に使用するシリアルポートを選択します。次に、[Tini][Tini Options]メニュー項目を選択すると、以下のダイアログボックスが表示されます。[DSTINIm400]ボタンを選択し、TINIm400ボードと通信することができるようにMTKを構成します。図5に、このダイアログと[DSTINIm400]ボタンを示します。

図5. TINIm400構成オプションの選択
図5. TINIm400構成オプションの選択

[xxx baud]メニューオプションで[Tini][Open COMx]の順に選択し、シリアルポートを開きます。次に、[Tini][Reset]オプションの順に選択し、評価ボードをリセットします。次のようなDS80C400用のローダプロンプトが表示されます。
DS80C400 Silicon Software - Copyright (C) 2002 Maxim Integrated Products
Detailed product information available at http://www.maxim-ic.com
Welcome to the TINI DS80C400 Auto Boot Loader 1.0.1
>
[File]メニューから、[Load HEX File]を選択します。先ほど作成したhello_world.hexファイルを検索して選択します。ロードしたプログラムを実行する方法は2つあります。プログラムはバンク40にロードされているため、以下のように入力することによって実行することができます:
> B40
> X
バンク40を選択してそこにあるコードを実行するもう1つの方法は、次のとおりです。
> E
この場合、ROMは実行可能コードの検索を行います。つまり、カレントバンクに実行可能コードがあることを示す特殊なタグを検索します。このタグは、文字列「TINI」にカレントバンクの番号が続く形式で、カレントバンクのアドレス0x0002にあります。アプリケーションの始動コードは、以下の行でこのタグを宣言しています。
?VECTOR_TABLE:
sjmp ?INIT
DB 'TINI' ; Tag for TINI Environment 1.02c
; or later (ignored in 1.02b)
DB high(?INIT) ; Target bank
sjmp ?INITステートメントがバンク0x40のアドレス0x0000にあることに留意してください。sjmpステートメントは2バイトであるため、この後、アドレス0x0002から実行可能タグ{ 'T', 'I', 'N', 'I', 0h}が続きます。「E」と入力すると、ROMはバンクC0hから開始して下向きに検索し、実行可能コードを探します。「E」を入力した後、意図したものとは異なるコードが実行された場合は、コードをロードした0x400000よりも高位のアドレスに実行可能タグをROMが見つけたことを意味します。この場合、そのタグを見つけて、その領域のメモリの内容を消去する必要があるかもしれません。

ROMとIAR ROMライブラリへのインタフェース

アセンブリからROM関数を呼び出すプロシージャは、「高速マイクロコントローラユーザガイド」のDS80C400の付録3で説明されています。ただし、CからのこれらのROM関数の呼び出しはやや複雑です。パラメータをIAR C コンパイラの形式からROM形式に変換する必要があります。IARコンパイラは、ハードウェアのスタック位置とレジスタの組み合わせでパラメータを渡します。ところが、ROM関数はさまざまな形式でパラメータを受け取ります。たとえば、ソケット関数は1つのパラメータバッファに保存されたパラメータを受け取ります。逆に、ユーティリティ関数の多くは特殊な関数レジスタまたはスタックメモリ位置で渡されたパラメータを受け取ります。IARの呼び出し形式からROMのパラメータ形式に変換するため、ダラスセミコンダクタはROM関数にアクセスするためのROMライブラリを用意しました。

CプログラムでROM関数を使用するには、ヘッダファイルをインクルードし、対応するライブラリファイルをリンクするだけです。IARコンパイラのROMライブラリを以下に示します。
  • ROM初期化ルーチン
  • DHCPクライアント
  • プロセススケジューラ
  • ソケット(TCP、UDP、マルチキャスト)
  • TFTPクライアント
  • ユーティリティ関数(CRC16、乱数)
ファイルシステム、メールクライアント、HTTPサーバなどのIARで利用可能な拡張ライブラリは、このアプリケーションノートの執筆時点では用意されていません。ダラスセミコンダクタはIAR用のライブラリサポートを強化しているため、DS80C400のIARライブラリホームページ4が更新されているかどうかを確認してください。

簡単なアプリケーション:HTTPサーバ

ROMライブラリの機能の一部、特にソケットとタスクスケジュ−ラの各ライブラリの使用方法を示すために簡単なhttpサーバを用意しました。サンプルアプリケーションは、HTTPサーバとSNTPクライアントという2つのモジュールで構成されています。メインプログラムは、httpサーバを実行するサブタスクを新しく作成します。httpサーバはポート80でクライアント接続を処理します。親タスクは60秒ごとに1回、時刻サーバの現在の時間と同期をとろうとします。

SNTPクライアントモジュール

以下のコードは、SNTPクライアントモジュールの中核となる機能を記述しています。
socket_handle = socket(0, SOCKET_TYPE_DATAGRAM, 0);
for (i=0;i<256;i++)
buffer[i] = 0;
// set a timeout of about 2 seconds
buffer[0] = 0x0;
buffer[1] = 0x0;
buffer[2] = 0x8;
buffer[3] = 0x0;
setsockopt(socket_handle, 0, SO_TIMEOUT, buffer, 200);
buffer[2] = 0; //reset since we used this in call to setsockopt
buffer[0] = 0x23; // No warning/NTP Ver 4/Client
address.sin_addr[12] = TIME_NIST_GOV_IP_MSB;
address.sin_addr[13] = TIME_NIST_GOV_IP_2;
address.sin_addr[14] = TIME_NIST_GOV_IP_3;
address.sin_addr[15] = TIME_NIST_GOV_IP_LSB;
address.sin_port = htons(NTP_PORT) // port number
sendto(socket_handle, buffer, 48, 0, &address, sizeof(struct sockaddr));
recvfrom(socket_handle, buffer, 256, 0, &address, sizeof(struct sockaddr));
//IAR uses little Endian for storing data, so reorganize the data before //converting it to long
buffer[0]=buffer[43];
buffer[1]=buffer[42];
buffer[2]=buffer[41];
buffer[3]=buffer[40];
timeStamp = *(unsigned long *)(&buffer[0]);
formatTimeString(timeStamp, "London", last_time_reading_1);
formatTimeString(timeStamp - (6 * SECONDS_PER_HOUR), "Dallas", last_time_reading_2);
formatTimeString(timeStamp + (5 * SECONDS_PER_HOUR) + (30 * SECONDS_PER_MINUTE), "Bangalore", last_time_reading_3);
formatTimeString(timeStamp - (10 * SECONDS_PER_HOUR), "Honolulu",
last_time_reading_4);
last_reading_seconds = getTimeSeconds();
closesocket(socket_handle);
SNTPクライアントモジュールは、RFC 1361に準拠して実装されています。SNTPモジュールは、UDPプロトコルを使用してtime.nist.govと通信し、タイプスタンプを要求します。このアプリケーションノートの執筆時点ではDNS検索がサポートされていなかったため、time.nist.govのIPアドレスを手動で設定している点に留意してください。

最初にデータグラムソケットを生成し、約2秒というタイムアウトを与えます(0x800==2048ミリ秒)。これによって、選択したサーバとの通信が失敗した場合に、応答を永久に待っているという事態を避けることができます。

次は、リクエストのオプションを設定する行です。各ビットの意味は、RFC 1361の3節に記載されています。0x23という値は、うるう秒に対する警告なしとNTPバージョン4の使用をリクエストし、モードが「Client」であることを示すものです。共通データグラム関数であるsendtorecvfromを使用してリクエストを送出して応答を受信したら、タイムスタンプ値の秒の部分がtimeStamp変数に割り当てられ、基準時刻の1970年1月1日に対して時刻が調整されます。その後、formatTimeString関数を使用して、このタイムスタンプを「In London it is 05:33:19 on May 11, 2005.」などの読みやすい文字列に変換します。

getTimeSeconds関数は、DS80C400の内蔵クロックをベースとして最終更新時刻を求める関数です。約60秒間隔でしか更新しないため、time.htmlというHTMLページはこの値を使用して、最終更新時刻からの経過時間を報告します。最後にソケットをクローズし、SNTPクライアントは60秒間のスリープに戻ります。

簡単なHTTPサーバ

時刻サーバアプリケーションのもう1つのサブモジュールはWebサーバです。このアプリケーションのHTTPサーバは、RFC 2068で記述されている、非常に簡単なバージョンのHTTPサーバです。このバージョンでサポートされているのはGETメソッドだけで、入力ヘッダは無視され、出力ヘッダもほとんど出力されません。このアプリケーションノートの執筆時点ではファイルシステムライブラリは用意されていなかったため、サンプルアプリケーションは動的にHTMLページを生成します。

サーバソケットは、Berkley型のソケット関数を呼び出すことによって生成されます。このため、サーバソケットのセットアップは極めて簡単です。以下のコードを見れば、この簡単なHTTPサーバで、新しいコネクションの生成からバインド、アクセプトがどのように処理されているかがわかります。
struct sockaddr local;
unsigned int socket_handle, new_socket_handle, temp;
socket_handle = socket(0, SOCKET_TYPE_STREAM, 0);
local.sin_port = htons(80);
bind(socket_handle, &local, sizeof(local));
listen(socket_handle, 5);
printf("Ready to accept HTTP connections...\r
");
// here is the main loop of the HTTP server
while (1)
{
new_socket_handle = accept(socket_handle, &address, sizeof(address));
handleRequest(new_socket_handle);
closesocket(new_socket_handle);
}
この簡単なアプリケーションでは、新規ソケットがアクセプトされても、リクエストの処理を行うために新しいスレッドやプロセスが開始されないことに留意してください。すなわち、同じプロセスでリクエストの処理が行われます。今回のようなデモ用でなければ、HTTPサーバは新しいスレッドを立ち上げてリクエスト処理を行います。そのようにしなければ、複数接続を同時に実現し、処理することができないからです。今回のプログラムでは、リクエストの処理が終わると、ソケットをクローズし、次の接続要求が来るのを待ちます。

handleRequestメソッドは、要求されたリクエストのパースによるファイル名の取得と、メソッドが「GET」であることの確認を行います。他のメソッドは(「POST」、「HEAD」、「OPTIONS」でさえも)処理しません。

IARコンパイラのためのDS80C400アセンブリ関数の作成についての注意

IARのマニュアルには、Cプログラムから呼び出し可能なメソッドを8051アセンブリで記述する方法が説明されています。IARコンパイラで記述したCプログラムから呼び出される8051アセンブリ関数を記述するときには、以下の点が重要となります。引数を渡すためにレジスタを利用できない場合、リトルエンディアンの順序で引数をスタックにプッシュします。
  1. 関数パラメータを渡す形式
    以下の表は、引数の受け渡し方法を示しています。
    Arguments Character
    8-bit values R1,R2,R3,R4,R5
    16-bit values R3:R2 or R5:R4
    24-bit (pointer) values R3:R2:R1
    32-bit values R5:R4:R3:R2

    以下の表は、関数の戻り値の形式を示しています。
    Arguments Character
    8-bit values R1
    16-bit values R3:R2
    24-bit (pointer) values R3:R2:R1
    32-bit values R5:R4:R3:R2

    関数int foo(int x, int y,void* ptr);の引数と戻り値は、以下に示すように渡されます。



  2. データ型の保存形式
    IARはリトルエンディアンの保存形式を採用しています。IARは、再起動されると、バイナリデータの保存フォーマットを使用します。このフォーマットでは、数値の最下位バイトが最低位アドレスに保存されます。

    たとえば、4バイト長の値0xDEADBEEFは、以下に示すようにメモリに保存されます:



  3. 簡単なアセンブリプログラムと「C」とのインタフェース この項では、IAR Embedded Workbenchによる、アセンブリプログラムの記述方法と「C」プログラムとのインタフェース接続の方法について説明します。アプリケーションは16ビット値と32ビット値のバイトをスワップし、スワップしたバイトをデフォルトコンソールに出力します。Cで呼び出し可能な関数のプロトタイプはint ltob( int *shortptr , long *longptr)です。
サンプルアプリケーションは、main.cおよびeswap.s51という2つのファイルで構成されています。main.cはアセンブリ言語で作成したサンプル関数ltob()を呼び出します。新しいプロジェクトendianを作成します。次に、cstartup.s51low_level_init.s51putchar.cの各ファイルとダラスセミコンダクタROMの初期化ライブラリrominit.r51を追加します。これについては、上記の項「8051 IAR Embedded Workbenchのインストール」で説明したとおりです。

以下の内容を記述した新しいmain.cファイルを作成し、プロジェクトendianにこれを追加します。Cでは、コンパイラに関数の呼び出し方法がわかるように関数を宣言しなければなりません。したがって、ltob()関数をmain()の前に宣言します。関数ltob()は成功時には「0」を、ポインタのいずれかがNULLの場合には0以外を返すことに留意してください。プログラムは、以下の結果をコンソールに出力するはずです。
--------------------------------------------------------------------------------------------------------------------
Program output:
Set values: int= 0xdead long = 0x12345678
Converted values: int= 0xedde long = 0x78563412
-------------------------------------------------------------------------------------------------------------------
// program main.c
#include <stdio.h>
#include <printf.c>
#include <frmwri.c>
int ltob(unsigned int *intptr,unsigned long *longptr);
void main()
{
unsigned long i = 0x12345678;
unsigned int k = 0xdead;
int err;
printf("set values: int=0x%x long=0x%lx
",k,i);
err = ltob(&k,&i);
if(err)
printf("Error: One of the pointers is NULL
");
else
printf("converted values: int=0x%x long=0x%lx
",k,i);
while(1)
;
}
新しいファイルeswap.s51を作成し、以下のアセンブリコードを入力して、プロジェクトendianにこれを追加します。このアセンブリプログラムは、関数ltob()をPUBLICとして宣言しています。この関数を「C」プログラムから呼び出すためです。ltob()の最初のパラメータはポインタであり、DS80C400コントローラのレジスタr3:r2:r1で渡されます。2番目のパラメータもポインタで、IARコンパイラによってオフセットの3~5にてスタックにプッシュされます(オフセット3には最下位バイト、オフセット5には最上位バイトが格納されます)。最初に、関数は、スタックに保存されたポインタ(32ビット値を指します)を検索し、ポインタの指すバイトをスワップして、スワップしたバイトを同じメモリ位置に戻します。同様に、16ビット値もバイト単位でスワップし、変換前に保存されていた位置に保存します。レジスタr6とr7がアセンブリ関数を通じて保存されていることに留意してください。これはIARコンパイラがr6とr7を永久レジスタとして取り扱うためで、いかなる関数呼び出しもこれらのレジスタを変更してはならないことを意味します。
#include "reg400.inc"
r0_b0 equ 0 ; Register bank 0 equates.
r1_b0 equ 1
r2_b0 equ 2
r3_b0 equ 3
r4_b0 equ 4
r5_b0 equ 5
r6_b0 equ 6
r7_b0 equ 7
PROGRAM ENDIAN_SWAP
PUBLIC ltob
RSEG FAR_CODE:CODE:NOROOT(0)
; ********************************************************************
;
; int ltob(unsigned int* shortptr, unsigned long* longptr)
;
; ********************************************************************
ltob:
// shortptr is in r3:r2:r1
// longptr is in stack at offset 5
; get the longptr stored in the stack
mov a,SP
clr c
subb a,#5
mov b,a
mov a,esp
anl a,#0x3
orl a,#0xDC ; extended stack is at 0xff dc00
subb a,#00 ; subtract 0x0005 to point to MSB of 2 nd argument
mov DPX,#0xFF
mov DPH,a
mov DPL,b
push r6_b0 ; save r6:r7 for the compiler
push r7_b0
movx a,@DPTR
mov r4,a ;store least significant byte of 'longptr' in r4
inc DPTR
movx a,@DPTR
mov r5,a ;store middle byte of 'longptr' in r5
inc DPTR
movx a,@DPTR
mov r6,a ;store most significant byte of 'longptr' in r6
mov a,r4_b0
orl a,r5_b0
orl a,r6_b0
jz ltob_err ; is (longptr == NULL)?
mov dpx,r6_b0 ; point to the memory where 'longptr' is pointing to
mov dph,r5_b0
mov dpl,r4_b0
pop r6_b0 ; restore r6:r7 for the compiler
pop r7_b0
push dpx
push dph
push dpl
movx a,@dptr ; get the long value (in r4:r3:r2:r1) from the memory
mov r4,a
inc dptr
movx a,@dptr
mov r5,a
inc dptr
movx a,@dptr
mov r6,a
inc dptr
movx a,@dptr
mov r7,a
inc dptr
pop dpl
pop dph
pop dpx
mov a,r7_b0 ; swap the long value bytes and store it in memory
movx @dptr,a
inc dptr
mov a,r6_b0
movx @dptr,a
inc dptr
mov a,r5_b0
movx @dptr,a
inc dptr
mov a,r4_b0
movx @dptr,a
mov a,r1_b0 ; is (shortptr == NULL)?
orl a,r2_b0
orl a,r3_b0
jz ltob_err
mov dpx,r3_b0 ; point to a memory where the 'shortptr' is pointing to
mov dph,r2_b0
mov dpl,r1_b0
push dpx
push dph
push dpl
movx a,@DPTR ; get the integer value from memory
mov r2,a
inc dptr
movx a,@dptr
mov r1,a
inc dptr
pop dpl
pop dph
pop dpx
mov a,r1_b0 ; swap the integer bytes
movx @dptr,a
inc dptr
mov a,r2_b0
movx @dptr,a ; bytes of an integer are swapped and stored in memory
mov r3,#00 ; return 'success'
mov r2,#00
sjmp ltob_exit
ltob_err:
mov r3,#00 ; return 'error'
mov r2,#01
ltob_exit:
ret
END ; end of assembly program
ダウンロード:上記アプリケーションのソースコード

制限事項および開発の問題

IARコンパイラ6.11Aの使用中に以下の制限事項が認められました。
  1. IARコンパイラはスタックを使用してローカル変数を保存します。DS80C400では、スタックは1024バイトに制限されています。DS80C400ライブラリのデフォルトのスタックスワップサイズ(ROM_SAVESIZE)は384バイトです。アプリケーションが多くのスタック変数を宣言している場合は、それに合わせてこの制限を変更するようにしてください。デフォルトのタスクスワップサイズを変更するには、task_genesis(unsigned int savesize)またはtask_fork(unsigned char priority, unsigned int savesize)というダラスセミコンダクタのライブラリ(rom400_task.hで定義されています)を使用し、savesizeパラメータに適正な値を設定します。
  2. 「最低の最適化レベル」を選択しない限り、printfsprintfなどの関数は正しく機能しません。最適化のレベルを選択するには、[project][options][ICC8051]の順に選択し、[Code]タブで[None]を選択します。
  3. IARによるprintfsprintfのデフォルトライブラリは正しく機能しません。これらのライブラリを正しく機能させるには、CプログラムにIARが提供するCのファイルをインクルードする必要があります(#include <printf.c>など)。

結論

IARコンパイラとダラスセミコンダクタが提供するライブラリによって、Cで記述したアプリケーションがDS80C400 ROMソフトウェアの性能と機能を利用することができるようになります。Cで記述したプログラムは、ネットワークスタック、メモリマネージャ、プロセススケジューラ、およびその他の多くのDS80C400の機能を利用することができます。DS80C400マイクロコントローラ用にC言語を使用する開発者は、簡潔なアプリケーションを作成し、そのアプリケーションに十分な速度、性能、およびコードスペースを与えることによって、いかなる問題にも取り組めるようになります。ダラスセミコンダクタは、Keilコンパイラで現在利用可能なDS80C400のすべてのライブラリの、IARコンパイラへの移植に取り組んでいます。DS80C400 IARライブラリのホームページを定期的に閲覧し、更新状況を確認してください。

関連リンク

IAR ROMライブラリプロジェクトホーム
IARのホームページ
Java開発キットのダウンロードページ
Java通信API
Application Note 609:Internet Speaker with the DS80C400 Silicon Software
1-Wireパブリックドメインキット
DS80C400ユーザガイド
TINIソフトウェア開発キット

¹ Javaランタイム環境
² Java通信API
³ 高速マイクロコントローラユーザガイドのDS80C400の付録
4 http://files.dalsemi.com/tini/ds80c400/c_libraries/iar/index.html



µVision2はKeil Corporationの登録商標です。

IAR Embedded WorkbenchはIAR Systems ABの登録商標です。

JavaはSun Microsystems, Inc.の商標です。

TINIはMaxim Integrated Products, Inc.の登録商標です。

WindowsはMicrosoft Corp.の登録商標です。


関連製品  APP 3550: Jan 12, 2006
DS80C320 高速/低電力マイクロコントローラ フルデータシート
(PDF, 700kB)
無料
サンプル
DS80C400 ネットワークマイクロコントローラ フルデータシート
(PDF, 1.8MB)
無料
サンプル
DS80C410 イーサネットおよびCAN付きネットワークマイクロコントローラ フルデータシート
(PDF, 1.8MB)
無料
サンプル
DS80C411 イーサネットおよびCAN付きネットワークマイクロコントローラ フルデータシート
(PDF, 1.8MB)
無料
サンプル

自動アップデート
お客様が関心のある分野でアプリケーションノートが新規に掲載された際に自動通知Eメールの受信を希望する場合は、EE-Mail™にご登録ください。


We Want Your Feedback!



フィードバックをお寄せください。
内容に満足されましたか、あるいは満足されていませんか?もっと良いページにできると思いますか?あるいは、単なるコメントでも結構です。フィードバックをお待ちしています。—マキシムはお客様からいただく訂正、提案を元に改善していきます。 このページを評価し、フィードバックを送信する。

 

ダウンロード、PDFフォーマットダウンロード、PDFフォーマット(264kB)
 AN3550, AN 3550, APP3550, Appnote3550, Appnote 3550

        •         •         •     プライバシーポリシー     •     法的お知らせ

    Copyright © 2009 by Maxim Integrated Products