pic33 指向位对象的指针

问题描述

我在微芯片 PIC33E512MU810 上有一个项目,我想设置一个指向位对象地址的指针。 类似的东西:

bool *pointer1 = &LATGbits.LATG12;

我知道根据文档,这在 microchip 的编译器中是不允许的,我什至尝试过,但它显然弹出了一个错误

不能声明指向位类型的指针或分配位对象的地址 到任何指针。也不可能静态初始化位变量,因此它们必须是 在代码本身中分配了任何非零起始值(即 1)。位对象将是 启动时清零,除非该位被限定为持久性。

我想知道是否有一些方法可以实现相同的目标?

谢谢

解决方法

不幸的是,这是不可能的。但是您可以利用 C 宏的强大功能。我不确定这是否能解决您的确切问题。但也许至少给了你一个想法。有关我在 MPLABX 模拟器中编写和测试并运行良好的示例代码,请参见下文。如果它有助于解决您的问题,那么您可以为您的 32 位系统修改一些定义,因为我为 8 位系统测试了它。在这段代码中,setBitclearBit 宏起到了作用。代码如下:

#include <xc.h>
#include <stdint.h>

// Macros for setting bits in C style
#define setBit(reg,bit) reg |= 1 << bit
#define clearBit(reg,bit) reg &= ~(1 << bit)

typedef struct {
    int var1;
    char var2;
    /* Holds a reference to any SFR register change the type to uint32_t
    * if your system is 32 bit. I tested it for 8 bit in simulator*/
    volatile uint8_t *latReg; 
    char bitno; // Holds bit number
} mixedTypes_t;

void initMyMixedTypes(
            mixedTypes_t *mixedtype,int v1,char v2,volatile uint8_t *preg,char bitno) {
    mixedtype->var1 = v1;
    mixedtype->var2 = v2;
    mixedtype->latReg = preg;
    mixedtype->bitno = bitno;
}

// A sample function that take a sample action according to structure's var1
void makeSomething(mixedTypes_t *mtype) {
    if(mtype == NULL) return; // Make nothing if null
    if(mtype->var1 > 100) {
        setBit(*(mtype->latReg),mtype->bitno);
    }
    else {
        clearBit(*(mtype->latReg),mtype->bitno);
    }
}

void main(void) {
    
    mixedTypes_t aMixedType; // Declare your struct
    
    // Here you init your struct
    initMyMixedTypes(&aMixedType,500,'k',&LATA,_LATA_LA3_POSN);

    while(1) {
        setBit(LATA,0);
        clearBit(LATA,0);
        
        // Make something with the structure by calling some function
        makeSomething(&aMixedType); 
        
        aMixedType.var1 = 58; // Set it to a value less than 100
        
        // Now the function will evaluate again and clear the associated bit
        makeSomething(&aMixedType);
        
    }

    // Never reach here
    return;
}

如果您感到困惑,请向我询问任何部分。