« 週末のお買い物 | Main | 試作中 »

2007.10.17

H8でC その後

先日から組んでるH8のプログラムがようやくうごきました。
やってること自体は簡単なんだから、できなければ困るのだけれどね。

結局ひっかかってた事は、ポインタと構造体に関する表現方法の理解の問題と、H8の仕様と開発環境の使い方の問題でした。

サンプルにあったVector Addressの記述についてと、タイマによる割り込み処理については未解決ですが、目的の物は出来たし残りは趣味の領域になってしまうので、今回は時間切れということで。

時間があったらぼちぼち.....ってそのまえにMSP430を自力でちゃんと動かさなきゃね。

以下覚え書きです。
プログラムはルネサスのサイトから拾ってきたものにちょっと手を入れただけの物です。
間違いありましたらご指摘よろしくお願いいたします。

---------- ここから ----------
struct BIT {
unsigned char b7:1; /* bit7 */
unsigned char b6:1; /* bit6 */
unsigned char b5:1; /* bit5 */
unsigned char b4:1; /* bit4 */
unsigned char b3:1; /* bit3 */
unsigned char b2:1; /* bit2 */
unsigned char b1:1; /* bit1 */
unsigned char b0:1; /* bit0 */
};
---------- ここまで ----------
これは、BITという名前の構造体を宣言しています。
構成要素はb7,b6,b5,b4,b3,b2,b1,b0です。
各要素の大きさは1bitです。

---------- ここから ----------
#define TMA  *(volatile unsigned char *)0xFFA6 /* Timer ModeRegister A */
---------- ここまで ----------
0xFFA6という文字列の前に(volatile unsigned char *)がついているので、この文字列はアドレスを示すポインタで、符号の無い(unsigned)文字列(char)です。(volatile)は、コンパイラで最適化され、消されては困る時につけます。*(volati.....のように頭に*がついているので、このポインタが示す先のメモリ1バイトを示しています。
この文は、アドレスFFA6を示すアドレスにTMAという名前をつけています。H8はメモリマップドI/Oで、このアドレスは実際はタイマーをコントロールするレジスタに割り付けられています。

---------- ここから ----------
#define PDR3_BIT (*(struct BIT *)0xFFD6) /* Port Data Register 3*/
---------- ここまで ----------
0xFFD6という文字列の前に(struct BIT *)がついているので、この文字列はアドレスを示すポインタで、BITという名のついた構造体の型です。*(stru.....のように頭に*がついているので、このポインタが示す先のメモリを示しています。
この文は、アドレスFFD6の示すメモリにPDR3_BITという名前をつけています。

ということは、ポインタがBITという構造体だとそのポインタが示す先のメモリも同じ構造体として扱われるってことでしょうかね?(そう理解しないと、次の部分がちょっと矛盾)

---------- ここから ----------
#define P33   PDR3_BIT.b3
---------- ここまで ----------
PDR3_BITという名前のメモリの先頭から4bit目にP33という名前をつけてます。

---------- ここから ----------
/*********************************************************************************************************/
/* Vector Address */
/*********************************************************************************************************/

//#pragma section V1         /* VECTOR SECTOIN SET */
//void (*const VEC_TBL2[])(void) = {
             /* 0x00 - 0x0f */
// main
//};

#pragma entry main(sp=0xFF80)

#pragma section         /* P */

---------- ここまで ----------
ここはルネサスのサンプルほぼそのままなのですが、結局何をやっているのか理解できませんでした。
リンカにアドレスを渡してH8に転送した時におかれるアドレスを設定しているのだと思うのだけれど、それぞれの意味がさっぱりわかりません。
同じようなことをHEW4(ルネサスの開発環境)でも設定していて、なおかつ上の設定とバッティングしているらしく素のままじゃリンクエラーで止まってしまっていました。 とりあえず、HEWが何とかしてくれるだろうということにして、上のようにコメントアウトしてエラー回避。HEWさまさまです。

---------- ここから ----------
/*********************************************************************************************************/
/* 関数定義 */
/*********************************************************************************************************/

void main ( void );
void pulse ( void );

.....略.....

void main ( void )
{
         .....略.....
}
---------- ここまで ----------
ここで疑問。関数って関数定義のところで型宣言しているのに、実際に使う時にもう一度型宣言するのってなぜなんでしょう。型宣言したんだから

pulse () {
.....略.....
}
のように宣言無しでつかってもいいように思うんだけど。

そういえば、関数定義で型宣言せずにいきなり使ってる関数もあったっけ
int debounce(sw_status) {
int m,n;
.....略.....
}

結局どっちでもいいってことかな。
慣れてないから違和感感じるだけなんでしょうかね。

|

« 週末のお買い物 | Main | 試作中 »

Comments

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



« 週末のお買い物 | Main | 試作中 »