0

マイクロコントローラをプログラムしたことがある場合は、特定のレジスタの選択ビットを操作したり、全体にバイトを書き込んだりすることに慣れているでしょう。たとえば、C を使用する PIC では、1 バイト全体を PORTA に書き込んですべてのビットを設定するか、単純に PORTAbits.RA# をアドレス指定して 1 つのビットを設定することができます。これらの構造体/共用体が定義されている方法を模倣しようとしているので、プログラムの変数で同じことを行うことができます。具体的には、マイクロコントローラがオンになったときに、自分で定義したレジスタを次のようなものでリセットできるようにしたい

REGISTER = 0;

REGISTERbits.BIT0 = 0;
REGISTERbits.BIT1 = 0; 
...
//or
REGISTERbits = (0,0,0,0,0,0,0,0);

明らかに、前者の方がエレガントで、行スペースを大幅に節約できます。マイクロコントローラーのヘッダー ファイルは、次のようになります。

#ifndef __18F2550_H
#define __18F2550_H
....

extern volatile near unsigned char       LATA;
extern volatile near struct {
  unsigned LATA0:1;
  unsigned LATA1:1;
  unsigned LATA2:1;
  unsigned LATA3:1;
  unsigned LATA4:1;
  unsigned LATA5:1;
  unsigned LATA6:1;
} LATAbits;

...すべてのレジスタに対して、および複数バイトのレジスタは、Registerbits に構造体の共用体を使用します。私の初期化/宣言はヘッダーではなくメイン ソース ファイルにあるため、extern を削除し、私の近くに置きました。

volatile unsigned char InReg;
volatile struct{
    unsigned NSENS:1;   //One magnetic sensor per direction
    unsigned SSENS:1;
    unsigned ESENS:1;
    unsigned WSENS:1;
    unsigned YBTN:1;    //One crosswalk button input per axis
    unsigned XBTN:1;    //(4 buttons tied together each)
    unsigned :2;
} InRegbits;

...しかし、コンパイル時に、InReg と InRegbits はメモリ内の 2 つの別々の場所として定義されます。つまり、InReg に書き込んで InRegbits を変更することはできません。これが機能するように変更するにはどうすればよいですか?私がコピーしようとしているのは、特別なマイクロコントローラ レジスタであるため、機能するだけですか?

助けてくれてありがとう

4

2 に答える 2

3
volatile union InReg {
    unsigned char InRegAll;
    struct near {
        unsigned NSENS:1;   //One magnetic sensor per direction
        unsigned SSENS:1;
        unsigned ESENS:1;
        unsigned WSENS:1;
        unsigned YBTN:1;    //One crosswalk button input per axis
        unsigned XBTN:1;    //(4 buttons tied together each)
        unsigned :2;
    } InRegbits;
}

このコードは移植できない可能性があることに注意してください。

于 2013-03-18T00:33:54.890 に答える
2

同じ結果を保証するには、ユニオン内に 2 つの構造体が必要です。標準では、共用体のメンバーが構造体であり、最初の構造体メンバーの型に互換性がある (そして同じビット幅に関連している) 場合、それらのいずれも同じように操作できるとされています。それ以外の場合、別のユニオンメンバーを介して任意のユニオンメンバーにアクセスすると、未定義の動作になります。

例えば

volatile union {
    volatile struct {
        unsigned int InReg;
    } InReg;
    volatile struct {
        unsigned NSENS:1;       //One magnetic sensor per direction
        unsigned SSENS:1;
        unsigned ESENS:1;
        unsigned WSENS:1;
        unsigned YBTN:1;        //One crosswalk button input per axis
        unsigned XBTN:1;        //(4 buttons tied together each)
        unsigned:2;
    } InRegbits;
} Reg_s;
于 2013-03-18T01:03:57.017 に答える