Hi-Tech C16 + PIC12f1822でswitch文にバグ

現在、来年度教材用に動作確認中であるが、比較的新しいバージョンでPIC12f1822でswitch文まわりにバグが含まれているのを発見した。

バージョンによって挙動が違うのでなんともいえないのだが、いろんなパターンがあるので注意が必要。

1.#pragma switch time は使うな

どうやらv9.71あたりから採用されたpragmaらしいが、12f1822で使用するとswitch文が正しくスイッチせず暴走する。このpragma自体のないv9.70以下では問題ない。

2.バージョン9.81では8個以上分岐するな

v9.80では起こらないがv9.81から8個以上分岐するswitch文が正しくスイッチせず、評価変数が1,2,3,4,5のときcase文でそれぞれ1,3,5,7,9にスイッチする。8分岐のとき5以上の数を評価させるとリセットがかかった(私のプログラムの場合)。

いずれのケースもすべて試したわけで無いが、12f683や18f1825では再現しないことから、12f1822固有の問題と思われる。

この現象をテストするために作成したソースは次のとおり


#include "..\piclib.h"
//#pragma switch time

void main()
{
	int ac=0;
	InitPic();	// 初期設定
	LcdInit();	// LCD設定
	printf("start\n");
	for(;;){
		ac++;ac&=0x0f;
		printf("%d:",ac);
		switch(ac){
			case 1:
				printf("1:%d",ac);
				break;
			case 2:
				printf("2:%d",ac);
				break;
			case 3:
				printf("3:%d",ac);
				break;
			case 4:
				printf("4:%d",ac);
				break;
			case 5:
				printf("5:%d",ac);
				break;
			case 6:
				printf("6:%d",ac);
				break;
			case 7:
				printf("7:%d",ac);
				break;
			case 8:
				printf("8:%d",ac);
				break;
		}
		DelayS(1);
		printf("\f%d times\n",ac);
	}
}

このソースで、たとえばcase文を1つ減らすと正常に動作したりするw。
正しく動作するとLCDには、1:1:1、2:2:2、3:3:3と表示するのだが、2の現象が起こるとLCDに1:1:1、2:3:2、3:5:3…なんてふざけた表示がされリセットがかかってstartが表示される。

  1. 6/20にバージョンアップしたV9.82では、このバグは解消されたみたいです。実際にテストしてみましたがOKでした。ご参考までに。

  1. トラックバックはまだありません。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。