2014年12月16日

PIC32MX: 制限なしのMPIDE付属の無料GCCコンパイラのメモ 2014

PIC32MX: 制限なしのMPIDE付属の無料GCCコンパイラのメモ 2014
* はじまり
* MPIDE
* MPIDE ダウンロード
* ハック完了 (^^)/
* 結果内容
* MPLABXへの直接登録成功 (^^)/ うそでしょ?!
    登録方法:
    コンパイル・オプション設定方法
* と思ったが。。。(オイ
* なんとか出来た (^^)/
* 結果内容 (2)
* サンプル・プロジェクト
    ポイント:
    ダウンロード:
* Firewing: BASICコンパイラ

* はじまり
PIC32MX用の制限なし無料のコンパイラの話は以前書いて玉砕した。
で、
新たに見つけた全然別な以下の方法は予想を遙かに超える大成功状態で、(^^)/ (^^)/
となった。

* MPIDE
全く見落としていたけど、ChipKit用のIDE、
MPIDEに付属しているPIC32MX用のGCCが、サイズ制限なしで使えるらしい
ので調査してみる というメモ。
詳細はこれからだけど、
PinguinoのGCCに比べてのメリットは、
PLIB(注1)という今はObsolete(廃版)になってしまった、
Microchipが作ったペリフェラルライブラリが付属していること。
したがって、
PLIB使用のMPLABX用のプロジェクトが、
コマンドラインでコンパイルできて、mips16も有効で
サイズ制限もなく使えるかもしれないという話。

実際にやってみないとなんとも言えないけど。。。
つづく。。。

* MPIDE ダウンロード
ここから過去リリース分が全部取得できる
http://chipkit.s3.amazonaws.com/index.html
Official Release 20140821
http://chipkit.net/forum/viewtopic.php?f=20&t=3033 
上のバージョンはスタートアップのコード領域があふれてダメだった。orz

* ハック完了 (^^)/
mpide-0023-windows-20140316
http://chipkit.net/forum/viewtopic.php?t=2877
というバージョンを使った、
何だ、10分でできた (^^)/ (^^)/
もっと早くMPIDEのgccをチェックするべきだった。
orz

* 結果内容
(1) MPLABX上で作ったプロジェクトがそのまま使えます。(PLIBなら)
(2) サイズ最適化「-Os」オプション と 「-mips16」オプションが有効です。
(3) Microchipの周辺ライブラリPLIBや標準ライブラリ系(stdioとか)も「-mips16」版がリンクされます(4) コマンドラインでコンパイルします。
(5) ソース上で アトリビュート「__attribute__ ( (mips16) )」は不要です。
(6) コンパイル時のうっとうしいメッセージは出ません。(^^)/

* MPLABXへの直接登録成功 (^^)/ うそでしょ?!
上の使い方はコマンドラインで「make」していましたが、
試しに「mpide-0023-windows-20140316」版を MPLABX 2.20に登録してみました。
登録方法:
以下のBINフォルダを「C32」タイプで登録するだけです。
D:\mpide-0023-windows-2014316\hardware\pic32\compiler\pic32-tools\bin
MPLABXのメニューから 
Tools - Options - Embeddedで上記binフォルダをAddします。C32タイプです。
あとは普通にコンパイルオプションを設定します。
コンパイル・オプション設定方法
ここを参照。
PIC32: MPLAB(X)でmips16オプションを使うときのメモ 2013
http://mpu.seesaa.net/article/ 399685640.html
自分のプロジェクトはMPLABからコンバートしたので「-mips16」とかが
選択できました。新規にプロジェクト作るとアレかもしれない。
ではなくて、
「C32」タイプのコンパイラは「-mips16」系のオプション設定が有効な様です。

で、
大成功!!!!!!

こんなに簡単に最強版使えるなんて、もっと早く教えて欲しかった。 xD
(^^)/

* と思ったが。。。(オイ
実はコンパイルが成功しただけで、出来たHEXは動かない物でした。orz
ハハハ orz
原因は、リンカスクリプトとスタートアップコードがChipKit用のブートローダを使う様に
なっていることでした。
ひとまずブートローダなしで使いたいのだ。

* なんとか出来た (^^)/
できた。

* 結果内容 (2)
(1) MPLABX上で作ったプロジェクトがそのまま使えます。(PLIBなら)
    ただし、スタートアップコードとリンカスクリプトを専用の物に変更します。
(2) サイズ最適化「-Os」オプション と 「-mips16」オプションが有効です。
(3) Microchipの周辺ライブラリPLIBや標準ライブラリ系(stdioとか)も「-mips16」版がリンクされます。
(4) ソース上で アトリビュート「__attribute__ ( (mips16) )」は不要です。
(5) コンパイル時のうっとうしいメッセージは出ません。(^^)/

* サンプル・プロジェクト
ポイント:
コンパイラは制限なしの以下の版のみ使用可能です。
http://chipkit.s3.amazonaws.com/builds/mpide-0023-windows-20140316.zip
( http://chipkit.s3.amazonaws.com/index.html )
試してませんがLinuxやMacでも動くと思います。

制限ありのコンパイラ「C32 v2.02」にそのまま切り換えて使うことができます。
(警告がでますが)
XC32系はエラーが出て使えません。orz
ダウンロード:
led-mpide-mplabx-2014-12-21.7z
PIC32MX220F032B用です。48MHzで動作します。
マイコンを変えたらリンカスクリプトの修正も必要です。
PLIB関数を使って、Timer割込みや、UART, millis(), delay_ms()を作ってLEDチカチカするデモです。
ChaNさんのxprintf()を使ってUARTに「Hello !」表示出してます。
内容:
irukaさんの以下のホームページで
PIC32MX
hp.vector.co.jp/authors/VA000177/html/PIC32MX.html
「pled.zip」の中のリンカスクリプトとスタートアップコードを
少し改変して使用させていただきました。
書込みは付属のpic32prog.exeを使ってPickit2で書いてます。
Pickit3で書けるかどうか未確認です。
MPLAB X v2.20 上でPickit3での書込み、デバッグができました。(^^)/

* 実験配線図
内蔵発振器で動かします。

pic32mx220f032b-basic.png

サンプルコード:
以下の黄色い行はおまじないで必要です。取れれば取りたいけど。
PLIBを使ってLED1をチカチカしながら、UART1にメッセージを出し続けるデモです。
UART: 115200bps
Pin6 = RX
Pin7 = TX
/******************************************************************************/
/*  Files to Include                                                          */
/******************************************************************************/
#include "sys.h"         /* system definition                        */
#include "uart.h"
#include "xprintf.h"

//*    This sets the MPIDE version number in the image header as defined in the linker script
const uint32_t __attribute__((section(".mpide_version"))) _verMPIDE_Stub = 0x01000309;    // assigns the build number in the header section in the image

/* 
   Config settings
   Main clock = 8MHz /2 * 24 /2   = 48MHz
   Peripheral clock = 48MHz /1    = 48MHz

   Configuration Bit settings
   SYSCLK = 48 MHz (8MHz / FPLLIDIV * FPLLMUL / FPLLODIV)
   PBCLK  = 48 MHz
   WDT OFF
   Other options are don't care
   */
#pragma config UPLLEN    = ON            // USB PLL Enabled
#pragma config FPLLMUL   = MUL_24        // PLL Multiplier
#pragma config UPLLIDIV  = DIV_2         // USB PLL Input Divider
#pragma config FPLLIDIV  = DIV_2         // PLL Input Divider
#pragma config FPLLODIV  = DIV_2         // PLL Output Divider
#pragma config FPBDIV    = DIV_1         // Peripheral Clock divisor
#pragma config FWDTEN    = OFF           // Watchdog Timer
#pragma config WDTPS     = PS1           // Watchdog Timer Postscale
#pragma config FCKSM     = CSDCMD        // Clock Switching & Fail Safe Clock Monitor
#pragma config OSCIOFNC  = OFF           // CLKO Enable
#pragma config POSCMOD   = HS            // Primary Oscillator
#pragma config IESO      = OFF           // Internal/External Switch-over
#pragma config FSOSCEN   = OFF           // Secondary Oscillator Enable (KLO was off)
#pragma config FNOSC    = FRCPLL         // Internal RC with PLL
//#pragma config FNOSC = PRIPL           // Ext OSC
#pragma config CP        = OFF           // Code Protect
#pragma config BWP       = OFF           // Boot Flash Write Protect
#pragma config PWP       = OFF           // Program Flash Write Protect
#pragma config ICESEL    = ICS_PGx1      // ICE/ICD Comm Channel Select
#pragma config DEBUG     = OFF           // Background Debugger Enable
#pragma config JTAGEN    = OFF           // JTAG Disabled
#pragma config FUSBIDIO  = OFF
#pragma config FVBUSONIO = OFF
#pragma config PMDL1WAY  = OFF
#pragma config IOL1WAY   = OFF

/******************************************************************************/
/* Macro Declaration                                                */
/******************************************************************************/
#define SYS_FREQ            FOSC
#define PB_DIV              1
#define PRESCALE            256
#define TOGGLES_PER_SEC     1000   /* 1msec Tick count */
#define T1_TICK             (SYS_FREQ/PB_DIV/PRESCALE/TOGGLES_PER_SEC)

#define LED1                BIT_15

/******************************************************************************/
/* Global Variable Declaration                                                */
/******************************************************************************/
volatile uint32_t ticks ;

/******************************************************************************/
/* millis()                                                                   */
/******************************************************************************/
uint32_t millis(void){
    return ticks;
}

/******************************************************************************/
/* Timer1 Interrupt                                                           */
/******************************************************************************/
void __ISR(_TIMER_1_VECTOR, ipl2) Timer1Handler(void)
{
    // clear the interrupt flag
    mT1ClearIntFlag();
    ticks++;
}

/******************************************************************************/
/* delay_ms()                                                                 */
/******************************************************************************/
void delay_ms(uint32_t ms ){
    uint32_t prev = millis();
    while( ( millis() - prev) < ms ){
        /* just wait */
    }
}

void timer_init(void){
    /* Timer1 init */
    OpenTimer1(T1_ON | T1_SOURCE_INT | T1_PS_1_256, T1_TICK);
    /* set up the timer interrupt with a priority of 2 */
    ConfigIntTimer1(T1_INT_ON | T1_INT_PRIOR_2);
}

/******************************************************************************/
/* Main Program                                                               */
/******************************************************************************/
int32_t main(void)
{
    uint32_t count = 0;
    /*
       SYS_CFG_WAIT_STATES (configures flash wait states from system clock)
       SYS_CFG_PB_BUS (configures the PB bus from the system clock)
       SYS_CFG_PCACHE (configures the pCache if used)
       SYS_CFG_ALL (configures the flash wait states, PB bus, and pCache)
       SYSTEMConfig(SYS_FREQ, SYS_CFG_ALL);
       SYSTEMConfigPerformance(SYS_FREQ);
       */
    SYSTEMConfig(SYS_FREQ, SYS_CFG_WAIT_STATES |  SYS_CFG_PCACHE);
    ANSELA = 0x0000;
    ANSELB = 0x0000;
    INTConfigureSystem(INT_SYSTEM_CONFIG_MULT_VECTOR);
    /* enable multi-vector interrupts */
    INTEnableSystemMultiVectoredInt();
    
    uart_init( UART1, 115200 );
    timer_init();

    /* Init LED port */
    mPORTBSetPinsDigitalOut( LED1 );
    mPORTBClearBits( LED1 );

    /* LED blinker */
    delay_ms( 500 );
    while(1) {
        delay_ms( 500 );
        mPORTBToggleBits( LED1 );
        xprintf("\n Hello !  0x%04X", count++);
    }
}
   
UART出力: pic32-mpide-gcc-uart-terminal.png * Firewing: BASICコンパイラ 直接関係ないものの、:D 上と同じ事をPIC用のBASIC言語コンパイラ、Firewingでやると こんな感じになる。 http://mpu.seesaa.net/article/410490627.html#toc_pic32_led_blink 簡単! (^^)/ (注1)PLIBの替りに今は「Harmony」になっている。
posted by Copyright (C) avrin All Rights Reserved. at 00:00| Comment(7) | PIC32MX | このブログの読者になる | 更新情報をチェックする

2014年04月06日

2014: 最強マイコン! PIC32MX250/230 128KB/64KB 秋月で出る!

2014: 最強マイコン! PIC32MX250/230 128KB/64KB 秋月で出る!/

なんと、なんと、320円ポッキリで
工作用DIPマイコン史上最強 xD のマイコンがついに秋月価格で登場しました。
これはスゴイ。

360円 2014/04
PIC32MX250F128B
http://akizukidenshi.com/catalog/g/gI-07644/
320円 2014/04
PIC32MX230F064B
http://akizukidenshi.com/catalog/g/gI-07643/.

* Pinguino基板
このマイコンを搭載可能なPinguino基板
http://wiki.pinguino.cc/index.php/PIC32MX250_Pinguino

実は、この基板のガーバ・ファイルがここに置いてあって、
置いてあって。 xD
あくまで置いてあるのを偶然見つけただけなんだけど。 :D
といっても、「どっかに置いてないかなぁ〜」って目で探してたのは否定しないけど、 xD
Fusion PCBとかに出せば作れてしまうのだった。
この大きさだと1000円/10枚で入りそうかも。
と、バラしていいのかどうかは少し悩むところ。 (オイ
個人で使う分には問題ない気もする。



参考:
PIC32MX irukaさんのページ
http://hp.vector.co.jp/authors/VA000177/html/PIC32MX.html
秋月でPIC32MX 28pin DIP版出る
チョコットお試し LPC1114FN28 (1) 2012/09
Pinguino X4 IDE 簡単インストール 


posted by Copyright (C) avrin All Rights Reserved. at 00:00| Comment(0) | TrackBack(0) | PIC32MX | このブログの読者になる | 更新情報をチェックする

2013年11月21日

PIC32MZ: microMIPS版 出る。 2013

新たにPIC32MZというのが発表されたようです。
200MHz/330DMIPS
Flash: 2M byte SRAM: 512k byte
microMIPS命令セット搭載
DSP内蔵
...あとたくさん :-)

だそうです。

このシリーズは結構ハイエンドな感じで縁がなさそう。xD


噂されていたmicroMIPS命令セットが初搭載されました。
ARMでいうところのThumb2命令の様なものらしいです。

個人的にはPIC32MXのDIP版でmicroMIPS版を出してほしいです。


発表文
http://www.microchip.com/pagehandler/en-us/press-release/microchips-pic32mz-32-bit-mcus.html
日本語
http://www.nikkan.co.jp/newrls/pdf/20131120-14.pdf
短い説明
http://ww1.microchip.com/downloads/en/Market_Communication/Microchips%20PIC32MZ%20Press%20Presentation.pdf
評価ボード
http://www.microchipdirect.com/ProductSearch.aspx?Keywords=PIC32MZ
データシート
http://www.microchip.com/wwwproducts/Devices.aspx?product=PIC32MZ2048ECH144
posted by Copyright (C) avrin All Rights Reserved. at 00:00| Comment(0) | TrackBack(0) | PIC32MX | このブログの読者になる | 更新情報をチェックする

2013年04月02日

PIC32: MPLAB(X)でmips16オプションを使うときのメモ 2013

PIC32: MPLAB(X)でmips16オプションを使うときのメモ 2013

* はじまり
* C32とXC32
* mips16オプションの指定方法
* 注意点
* C32コンパイラ
* XC32コンパイラ
* 非常に重要なコード削減オプション "--gc-sections"
* MPLABX上で複数のコンパイラバージョンを切り換えるときの注意点
* MPLABX(v1.70以降)のMakefile + C32 + mips16 でコマンドライン・コンパイル
* 60日のお試し期間かどうかを確認する方法
* -Osオプションの効果 (^^)/

* 効果は絶大だった!!
* PIC32MX250F128Bを使う Flash=128KB, SRAM=20KByte
* C32に未来はない!

* はじまり
PIC32: MPLAB(X)でmips16オプションを使うときのメモ。

ここでは無料で使えるLite版のコンパイラC32、XC32に限って記述する。
mips16オプションはPIC32のコードサイズを劇的に減少させるコンパイラ・オプションであり、(注1)(注7)
220円ポッキリの少FLASH版PICMX220F032Bでは必須となる。
しかし、
Microchipは無料版コンパイラに対してmips16オプションを無効にする方針だ。
ちなみに、mips16オプションは「別に最適化オプションじゃなくて」、
MIPSコア(MIPS32 M4Kコア)が持つ基本機能の使用を選択するオプションなのだ。

以下、ここで使った現時点(2013/04)の最新版を
MPLAB v8.90
MPLABX v1.70
C32 v2.02a
XC32 v1.20
とする。
C32とXC32はインストール時に最初から「Lite版」を選択しています。
従って、60日の試用期間は「最初から終了した状態」で使います。(注8)

* C32とXC32
PIC32用のCコンパイラは、「C32」と「XC32」の2種類がある。
双方ともMPLAB、MPLABX上から使用することが可能。
(MPLABでXC32、MPLABXでC32を使うことも可能)
さらに複数バージョンのコンパイラをインストールすれば、IDE上で切り換えて使用できる。

C32は基本的にMPLABに付属しているが、古い版は以下のページから取得出来る。
過去のMPLAB(X)、コンパイラ倉庫:
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en023073

* mips16オプションの指定方法
基本的に以下の使い方がある。
(a) コンパイル時、「-mips16」オプションを追加する。
    但し、この機能はC32、XC32共に無効になっています。
(b) 関数に __attribute__ ( (mips16) ) オプションを追加する。
    C32は効果有りで、XC32は効果なしです。
(c) #pragma GCC option("mips16") をソースコードの先頭に追加する。(注3)
    この機能はC32、XC32共に無効になっています。
(d) リンク時にリンカに「-mips16」オプションを追加する。
    C32は有効、
    XC32は原則無効で、バグで有効になります。(爆
    リンク時に「-mips16」を指定すると、リンクされる標準ライブラリやペリフェラル・ライブラリが
    「mips16バージョン」になるので状況によっては大きくFLASH容量を削減できます。

以下、上記のオプションを個別に「mips16オプション(a)」の様に表記する。
まとめ:
(1) 効果があるのは基本的に「C32でmips16オプション(b)と(d)」です。
(2) 従って、ソースコード上のmips16化したい全ての関数に、
 __attribute__ ( (mips16) ) 
  を付加する必要があります。
  手間といえば手間ですが、その気になれば、なんとかなる。(爆
以下を使います。
"mips16.h":
#ifndef __MIPS16_H__
#define __MIPS16_H__

#define _MIPS16 __attribute__ ( (mips16) )

#endif    /* __MIPS16_H__ */ 
これを、mips16化したいソースコードの先頭に付加します。 例えば、
#include "mips16.h"
...

void foo( void ) {
  ...
  }
uint32_t *bar( void ){
...
}
を
void _MIPS16 foo( void ){
  ...
  }
_MIPS16 uint32_t *bar( void ){
  ...
  }
に変更。
ソースコードが多数あっても、置換していくだけなので1時間もあればケリが付く話(オントカヨ (爆 努力に見合った結果が得られることは間違いないだろう。(体験済み) (爆 また、全部一度にやる必要もなくて、ひとまずサイズの大きな関数やファイルだけを重点的に、 _MIPS16化して行けば良いと思います。 * 注意点 以下の話では、最適化コード・オプションを「-Os」にして、「-mips16」を付加しています。 無料版コンパイラの場合、双方共に一部を除いて無視される方向ですが、(詳細は後述) ここでは「無視するなら勝手に無視してくれ」というスタンスをとる事にします。(注5) * C32コンパイラ C32でmips16オプション(b)が有効になるバージョンは「C32 v2.00以降」です。 v1.xx系はmips16非対応な上、古いので使わない様にします。 C32はMPLABに付属しているのでMPLABを最新にするか、 上記の倉庫から最新のC32(今ならv2.02a)を取得して使った方が良いです。 * XC32コンパイラ 以下はXC32 v1.20の場合です。 全面的にmips16オプションが無効にされている。ただし、"リンク時のみ"「-mips16」オプションがバグ?で有効になる 現象がある。従って将来遮断される可能性が高い。 * 非常に重要なコード削減オプション "--gc-sections" Maple(ARM STM32)やArduino(AVR)のgccでは普通に有効になっている重要な「コード削減オプション」である。 「-mips16」オプションもここで指定しておく。 設定方法: MPLAB、MPLABX及び、C32,XC32共通。 コンパイル・オプション設定ダイアログで以下のチェックを有効にする。 コンパイラ: 「Compiler」- Categories:「General」画面で、 "Isolate each function in a section" "Place data into its own section" "Generate 16-bit code" これは一応、コンパイラの挙動に関わらずチェックしておくことにする。 「Compiler」- Categories:「Optimization」画面で、 「Optimize Level」の図で、「s」(= -Os)にします。(これも無視されます) 少なくとも「-O0」以外にしておくべきです。 リンカ: 「Linker」- Categories:「General」画面で、 "Remove unused sections" にチェックを入れる。 「Linker」- Categories:「Libraries」画面で、 "Optimization level of Standard Libraries" を「s」 ( =-Os) "Genarate 16-bit code"にチェック 項目の表現はMPLABとMPLABXで微妙に違いますが、大体分ると思います。 上記設定でコンパイル時に、 -ffunction-sections -fdata-sections -mips16 リンク時に --gc-sections -mips16 が追加されることになる。 (MPLABX上ではリンカの-mips16指定は出来ない) * MPLABX上で複数のコンパイラバージョンを切り換えるときの注意点 MPLABX v1.70の場合である。 例えばC32の場合、デフォルトで「半角スペースを含む」フォルダにインストールされる。 このあとC32の別バージョンをインストールしても認識はされるが、切り替えできない状態に陥る。 この場合、全てのC32コンパイラを「半角スペースを含まない」フォルダにインストールし直すことで解決出来る。 * MPLABX(v1.70以降)のMakefile + C32 + mips16 でコマンドライン・コンパイル MPLABXのv1.70から、MS-DOS窓で使える「Makefile」が生成されるようになった。 プロジェクトのトップフォルダで「make」コマンドを打てばコマンドライン・コンパイルが出来る。 ただし、「make.exe」はMPLABXに付属のものである必要がある。 例えば、 D:\MPLABX\gnuBins\GnuWin32\bin\make.exe を使う必要がある。 以下のバッチファイル群を使えば、このMakefileを使って「C32 + mips16」でコンパイル出来てしまいます。 (_MIPS16化は必要) MPLABX上の「mips16」オプションの有効、無効にかかわらず、「-mips16」オプション付でコンパイルします。 従って、MPLABX上で作った新規プロジェクト(C32用)にも効果があります。 m.bat mm.bat asm-list.bat 準備中 * 60日のお試し期間かどうかを確認する方法 コンパイル・オプション設定ダイアログで以下のチェックを有効にする。 「Compiler」-「Optimization」画面で、 「Optimize Level」の図で、「s」(= -Os)にします。 この状態でコンパイルすると、お試し期間切れ(無料のLite版状態)なら以下の様なメッセージがOutputウインドウに表示されます。 ... warning: Compiler option (Optimize for size) ignored due to an invalid license ... warning: Disable the option or visit http://www.microchip.com/c32 to purchase a full standard-edition license. * -Osオプションの効果 (^^)/ C32コンパイラに於いて、コード最適化オプションは以下の状況を示す。 -O0(オーゼロ): 最適化一切なし。コードは冗長。 -O1,-O2,-O3,-Os: 一定の最適化が有効になる。この中のどれを指定しても同じ。(注11) コードサイズは激減する。 従って、このページでは代表値として「-Os」を使用する。 コードサイズが激減する現象は以下のページと同じと思われる。 PIC24F:「C30のLite版の最適化オプション」 Microchipが禁止しているのは、多数の最適化項目の内、 最適化レベル(1,2,3)に依存する項目と、「コードサイズ」に関する部分のみと推測できる。(注9) 従って、それ以外の多くの最適化項目が有効になっていると思われる。 * 効果は絶大だった!! このページに書いた設定を全部適用すると、どれくらいの効果があるか確認してみました。 比較は「プロジェクトのデフォルト設定のまま」と「このページの設定適用後」(_MIPS16化含む)です。 コンパイラはC32(v2.02a)です。内容はMicrochipの「FatFSデモプロジェクト」です。 順番にオプションを追加していき、個々のFLASH削減量を見ていきます。 (1) プロジェクトのデフォルト設定のまま:(最適化一切なし) 53.1KByte PICMX220F032BだとFlash容量オーバーで使えません。 (2) 上に--gc-sections系を追加してみる: 43.1KByte 10KByteも減ります。(^^)/ (3) さらに「-Os」オプションを有効にしてみる: 28.5KByte 実は15KByteも減るのね。 (^^)/ (4) さらに-mips16オプションと「_MIPS16化」を追加する: 18.8KByte さらに10KByte減りました (^^)/ 53.1KByte が最終的に 18.8KByte まで縮みました。スゴすぎ!! この様に絶大な効果が得られます。 PICMX220F032Bだと全然無理と思われたプロジェクトも余裕で使えることになりました。(注10) おしまいっ!! (オイ * PIC32MX250F128Bを使う Flash=128KB, SRAM=20KByte PIC32MX250F128B 483円 http://jp.rs-online.com/web/p/microcontrollers/7680836/ というわけで、いろいろ気にしたくない場合、上記のマイコンを使えばスッキリします。 最終的にFlash=32KByte SRAM=8KByteで収まるならPICMX220F032Bにダウングレードするという 方が楽ちんですね。 * C32に未来はない! 現在、MicrochipはC32に変えてXC32コンパイラを推奨している。 C32のフォルダを探索してみると、v2.02aの最も新しいファイルの最終変更日付が2011/11/28である。 もう1年以上も放置されていることになる。 残念ながらC32は既に捨てられたと考えるの妥当だ。 従って、C32をメインで使用するなら、最新のXC32で提供されているヘッダファイルやペリフェラルライブラリのソースコード とC32内のそれらと比較チェックが必要だろう。 参考ページ: irukaさんのページ PIC32MX http://hp.vector.co.jp/authors/VA000177/html/PIC32MX.html (注1) ARM7のThumbコードのイメージ。 (注2) 使用の可否はGCCマニュアル参照 (注3) この機能は、一般的なGCCなら使える可能性があって、 ソースコード内(任意の場所から、〜までとか)でコンパイル・オプションを変更可能なので、 ある状況下では非常に便利です。(括弧内に任意のコンパイルオプションを指定出来る。)(注2) (注5) コンパイル時の警告がうっとうしい場合は変更しても良いかもしれませんが、最適化が効かなくなります。 (注6) IDEの再起動、又はコンパイラ・オプション画面を出して「Apply」が必要。 (注7) 注意ポイントとして、mips16化コードは実行速度が30%程度低下する。 (注8) 60日試用期間を有効にしてもかまいませんが、ここでは60日経っても状況が変わらないように 配慮しています。60日後に「そんな話聞いてないっ!!」とならない様に。(オイ (注9) 一般的な最適化グループ項目の詳細はGCCのマニュアルにある。 (注10) 動くかどうか試してないけど、普通は大丈夫だと思います。(^^; (注11) 実はビミョ〜に変化する場合もありますが、微妙なので無視します。
posted by Copyright (C) avrin All Rights Reserved. at 00:00| Comment(4) | PIC32MX | このブログの読者になる | 更新情報をチェックする

2012年06月06日

秋月でPIC32MX 28pin DIP版出る

秋月でPIC32MX 28pin DIP版出る
* はじまり
2012/06
http://akizukidenshi.com/catalog/c/cpic32_dI_ssp/
秋月で、なんと、28pin DIP 300mil の32ビットマイコンPIC32MXが、
さらに、なんと 32KByte + USB機能付で220円ポッキリという
いわゆる、「秋月価格」で販売開始された。

PIC32MX220F032B
http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en556007

ちなみに、メーカ直販価格は2012/06時点で、1個 216円(80円/$)=$2.7、 
1000個以上で1個 168円(80円/$)=$2.1
http://www.microchipdirect.com/ProductSearch.aspx?keywords=PIC32MX220F032B-I/SO

少し前にARM Cortex-M0 の 太めな28pin DIP 600mil タイプがあったけど、このPIC32MX220の300milの
ほうが小さくて良いね。Coretex-M0 DIPも秋月に置いて欲しいけど。

より大容量型:
以下の様に同じ28pin DIPの大容量型も存在するので、これらも秋月価格でだしてほしいね。

    28pin DIP   Flash, SRAM, 
PIC32MX230F128B 128kb, 32kb, USB
PIC32MX250F064B  64kb, 16kb, USB

http://www.microchip.com/maps/microcontroller.aspx

* PIC32MX用コンパイラ
コンパイラは、
1, MPLAB系に付いてくる「pic32-gcc」、
2, Pinguinoプロジェクトで配布している「mips-gcc」(無料)、
  gcc version 4.5.2
  これはPinguinoをインストールすると自動でインストールされる。
  http://avr.paslog.jp/article/2477815.html
   Pinguino X.3なら
   C:\PinguinoX.3\win32\p32\bin
   に実行パスを通せばコンパイル可能。リンカスクリプトやビルドスクリプトは
   一度Pinguino上でコンパイルすると、
   C:\PinguinoX.3\source
   に生成されるので参考になる。
3, Sourcery Codebench Lite MIPS ELF
   gcc version 4.6.3
   mips-sde-elf-gcc
   mips-sde-elf-g++
   後述。 調査中。
4, Chipkit IDEに付属のgcc
   調査中。
   https://github.com/chipKIT32/chipKIT32-MAX/downloads
   mpide-0023-windows-20120903.zip (Windows用)をダウンロード、解凍します。
   

これらのgccは同じgccから派生した物と思われます。
比較はこれからだけど、最適化制限のあるMPLAB系のgccよりも最適化制限のない
その他のgccのほうがFlashサイズが小さくなる可能性が高い。
16bit長のコード生成 / mips16e:
『はじめて読む MIPS(リローデッド)』 by 中森章
http://www.cqpub.co.jp/interface/TechI/Vol39/app/mips_asm.pdf
が非常に参考になります。

ARMのThumbコードと同様に16bit長のコード生成が可能で、実行速度は落ちるものの
Flashサイズを激減させることが出来る。
今回のPIC32MX220等には必須だろう。

mips-gcc -Os -mips16 main.c 
の様にコンパイル時に「-mips16」オプションを付ける。
リンク時にも付ける。

MPLAB IDEの場合、コンパイルオプションの設定で、
General - 「Genarate 16-bit code」にチェックを入れる。
コードの最適化は、「-Os」にしておく。(最適化の期限切れのはずだけど、なぜか多少の効果がある)

アセンブラ出力で確認する:
MPLABなら
pic32-objdump -h -S main.elf  > main.lst 
mips gccなら
mips-objdump -h -S main.elf  > main.lst 
とELFファイルからアセンブラ出力が得られるので、実際の16bit長のコード、
32bit長のコードの使われ方が確認できる。

*OpenOCD/JTAGでPIC32MX220に書込み&デバッグ
以下のスレッド、まだ全部読めてないけどPIC32MX220F03Bは既に
OpenOCDで対応済み風。
http://www.mail-archive.com/openocd-devel@lists.sourceforge.net/msg01059.html
なので、JTAGアダプタさえあればPickit3なしでもFLASH書込み&デバッグが今すぐ
出来る可能性が高い。
28pinしかないのでちょっとつらいけど、
Pingunoプロジェクトの
http://avr.paslog.jp/article/2477815.html
PIC32MX220用のブートローダがそのまま使えるらしいので、
最初にブートローダだけ書いて使うという手が良いかも。
ついでにPinguinoも試せる。

* PIC32MX220のエラッタ
http://ww1.microchip.com/downloads/jp/DeviceDoc/jp556114.pdf
2012/06現在入手できるのは、たぶんリビジョン「A0」か「A1」のはず。
(エラッタは今のところ11個)
ちなみに、このリビジョン「Ax系列」はかなり初期の段階で、これから修正が
入るのと新たなバグが発見されて「Bx系列、「Cx系列」に移行して行くと思われる。

エラッタは全部熟知したほうが良いわけだけど、なかなか大変。
自分的にハデ目なものを挙げてみる。
(以下はざっくりめなので詳細はエラッタ参照のこと)

(1)CPUの書込みサイクル・バグ
  通常、CPUの書込みサイクルの初期段階で「割込みが入る」と、
  (a)  書込みサイクルキャンセル(或いは保留?) 
  (b)→ 割込み処理開始 → 割込み終了
  (c)→ キャンセルされた書込みサイクル開始
という形になるが、(a)部にバグがあって
「書込みサイクルがキャンセルされずに実行されてしまう」ので
 結局、余分に書込みが発生してしまうのだ。orz
問題:
  書込み先がメモリなら無問題なものの、SPI,I2C,UARTなどの送信レジスタ
  だった場合、同じデータが2度送られるという凶悪なバグが発生する。
  (PMPも同様らしい)

対策:
  送信レジスタに書く前に必ず割込みを禁止する。
  又は、送信にDMAを使えば避けることができる。

orz

エラッタは読んだ方が良い。
まず、エラッタを読む。

* pic32prog: PIC32MX220をPickit2/Pickkit3で書き込む
このソフトを使うと
http://code.google.com/p/pic32prog/
Pickit2で標準サポートされていないPIC32MX群への書込みが
できるらしい。
Windows/Linuxで動作可能の様だ。

ここ数日(2012/06/19)で大きく変わっていて、
(1)Pickit2/Pickit3対応
(2)WindowsではUSB HID対応となり、LibUSB-Win32のドライバは不要となった。
(3)LinuxはLibUSBベース
(4)デバイスIDの誤記修正
(5)書込み速度の改善
等々、良い感じになってきた。

特にWindows用がHID直接タイプになったので非常に使い易い。
(ドライバのインストール不要で、pic32prog.exeを実行するだけ)

コンパイル済みの実行ファイル:
http://code.google.com/p/pic32prog/source/browse/trunk/pic32prog.exe
実は上のリンクから実行ファイルが取得できないので、
こちらで取得したものを置いておきます。
解凍するといろんなファイルに混じってpic32prog.exeが出てきます。:D
pig32prog_src_pack_2012017.zip
これは、うまく書込みできないのでirukaさんのページのものを取得してください。
PIC32MXについて(概要) 
http://hp.vector.co.jp/authors/VA000177/html/PIC32MX.html

使い方:
http://code.google.com/p/pic32prog/wiki/README



* pic32prog はダメだった orz 2012/11 
このソフトで実際に「Pickit2」からPIC32MX220F032Bへ書き込んでみたものの、
LEDチカチカさえ出来なかった。orz
ソースを見るとコンフィグファイルの書込み部分に難ありな感じでした。
素直にPickit3を買った方が良いかも。 orz
(2013/02)
Programming pinguino 32 PIC32MX220 hid bootloader not responding
http://code.google.com/p/pic32prog/issues/detail?id=5&sort=-id
上のページでも同様にコンフィグ部分に不具合があると指摘されている。
上のページから得られるファイルにPic32progで書き込めるPinguino 32のブートローダファイルが
あるので、そのうち試してみよう。
(2013/02)
irukaさんの改良版pic32progで見事書込み&LEDチカチカ成功しました。
大感謝 m(__)m

ようやくスタートラインに立てたもののすでにモチベーションが...(爆

*UBW32プロジェクト
というのもあるらしい
http://www.schmalzhaus.com/UBW32/


* 最適化制限のない CodebenchのMIPS, コマンドライン コンパイラ
CodebenchもMIPS用のコンパイラを出しているので、MPLAB(X)のコンパイラに付属の
PIC32MXマイコン用ヘッダファイルやリンカスクリプトを使えば、
最適化制限なしでコンパイルできるんじゃないかと思います。
Sourcery CodeBench Lite Edition for MIPS ELF 
https://sourcery.mentor.com/GNUToolchain/subscription3537?lite=MIPS
のページに入って、「IA32 Windows Installer」を選択。
ダウンロードは登録が必要。

探査中。




参考文献:


参考:

1個200円のマイコンに書き込むために約4000円のライタが売れまくるという戦略。
も、あるにはある。(爆


検索キー: pic32 pic32mx pic32mx220 PIC32MX220F032B Pickit2 Pickit3 pic32prog errata エラッタ Pinguino
posted by Copyright (C) avrin All Rights Reserved. at 00:00| Comment(17) | PIC32MX | このブログの読者になる | 更新情報をチェックする