如何解决pic33 指向位对象的指针
我在微芯片 PIC33E512MU810 上有一个项目,我想设置一个指向位对象地址的指针。 类似的东西:
bool *pointer1 = &LATGbits.LATG12;
我知道根据文档,这在 microchip 的编译器中是不允许的,我什至尝试过,但它显然弹出了一个错误。
不能声明指向位类型的指针或分配位对象的地址 到任何指针。也不可能静态初始化位变量,因此它们必须是 在代码本身中分配了任何非零起始值(即 1)。位对象将是 启动时清零,除非该位被限定为持久性。
我想知道是否有一些方法可以实现相同的目标?
谢谢
解决方法
不幸的是,这是不可能的。但是您可以利用 C 宏的强大功能。我不确定这是否能解决您的确切问题。但也许至少给了你一个想法。有关我在 MPLABX 模拟器中编写和测试并运行良好的示例代码,请参见下文。如果它有助于解决您的问题,那么您可以为您的 32 位系统修改一些定义,因为我为 8 位系统测试了它。在这段代码中,setBit
和 clearBit
宏起到了作用。代码如下:
#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;
}
如果您感到困惑,请向我询问任何部分。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。