PICの最近のブログ記事



そもそも最後にPICを触ったのが2年前だし、それを含めてもCでPICファームを書くのは初めてなので、とりあえず簡単なことからはじめてみる。



#include<p18f2550.h>
#pragma config WDT = OFF

void wait( int _i, int _j, int _k);

void main(void){

TRISA = 0;
TRISB = 0;
PORTB = 0;
PORTA = 0;

while(1){
PORTB = 0xFF;
wait( 200, 50, 20);
PORTB = 0;
wait( 200, 50, 20);
}
}

void wait(int i_, int j_, int k_){
int i, j, k;
int dam = 0;

for( k = k_; k > 0; k--){
for( j = j_; j > 0; j--){
for( i = i_; i > 0; i--){
/*
_asm
nop
_endasm
*/
dam++;
}
}
}
}

これをコンパイル→書き込み→実行してみる。うまくいけばLEDの点滅が見られるはずなんだけど、そうはいかない。点滅の周波数が高すぎるのかと思って調節してみても変化なし。


困ってマニュアルのようなものをみてみると、どうやらC18はデフォルトで最適化を行っている様子。具体的には:



  • 同一文字列の併合

  • 分岐

  • バンキング

  • WREG コンテンツトラッキング

  • コード整理

  • 最後部コードの併合

  • 執行されないコード削除

  • コピー伝播

  • 冗長保存削除

  • 不要コードの削除

  • 過程抽象


というようなことを行っているらしい。


「不要コードの削除」か「執行されないコード削除」によって、wait関数内部のループが殺されてしまったのかなあと推測。MPLAB IDEの設定画面から、C18の実行時のオプションに-Oを加えてすべての最適化を抑制する。実効速度がクリティカルな影響を及ぼすようなデバイスではないので、問題ないと思うけど少し残念な気持ちが残る。


で、コンパイル→書き込み→実行すると、今度はうまくいく。若干点滅の挙動が不自然なのが気になる。


そういえば昨日のエントリで書いたように、C18 Student Editionは60日経過すると一部の最適化ができなくなるらしいのだけど、普段から-Oして開発してたら気にする必要ないのかな?ってそういう問題じゃないかなー。


とりあえず今日はちゃんと動かせることがわかったので満足。




USB機器を作るにあたって、PIC16系+USBコントローラな構成にするかPIC18F系でいくか悩んでる。


できればシンプルかつ安価にいきたいので、PIC18F系でいきたいのだけど、Microchip社が公開してるUSBターゲット用ファームのサンプルが同社のMPLAB C18というコンパイラでなければコンパイルできないらしく、これが有償ときているので悩んでいる。約$860。BCC, gcc, VCコンパイラしか使ったことのない人間からすれば高すぎる。価値観もさることながら財政的に苦しい。


で、C18にはStudent Editionなるものがある。あるのだが、60日間という期限があって、これを超えると一定の制限がかかるらしい。


この制限の内容が英語でしか提供されていなくて、ぼくの知識でがんばって訳しても不明確な内容にしかならないので困ってる。


原文。



The Student Edition is free! It has all the features of the full compiler and libraries.


After 60 days, the optimizations related to procedural abstraction and to the extended


instruction set of the newer PIC18XXXX devices will be disabled.


Code compiled after the expiration date will function but may occupy more memory space.


http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en010014:title=MPLAB C Compiler for PIC18 MCUs


  • Student Editionは無料である

  • コンパイラとライブラリのすべての機能が使える

  • 60日経過後、手続きの抽象化・新しいPIC18系の拡張命令セットに関する最適化が無効化される

  • 試用期間終了後もコンパイルはできるが、コンパイルされたコードは肥大化するかもしれない


↑で正しければ、最適化が結果を分けるほど大きなデバイスじゃないから普通に使って問題ないはずなんだけど……。


間違ってたら誰か教えてくださいです。


PIC Ruby Compiler

| コメント(0) | トラックバック(0)



一年生からプログラミングが非常に不評だった、という話の続き。


いきなりアセンブリを教えようとしたから拒絶された、Cとか高級言語なら受け入れてくれたはず、なぜなら別の(機械チームの)子にRubyで教えたら好評だったから、という論調でCにしない?というような話を顧問としてた(この話が二進数の件に通じてます)。でもアセンブラのほうがシンプル、そもそも機械の子はプログラミングに興味があった、ということから少なからず怪しい理屈。でもまあ物は試しでしょ、みたいな流れになった。


でも手元にPIC C Compilerがない。BCCもない。落とせばいいけど全部のマシンに入れるのが面倒い。


そこで人間コンパイラどうよ、みたいなことに。


いや何のことはない、一年生が書いたCのコードを、俺(ないし顧問(ないか(笑)))がアセンブリコードに書き換えるという荒業。昔は実際そうだったらしいし。いやそれはアセンブラだっけか(笑


冗談半分で実行には至らなかったけど、結構面白そうだなと思った。エキセントリックなコードを突きつけられたコンパイラの嫌な気持ちがわかるかも知れない、というような感じで。


ていうかこのところそれほど忙しくないので、PIC用のコンパイラでも作ってみようかな、と考えてる。せっかくだし興味が湧いてきたRubyでとか、それなら機械の子といっしょにとか、色々面白いネタに昇華しようと思案中。


Rubyでコンパイラ書くなら、Rubyコード─コンパイル→PICアセンブリのほうが面白いかな。


このアーカイブについて

このページには、過去に書かれたブログ記事のうちPICカテゴリに属しているものが含まれています。

前のカテゴリはOpenCVです。

次のカテゴリはPMMLです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

Powered by Movable Type 4.32-ja