2009年5月25日月曜日

FreeRTOSV5.2.0(LPC23xx)を解析する。

CQ出版 Interface誌 2009.5付録基板 LPC2388を何とか使えるようにしたいと思い、悪あがきを続ける。

1.GNU GCCによる開発環境の整備
 ・バージョン4.3.0 4.4.0 いづれも LED点滅など簡単なプログラムは可能
 ・複数割り込み等、少々込み入ったプログラムは、一定時間稼動後ハングする。

2.FreeRTOSによる開発プロトタイプの構築
 ・http://www.freertos.orgにアクセスし、ダウンロードサイト(http://sourceforge.net)からFreeRTOSV5.2.0.zipをダウンロードする。
 ・zipファイルを展開し、ARM7_LPC2368_Eclipse,Common,SourceのフォルダをCopyし、プロトタイプの構築を試みる。
 ・ARM7_LPC2368_Eclipse/RTOSDemoのフォルダでバージョン 4.4.0 でmakeを実行
 ・configPINSEL2_VALUEの未定義エラーが起こる、FreeRTOSConfig.h の #define confinPINSEL2_VALUEのコメントをはずす。
 ・再度ビルド、 no memory region specified for loadable section `.eh_frame' が起こる。
 ・適当に、lpc2368.ld(リンカスクリプト)を修正
    ※追記内容
     .eh_frame_hdr : ALIGN (4)
     {
     KEEP (*(.eh_frame_hdr))
     } >ethram          <<(ramをethramに変更)
     .eh_frame : ALIGN (4)
     {
     KEEP (*(.eh_frame))
     } >ethram          <<(ramをethramに変更)

     (ramでは「RTOSDemo.elf section .eh_frame will not fit in region ram」ビルドエ- で ethramに変更 これも適当)

 ・再度ビルド実行 成功 ただし、「does not support interworking」のワーニング表示
 ・このディレクトリをCopyしRTOS開発環境のプロトタイプとする。
    ARM7_LPC2368_Eclipse >> ARM7_LPC2388_Prototype
RTOSDemo >> RTOS_Prototype
    lpc2368.ld >> lpc2388.ld ファイル名変更
    Makefileの内容も併せて変更 lpc2368 を lpc2388 に変更
    ビルドを試す。 >OK

3.FreeRTOSによる開発プロトタイプの構築 その2
 プロトタイプへの修正内容
  ・LCD関連の無効化(将来 SG12864に対応)
  ・TCP/IPプロセスの無効化
  ・LEDを 基板LED1 Port1 Pin18に変更
 1)FreeRTOSの分析
  ・main.cの分析

4.自作関数の組み込み
 1)LEDコントロールの組み込み
 2)LCD(グラフィック)コントロールの組み込み。
  不具合
  ・memset,strcpy,strncpy,strlen,strcatでハングする。
  ・memset等の関数を自作する。LPC_memset等 とする。
    >>一応 動作OK
 *memset,strcpy等の標準関数は今後必須としたいので、>>
  ・コンパイルオプション検討(自作関数用 LPC23Lib.a )
    COMPILE_OPTS = -O1 -mcpu=arm7tdmi-s -fomit-frame-pointer -mthumb-interwork
       を
    COMPILE_OPTS = -mthumb -O0 -v -mhard-float に変更。
    (-mcpu=arm7tdmi-s で エラー Error: selected processor does not support requested special purpose register -- `mrs r3,CPSR'... )
    でようやくOK

5.デバッグ用にLOGのLCD出力
  FreeRTOSの関数 xTaskCreate() 正常に実行される。
   〃       vTaskStartScheduler() ほどほどに動作。
    ・タイマー0の割り込みで実行される関数を portISR.c (ARMモードでコンパイル)から自作関数(thumbモードでコンパイル)に置き換えると、VICVectAddr4に設定されるアドレスが1バイトずれる。> 仕方なく、portISR.c にコードを書き込む。(原因不明)
    ・このタイマー割り込み関数は、最初の割り込み時に実行される。しかし、それ以降の割り込みは確認出来ず。

6.泥沼。
  1)thumbモードをARMモードにしたり、thumbモードに戻したり。(Makefileをいろいろイジル)
  2)etc.

7.現時点でのLPC2388の壁
 1)割り込み関連の扱い VICVectAddrX, VICVectCntrlX,,,etc.
 2)命令系がARMモードとThumbモードの2ある事。
    参考にするサンプルコード(プロジェクト)が両方使っているケースが多い。
 3)startup.s , boot.s 等のスタートアップ用のアセンブラコードが難解。
 4)リンクスクリプトファイルも難解。
 5)とにかくタイマー0の割り込みが安定的に動かない。。。。。
 6)GNU GCC の地雷 >> 単に変数を追加するだけで動作が異なる。









    





 

2009年5月14日木曜日

GNUによる開発環境の整備(for ARM7TDMI)

組み込み用の開発環境として、GNUによる開発環境の整備を試行します。
問題はWindowsVISTA 64bit、失敗覚悟で行います。

1.linux環境の構築(Cygwinのインストール)
 1)"http://www.cygwin.com"にアクセス
 2)「Install or update now!」のアイコンをクリック ダウンロードで「実行」
    [Cygwin Setup]インストーラが立ち上がる。
 3)「Choose A Dounload Source」で Install from Internet を選択
 4)「Select Root Install Directory」は デフォルト"C:\cygwin"のまま設定
 5)「Select Local Packege Directory」は 適当にディレクトリ"C:\DownLoad\Cygwin"を設定
 6)「Select Your Internet Connection」で Direct Connection を選択
 7)「Select Download Site」で 適当にダウンロードサイトを選択
 8)「Select Packeges」先頭の"All"の横の"Default"はそのまま。
   ①パッケージの追加
    再度[Cygwin Setup]インストーラが立ち上げ以下のパッケージを追加する。
     ・"Archive" zip等のファイルの圧縮/解凍
     ・"Devel"  gcc、make等の開発ツール
     ・"Editors" vi等のエディター
     ・"Net"/"inetutils" telnet等のネットワークツール

--アンインストールの場合  
( ⑧「Select Packeges」で 先頭の"All"の横の"Default"をクリックして"Uninstall"に変更する。)
     

2.GNU開発環境のインストール
 1)GNU関連パッケージの入手
  ①"http:://www.gnu.org"にアクセス
  ②[DownLoad]をクリック
  ③「How to get GNU software」の[・Download it from the web or via FTP:we....]をクリック
  ④「GNU mirror list」の[Asia/Japan ftp://ftp.ring.gr.jp/pub/GNU]をクリック
  ⑤gccパッケージの入手
   ・[gcc]をクリック
   ・[gcc-4.4.0]をクリック(最新版にトライ)をクリック
      ※IE8.0では不調 [Apr 22 09:39 gcc-4.4.0]の表示
   ・[gcc-4.4.0.tar.bz2]をクリック
   ・c:\Download\GNUに保存
  ⑥binutilsパッケージの入手( ④のFTPサイトより。)
   ・[binutils]をクリック
   ・[binutils-2.19.1.tar.bz2]をクリック
   ・c:\Download\GNUに保存
  ⑦gmpパッケージの入手( ④のFTPサイトより。)
   ・[gmp]をクリック
   ・[gmp-4.3.1.tar.bz2]をクリック
   ・c:\Download\GNUに保存
  ⑧mpfrパッケージの入手
   ・"http://www.mpfr.org/”にアクセス
   ・[Latest release: download]をクリック
   ・[mpfr-2.4.1.tar.bz2]をクリック
   ・c:\Download\GNUに保存
  ⑨Insightパッケージの入手
   ・"ftp://sourceware.org/pub/insight/releases/”にアクセス
   ・[insight-6.8.tar.bz2]をクリック
   ・c:\Download\GNUに保存
  ⑩newlibパッケージの入手
   ・"ftp://sourceware.org/pub/newlib”にアクセス
   ・[ newlib-1.17.0.tar.gz]をクリック
   ・c:\Download\GNUに保存

 2)インストール (Cygwinでの作業)
  ①インストール先ディレクトリ作成
   ・cd /usr/local
   ・mkdir arm-tools
  ②各パッケージの解凍
   ・tar jxvf /cygdrive/c/DownLoad/GNU/binutils-2.19.1.tar.bz2
   ・tar jxvf /cygdrive/c/DownLoad/GNU/gmp-4.3.1.tar.bz2
   ・tar jxvf /cygdrive/c/DownLoad/GNU/mpfr-2.4.1.tar.bz2
   ・tar jxvf /cygdrive/c/DownLoad/GNU/gcc-4.4.0.tar.bz2
   ・tar jxvf /cygdrive/c/DownLoad/GNU/insight-6.8.tar.bz2
   ・tar zxvf /cygdrive/c/DownLoad/GNU/newlib-1.17.0.tar.gz
(arm-tools以下をバックアップ)
  ③binutilsパッケージのインストール
   ・cd binutils*
   ・./configure --target=arm-elf --prefix=/usr/local/arm-tools
   ・make
   ・make install
  ④gmpパッケージのインストール
   ・cd ../gmp*
   ・./configure --prefix=/usr/local/arm-tools
   ・make
   ・make check
   ・make install

  ⑤mpfrパッケージのインストール
   ・cd ../mpfr*
   ・./configure --prefix=/usr/local/arm-tools --with-gmp=/usr/local/arm-tools
   ・make
   ・make check
   ・make install

  ⑥gccパッケージのインストール
   ・cd ../
   ・mkdir BuildGcc
   ・cd BuildGcc
   ・../gcc-4.4.0/configure --target=arm-elf --with-gmp=/usr/local/arm-tools --with-mpfr=/usr/local/arm-tools --prefix=/usr/local/arm-tools --enable-interwork --enable-multilib --enable-languages=c --disable-libssp
    (--with-newlib を追加 */* 下記参照)
    (--with-float=soft を追加 7/10 )
   ・make
   ・make install

   (/usr/local/arm-tools/binにPATHを通す。 <== newlibインストール失敗対応 12/4 )

  ⑦newlibパッケージのインストール
   ・cd ../newlib*
   ・./configure --target=arm-elf --prefix=/usr/local/arm-tools
    (--with-float=soft を追加 7/10 )
   ・make
   -- インストールの中断(エラーによる)

     エラー発生
       内容
         lib_a-dummy.oのコンパイル時
/bin/sh: arm-elf-cc: command not found

     エラー解析
      a.現在GNU開発環境があるPCでnewlibのconfigureを実行、出力Makefileを今回のMakefileと比較(diff)
       > CC_FOR_TARGET=$(STAGE_CC_WRAPPER) arm-elf-gcc $(FLAGS_FOR_TARGET) 
       < CC_FOR_TARGET=$(STAGE_CC_WRAPPER) arm-elf-cc $(FLAGS_FOR_TARGET) <=今回
       なぜ arm-elf-cc になったのか?
      b.config.logを確認
       591行目 CC_FOR_TARGET があった。
      c.configureの確認
       8539行以降にCC_FOR_TARGETの設定が記述

対処
      a.深く考えなく、GCCのバージョン を 4.3.3 に入れ替える。
             ==>変わらなかった。
      b.GCCのインストール 各オプションを変える。
             ==>検討中 ==> 解決
次のオプションでgccの configure を実行 (--with-newlib を追加)
     ../gcc-4.4.0/configure --target=arm-elf --with-gmp=/usr/local/arm-tools
         --with-mpfr=/usr/local/armtools --prefix=/usr/local/arm-tools
         --enable-interwork --enable-multilib --enable-languages=c
         --disable-libssp --with-newlib
       で gccとnewlibのインストール作業をやり直した。

※newlibでの再ビルドは make clean では不十分、newlib-1.17.0.tar.gz の解凍からやり直したほうが良さそう。

   --インストールの続き
   ・make install

  ⑥gccパッケージの補足インストール
   ・cd ../BuildGcc*
   ・make all
   ・make install

3.GNU検証
 1)newlibインストール失敗(未解決)での検証
   ① TIMERでLEDを点滅プログラム
             ==> 成功
 ② LCD表示プログラム
     ・リンクで、-lc オプションがエラー  llibc がリンクできず。

その他
 1)NXP LPC2388用 ダウンローダー 「Flash Magic」のインストール
   ①"http://www.flashmagictool.com/"にアクセス
   ②Download FlashMagic.exe (ページ右側)をクリック
   ③インストールプログラムを実行
 2)CP2102_USB ドライバのインストール
   ①LPC2388基盤をUSB接続
   ②ドライバインストールを促されるので、インターネットでドライバを検索する方法でインストールを行う。

2009年5月13日水曜日

DELL Studio Slimが潰れた。 無事復旧?

 先週より、いじくりまわしていた DELL Studio Slimが 潰れた。
Windows VISTAのインストール 7回、Windows 7 4回、かなりヘビーな事をやってった報いかとも思いつつ、、、
 前日、NEC ValueOne、HP xw4400、IBM RS6000、と順次シャットダウンを行ったのですが。DELL Studio Slimだけが立ち上がらない。

 1.本日最初の立ち上げ。
 「Windowsのシャットダウン障害の意味のメッセージ」
が表示。かまわず通常のWindows立ち上げを選択。 10分ごも立ち上がらない。画面表示なし。ディスクアクセスは頻繁にある。メインスイッチを長押しし、電源OFF
 2.セーフモードでの立ち上げ。
  ①最初の立ち上げと同じ障害メッセージが表示されたので、Safeモードを選択して立ち上げた。
  ②シャットダウンを行う。
 3.3度目の立ち上げ。
  最初の障害メッセージは出ない、Windowsが立ち上がりそうに思えたが、最後の最後で、立ち上げはストップ。10分たっても立ち上がらない。ディスクアクセスは頻繁にある。またもや強制電源OFF
 4.セーフモード+ネットワークでの立ち上げ。
  ①障害メッセージに対し。  Windows Live OneCare での バックアップを使った復旧を試みようとSafe+ネットワークで立ち上げた。
  ②Windows Live OneCareは起動を試すが失敗。
  ③シャットダウンを行う。
 5.5度目の立ち上げ。
  最初の障害メッセージは出ない、、、強制電源OFF
 6.セーフモードでの立ち上げ。
  ①コントロールパネル>管理ツール>コンピュータの管理>記憶領域>ディスクの管理で
   WindowsVistaのパーティションを選択し、プロパティを表示
   ツール>エラーチェック>チェックする で 次回起動時にディスクチェックおよび、リカバリを設定して。シャットダウン。
 7.7度目の立ち上げ。
  ①起動時にディスクチェックのメッセージが表示 ディスクチェック、リカバリに 3時間かかり、その後、無表示のままディスクアクセスが続く。
  ②ディスクチェックに3時間かかったので、3時間以上待つ。
  ③Windows Live OneCare で 復元を行う。
    不足しているファイルを全て復元する。
     復元するファイル:2ファイル(16.2KB)
  ④Windoows再起動
  ⑤再起動確認
 
 まとめ
  ・最初の立ち上げ時に、3時間以上待てばよかったと思う。
  ・多分ディスクリカバリが行われているのだろう、その間の無表示は問題。
  ・Safeモードで立ち上げた時、Windows Live OneCare でのファイル復旧が出来ないのは、問題。
  ・Safeモードで 管理ツール>コンピュータの管理>記憶領域>ディスクの管理 で 該当のディスクパーティションのリカバリが出来ないのは、問題。


 その他メモ
  Windows Vistaで Administrator を使用可能にする方法。
  ・コマンドプロンプトを「管理者として実行(A)」で起動する。
   スタート>すべてのプログラム>アクセサリ>コマンドプロンプトを右クリック
  ・コマンドプロンプトで net user administrator /active:yes を実行
  ・コントロールパネル>ユーザアカウントで Administrator のパスワードを設定する。

   

 

2009年5月11日月曜日

再び、Vista64を試す。

 一応、Windows7へのリプレースの検証は終えます。これまでの作業を踏まえ、再度Windows Vista (64bit)へのリプレースを検証します。

1.Windows Vista (64bit)のインストール
 1)PC電源ON、DELL画面でF12キー(Boot Option)を押す。
 2)DELL Reinstallation DVD を PCに入れる。
 3)Boot Devide を CD/DVD:SM-....に変更する。
 4)「Press any key to boot .....」 で 適当にキーを押す。
 5)言語「日本語」選択、、、ライセンス条項「条項に同意します」チェック、インストールの種類「新規」
 6)カスタムインストールを選択
 7)インストールの場所 ディスク0のパーティションを一旦「削除」、「新規」、「フォーマット」
   (ディスク0、パーティション 合計サイズ 465.7GB 空き領域 465.6GB)
   再起動
 8)ユーザー、パスワード、PC名、を入力
 9)「推奨設定を使用します。」を選択、時刻、日付を確認、「開始」...
 10)ウェルカム センター 
  ①デバイスマネージャーで 障害のデバイスを調べる。
   ・ディスプレイアダプタ>標準VGAグラフィックアダプタ
   ・ネットワークアダプタ>Tealtek RTL8168/8111....
   ・ほかのデバイス>SMバスコントローラ
  ②DELL Device driver DVDを 入れる。 autoRcd.exeの実行
Dell Resource CD のインストール

  ③システム、ビデオ ドライバのインストール
   再起動 
  ④ネットワークのドライバのインストール
    ネットワーク デバイス ドライバ (ネットワーク Del Diagnosticsのほうではない。)
     「Realtek RTL81XX...」をクリック。
     「解凍」を押す。 ドライバインストールソフト起動

  ⑤ネットワーク接続確認
   ・IEでmsnのHPが表示される。
   ・スタート>ネットワーク 
    メニューバー下に「ネットワーク探索とファイル共有が無効になっています。、、、」
      「、、、共有の有効化」を選択
   ・「ネットワークと共有センタ」が起動。「いいえ、、、(プライベートネットワークに限定する共有を設定)」を選択。
   ・ネット上のほかのPCが表示できない場合
     ワークグループのチェックボックスの全てのチェックをはずす。か全てのチェックボックスをチェックするかする。
  ⑥ワークグループの変更
   ・スタート>コンピュータで コンピュータのプロパティを表示させる。(右クリック)
   ・コンピュータ名、ドメインおよびワークグループの設定 で「設定と変更」
     システムのプロパティが表示 「変更」
   ・ドメイン・ワークグループを 例)MSHOME に変更する。

2.Windows Live OneCareのインストール

※ここで、バックアップとしてWindows転送ツールを使う。
  このPCを古いPCとして、別のPCの共有ディレクトリに転送ファイルを書き出す。

3.その他アプリケーションのインストール
 1)Roxio Creator DE 10.2
  ①Setup.EXEの実行
   *Windosw 再起動
 2)Cyberlink Remote Media
  ①Setup.EXE
 3)Cyberlink Power DVD DX8.1
  ①Setup.EXE

4.Microsoft Office 2003 のインストール
 1)SETUP.EXEの実行
 2)ユーザー情報の入力
 3)使用許諾契約書 同意
 4)インストールの種類 カスタムインストール
   ①Outlookのチェックをはずす。アプリケーションごとにオプション。。のチェック


5.メール等のデータ移動
   DELL Dimension430S =>(NEC ValueOne 共有ディレクトリ)=> DELL Studio Slim
 1)旧PC用にWindows転送ツール準備
   ①全てのプログラム>アクセサリー>システムツール>Windows転送ツール
   ②新しい、転送を開始しますか?、、「新しい転送を開始する。」を選択
   ③現在使用しているコンピュータはどれですか?、、「新しいコンピュータ」を選択
   ④転送ケーブルについて。 「いいえ、他のオプションを表示します。」
   ⑤古いコンピュータにWindows、、 「いいえ、ここでインストールする必要があります。」
   ⑥Windows転送ツールをインストールする方法、、 「外付けハードディスクまたは、、」を選択
   ⑦ネットワーク上の共有ディレクトリ(NEC ValueOne)を選択
   ⑧ご使用のコンピュータ、、 「はい、ネットワーク上でファイルと設定を転送します。」を選択
   ⑨Windows転送ツールのキーがありますか? 「いいえ、キーが必要です。」を選択。
   
 2)旧PCでファイル転送実行
   ①ネットワークの共有ディレクトリ(NEC ValueOne)のMigWizホルダのMigSetup.exeを実行。
   ②「CD,DVD,または他のリムーバルメディアを使用する。」を選択
   ③「外付けハードディスクまたはネットワークの場所」を選択
   ④ネットワークの共有ディレクトリを指定。パスワード指定。
   ⑤転送するユーザーアカウント、ファイル、および設定の選択。
     ・主要なユーザーアカウント以下
     ・主要フォルダ
   ⑥転送実行。
 
 3)新PCでファイル転送実行
   ①データ転送を行った共有でディレクトリ(NEC ValueOne)のSaveDataダブルクリックする。
     Windows転送ツールが立ち上がる。
   ②共有ディレクトリを「参照」で選択しなおし、パスワードを入力
   ③ユーザーアカウントの引継ぎを確認。
   ④転送実行
    *Windows再起動
 4)IE動作確認
 5)mail動作確認
  ・Windowsメール起動
    「Outlook Expressから電子メールアカウントとメッセージを転送しています。」
      *メッセージインポートしているときにエラー発生
      *アカウントのユーザー/パスワードを要求された。
       全アカウント(システム情報含む)で行った場合、このユーザ-/パスワード要求は無かった。


-------ここから下は、奮闘中

6.Oracle10g Client のインストール
 1)ランタイム インストール
 2)カスタム インストール [Oracle Winodows Interfases 10.1...]
 3)スタート>すべてのプログラム>Oracle-OraClient10g_home1>Configuration and Migration Tools>Net Configuration Assistantで SQL NET 設定を行おうとする。
 4))コンピュータ/ローカルディスク(C:)/Oralce/product/10.1.0/Client_1をアクセスしようとすると、
 「このフォルダーにアクセスする許可がありません。」で続行をクリック
 5)再度 Net Configuration Assistant を起動しようとする。
  「このショートカットの参照先にアクセスできません。必要なアクセス許可がない可能性があります。」
  c:\Oracleの所有者を現ユーザに変更する。
   ①コントロールパネル/システムとセキュリティ/管理ツール/サービスで
     OracleMTSReco...のサービスを停止する。
   ②c:\Oracleの名前を変更する。 c:\Oracle2など
   ③c:\Oracleのディレクトリを作成する。
   ④c:\Oracle2(仮)のフォルダ product を c:\Oracleのディレクトリに Copyする。
   ⑤c:\Oracle2(仮)を削除する。
 6)再度 Net Configuration Assistant を起動。成功
   ①ローカル・ネットサービス名構成
   ②追加
   ③サービス名 ***.world を入力
   ④TCPを選択
   ⑤ホスト名 192.168.xxx.xxxを入力
   ⑥ネットサービス名 *** を入力
     終了
 
 7)SQL Plus の実行 成功
 8)ODBCの設定
   コントロールパネル>>管理ツール>データソース(ODBC)
    ※ Oracle ODBC が無い。
   Windows Vista 再起動 更新プログラムのインストール 46個が 実行される。

    **** Oracle ODBCの設定で悩む。

 9)Oracle HP(OTN)より ODBCドライバをダウンロードする。
   Oracle ODBC Driver 10.1.0.5.0(旧10.1.0.2.0)
>> OUI 10.1.0.3.0が必要 エラー OUI Oracle Universal Installar
Windows XP までは、Microsoft Data Access Componet(MDAQ)
Vistaでは??

  ここで一もがき
Oracle11g Clinet Windows Interface をインストール
  レジストリエディタで 
    HKEY_LOCAL_MACHINE\SOFTWARE\ODBCINST.INI に
     Oracle in OraClient10g_home1 = Installed を 追加
      失敗

  レジストリの登録 参考となるキーがあればエクスポートする。 エクスポートされたファイルをテキストエディタで修正する。このファイルをダブルクリックする。



メモ
 Windows転送では、ビデオドライバの復元は出来なかった。
(ウェルカムセンターはコントロールパネルの[システムとメンテナンス]にあります。)

 













  

           

2009年5月10日日曜日

Windows 7 にトライする。

 いままで、PCのリプレースでいろいろ試しました。その結果 Windows Vista 64bitを一旦諦め、Windows 7 32bit を導入します。

インストール概要
 ①ハードディスクのフォーマット
 ②Windows7(32bit)のインストール
 ③Oralce10gR1 Clientのインストール
 ④Office2003のインストール
 ⑤Excel VBA(OO4O)マクロの稼動設定
 ⑥Visial Studio 2005のインストール
 ⑦VC++2003 開発アプリケーションの稼動確認
 ⑧Visual Studio 2005 開発アプリケーションの稼動確認

1.準備 
 1)Microsoft より、Windows 7 をダウンロードする。
 2)インストールDVDを作成する。
 3)ハードディスクのフォーマット
   *一旦 Windows7 をインストールされた状態で再インストールを行うとき、ハードディスクのフォーマットは行えなかった。
   次の手順でディスクのフォーマットを行った。
  ①DELL studio slim の 電源ON
  ②DELL画面 PF12を押す。(Boot Option)
  ③DELのREINSTALL WindowsVISTA 64bit ディスク入れる。
  ④インストールの場所選択・ドライブオプション で DISK0 パーティション3をフォーマットを行う。
  

2.Windows 7 インストール
 1)DELL studio slim の 電源ON
 2)DELL画面 PF12を押す。(Boot Option)
 3)Windows 7 インストールディスクを 入れる。
 4)Boot Device を CD/DVD:.. に替える。
 5)インストールの重要な更新プログラムの取得 「インターネットに接続して最新のインストール、、」
 6)ライセンス条項 「同意します」チェック
 7)インストールの種類 「新規インストール」を選択
 8)インストール場所の選択 ディスク0 パーティション3 空き450.7GB
 9)ユーザー名、コンピュータ名の設定 / パスワード の設定
 10)コンピュータの保護と。。。 推奨設定を使用します。
 11)日付、時刻設定、ホームネットワーク選択
   Windows7インストール終了 ローカルディスク(C:)空き 440GB
  *Windows7再起動確認

3.Oralce10gR1 Clientのインストール
 1)Oralce10gR1 Client DVDを 入れる。autorun.exeの実行
 2)インストールタイプの選択で ランタイムを選択
 3)Oracle Net Configuration Assistant が立ち上がる。 
 4)インストール終了
 5)スタート>すべてのプログラム>Oracle-OraClient10g_home1>Configuration and Migration Tools>Net Configuration Assistantで SQL NET 設定を行おうとする。
  「このショートカットの参照先にアクセスできません。必要なアクセス許可がない可能性があります。」のエラーメッセージ。
 7)コンピュータ/ローカルディスク(C:)/Oralce/product/10.1.0/Client_1をアクセスしようとすると、
 「このフォルダーにアクセスする許可がありません。」で続行をクリック
 8)再度 Net Configuration Assistant を起動する。 
   ①ローカル・ネットサービス名構成
   ②追加
   ③サービス名 ***.world を入力
   ④TCPを選択
   ⑤ホスト名 192.168.xxx.xxxを入力
   ⑥ネットサービス名 *** を入力
     終了
 9)スタート>すべてのプログラム>Oracle-OraClient10g_home1>Application Development>SQL Plus を起動する。 データベース 接続を確認。

 10)Oracle Client 追加インストール
   ***初期手順略***
 11)インストール先を OracClient10g_home1に変更
 12)インストールタイプ カスタム を選択
 12)使用可能な製品コンポーネント [Oracle Winodows Interfases 10.1...]をチェック
   インストール実行

 登録レジストリを確認
   HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/KEY_OraClient10g_home1/ORACLE_HOME
(C:\Oracle\product\10.1.0\Client_1)
Oracle9iのレジストリと比較。

4.Office2003のインストール
 1)完全インストールを実行 

5.Oracle ODBCの設定
 1)コントロールパネル/システムとセキュリティ/管理ツール/データソース(ODBC)を実行
 2)ODBCデータソースアドミニストレーターでシステムDNSを追加する。
  ①追加 Oracle in OraClinet10g_home1 を選択
  ②データソース名、TNSサービス名、ユーザーIDを入力
  ③接続テスト 成功

6.デジタル署名(プライベート)
 1)スタート>すべてのプログラム>Microsoft Office>Microsoft Officeツール>VBAプロジェクトのデジタル署名
 2)デジタル証明書 証明書の名前 "White Clouds" で 作成。
 
7.Excel VBA(OO4O)マクロの稼動設定
 1)VBA(OO4O)を含むExcel Bookを開く。
 「マクロが使用できません。セキュリティレベル高に設定されています。また、デジタル署名,,,,,」のエラー OK を押す。
 2)ツール/マクロ/Visual Basic Editer を起動
 3)Visual Basic Editer ツール/デジタル署名 を実行
 4)デジタル署名 「選択」 "White Clouds" を選択
 5)このExcel Bookを上書き保存、一旦閉じる。
 6)再度このExecl Bookを開ける。 「セキュリティ」の警告表示
 7)この発行者のマクロを常に信頼する。のチェックボックス チェック >> マクロを有効にする。
   「書き込みできません。」のエラー表示
 8)コンピュータ/ローカルディスク(C:)/Oralce/product/10.1.0/Client_1をアクセスしようとすると、
 「このフォルダーにアクセスする許可がありません。」で続行をクリック
  ※最初のOracle Client インストール後で起きた現象と同じ。対処も同じにする。
 9)再度このExecl Bookを開ける。VBAマクロを実行 成功
  ※それでも失敗することがある。その場合
   ①コントロールパネル/システムとセキュリティ/管理ツール/サービスで
     OracleMTSReco...のサービスを停止する。
   ②c:\Oracleの名前を変更する。 c:\Oracle2など
   ③c:\Oracleのディレクトリを作成する。
   ④c:\Oracle2(仮)のフォルダ product を c:\Oracleのディレクトリに Copyする。
   ⑤c:\Oracle2(仮)を削除する。
   ** この操作は、c:\Oracle フォルダの所有者を Administrator から現ユーザーの切り替え操作です。 **
   ※これは、Windows7とOracle Clientのセキュリティの管理の齟齬が起こすトラブルと考えられます。(今回は、アプリケーションのインストールホルダの所有者を変えることで、Windows7のセキュリティに起因する障害を回避しました。)

8.Visial Studio 2005 のインストール
 1)インストールを開始
  Disk2のインストール中 「このプログラムには、既知の互換性の問題があります。」エラー発生
  場所:・・・Common7\IDE\devenv.exe
  場所:e:\setup\..\wcu\see\SQLEXPR32.EXE
  場所:c:\7644ff.....\setup.exe
このエラーに対し、 プログラムを実行する。を選択
  
 2)Window7 再起動
 3)Visual Studio 2005 起動
 「このプログラムには、既知の互換性の問題があります。」エラー発生
  場所:・・・Common7\IDE\devenv.exe
このエラーに対し、 プログラムを実行する。を選択
 4)全体的な開発を選択。
 5)プロジェクトのOpen 成功、 リビルド 成功、デバッグ 可能


9.Visual Studio 2005 開発アプリケーションの稼動確認
 ※今回 Oracle9iから Oarcle10gへの置き換えになったので Windowsのレジストリの調整を行う。
 1)コマンドプロンプト等で regedit を実行 
 2)レジストリキーの追加 
   HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE に 新規で文字列値 「ORACLE_HOME」を追加
    値は c:\Oracle\product\10.1.0\Client_1 を設定。
 3)デバッグで正常処理確認。

10.Windows Live OneCareのインストール
 1)Windows Live OneCareのハブPC(NEC Value One)で旧PC(Deminsion430S)のエントリを削除
 2)Windows Live OneCareのDVDを入れる。
 3)このプログラムは互換性の問題のためブロックされています。
   インストールファイルをダウンロードできません。
   エラーID 0017-80070003
 Microsoft HP で Windows 7 に対応するアンチウイルスソフトに OneCare が無い、VISTAまでは有った。

 

2009年5月7日木曜日

DELL Dimension 430S を DELL studio slim に置き換えた。

 5月6日 DELL Dimension 430S がそろそろクラッシュしそうなので、先月、GWに何とかしようとして、DELL studio slim を購入しました。
 Dimension 430Sは購入から、7年、ほぼ毎日休み無しに頑張った。この間、SONYのPSXは2年、日立のDVDレコーダーWOOは3年で潰れてしまいました。PCと同じようなAV機器なのに今思い返せば、Dimension 430Sに比べ、非常に高価な買い物だったようです。
 Dimension 430Sの退役に備えて、購入時の箱を見てみたら 2002/04の請求書が出てきた、モニタなしで、98,300円 当時、とても安いと思って買ったのですが、今回購入のstudio slimは、モニタ(23)付き、84.631円、デフレの進行をいまさら実感。
 さて、余談はさておき、今回のPCのリプレースの内容を以下に記します。

Ⅰリプレース内容
1.PC  Dimension430S >> studio slim
 1)CPU Pentium4 1.6GHz  >>  Core2 Quad 2.4GHz
 2)RAM    384MB  >> 4GB
 3)HDD    80GB   >> 500GB

2.OS Windows XP Home >> Windows Vista Home P 64Bit  >> Windows7 32Bit
       WindowsVista(64)へのリプレースは困難、Windows7へのリプレースを試す。
       最終的には XPに戻すことも検討しなければと思う。

3.ソフトウエア
 1)Office 97
    Vista(64)  Office 97 インストール失敗、Office2003 成功
    Windows7(32) Office2003 成功
 2)Visual C++ 2003
    Vista(64)  インストールせず
    Windows7(32) 2003はインストール失敗 Visual Studio 2005 インストール成功(一部エラー)
   
 3)Oracle9i Client 
    Vista(64) Oracle9i インストール失敗、Oracle10gR1(32) インストール失敗、Oracle10gR2(64) インストール失敗 Oracle11g インストール成功
    Windows7(32) Oracle9i インストール不可、Oracle10g(32) インストール成功 
 4)一太郎(これは、諦め)

4.まとめ
 1)Windows Vista、Windows7何れも、セキュリティ強化で、ソフトウエアのインストールがインストール自体の失敗か、ソフトウエアがファイルアクセス制限に引っ掛かって起動できないだけかの見極めが必要。
 2)Windows転送は新旧PC ユーザーアカウントをしっかり管理して行わないと。混乱する。
 3)Excel VBAマクロを使用する場合、デジタル署名(プライベート)を使う、意外と簡単。
 4)Oralce Client インストール時のレジストリの登録について要チェック。



==================================================================================
ここから下は作業ログ(作業内容を書き散らす)
==================================================================================
リプレース作業
1.Windows転送ツール なんも考えず実行
  Dimension430S ===> NEC Value ONE(共有ディスク) ===> studio slim
    2時間程度で終了
 ※ユーザーアカウントの扱いには、注意 
 Windows転送終了後、早速、メール、IEを試す。メールのメッセージ、アカウント、IEのお気に入り、クッキーが初期状態のまま、共有ディスクには、2GBのデータが残っている。、、、
 仕方なく、メール、IE、を個別にデータの移し替えを行う。IEはお気に入り、クッキー、メールはアカウント、アドレス帳の移し替えは成功、しかしメッセージは失敗。
 メールメッセージの移し替えは、
  Windows XP のOutlook ExpressからWindows VistaのWindowsメールへのメッセージの変換となる。ここで問題発生
 Outlook ExpressのメッセージはOutlookのメッセージとしてエクスポート、WindowsメールはOutlookのメッセージがインポート出来ない。(OutlookExpressのメッセージならインポートできるらしい)
 いろいろやるが、どうしてもうまくいかない。仕方なく、Windows転送からやり直す。、

 そこで、気が付く、ユーザーアカウントの新旧PC間の紐付け設定が有った、どうやら、最初の転送で見過ごしていたようです。転送終了後、ユーザアカウントを確認して、ログインする。IEもメールもしっかり旧PC(Dimension430S)から引き継がれていた。 

2.Office97
 Office97のCDをstudio slimに入れる、何も起こらない。フォルダをあけてSetupをクリックする。
エラーで動かない。Office2003で試す。インストール終了、NEC Value OneのOffice2003をアンインストールOffice97に置き換える。
※ ドックのメールをクリックするとOutlookが立ち上がった。少々慌てたが、OutlookのショートカットをWindowsメールのショートカットに置き換えた。

3.Oracle9i クライアント
 1)Oracle9i クライアント トライ 
 Oracle9iクライアントをインストール、最後の最後でコケる。Oracle10g クライアント(32bit)をインストール。
  そのほか 「javai.dllへの書き込み中エラー」
         「jrew.exeは動作停止」

 2)Oracle10gクライアントR1(32bit) インストール
Oracle9iインストールを失敗したあと Universal Installer で インストール済みの製品にエントリが無かったため、Oracle9i をアンインストール作業を行わず。Oracle10gクライアント(32bit)をインストール。
  Universal Installer で インストール済みの製品のエントリにOracle9iとOracle10gのエントリが表示された。
 SQL Plusを試すと、Oracle9i の方が立ち上がり、Oracle10gの方が立ち上がらなかった。
しかし、Excelマクロ(VBA)をためすと、OracleObject for OLE(OO4O)が不調。
 OO4Oはインストールされるが不調 VBAエラー「書き込みできません」 
[Set OO4Session = CreateObject("OracleInProcServer.XOraSession")]
 Oracle9i、Oracle10gをアンインストール
        ※WindowsVistaでのファイルアクセス拒否でおきるエラーの可能性あり。

 3)Oracle10gクライアントR2(64bit) インストール
 Oracle ホームページから Oracle Database 10g R2 Win x64(30日トライアル版) クライアントをダウンロードしインストールを試みる。インストーラ起動時の Windowsバージョン等のチェックでエラー
 「oraparam.ini」をいろいろいじるが、結局だめ。

 4)Oracle11gクライアント(64bit) インストール
  インストールタイプ:ランタイムでインストール
   Oracle ODBC Driver 11.1.0.6.0
 Oracle Provider for OLE DB 11.1.0.1.6.0 のインストール済み確認
 OO4O はOracle Provider for OLE DB になったのか? >> そんなにこだわることは無い。
        
==================================================================================
4.Windows7(32bit)に入れ替え
 ここでちょっと寄り道、Windows Vista(64bit)では、 Excel VBAマクロの全面見直しが必要と予想される。
 Vistaの32Bit版が手元にないので、思い切って、Windows7(32bit)をインストールする。
さて、Oracle Clientのインストールを行う。
 1)Oracle9i Clinetを試す。
  エラー 「ファイルc:\oracle\ora90\orancryp9dllからc:\oracle\ora90\orancryp9.dll.bakへの移動中のエラー」発生。  Oracle Net Configuration で ハング
   *SQL Plus  Oracle7.3 DataBase に接続成功
 2)Office97を試す。
  インストールは成功
  OO4Oの検証用に Excel VBAマクロを実行
  「ActivXコンポーネントはオブジェクトを作成できません」エラーOO4Session = CreateObject("OracleInProcServer.XOraSession")]

  regsvr32 "C:\Program Files\Common Files\Microsoft Shared\DAO\DAO360.DLL"
を試す。エラー
  regsvr32 "C:\Program Files (x86)\Common Files\Microsoft Shared\DAO\DAO360.DLL"
は成功
  Program Files と Program Files (x86) が存在する。 


  Regedit をコマンド コマンドプロンプトで起動する。 操作すると、コマンドプロンプトのウインドウが点滅する。
  レジストリエディタのエントリは Program Files が値として設定。いろいろまずそう。

3)Windows7をインストールする。(ディスクフォーマット)


 2度Windows7をインストールすると、元のVISTAは消える可能性あり。
フォーマットはインストールするパーティションの選択画面で行う。
 Windows7 インストール 直後 10.6GB使用 440GBあき Disk0 パーティション3

  管理 ユーザーアカウント DreamExpress
 ユーザーアカウント yanagiを追加

4)Oracle7 Client をインストール
 ランタイムを選択
  「jrew.exeは動作を停止しました。」
  エラー時に立ち上がっていた Net Configuration Assistant で 「ネット・サービス名を自分で作成する。」のラジオボタン選択でハングする。
 <windows再起動>
 Oracle Net Configuration Assistant を起動
 ローカル・ネットサービス名構成を実行
 ①SQL *Plusを実行 一応DBに接続する。
 ②コントロールパネル・システムとセキュリティ・管理ツール・ODBCデータソースアドミニストレータを起動
   システム DNS で データソースの新規作成 Microsoft ODBC for Oracleで 行う。
   「Oracle in OraClinet9i_home」でないのが問題
     Oracle9i カスタムインストールを実行
5)Office2003をインストール
VBAマクロつきExcellを試す。
  デジタル証明書を要求するダイアログが表示
 すべてのプログラム>Microsoft Office>Microsoft Office ツール>VBAプロジェクトのデジタル署名
 証明書の名前 WhiteClouds
で証明書作成。
 Microsoft Excell > VBAマクロ ブック を開く。> ツール > マクロ >Visual Basic Editer
 Microsoft Visual Basic Editer > ツール > デジタル署名 > 署名 証明書名 選択で WhiteClouds を選択する。
  証明書のプロパティを見ると。
 * この CA ルート証明書は信頼されていません。。。の表示  無視
 上書き保存
 Microsoft Excell > VBAマクロ Excelブック を開く。
  セキュリティの警告が出る。 「この発行者のマクロを常に信頼するをチェック」 >マクロを有効にする。
 でようやく、OO4Oの検証
  >> やはり ActivXコンポーネントはオブジェクトを作成できません。
で Oracle10g Client R1をインストール
Windows 再起動
すべてのプログラム>Oracle - OraClient10g_home1 > Application Development > SQL Plusを実行

  「このショートカット参照先にアクセスできません。必要なアクセス許可が無い可能性があります。」

WindowsXp(Dimension430S)から引き継がれたユーザで試す。同じ

ここで気づく VistaのWindowsメールはどうなった?? Outlook2003に切り替えた。

もとのWin7インストールユーザーに戻す。

SQL Plusショートカットのプロパティ(リンク先)をしらべる。
リンク先のフォルダを調べる。
途中で、アクセス拒否に会う。アクセス拒否を解除する。
問題
たフォルダのアクセス制限がかかるのは問題!!
SQL Plusを立ち上げ成功
Net Configration Assistant で ローカル・ネット・サービス名構成
サービス名:  ***.world 
         TCP
ホスト名:    *.*.*.12

ネットサービス名 ***10g
コントロールパネル>システムとセキュリティ>管理ツール>データソース(ODBC)
データソースの新規作成> データソースのドライバ  Oracle in OraHome90(9.0....) を選択
 ※ 選択ドライバはOracle9iのODBCに見える。しかし ネットサービスのエントリがOracle10g側で設定したものがつかわれる。

  少々混乱

混乱の原因

  ・Windows7でOracle9iClientのインストールが一部失敗(jrew.exeエラー)   
  ・WindowsXP(Oracle9iClinetインストール)をWindowsに-
Oracle10g Client R1でカスタムインストール 

  再度 ODBC OLEを確認しながらインストール

管理ツールでシステムDNSにOralce10gのドライバが追加される。

DNSの追加。を改めて行う、以前のエントリは削除不能になる。
OO4Oの検証
  >> やはり 「ActivXコンポーネントはオブジェクトを作成できません。」が「書き込みできません。」に変わる。

***** ここまで WindowsVista Windows7に Oracle 9iのインストールをあきらめる。
Oracle10g Oracle9i アンインストール
c:\oracle のディレクトリ削除

Oracle10g Client まず、ランタイムでインストール、次にカスタムインストール
カスタムインストール(Oracle Windows Interfaces 10.1.0...)
Net Configration Assistant は アクセス拒否に会い 起動できず。

ここで、中断、シャットダウン 

 再び Window7を立ち上げる。 さて、再インストールの前に、SQL*Plusを試す。

なんと、、、
  SQL*Plusが動いた。Net Configuration も動いた、 ローカル・ネット・サービス名構成を行い、管理ツール(データソースODBC)でシステムDNSの設定を行う。
さて、Excel VBA OO4O を試す。 データベースに接続確認、すべてうまく行く。

どうなっているのか、逆に不安になる。

ユーザーを切り替えて(今まではWin7インストールユーザー)
これ以降は 旧PC ユーザー
  Sql*Plusは正常に使えた。
  Excel VBA のデジタル署名(プライベート)が無効になっている。

Visual Studio 2005をインストールする。

 c:\Program Files\Microsoft Visual Studio8\Common7\IDE\devenv.exe
で既知の互換性の問題がありますエラー

  Protected Storage サービスを開始

Oracle Client インストールでの、、、
レジストリの値が旧PCの可能性あり。Windows転送でかぶった可能性あり。<<要チェック
RegisryKey  LocalMachine/SOFTWARE/ORACLE/ORACLE_HOMEが c:\oarcle\ora90
これを c:\Oracle\product\10.1.0\Client_1に変更

2009年5月4日月曜日

フェーズ3 Key入力テスト NXP LPC2388

4つのスイッチを押すと、それぞれに応じて、LEDが点灯する。
※このプログラムも数秒でハングする。
1.キー入力使用 main()関数 ソース
/****************************************************************************
タイマ割り込みサンプルプログラム(オンボードLED点灯制御)
****************************************************************************/
#define _EXTERN_
/* Includes ------------------------------------------------------------------*/
#include "LPC_BaseLib.h"

/* LED点滅用変数*/
int toggle0;
/* CPU割り込み処理*/
void CPU_IRQInterrupt(void)
{
  switch(VICIRQStatus)
  {
  // for Timer0 IQR Interrupt  ハートビート用割り込み
    case INT_IRQ_TIMER0:
      if(toggle0 == 0)
      {
        toggle0 = 1;
        Led_0_ON();
      }
      else
      {
         toggle0 = 0;
         Led_0_OFF();
      }
      /* タイマ割り込みクリア*/
      TIMER_InterruptReset(&TIMER_0);
      break;
    case INT_IRQ_TIMER1:
    ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
    case INT_IRQ_TIMER3:
      // for Timer3 IQR Interrupt
      Key_Sarch();
      /* タイマ割り込みクリア*/
      TIMER_InterruptReset(&TIMER_3);
      break;
    default:
    ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
    ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

/* タイマ割り込みLED点灯制御プログラム*/
int main(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    TIMER_InitTypeDef TIMER_InitStructure;

    SYS_Initialize();

    /* LED点灯制御設定*/
    Led_Init();

    Key_Init();

    // タイマ設定 Timer0 Use for Hart Beet
    TIMER_StructInit(&TIMER_InitStructure);
    TIMER_InitStructure.TIMER_ID = TIMER_ID_0;
    ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
    ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
2.LPC用Key入力関数側
#include
#include "LPC_BaseLib.h"

void Key_Init()
{
  key_gpioinit();
  Key_Proc_Mode = KEY_MODE_MAIN;
}

// 前回GPIOがLow今回Highの場合 キー入力(Push)とみなす。
void Key_Sarch()
{
  if(Ref_Key_0 == VAL_KEY_ON && KEY_VAL_0 == VAL_KEY_OFF)
  {
    Key_Intrrupt(ID_KEY_0);
  }
  Ref_Key_0 = KEY_VAL_0;

  if(Ref_Key_1 == VAL_KEY_ON && KEY_VAL_1 == VAL_KEY_OFF)
  {
Key_Intrrupt(ID_KEY_1);
  }
  Ref_Key_1 = KEY_VAL_1;

    ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
    ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

//キー対応GPIO設定
void key_gpioinit(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  // GPIO 0
  GPIO_InitStructure.GPIO_ID = GPIO_Port_0;
  GPIO_InitStructure.GPIO_Pins = GPIO_Pin_0 GPIO_Pin_1 GPIO_Pin_10 GPIO_Pin_11   GPIO_Pin_17;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_FAST;
  GPIO_InitStructure.GPIO_ModeIO = GPIO_Mode_INPUT;
  GPIO_InitStructure.GPIO_ModePin = GPIO_ModePin_PULLUP;

  GPIO_Init(&GPIO_0,&GPIO_InitStructure);
}

3.キー入力動作定義
#include

#include "LPC_BaseLib.h"

unsigned int icnt;

voidKey_Intrruptint key_id)
{
  switch(key_id)
  {
    case ID_KEY_0:
      Led_1_ON();
      Led_2_OFF();
      Led_3_OFF();
      break;
    case ID_KEY_1:
      Led_1_OFF();
      Led_2_ON();

    ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
    ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

2009年5月2日土曜日

フェーズ1 GPIO テスト NXP LPC2388

NXP LPC2388の GPIO を以下のとおり検証した。


概要 4つのLEDをTIMER0で点滅させる。


タイマ割り込みハンドラは startup.s で設定されたハンドラ CPU_IRQInterrupt を main() ソースファイルに、準備する。


1.GPIO使用 main()関数側
  1)初期設定
    GPIO_InitTypeDef GPIO_InitStructure;
     // GPIO 0
    GPIO_InitStructure.GPIO_ID = GPIO_Port_0;
    GPIO_InitStructure.GPIO_Pins = GPIO_Pin_27;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_FAST;
    GPIO_InitStructure.GPIO_ModeIO = GPIO_Mode_OUTPUT;
    GPIO_InitStructure.GPIO_ModePin = GPIO_ModePin_PULLDOWN;
    GPIO_Init(&GPIO_0,&GPIO_InitStructure);

 ※ システムコントロールレジスタ SCS(0xE01FC1A0) に0x01をセットするとGPIO0,GPIO1はFGPIOに設定されるが、設定の有無による違い未だ実感出来ず。(高速IFが必要にならない限り実感できないと思う。)

 2)GPIO出力 
   GPIO ポート1の18番ピンに1出力 付録基板LED1消燈
   GPIO ポート1の19番、22番ピンに0出力 外付けLEDが点灯
     GPIO_SetBits(&GPIO_1,GPIO_Pin_18);
     GPIO_ResetBits(&GPIO_1, GPIO_Pin_19 GPIO_Pin_22);
2.GPIO使用 LPC用GPIO関数側
 1)GPIO設定構造体
    typedef struct
    {
    GPIOPortID_TypeDef GPIO_ID;
    u32 GPIO_Pins;
    GPIOMode_TypeDef GPIO_Mode;
    GPIOModeIO_TypeDef GPIO_ModeIO;
    GPIOModePin_TypeDef GPIO_ModePin;
    }GPIO_InitTypeDef;

 2)GPIO構造体
    typedef struct
    {
    vu32 *pIOPIN;
    vu32 *pIOSET;
    vu32 *pIODIR;
    vu32 *pIOCLR;
    vu32 *pFIODIR;
    vu32 *pFIOMASK;
    vu32 *pFIOPIN;     
    vu32 *pFIOSET;
    vu32 *pFIOCLR;
    } GPIO_TypeDef;


    EXTERN GPIO_TypeDef GPIO_0;
    EXTERN GPIO_TypeDef GPIO_1;
    EXTERN GPIO_TypeDef GPIO_2;
    EXTERN GPIO_TypeDef GPIO_3;
    EXTERN GPIO_TypeDef GPIO_4;


 3)関数 GPIO_Init
    void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
    {
     u32 i;
     u32 *pPINSEL_H;
     u32 *pPINSEL_L;
     u32 *pPINMODE_H;
     u32 *pPINMODE_L;
     vu32 bitpattern;
       
    switch(GPIO_InitStruct->GPIO_ID)
    {
      case GPIO_Port_0:  //ポート0のピン選択レジスタポインタをセット
        pPINSEL_L = (u32 *)(PINSEL_BASE_ADDR + 0x00);
        pPINSEL_H = (u32 *)(PINSEL_BASE_ADDR + 0x04);
        pPINMODE_L = (u32 *)(PINSEL_BASE_ADDR + 0x40);
        pPINMODE_H = (u32 *)(PINSEL_BASE_ADDR + 0x44);
        break;
      case GPIO_Port_1:
        pPINSEL_L = (u32 *)(PINSEL_BASE_ADDR + 0x08);
        pPINSEL_H = (u32 *)(PINSEL_BASE_ADDR + 0x0c);
    ///////////////////////////////////////////
      default:
         return;
    }
      /* Setting Low Bits . for use GPIO (Bit Patern "00")*/
    for(i=0;i<16;i++)
    {
      if( GPIO_InitStruct->GPIO_Pins & (0x00000001 << i))
      {  // ピン選択レジスタの設定 Pin0-15
        bitpattern = 0x0000003 << (2*i);
        bitpattern ^= 0xFFFFFFFF;
        *pPINSEL_L &= bitpattern;
        //Bit Clear and Pin use GPIO
        *pPINMODE_L &= bitpattern;
        //Bit Clear
        bitpattern = GPIO_InitStruct->GPIO_ModePin << (2*i);
        *pPINMODE_L = bitpattern;
      }
    }
    for(i=0;i<16;i++)
    {
      if( GPIO_InitStruct->GPIO_Pins & (0x00000001 << (i+16)))
      { // ピン選択レジスタの設定 Pin16-31
        bitpattern = 0x0000003 << (2*i);
        bitpattern ^= 0xFFFFFFFF;
        *pPINSEL_H &= bitpattern;
        //Bit Clear and Pin use GPIO
        *pPINMODE_H &= bitpattern;
        //Bit Clear
        bitpattern = GPIO_InitStruct->GPIO_ModePin << (2*i);
        *pPINMODE_H = bitpattern;
      }
    }
    if( GPIO_InitStruct->GPIO_Mode == GPIO_Mode_REGACY)
    {
      switch(GPIO_InitStruct->GPIO_ID)
      { // GPIOレジスタポインタのGPIO構造体への登録
         case GPIO_Port_0:
          GPIOx->pIOPIN = (u32 *)(GPIO_BASE_ADDR + 0x00);
          GPIOx->pIOSET = (u32 *)(GPIO_BASE_ADDR + 0x04);
          GPIOx->pIOSET = (u32 *)(GPIO_BASE_ADDR + 0x04);
          GPIOx->pIODIR = (u32 *)(GPIO_BASE_ADDR + 0x08); // Pin Control Reg. (0:input 1:output)
          GPIOx->pIOCLR = (u32 *)(GPIO_BASE_ADDR + 0x0c); // Output Clear Reg.
         break;
        case GPIO_Port_1:
          GPIOx->pIOPIN = (u32 *)(GPIO_BASE_ADDR + 0x10);
          GPIOx->pIOSET = (u32 *)(GPIO_BASE_ADDR + 0x14);
          GPIOx->pIODIR = (u32 *)(GPIO_BASE_ADDR + 0x18);
          GPIOx->pIOCLR = (u32 *)(GPIO_BASE_ADDR + 0x1c);
          break;
        default:
          return;
      }
      GPIOx->pFIODIR = NULL;
      GPIOx->pFIOMASK = NULL;
      GPIOx->pFIOPIN = NULL;
      GPIOx->pFIOSET = NULL;
      GPIOx->pFIOCLR = NULL;
      for(i=0;i<32;i++)
      {  // 各ピンの入出力の設定
        if( GPIO_InitStruct->GPIO_Pins & (0x00000001 << i))
        {
          if(GPIO_InitStruct->GPIO_ModeIO == GPIO_Mode_INPUT)
          {
            bitpattern = 0x0000001 << i;
            bitpattern ^= 0xFFFFFFFF;
            *(GPIOx->pIODIR) &= bitpattern; // Input Mode bit off
          }
          else
          {
            bitpattern = 0x0000001 << i;
            *(GPIOx->pIODIR) = bitpattern; // Output Mode bit on
          }
        }
      }
    }
     else
    {
     /* Fast GPIO Mode */
      switch(GPIO_InitStruct->GPIO_ID)
      {  // GPIOレジスタ群のポインタをGPIO構造体へ登録
        case GPIO_Port_0:
          GPIOx->pFIODIR = (u32 *)(FIO_BASE_ADDR + 0x00); //Pin Control Reg. (0:input 1:output)
          pFIOMASK = (u32 *)(FIO_BASE_ADDR + 0x10); //Pin Mask Reg. (0:input 1:output)
          GPIOx->pFIOMASK = (u32 *)(FIO_BASE_ADDR + 0x10); //Pin Mask Reg. (0:input 1:output)
          GPIOx->pFIOPIN = (u32 *)(FIO_BASE_ADDR + 0x14); // Pin Value Reg.
          GPIOx->pFIOSET = (u32 *)(FIO_BASE_ADDR + 0x18); // Output Set Reg.
          GPIOx->pFIOCLR = (u32 *)(FIO_BASE_ADDR + 0x1c); // Output Clear Reg.
          break;
          case GPIO_Port_1:
          GPIOx->pFIODIR = (u32 *)(FIO_BASE_ADDR + 0x20);
       ///////////////////////////////////////////
         default:
           return;
      }
      GPIOx->pIOPIN = NULL;
      GPIOx->pIOSET = NULL;
      GPIOx->pIODIR = NULL;
      GPIOx->pIOCLR = NULL;
      for(i=0;i<32;i++)
      {  // 各ピンの入出力の設定
        if( GPIO_InitStruct->GPIO_Pins & (0x00000001 << i))
        {
          if(GPIO_InitStruct->GPIO_ModeIO == GPIO_Mode_INPUT)
          {
            bitpattern = 0x0000001 << i;
            bitpattern ^= 0xFFFFFFFF;
            *(GPIOx->pFIODIR) &= bitpattern; // Input Mode bit off
          }
          else
          {
            bitpattern = 0x0000001 << i;
            *(GPIOx->pFIODIR) = bitpattern; // Output Mode bit on
          }
          bitpattern = 0x0000001 << i;
          bitpattern ^= 0xFFFFFFFF;
          *(GPIOx->pFIOMASK) &= bitpattern; // Mask bit off
         }
        }
       }
       return;
    }
 4)関数 GPIO_SetBits ポート単位でのPin設定 
   GPIO ポートビットセットレジスタを使い Pinに”1”(High)を設定
    void GPIO_SetBits(GPIO_TypeDef* GPIOx, u32 GPIO_Pin)
    {
     if(GPIOx->pFIOSET != NULL) // FGPIOの判断
     {
        *(GPIOx->pFIOSET) = GPIO_Pin; 
      }
      else
      {
        *(GPIOx->pIOSET) = GPIO_Pin;  
      }
    }
 5)関数 GPIO_ResetBits ポート単位でのPinクリア
   GPIO ポートビットクリアレジスタを使い Pinに”0”(Low)を設定
    void GPIO_ResetBits(GPIO_TypeDef* GPIOx, u32 GPIO_Pin)
    {
       if(GPIOx->pFIOCLR != NULL)
      {
        *(GPIOx->pFIOCLR) = GPIO_Pin;
      }
      else
      {
        *(GPIOx->pIOCLR) = GPIO_Pin;
      }
    }

3.タイマ設定 main()側
 1) タイマ設定および 割り込み設定
    /* タイマコントローラへの供給クロック分周設定 */
    *CLK_PCLKSEL0 = (*CLK_PCLKSEL0 & 0xfffffff3); /* 1/4 */ /* タイマ0のパラメータ設定 */
    *TIMER_T0PR = 0x00000000;    /* プリスケール無し */
    *TIMER_T0MR0 = 1000000;    /* 供給クロック周波数=1秒 */
    *TIMER_T0MCR = 0x00000003;    /* Match時にTCクリア&割り込み */
    *TIMER_T0TCR = 1;   /* タイマスタート*/
    /* 割り込みコントローラ設定 */
    *VIC_IntSelect = *VIC_IntSelect & (~0x10); /* IRQ選択 */
    *VIC_IntEnable = *VIC_IntEnable 0x10; /* タイマ0のみ有効 */
    /* 割り込み許可 */
    CPU_EnableInterrupt();
  2)割り込みハンドラ
    IRQ割り込みでCALLされるハンドラをTIMER0の割り込みハンドラとして利用。
    void CPU_IRQInterrupt(void)
    {
      if( toggle == 0 ) {
        toggle = 1;
    ***************************************  
     *TIMER_T0IR =1; /* タイマ割り込みクリア */
    }

4.startup.s
   ここで IRQ割り込みを登録
 CQ出版IF誌のサンプル使用
.text
.extern main
.extern _sp_base
#======================================
# Initialize vectors
#======================================
    B _startup
    nop
    nop
    nop
    nop
    nop
    B _IRQ_handle
    nop
    .org 0x20
    .global _startup
_startup:
#IRQ通知を受け取るように設定する
    MRS R0, cpsr
    eor R0, R0, #0x80
    MSR cpsr, R0
#プロセッサモードをIRQモードへ
    MRS r1, CPSR
    BIC R1, R1, #0x1F
    ORR R1, R1, #0x12
    MSR CPSR, R1
#例外ハンドラ用スタックを設定
    LDR sp, = _exception_sp_base
#プロセッサモードをスーパーバイザモードへ戻す
    MRS r1, CPSR
    BIC R1, R1, #0x1F
    ORR R1, R1, #0x13
    MSR CPSR, R1
# スタックを設定
    LDR R13,=_sp_base
    BL main
    .align 0x4
_IRQ_handle:
#例外用スタックにレジスタ退避
    STMDB sp!,{r0-r12, r14}
    MRS r0, spsr
    STMDB sp!, {r0}
    bl CPU_IRQInterrupt
#例外用スタックからレジスタ復帰
    LDMIA sp!, {r0}
    MSR spsr_cf, r0
    LDMIA sp!,{r0-r12,r14}
    SUBS PC, R14, #4

フェーズ2 TIMERテスト NXP LPC2388

NXP LPC2388 のタイマー機能の検証を以下のとおりおこなった。

概要 4つのLEDを4つのタイマー(TIMER0~TIMER3)で異なるインターバルで点滅させる。

※10秒程度チカチカしてプログラムはハングする。

1.タイマ設定 main()関数側

    // タイマ 設定 Timer0
    TIMER_StructInit(&TIMER_InitStructure);
    TIMER_InitStructure.TIMER_ID =TIMER_ID_0;
    TIMER_InitStructure.TIMER_INTVL_MR0 = TIMER_INTVL_1mS * 5;
    TIMER_InitStructure.TIMER_INTVL_MR0_TCR = TRUE;
    TIMER_InitStructure.INTRPT_HANDLR = Tim0_InterruptHnd;
    TIMER_Init(&TIMER_0,&TIMER_InitStructure);
    *(TIMER_0.pTPR) = 0xF;
    TIMER_Start(&TIMER_0);

2.LPC用タイマ関数側。
 1)タイマ設定構造体

    typedef struct
    {
    TIMER_ID_TypeDef TIMER_ID;
    TIMER_PCLK_TypeDef TIMER_PCLK;
    u32 TIMER_PRCMAX;
    u32 TIMER_INTVL_MR0;
    u32 TIMER_INTVL_MR1;
    u32 TIMER_INTVL_MR2;
    u32 TIMER_INTVL_MR3;
    bool TIMER_INTVL_MR0_TCR;
    bool TIMER_INTVL_MR1_TCR;
    bool TIMER_INTVL_MR2_TCR;
    bool TIMER_INTVL_MR3_TCR;
    u32 INTRPT_HANDLR;
    }TIMER_InitTypeDef;

 2)関数 TIMER_StructInit

   1)のタイマ設定構造体に初期値を設定

 3)関数 TIMER_Init

  ①TIMER0~3のタイマレジスタ群のポインタを設定。
  ②割り込みレジスタVICIRQStatus、VICIntEnableの設定
  ③割り込みレジスタVICVectCntlxxとVICVectPriorityxxに割り込みハンドラー、プライオリティを設定する。(効果なし)
  ④プリスケーラのMAX値の設定(今のところ0を設定:プリスケールなし)・・・よく解らない
  ⑤タイマーインターバルの設定。
  ⑥タイマ一致コントロールレジスタの設定。(タイマ割り込みを設定、タイマカウンタリセットを設定)
    void TIMER_Init(TIMER_TypeDef* TIMERx, TIMER_InitTypeDef* TIMER_InitStruct)
    {
    Timer_Interval_Rate= TIMER_INTVL_RATE;
    switch(TIMER_InitStruct->TIMER_ID)
    {
    case TIMER_ID_0:
        PCLKSEL0 &= 0xFFFFFFF3;
        PCLKSEL0 = TIMER_InitStruct->TIMER_PCLK <<>
        TIMERx->pTIR = (u32 *)(TMR0_BASE_ADDR + 0x00);   ①
        TIMERx->pTTCR = (u32 *)(TMR0_BASE_ADDR + 0x04);
        TIMERx->pTTC = (u32 *)(TMR0_BASE_ADDR + 0x08);
    ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

        VICIntSelect = VICIntSelect & ~(0x1<<4); ②
        VICIntEnable = VICIntEnable (0x1<<4);
        VICVectCntl4 = TIMER_InitStruct->INTRPT_HANDLR; ③
        VICVectPriority4 = 0x04;
        break;

    case TIMER_ID_1:
        PCLKSEL0 &= 0xFFFFFFCF;
    ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

        VICVectCntl27 =TIMER_InitStruct->INTRPT_HANDLR; ③
        VICVectPriority27 = 0x07;
        break;

    default:
        return;
    }

    /* Prescale Register */
    *(TIMERx->pTPR) = TIMER_InitStruct->TIMER_PRCMAX;  ④
    if(TIMER_InitStruct->TIMER_INTVL_MR0 != (u32)NULL)
    {   
     *(TIMERx->pTMR0) = TIMER_InitStruct->TIMER_INTVL_MR0 * Timer_Interval_Rate; ⑤
     *(TIMERx->pTMCR) = *(TIMERx->pTMCR) & ~(0x07);
     if(TIMER_InitStruct->TIMER_INTVL_MR0_TCR )
     {
         *(TIMERx->pTMCR) = *(TIMERx->pTMCR) (0x03); ⑥(TCリセットあり)
     } else {
         *(TIMERx->pTMCR) = *(TIMERx->pTMCR) (0x01); ⑥(TCリセットなし)
     }
    }

    if(TIMER_InitStruct->TIMER_INTVL_MR1 != (u32)NULL)
    {
     ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
     ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
     return;
    }

 4)関数  TIMER_Start

  TIMER_Initでポインタが設定されたタイマコントロールレジスタ TxCR でTIMERカウンタ Enable設定。

    void TIMER_Start(TIMER_TypeDef* TIMERx)
    {
        *(TIMERx->pTTCR) = *(TIMERx->pTTCR) 0x00000001;
        return;
    }

3.タイマー割り込み処理


    本来 1.で指定したタイマ割り込みハンドラ(Tim0_InterruptHnd)でLEDの点滅を実現したいが不調、IRQ割り込みで(タイマ割り込みをIRQ割り込み指定)実行されるハンドラで実現。

    void CPU_IRQInterrupt(void)
    {
        switch(VICIRQStatus)
        {
            case INT_IRQ_TIMER0:
                if(toggle0 == 0)
                {
                     toggle0 = 1;
                    GPIO_ResetBits(&GPIO_0,GPIO_Pin_27);
                } else {
                    toggle0 = 0;
                    GPIO_SetBits(&GPIO_0,GPIO_Pin_27);
                }
                TIMER_InterruptReset(&TIMER_0);
                break;
             case INT_IRQ_TIMER1:
                if(toggle1 == 0)
                {
                    toggle1 = 1;
                    GPIO_ResetBits(&GPIO_1,GPIO_Pin_19);
                } else {
                    toggle1 = 0;
                    GPIO_SetBits(&GPIO_1,GPIO_Pin_19);
                }
                TIMER_InterruptReset(&TIMER_1);
                ・・・・・・・・・・・・・・・・・・・・・・・・・・・

2009年5月1日金曜日

悪戦苦闘 LPC2388

このベースボード等の情報は次。
http://www.ac.auone-net.jp/~w-cloud/Index.htm



CQ出版 Interface 2009/5 付録のARM(LPC2388)基板を試しています。

備忘録的に記します。

開発環境 GNU
gcc 4.3.0 newlib 1.17.0 binutils 2.19.1 mpfr 2.4.1 gmp 4.2.4
開発UI Cygwin   GNU bash, version 3.2.48(21)-release (i686-pc-cygwin)

過去のV850で試したプログラムが100KByte超えのため、IAR Embededd Workbenchの利用は見送りました。

0.フェーズ0.(準備)
  付録基板の部品組み付け。

  [ドジ]
    CN5,CN6,CN7のUSBのコネクタを間違えて裏面に装着。CN5のみ表に付け替え。
一旦取り付けたコネクタを外すのはなかなか困難。

  [不具合]
   1) FlashMagicによる、書き込み失敗。
    ・Interface誌サイトからダウンロードしたサンプルプログラム(gcc版)をLPC2388
     に書き込む。
    ・このサンプルプログラムを再コンパイルし、LPC2388(No.1基板)に書き込む。
            書き込み不能になる。
   2) 対処
    ・LPC2388のダウンローダーがつぶれたと思い、I誌2冊目を購入(No.2基板)
    ・前述、再コンパイルのプログラムをNo.2基板に書き込む。
    ・再度、No.2基板に書き込む。
            書き込み不能になる。
      <ほとんど諦め気分>
    ・数日後 再挑戦、なぜか、No.2基板に書き込む。
            書き込み成功。
    ・あれやこれやと試す。 再び書き込み不能に。。。。
    ・基板JP2のコネクタを抑えながら(奥に・手前に)押しながらリセットボタン(JP1)
を押し、FlashMagicによる書き込みを試行。
           書き込み成功。
      結局のところ、JP2のピンヘッダーの半田付け不良が原因。
      基板No.1、No.2とも半田付けをやり直し。で解決。

      CN1,CN2,,等の他のコネクタの半田付け不良は今のところありません。
      2つの基板で両方ともJP2の半田付けに ミス るとは、。。。(無念)

1.フェーズ1.GPIOテスト
  GPIO: GPIO_0 Pin_27 GPIO_1 Pin_18,19,22  GPIO_2 Pin_8
  TIMER: TIMER_0
 
各GPIOににLEDを接続し(GPIO_1 Pin_18は基板LED1) TIMER_0 の インターバル割り込みでLEDを点滅。

 [Tech.Memo ]
  1)TIMER割り込みについて。    
    IRQ割り込みを使用、無条件でTIMER_0の割り込みとして利用
  2)LEDについて。
    +3.3V --(R200Ω)-- LED -- GPIO_n Pin_n で接続 GPIO Lowレベルで LED点灯   
  
2.フェーズ2 TIMERテスト
  GPIO: GPIO_0 Pin_27 GPIO_1 Pin_18,19,22  GPIO_2 Pin_8
  TIMER: TIMER_0 TIMER_1 TIMER_2 TIMER_3

 TIMER_0 で GPIO_0 Pin_27 (LED0)、TIMER_1 で GPIO_1 Pin_19 (LED2)、TIMER_2 で GPIO_1 Pin_22 (LED3)、TIMER_3 で GPIO_2 Pin_19 (LED4)のLEDを点滅。
 [Tech.Memo]
   1)TIMER割り込みについて。
       IRQ割り込みを使用、レジスタ VICIRQStatus で TIMER_0~3の割り込みを判断
      する。
      ex. TIMER_0の割り込みはVICIRQStatusと ((u32)0x00000010)でANDをとり、割り込
        みの有無を判定。
   2)TIMER_2,3の利用について。
     パワーコントロールレジスタ(PCONP)の設定が必要。
 [不具合]
   1)現象 複数のタイマーを稼動させると一定時間で LPC2388はハングする。
     タイマーインターバルに比例して停止までの時間は変化、インターバルの組み合わせでも変化
     する。
   2)対処 ・・未解決
     VICVectAddr4 VICVectPriority4(TIMER_0の場合)を適当に設定するが改善せず。
     そもそもこれらのレジスタの使い方、割り込み(IRQ)理解度が不足。

3.フェーズ3 KeyInテスト
  GPIO: GPIO_0 Pin_27 GPIO_1 Pin_18,19,22  GPIO_2 Pin_8 (LED用)
      GPIO_0 Pin_0 Pin_1 Pin_10 Pin_11 Pin_17  (Key入力用)
  TIMER: TIMER_0(Heat Beet用)  TIMER_3(Key Scan用)

 GPIO_0 Pin_0...に接続した、タクトスイッチのON/OFFをTIMER_3のインターバルでチェックし、押されたスイッチにより、各LEDの点灯を切り替える。
 
 [Tech.Memo]
   1)キー入力について。
    GPIO_0 Pin_0,1,,,には、3.3V(100KΩ+1KΩ)で接続、スイッチONでGRND(1KΩ)に接続。  
 [不具合]
   1)現象 2.フェーズ2と同様に一定時間後、LPC2388はハングする。
   2)対処 未解決
    (6/25)解決 割り込み時にVICVectAddrにセットされるアドレスを使って割り込みハンドラー関数を起動させることで解決。

 [不具合2]
   1)FlashMagic書き込みエラー発生。
    「Error Programing the Hex file RAM locations 0x40000120 to 0x400001FF are...」
   2)対処
    リンクスクリプトファイルの「.data 0x40000000: {」を「.data 0x40000200: {」に変更


4.フェーズ4 LCDテスト
  GPIO: GPIO_0 Pin_27 GPIO_1 Pin_18,19,22  GPIO_2 Pin_8 (LED用)
      GPIO_0 Pin_0 Pin_1 Pin_10 Pin_11 Pin_17  (Key入力用)
      GPIO_2 Pin_0,1,2,3,4,5,6,7 GPIO_4 Pin_24,25,28,29,30,31  (LCD用)
  TIMER: TIMER_0(Heat Beet用) TIMER_1(LCDリフレッシュ用) TIMER_3(Key Scan用)

 グラフィカルLCD SG12864 に キー操作にあわせ文字列を表示する。
 [不具合]
   1)現象 2.フェーズ2と同様に一定時間後、LPC2388はハングする。
   2)対処 未解決
      使用タイマをTIMER_0のみに変更  タイマカウンタ数で各機能を振り分け。
    (6/25)解決 前述

5.フェーズ5 LCDグラフィカルテスト。
 LCDにチャートを描画する。グリッドと、グラフ(サンプルデータによる。)の描画。
 [不具合]
   1)現象 描画位置決めの、座標計算(float)でハングする。
   2)対処 未解決。
   (7/9)解決 GCCのインストールのやり直し、インストールのオプション指定を変更。
[不具合]
   1)現象 基板のUSBケーブルを一旦外すと、次のプログラム起動でハングする。
         (電源OFFで書き込まれたプログラムの一部が消えた。。と考え勝ちな現象)  
   2)対処 リンクスクリプトファイルを変更するが変わらず。 未解決。
    解決(6/24)の 3.リンクスクリプトファイル         
6.フェーズ6 UARTテスト。
  UART: UART1
 PC Windows/アクセサリ/通信/ハイパーターミナル でCOM1接続 ハイパーターミナル キー入力を基板側LCD表示、基板側スイッチ操作で文字列をUART出力、ハイパーターミナルで表示。

 [Tech.Memo]
   1)RS232CドライバIC ANALOG DEVICES ADM3202AN について。
    GPIO_0 Pin_15をUART1 TX、同 Pin_16を UART1 RXとして使用。
   2)UART割り込み設定(IRQ)。
    
 [不具合]    
   1)現象 PCからキーニュー力データを受けた時にハング(50%前後の割合でハング)
        UARTの割り込みが前述のタイマ割り込み同様な原因と思う。
   2)対処 未解決。
    (6/25)解決

※ ここまでの試行で、割り込み、各タスク等のスケジュール、マイコン資源、、、等の管理が必要と思いRTOSの導入が必要と思うようになる。

7.フェーズ7 RTOS 導入テスト
 7-1.Toppers ASPを調べる。 まったく手が出せない。
 7-2.FreeRTOSを調べる。
   1)導入 SOURCEFORCE.NET 「FreeRTOS Real Time Kernel」 から FreeRTOSV5.2.0.zip
     をダウンロード (The FreeRTOS.org Project)
   2)サンプルコードを調べる。   
     Demo\ARM7_LPC2368_Eclipse\RTOSDemo\main.c を調べる。
   3)サンプルコードを改造
    ・全般 Ethernet関連のコードをコメント化、または、ダミー化
        TIMER0をFreeRTOS専用に(サンプルコードに従い)
    ・main.cの改造 関数xTaskCreate( vuIP_Task, ,,をコメント化、同関数で指定さ
れる vLCDTaskの内容 を LED点滅の簡単なものに改造。
    ・lpc2368.ld(リンクスクリプト)の改造
         ram, __stack_end__のアドレス、サイズ等を修正。
    ・Makefileの改造 Ethernet関連のファイル指定を削除。
    ・・・
   4)結果
     ・main()内の vTaskStartScheduler()まで正常終了本来、この関数で待機する
はずが終了してしまう。
     ・TIMER_0の割り込みが不調 タイマの稼動自体不明。。。

    ただ単にプログラムがハングしているのか不明。
    
    <プログラム概要>
     元プログラム  
        Ethernetの機能タスクの構成 => LCD関連の環境構成 => LCD機能タスクの
        構成  => タスクスケジューラの起動
              で
        Ethernetの機能、LCDの機能の稼動。
     改造プログラム
        LED点灯のタスクの構成 => タスクスケジューラの起動
              で
        LEDが点滅するハズだった。 

「その他 課題」
 * ADC での 値表示を試そうとして、C言語関数 sprintf()を使うと即座にプログラムはハングする。 (リンクスクリプトを修正しないと、リンクは通らない。エラーメッセージにある「‘end」をリンクスクリプト追加するが、その正誤もわからない。)
  解決(7/10)newlibのインストールのやり直し。

 * float,doubleの計算でプログラムがハングするケースが多い。
 * タイマー等の割り込みを使いながら、main()内のwhile(1)ループで何かをさせると。プログラムはハングする。
   

     
※本Blogは、組み込み素人の、趣味レベルの内容です。電子ブロック世代(発売当時)でITエンジニアが、近年、たまたま、Interfaceの付録基板に出会ってはまってしまった、そんな中年男が暇をみて書き込んでいます。 エキスパートの皆様からみて、内容に間違いも多いと思いますがご容赦願います。
 誤字脱字等、乱文、書きかけ等、も併せてご容赦願います。