[C#]switch文のcase句の中だけで有効な変数を宣言する[C,C++,javaも同様]
プログラム中に例えば、以下の様なswitch文があったとします。 void func( int inData ) { switch ( inData ) { case 1: …; break; case 2: …; break; } }void func( int inData ) { switch ( inData ) { case 1: …; break; case 2: …; break; } } このcase句の中で、ワークの一時変数を使いたい場合、以下のようにcase内で宣言する事が…
続きを読む
[C言語]文字コードがACSIIで無い場合にコンパイルエラーを出す方法
上手い事プリプロセッサ命令を使ってるなと思ったのでメモ。 #ifで、アルファベット’a’の文字コードを調べることで判定しています。 gawk3.1.5のソース(eval.c)より。 #if ‘a’ == 97 /* it’s ascii */ // …文字コードがASCIIだったときの処理 #else #include "You lose. You will need a translation table for your character set." #endif#if ‘a’ == 97 /* it’s ascii */ // …文字…
続きを読む
[VisualStudioでμITRON]HelloWorldプログラムを作成する
前回はμITRONの実装のひとつであるHOS(Hyper Operating System)をダウンロードし、 カーネルのライブラリを作成しました。 Visual Studioで実行可能なμItronの環境を構築する 今回はこのライブラリを使用して、μITRON環境下でHelloWorldを表示させるプログラムを作成します。 今回作成するプロジェクトのフォルダ構成 作業に入る前に、今回の説明の前提を説明しておきます。 まず、前回書いたカーネルのライブラリは準備が出来ているものとします。 Visual Studioで実行可能なμItronの環境を構築する 今回作成するプロジェクトは、以下のフォル…
続きを読む
[対処法]D8045 : C ファイル ‘xxx.c’ を /clr オプションと共にコンパイルできません のエラーが出た時にすること
Visual Studioで、拡張子が*.cのc++プログラムをコンパイルする時、以下のエラーが出る事があります。 D8045 : C ファイル ‘xxx.c’ を /clr オプションと共にコンパイルできませんD8045 : C ファイル ‘xxx.c’ を /clr オプションと共にコンパイルできません この場合は、以下の手順でコンパイルオプションを変更するとエラーを回避できる場合があります。 メニューバーの、プロジェクト->xxxのプロパティを選択します。 構成プロパティ->C/C++->詳細設定を選択します。 右側に表示されたコンパイル言語の選択を、「規定」から「C++コードとしてコン…
続きを読む
[C言語基礎]switch文で偶数・奇数の判定を行う方法
int型の変数に入っている値をswitch文で偶奇判定するプログラムです。 int a = …; switch( a % 2 ) { case 0: printf( "偶数です\n" ); break; case 1: printf( "奇数です\n" ); break; }int a = …; switch( a % 2 ) { case 0: printf( "偶数です\n" ); break; case 1: printf( "奇数です\n&q…
続きを読む
[PIC]C30コンパイラをインストールする(dsPIC,PIC24用)
本記事ではPICのC言語向けコンパイラである、C30コンパイラのインストールと動作確認を行います。 C30コンパイラの正式名称は”MPLAB C Compiler for PIC24 MCUs and dsPIC DSCs”で、dsPICや,PIC24シリーズなどの16bitマイコンで使用可能なCコンパイラです。 C30コンパイラはPRO、Standard、Liteと3つのバージョンがありますが、今回は無償で利用可能なLite版を使用します。Lite版でもコンパイラとしてはフル機能が利用できますが、最適化が部分的にしか使用できないため生成される実行ファイルのサイズが若干…
続きを読む
[PIC16F88]HI-TECH CでTimer1割り込みを使用する
PICの16F88はTimer0,1,2という3つのタイマーモジュールを持っており、それぞれのタイマーは役割が異なっています。 今回は、16F88でHI-TECH Cを使用してTimer1割り込みを利用し、0.5秒周期でLEDを点灯させてみます。 クロックは16F88の内部オシレータを8MHzで駆動させます。 #include <stdio.h> #include <htc.h> #define TIMER_INTERVAL (0xffff – 20000) // TMRモジュールのカウント初期値 // 8MHz, 1/1プリスケーラで、10msecごとに…
続きを読む
[HEW]コンパイル時,gcc -Wallのように全ての警告メッセージを表示させる方法
H8の統合開発環境であるHEWの話です。 C言語のコンパイラとして、例えばgccを指定する場合だと-Wallオプションを使用することで、未使用変数のチェックなどの数多くの警告を出してくれます。 一方、H8マイコン開発環境のHEWでは、デフォルトでは上記のような軽微な問題に対してメッセージを出してくれません。ですが、このふるまいはコンパイルオプションを変更する事で変えることが出来ます。 変更の手順は以下の通りです。 メニューバーより、ビルド->H8S,H8/300 Standard Toolchainを選択します。 オプション項目の欄から、インフォメーションメッセージを選択します。 “…
続きを読む
12ステップで作る組込みOS自作入門: 1stステップの作成結果
読み始めた「12ステップで作る組込みOS自作入門」の本ですが、gccだと書籍の内容そのままで楽しくないので、H8の製造元であるルネサスが出しているIDEのHEWを使用して同じものを作ってみる事にします。 ターゲットのマイコンも,書籍ではH8/3069Fで説明していますが、H8/3694Fをターゲットに作成します。 このチップを使用する理由は、”たまたま手元にあったから”というだけです。 3069FはフラッシュROMが512Kbteなのに対して、3694Fのほうは32kByteしかないので途中で容量不足になりそうな気もしますが、出来るところまで作ってみて足りなくなったらそ…
続きを読む
変数の特定ビットだけを0に落とす時に、条件式を簡単に書く
※本記事の例はC言語ですが、java,C#などのビット操作が出来る言語に共通した話です。 まずは、ビット操作の基本的な考え方です。 たとえばcharがたの変数dataから、5bit目だけ0に落としたい場合を考えます。 この場合のコードをシンプルに書くと、以下のようになります char data = xxx; char ans = data & 0xDF;char data = xxx; char ans = data & 0xDF; これは、以下の論理式演算(ビット単位のand)を行って、特定ビットを落としています。 (data) xxxx xxxx and (0xdf) 11…
続きを読む
[PIC]HI-TECH Cで、タイマー割り込みを行う(PIC16F84A)
PIC16F84Aには、TMRというタイマーモジュールがあり、これを利用と一定周期でタイマ割り込みをかけることが出来ます。 今回は、HI-TECH Cでタイマ割り込み処理を作成してみます。 ※アセンブラ(MPASM)でタイマー割り込み処理を行いたい場合は、こちらの記事を参考にして下さい。 [PIC]TMRモジュールを使用する(タイマー割り込み) TMRを使用したサンプルコードです。 これは,8Mhzで動作しているPICに対して,約10ミリ秒周期でタイマー割り込みをかけています。 #include <stdio.h> #include <htc.h> #de…
続きを読む
[PIC]HI-TECH Cでコンフィギュレーションビットを指定する
PICのプログラムをアセンブリ(MPASM)で作成する場合は、CONFIG命令でコンフィギュレーションビットを指定するのですが、HI-TECH Cではこの設定は、__CONFIG()マクロで行います。 下記のプログラムは、__CONFIG()マクロの使用を使用したサンプルです。 #include <stdio.h> #include <htc.h> void main( void ) { __CONFIG( FOSC_HS & WDTE_OFF & PWRTE_ON & CP_OFF ); …
続きを読む
[PIC]HI-TECH Cで一定時間スリープさせる
PICでは、HI-TECH Cコンパイラをを使用した、C言語による開発を行う事ができます。 C言語で開発を行う場合、プログラム中で一定時間処理をスリープさせるにはどうしたら良いでしょうか? HI-TECH Cの環境では、主に以下の4つの手法があります。 1. 空ループを回す 2. _delay()マクロを使用する 3. __delay_ms()マクロを使用する 4. __delay_us()マクロを使用する1. 空ループを回す 2. _delay()マクロを使用する 3. __delay_ms()マクロを使用する 4. __delay_us()マクロを使用する 上記のうち2,3,4のマクロはH…
続きを読む
PIC16F84AをC言語で,MPLAB IDE環境で開発する
PIC16シリーズでは、入門者向けとしてよく使用されているPIC16F84Aですが、プログラムの格納エリアが小さいため通常はMPASMというアセンブラを使用してプログラムを行う事が多いです。 PICの製造メーカであるMicroChipが提供している統合開発環境のMPLABでも、標準ではアセンブラしか用意されていません。ですが、実はMicroChipはCのコンパイラも用意してくれているので、追加でコンパイラをインストールすれば、Cで開発する事も可能です。 今回はMPLABで、PIC16F84AのプログラムをC言語で開発する方法を説明します。 C言語によるPICプログラミング入門 MicroChi…
続きを読む
[C言語]リンクリストを使用したプログラムの基礎
構造体とmallocによるメモリの確保を利用した、リンクリストのサンプルプログラムです。 //———————————————————————- // File : linklist.c // Description : リンクリストを使用して、入力された点数の平均点を求める //———————————————————————- #include <stdio.h> #include <stdli…
続きを読む
[gcc]CPUID命令を使用して、CPUの情報を取得する
IntelのCPUでは、CPUIDというアセンブラの命令を使用することで、CPUの情報を入手する事が出来ます。 ここでいうCPU情報というのは、CPUのシリーズや、対応している命令セット、キャッシュ容量、プロセッサシリアルNoなどが含まれます。 このCPUID命令、C言語で普通にプログラムしていてはコールする事が出来ませんが、インラインアセンブラを使用することで利用する事が可能です。 今回は、gccのインラインアセンブラである”__asm__”命令を使用して、CPUID情報を取得する方法を説明します。 C言語からCPUID命令をコールする まずは、CPUID取得のベース…
続きを読む
[C言語入門]共用体でメモリを有効活用
今回は共用体です。 共用体の定義は以下のように行います。 union タグ名 { メンバ1; メンバ2; … };union タグ名 { メンバ1; メンバ2; … }; 一見すると構造体っぽい定義方法で、同じように見えるかもしれませんが、構造体と、共用体ではメモリ確保のされ方が異なります。 このことを確認するために、サンプルを1つ実行してみます。 #include <stdio.h> struct t_CHARACTER { char c0; char c1; char c2; char c3; }; union u_CHA…
続きを読む
[gcc]C言語のプログラムからレジスタの内容をダンプする
C言語のコードをgccで開発している場合、インラインアセンブラを使う事でレジスタの内容をダンプさせることが出来ます。 以下のdefine文を定義しておくと、1命令書くだけで、全レジスタをダンプしてくれるので便利です。 #define DUMP_REGISTER() { \ register int eax asm( "%eax" ); \ register int ebx asm( "%ebx" ); \ register int ecx asm( "%ecx" ); \ register int edx asm( "%ed…
続きを読む
gccのアセンブル出力を解析する時は-gオプションが便利
アセンブラの勉強のために、gccで-Sオプションを使用してC言語のコードからアセンブラのコードを出力していたのですが、ソースコード中の何行目がどの出力に対応するのか分かり辛く、苦労していました。 もちろん注意深く読めば対応は分かるのですが、本質的でないところに時間が取られてしまい、本来の解析が出来なくなってしまうので非効率です。 と思ってたのですが、コンパイル時に-gオプションをつけ、デバッグ情報を付与させると、ソースとアセンブリの対応が出力される事に最近気づきました。 以下、試してみた結果です。 こちらがテストに使ったコード #include<stdio.h> in…
続きを読む
[C言語入門]ポインタを理解する その1:メモリとポインタ変数入門
今回の説明はポインタ変数です。 ポインタ変数は、特に難しいというわけではないのですが、C言語での表記の仕方の問題で混乱する人も多いので、今回はゆっくりと順を追って説明していきます。 ポインタの理解には、前提としてコンピュータの構成要素であるメモリ(主記憶装置とも言います)の理解が必要となるので、まずこちらから説明していきます。 変数はメモリ上でどのように保持されているのか? まずは,変数とメモリについての説明です。今まで、”i=10;”といったコードを”変数に値をセットする”と説明していましたが、変数の値はコンピュータ上でどのように管理されている…
続きを読む