【问题标题】:Why are my variables in my struct changing?为什么我的结构中的变量会发生变化?
【发布时间】:2023-03-26 06:53:01
【问题描述】:

我正在尝试在 Intel Board D2000 Quark 上设置 SD 卡。我遇到的问题是我的结构中的变量在程序中的某个点发生了变化。我知道变量何时发生变化,但我不知道如何修复它。

我使用 C 而不是 C++ 的原因是 Intel Microcontrollers Studio 的编译器不允许我使用 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-&gt;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;

cmets 更新: 这是我的临时主线:

SD sdCard;

int main(void)
{
if(!SDInit(&sdCard)){
    QM_PRINTF("ERROR1\n");
}
while(1){}
}

如果有人知道解决方案或有任何疑问,请告诉我。

【问题讨论】:

  • sdCard 变量从何而来?
  • sdCard 变量声明在函数之上,所以它对所有函数都是全局的。
  • 你正确地 malloc 了吗?如果这是您的全部声明并且没有在其他地方声明,那么您将需要SD * sdCard = malloc(sizeof(SD));
  • sdCard 指向的SD 对象的内存在哪里?如果您将它指向函数内的局部变量,该变量稍后在程序中返回,那么它可能会别名为函数内部堆栈上的局部变量,这是未定义的行为。
  • 第一个声明在主SD sdCard;我把变量给一个函数,函数把它保存在库中。 SDInit(&amp;sdCard)uint8_t SDInit(SD* sd){ sdCard = sd;//rest of the code}

标签: c memory struct intel


【解决方案1】:

您未正确初始化sdCard。当前,您将sdCard 的值分配为指向它自己在堆栈上的位置的指针。相反,请使用SDInit(malloc(sizeof(SD)));

就我个人而言,我什至没有那个初始化函数。我会做SD * sdCard = malloc(sizeof(SD));

编辑:针对彼得的观点,您也可以这样做并忽略实例化函数:

SD sdCard;

【讨论】:

  • 谢谢!我使用了您的第一个建议,因为我非常需要该功能。我目前正在测试系统,但目前它正在运行。
  • 太棒了。如果它最终起作用,请将其标记给其他有相同/相似问题的人。欢迎使用 Stack Overflow。
  • @Bolt123:你为什么要为此使用动态存储,而不是使用SD sdCard; 而不是SD *sdCard?如果您总是在启动时使用固定大小的 malloc 调用初始化一个指针并且从不更改它,那么您最好只使用静态存储。然后,您可以删除一个间接级别,而不是让一个指针初始化为指向私有静态 SD 对象。当然,您仍然可以传递指向静态对象的指针,因此您不必更改太多代码。
  • @PeterCordes,谢谢你这么说。我检查了我的代码并对其进行了更改,它也可以正常工作。所以你的两个答案都有效!
  • @Bolt123:是的,Zachary 的回答当然有效,只是效率较低。
猜你喜欢
  • 2016-01-27
  • 2021-12-18
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
相关资源
最近更新 更多