無償ツールで構築するWindows Mobile 開発環境
1.背景
Windows Mobile(以下WM)の開発環境はVS2005ならStandard以上、VS2008ならProfessional以上のグレードが必要となります。これらのツールは高額なツールであるためホビーでWMアプリを開発しようと思ってもなかなか手が出せません。ブログを眺めた限りでは評価版で短期集中で開発して製作しているのが現状のようです。
2.目的
本記事は無償ツールでなんとかWMアプリの開発を行いたいと願う人に送ります。
無償ツールを使うためVSを使いような華かやな機能は期待しないでください![]()
3.前提条件及び私の環境
確認済み環境
Windows XP Home SP3
Windows Mobile 6 Pro(S11HT)
ちなみに関係ないと思いますが本環境のインストール前にVisual C#2005 Expressがインストール済みでした。
4.準備
下記のファイルをダウンロードしてインストールしておきます。
・Windows Mobile 6 Professional Images (JPN).msi 217MB
・.NET Framework 2.0 SDK Targeting .NET CF 2.0 (x86)
354MB ←もしかして入れなくてもよいかも(どなたかお試しください![]()
・NETCFSetupv2.msi (但し↑をインストールすると『C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\CompactFramework』にあります。 約25MB
DLもインストールもそれなりの時間がかかります。
5.環境変数Pathへ追加
『C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727』をPathに追加します。
6.サンプルプログラム
下記のソースを『HelloWorldForm.cs』と名をつけて保存してください。
// http://www.codeproject.com/KB/mobile/WiMoSansVS.aspx より
using System;
using System.Drawing;
using System.Windows.Forms;
namespace MyNamespace
{
class HelloWorldForm : System.Windows.Forms.Form
{
Label lblHello;
Button btnClose;
public HelloWorldForm()
{
this.Text="Hello World Sample";
btnClose = new Button();
lblHello = new Label();
btnClose.Click += new EventHandler(btnClose_Click);
btnClose.Text="Close";
btnClose.Location = new Point(10,100);
btnClose.Size = new Size(200,50);
lblHello.Text = "Hello World!";
lblHello.Location = new Point(10, 10);
lblHello.Size = new Size(200,50);
SuspendLayout();
this.Controls.Add(lblHello);
this.Controls.Add(btnClose);
ResumeLayout(false);
}
void btnClose_Click(object sender, EventArgs args)
{
this.Close();
}
[MTAThread]
static void Main()
{
HelloWorldForm mainForm = new HelloWorldForm();
Application.Run( mainForm );
}
}
}
7.バッチファイル
下記のスクリプトを『make.bat』という名前で保存してください。
SET FrameworkAssemblyPath="C:\Program Files\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE"
REM the following should be on one line but is broken into several lines for readability.
csc.exe /nologo /nostdlib /noconfig /out:HelloWorld.exe /r:""%FrameworkAssemblyPath%\mscorlib.dll"" /r:""%FrameworkAssemblyPath%\System.dll"" /r:""%FrameworkAssemblyPath%\System.Windows.Forms.dll"" /r:""%FrameworkAssemblyPath%\System.Drawing.dll"" HelloWorldForm.cs
8.ビルド
コマンドプロンプトを開きソースを保存した場所へ移動します。make.batを実行すると完成です。↓
9.エミュレータ
起動後の待ち受け画面↓
設定変更(フォルダ共有設定)をします。
File→Configure→Generalタブ→Share folder
にファイルをやり取りしたいフォルダを指定します↓
ファイルエクスプローラーを起動してStrage Cardを開きます↓
参考にしたサイト
http://www.codeproject.com/KB/mobile/WiMoSansVS.aspx
Visual Studio 2008(.NET3.5)で構築したい方は上記サイトが参考になります。
AVR JTAG ICE MKIIを使ってみた
JATG ICE MKIIを FunkOS自作評価ボードで使ってみた。
↓動作中
↓JATGICE MKIIのLEDがちかちかして動作しているのがわかる
使ってみた感想
・接続はAVR JTAGICE MKIIのマニュアルどおりの配線をしていたので問題なく接続できた
・シミュレータと違って実測であるところがよい
・ROM ICEと違って配線が楽
・ROM ICEでは完全にCPUを停止できないとか割り込みの問題とかアドレスマップの問題とかあっただけど、JTAGではそれがない(多分)
ちょっとひっかかったところ
・AVR StudioがWindowsを再起動しないとJTAGICE MKIIと接続できなくなる症状があった
きっかけはよくわからないけど、JTAGICE MKIIでROM焼きしようとしたときにAVRの電源OFFでエラーが出た後からそうなった。ちなみにこの状態でAVRISP MKIIを接続してもどうように接続できなかった。
JTAG ICEがこんなに面白いとなるとARM用のUSBProgも早く使えるようにしなきゃ!
FunkOS kernelハード依存部
一月ぶりのFunkOSの続きです。
過去に日記↓
http://ameblo.jp/elementor/entry-10303902339.html
http://ameblo.jp/elementor/entry-10301111081.html
今回はハードウェア依存部分になります。
ハードは下記の評価基板を自作して使用します。
前回紹介した回路(http://ameblo.jp/elementor/entry-10301111081.html )少し変更してます↓↓
・リセットの遅延用コンデンサを外した(AVRISP MKIIでリセット遅延があると回路以上と判断される)
・他凡ミス
マイコンはATMEGA644Pを使用するのでFunkOSプロジェクトファイル無いの
\port\AVR_GCC\atmega644ディレクトリ無いが対象となります。
標準のコードはINT0割り込みを使用しますが、今回はPCINT28を使用できるように変更しています。
もとのコードはhttp://sourceforge.net/projects/funkos/files からダウンロードしてご確認ください。
変更後のソースを下記に記載します。
1.kernelswi.c
//---------------------------------------------------------------------------
// FunkOS - Copyright (c) 2009, Funkenstein Software, See license.txt for details
//---------------------------------------------------------------------------
#include "types.h"
#include "kernelcfg.h"
#include "task.h"
#include <avr\io.h >
#include <avr\interrupt.h >
/* ソフトウェア割り込みはPORTD-4 PCINT28 */
//---------------------------------------------------------------------------
void KernelSWI_Config(void)
{
PORTD &= ~_BV(PD4); // Clear PCINT28
DDRD |= _BV(PD4); // Set PortD, bit 4 (PCINT28) As Output
}
//---------------------------------------------------------------------------
void KernelSWI_Start(void)
{
PCMSK3 &= ~_BV(PCINT28); // PCINT28を割込み禁止
PCIFR |= _BV(PCIF3); // Clear any pending interrupts on PCINT28
PCMSK3 |= _BV(PCINT28); // PCINT28を割込み許可
}
//---------------------------------------------------------------------------
void KernelSWI_Stop(void)
{
PCMSK3 &= ~_BV(PCINT28); // PCINT28を割込み禁止
PCIFR |= _BV(PCIF3); // Clear any pending interrupts on PCINT28
}
//---------------------------------------------------------------------------
void KernelSWI_Clear(void)
{
PCIFR |= _BV(PCIF3); // Clear any pending interrupts on PCINT28
}
/* XOR : ^
A B | Y
----+--
0 0 | 0
0 1 | 1 <- ビット反転
1 0 | 1
1 1 | 0 <- ビット反転
*/
//---------------------------------------------------------------------------
void KernelSWI_Trigger(void)
{
if (Task_IsSchedulerEnabled())
{
PORTD ^= _BV(PD4);
}
}
続いてkerneltimerです。標準では1Tick=100msecですがこれを1msecへ変更します。
2.kerneltimer.c
//---------------------------------------------------------------------------
// FunkOS - Copyright (c) 2009, Funkenstein Software, See license.txt for details
//---------------------------------------------------------------------------
#include "mcu.h"
#include "types.h"
#include "kernelcfg.h"
#include <avr\io.h >
#include <avr\interrupt.h >
#define TICK_TIME (1000UL) /* 1/1msec */
/* Timer Settings
CTC動作 WGM13:0 WGM12:1 WGM11:0 WGM10:0
*/
//---------------------------------------------------------------------------
void KernelTimer_Config(void)
{
// CTC Mode Bit
TCCR1A &= ~_BV(WGM10) & ~_BV(WGM11) & ~_BV(WGM13);
TCCR1B |= _BV(WGM12);
// OCR1A = システムクロック / 分周比(シフト量 8=2^3 64=2^6 256=^8 1024=2^10) / 周期(1msec=1000) -1
TCCR1B &= ~_BV(CS12);
TCCR1B |= _BV(CS11) | _BV(CS10); // 64分周
OCR1A = (USHORT)((CPU_CLOCK / TICK_TIME / 64) - 1); // Set the trigger time / 64 prescaler
}
//---------------------------------------------------------------------------
void KernelTimer_Start(void)
{
TIFR1 &= ~_BV(OCF1A); // Clear pending interrupts
TIMSK1 |= _BV(OCIE1A); // Enable interrupt
}
//---------------------------------------------------------------------------
void KernelTimer_Stop(void)
{
TIFR1 &= ~_BV(OCF1A); // Clear interrupt flags
TIMSK1 &= ~_BV(OCIE1A); // Disable interrupt
}
//---------------------------------------------------------------------------
void KernelTimer_DI(void)
{
TIFR1 &= ~_BV(OCF1A); // Clear interrupt flags
TIMSK1 &= ~_BV(OCIE1A); // Disable interrupt
}
//---------------------------------------------------------------------------
void KernelTimer_EI(void)
{
TIFR1 &= ~_BV(OCF1A); // Clear pending interrupts
TIMSK1 |= _BV(OCIE1A); // Enable interrupt
}
3.taskport.c
もともとはINT0で割り込みが掛かっていたためこれをPCINT28へ変更します。
変更部分だけ記載します。
○変更前
ISR(INT0_vect) __attribute__ ( ( signal, naked ) ); ISR(INT0_vect)
○変更後
ISR(PCINT3_vect) __attribute__ ( ( signal, naked ) ); ISR(PCINT3_vect)
尚、本変更はPCINT3系でタスクディスパッチャが発生するため、他のPCINT3系を同時利用する場合はtaskport.cで他のピンチェンジ割り込みと切り分ける処理を行う必要があります
また独自にMCUの初期化関数を追加します。
4.mcu.c
/*!
@file mcu.c
@brief MCUの初期化などMCU固有の操作を行います
@author Yamazaki
@date 21-Jul-09, new
*/
#include <avr >
#include "types.h"
#include "mcu.h"
/* ■■■ MCUポートセッティング ■■■
回路図より(2009.7.21現在)
No. Name Pin-No. Net name IO Description
1 PA0 40 D0 OUT OUT固定 LCDデータバスに接続(デフォルト値L)
2 PA1 39 D1 OUT OUT固定 LCDデータバスに接続(デフォルト値L)
3 PA2 38 D2 OUT OUT固定 LCDデータバスに接続(デフォルト値L)
4 PA3 37 D3 OUT OUT固定 LCDデータバスに接続(デフォルト値L)
5 PA4 36 D4 OUT OUT固定 LCDデータバスに接続(デフォルト値L)
6 PA5 35 D5 OUT OUT固定 LCDデータバスに接続(デフォルト値L)
7 PA6 34 D6 OUT OUT固定 LCDデータバスに接続(デフォルト値L)
8 PA7 33 D7 OUT/IN BUSY読み込み時IN LCDデータバスに接続(デフォルト値L出力)
9 PB0 1 RS OUT OUT固定 LCDインストラクション制御(デフォルトL)
10 PB1 2 R/W OUT OUT固定 LCD書出し/読込み制御(デフォルトL)
11 PB2 3 E OUT OUT固定 LCDイネーブル制御(デフォルトL)
12 PB3 4 LED1 OUT OUT固定 L:点灯 H:消灯(デフォルトH)
13 PB4 5 No-Net OUT OUT固定 L
14 PB5 6 MOSI OUT OUT固定 L(ISP)
15 PB6 7 MISO OUT OUT固定 L(ISP)
16 PB7 8 SCK OUT OUT固定 L(ISP)
17 PC0 22 No-NET OUT OUT固定 L
18 PC1 23 No-NET OUT OUT固定 L
19 PC2 24 TCK OUT OUT固定 L(JTAG)
20 PC3 25 TMS OUT OUT固定 L(JTAG)
21 PC4 26 TDO OUT OUT固定 L(JTAG)
22 PC5 27 TDI OUT OUT固定 L(JATG)
23 PC6 28 --- --- 32.768kHz水晶接続(OUT/INどちらでも可)
24 PC7 29 --- --- 32.768kHz水晶接続(OUT/INどちらでも可)
25 PD0 14 RXD --- UART
26 PD1 15 TXD --- UART
27 PD2 16 SW1 IN キー1(チャタリングSWフィルタ必要)
28 PD3 17 SW2 IN キー2(チャタリングSWフィルタ必要)
29 PD4 18 --- OUT ソフトウェア割り込みに使用する(PCINT)
30 PD5 19 --- OUT OUT固定 L(未使用)
31 PD6 20 DTR IN FT232RL
32 PD7 21 LED2 OUT OUT固定 L:点灯 H:消灯(デフォルトH)
Regster | 7 6 5 4 | 3 2 1 0 | Hex
--------+---------+---------+-------
DDRA | 1 1 1 1 | 1 1 1 1 | 0xff
PORTA | 0 0 0 0 | 0 0 0 0 | 0x00
DDRB | 1 1 1 1 | 1 1 1 1 | 0xff
PORTB | 0 0 0 0 | 1 0 0 0 | 0x08
DDRC | 0 0 1 1 | 1 1 1 1 | 0x3f
PORTC | 0 0 0 0 | 0 0 0 0 | 0x00
DDRD | 1 0 1 1 | 0 0 0 0 | 0xb0
PORTD | 1 0 0 0 | 0 0 0 0 | 0x80
*/
/*!
@brief MCU初期化関数
@return MCU_RESET_STSTUS
*/
UCHAR Mcu_Init(void)
{
UCHAR Reset = MCUSR & 0x1f; /* WDRF:WDT BORF:BOR EXTRF:External PORF:PowerOnReset */
MCUSR = 0; /* 電源ON後直ちにクリア */
PORTA = 0x00;
DDRA = 0xff;
PORTB = 0x08;
DDRB = 0xff;
PORTC = 0x00;
DDRC = 0x3f;
PORTD = 0x80;
DDRD = 0xb0;
PCICR |= _BV(PCIE3); // PCINT24~31のPC割込み禁止(ソフトウェア割込みPCIN28)
return Reset;
}
5.mcu.h
#ifndef __MCU_H__ #define __MCU_H__ #include "types.h" #define CPU_CLOCK (16000000UL) /* 16MHz */ #define POW_RESET 1 /*!< 電源ONリセット */ #define EXT_RESET 2 /*!< 外部リセット */ #define BOR_RESET 4 /*!< 電圧低下検知リセット */ #define WDT_RESET 8 /*!< ウォッチドッグタイマリセット */ #define JTG_RESET 16 /*!< JTAGリセット */ UCHAR Mcu_Init(void); #endif /* __MCU_H__ */
最近気付いたのですがリポジトリは少しずつ更新されてたみたいで、最新版をチェックアウトして使った方が良いかと思います。
最近はHD44780のドライバとかジョイスティックのドライバとかも含まれています。
またARM_CM3やMSP430にも対応しているようです
http://sourceforge.net/scm/?type=svn&group_id=263037
つづく





