为什么我的结构中的变量会发生变化?
Why are my variables in my struct changing?
我正在尝试在 Intel Board D2000 Quark 上设置 SD 卡。我遇到的问题是我的结构中的变量在程序的某个点发生了变化。我知道变量何时发生变化,但我不知道如何修复它。
我使用 C 而不是 C++ 的原因是英特尔微控制器工作室的编译器不允许我使用 C++。
下面,我复制了一些相关代码。
SD* sdCard;
uint8_t readData(uint32_t block, uint16_t offset, uint16_t count, uint8_t* dst){
if(count == 0){
return true;
}
if((count + offset) > 512){
goto fail;
}
if(!sdCard->inBlock_ || block != sdCard->block_ || offset < sdCard->offset_){
sdCard->block_ = block;
if(sdCard->type_ != SD_CARD_TYPE_SDHC){
block <<=9;
}
uint8_t result = sendCommand(CMD17, block);
if(result){
goto fail;
}
if(!waitStartBlock()){
goto fail;
}
sdCard->offset_ = 0;
sdCard->inBlock_ = 1;
}
for(; sdCard->offset_ < offset; sdCard->offset_++){
spiRecieve();
}
for(uint16_t i = 0; i < count; i++){
dst[i] = spiRecieve();
}
sdCard->offset_ += count;
if(!sdCard->partialBlockRead_ || sdCard->offset_ >= 512){
readEnd();
}
QM_PUTS("RD FINISH");
return true;
fail:
QM_PUTS("RD FAIL");
return false;}
变量变化的时刻是sdCard->block_ = block;
。首先是一定的价值。这条语句之后的值为 0xFFFFFFFF;这发生在结构中的每个变量上。
我的结构如下所示:
typedef struct SDcard{
uint32_t block_ ;
uint8_t errorCode_;
uint8_t inBlock_;
uint16_t offset_;
uint8_t partialBlockRead_;
uint8_t status_;
uint8_t type_;
}SD;
评论更新:
这是我的临时主:
SD sdCard;
int main(void)
{
if(!SDInit(&sdCard)){
QM_PRINTF("ERROR1\n");
}
while(1){}
}
如果有人知道解决方案或有任何疑问,请告诉我。
您没有正确初始化 sdCard
。当前,您正在将 sdCard
的值分配为指向其在堆栈上的位置的指针。相反,做 SDInit(malloc(sizeof(SD)));
.
就我个人而言,我什至没有那个初始化函数。我会做 SD * sdCard = malloc(sizeof(SD));
编辑:针对 Peter 的观点,您也可以这样做并忽略实例化函数:
SD sdCard;
我正在尝试在 Intel Board D2000 Quark 上设置 SD 卡。我遇到的问题是我的结构中的变量在程序的某个点发生了变化。我知道变量何时发生变化,但我不知道如何修复它。
我使用 C 而不是 C++ 的原因是英特尔微控制器工作室的编译器不允许我使用 C++。
下面,我复制了一些相关代码。
SD* sdCard;
uint8_t readData(uint32_t block, uint16_t offset, uint16_t count, uint8_t* dst){
if(count == 0){
return true;
}
if((count + offset) > 512){
goto fail;
}
if(!sdCard->inBlock_ || block != sdCard->block_ || offset < sdCard->offset_){
sdCard->block_ = block;
if(sdCard->type_ != SD_CARD_TYPE_SDHC){
block <<=9;
}
uint8_t result = sendCommand(CMD17, block);
if(result){
goto fail;
}
if(!waitStartBlock()){
goto fail;
}
sdCard->offset_ = 0;
sdCard->inBlock_ = 1;
}
for(; sdCard->offset_ < offset; sdCard->offset_++){
spiRecieve();
}
for(uint16_t i = 0; i < count; i++){
dst[i] = spiRecieve();
}
sdCard->offset_ += count;
if(!sdCard->partialBlockRead_ || sdCard->offset_ >= 512){
readEnd();
}
QM_PUTS("RD FINISH");
return true;
fail:
QM_PUTS("RD FAIL");
return false;}
变量变化的时刻是sdCard->block_ = block;
。首先是一定的价值。这条语句之后的值为 0xFFFFFFFF;这发生在结构中的每个变量上。
我的结构如下所示:
typedef struct SDcard{
uint32_t block_ ;
uint8_t errorCode_;
uint8_t inBlock_;
uint16_t offset_;
uint8_t partialBlockRead_;
uint8_t status_;
uint8_t type_;
}SD;
评论更新: 这是我的临时主:
SD sdCard;
int main(void)
{
if(!SDInit(&sdCard)){
QM_PRINTF("ERROR1\n");
}
while(1){}
}
如果有人知道解决方案或有任何疑问,请告诉我。
您没有正确初始化 sdCard
。当前,您正在将 sdCard
的值分配为指向其在堆栈上的位置的指针。相反,做 SDInit(malloc(sizeof(SD)));
.
就我个人而言,我什至没有那个初始化函数。我会做 SD * sdCard = malloc(sizeof(SD));
编辑:针对 Peter 的观点,您也可以这样做并忽略实例化函数:
SD sdCard;