DebugLab 发表于 2024-8-2 13:34:22

wnagming 发表于 2024-8-2 13:31
这样算下来,就是不做EEPROM磨损功能,也够咱们用了

这就是磨损均衡

vb2002 发表于 2024-8-2 13:46:02

Lkck8210 发表于 2024-8-2 13:19
关开关什么事?
EEProm不是有改变才写入吗?

要换挡啊,换挡就会有写入

vb2002 发表于 2024-8-2 13:48:04

DebugLab 发表于 2024-8-2 13:27
STC8H1K08,固定8K CODE,4K EEPROM,8个扇区,4096字节
可以第0扇区作为位计数器,bit有多少个0代表指针指 ...

这个牛,,{:5_284:}
能提供代码吗?

DebugLab 发表于 2024-8-2 14:35:40

vb2002 发表于 2024-8-2 13:48
这个牛,,
能提供代码吗?

没有,这段文字直接翻译成C语言就是代码了

Lkck8210 发表于 2024-8-2 15:16:36

vb2002 发表于 2024-8-2 13:46
要换挡啊,换挡就会有写入

但不会每次开机都换档吧?
有换档才在关机时更新EEProm

vb2002 发表于 2024-8-2 15:57:47

Lkck8210 发表于 2024-8-2 15:16
但不会每次开机都换档吧?
有换档才在关机时更新EEProm

现在就是每次关机开机,包括换挡都会写入eeprom,我有点懊恼,
还没完善好。

vb2002 发表于 2024-8-2 19:59:31

DebugLab 发表于 2024-8-2 14:35
没有,这段文字直接翻译成C语言就是代码了

这个是千问模型给出的答案,

我运行很多错误
麻烦您看看大体差不多吧!
#define EEPROM_SIZE 4096
#define SECTOR_SIZE 512
#define NUM_SECTORS 8
#define DATA_SECTORS (NUM_SECTORS - 1)
#define POINTER_SECTOR 0
#define DATA_SECTOR_START 1
#define POINTER_BIT_COUNT 3584
#define DATA_STATE_COUNT 128
#define DATA_STATE_BITS 7
#define DATA_FLAG_BIT 7

typedef struct {
    int sector;
    int byte;
} Pointer;

typedef struct {
    int valid;
    int state;
} Data;

// 声明实际的EEPROM读写函数
unsigned char eeprom_read_byte(unsigned char *addr);
void eeprom_write_byte(unsigned char *addr, unsigned char value);

// 假设的EEPROM读写函数
unsigned char readEEPROM(int address) {
    // 使用实际的EEPROM读取函数
    return eeprom_read_byte((unsigned char *)address);
}

void writeEEPROM(int address, unsigned char value) {
    // 使用实际的EEPROM写入函数
    eeprom_write_byte((unsigned char *)address, value);
}

// 读取指针
Pointer readPointer() {
    int pointerBitIndex = 0; // 从第0位开始
    unsigned char bitMask = 1;
    int byteIndex = pointerBitIndex / 8;
    int bitIndex = pointerBitIndex % 8;

    // 读取位计数器的指针位置
    unsigned char pointerByte = readEEPROM(POINTER_SECTOR * SECTOR_SIZE + byteIndex);
    while ((pointerByte & bitMask) == 0) { // 跳过已用的位
      bitMask <<= 1;
      if (bitMask > 0xFF) {
            bitMask = 1;
            byteIndex++;
            pointerByte = readEEPROM(POINTER_SECTOR * SECTOR_SIZE + byteIndex);
      }
      bitIndex++;
      pointerBitIndex++;
    }

    // 计算指针位置
    Pointer p = {DATA_SECTOR_START, pointerBitIndex / 8};
    return p;
}

// 写入指针
void writePointer(const Pointer* p) {
    int byteIndex = p->byte * 8;
    int bitIndex = byteIndex % 8;
    unsigned char byte = readEEPROM(POINTER_SECTOR * SECTOR_SIZE + byteIndex / 8);

    // 设置位
    byte &= ~(1 << bitIndex); // 清除位
    writeEEPROM(POINTER_SECTOR * SECTOR_SIZE + byteIndex / 8, byte);
}

// 读取数据
Data readData(const Pointer* p) {
    unsigned char dataByte = readEEPROM(p->sector * SECTOR_SIZE + p->byte);
    Data d = {
      .valid = !(dataByte & (1 << DATA_FLAG_BIT)),
      .state = dataByte & ((1 << DATA_STATE_BITS) - 1)
    };
    return d;
}

// 处理数据
void processData(Data* d) {
    if (!d->valid) {
      // 处理无效数据
      d->state++;
      if (d->state >= DATA_STATE_COUNT) {
            d->state = 0;
      }
      d->valid = 1;
    }
}

// 更新数据
void updateData(const Pointer* p, Data* d) {
    unsigned char dataByte = d->state | (d->valid ? 0 : (1 << DATA_FLAG_BIT));
    writeEEPROM(p->sector * SECTOR_SIZE + p->byte, dataByte);
}

// 主函数示例
int main() {
    Pointer p = readPointer();
    Data d = readData(&p);
    processData(&d);
    updateData(&p, &d);
    writePointer(&p);

    // 根据需要重复上述过程
    return 0;
}

DebugLab 发表于 2024-8-2 20:30:58

Lkck8210 发表于 2024-8-2 15:16
但不会每次开机都换档吧?
有换档才在关机时更新EEProm

那还要做掉电检测,需要使用比较器,还需要大电容储能

DebugLab 发表于 2024-8-2 20:31:54

vb2002 发表于 2024-8-2 19:59
这个是千问模型给出的答案,

我运行很多错误


AI写的不能信,cheat gpt
有空我写一个

vb2002 发表于 2024-8-2 21:00:36

DebugLab 发表于 2024-8-2 13:27
STC8H1K08,固定8K CODE,4K EEPROM,8个扇区,4096字节
可以第0扇区作为位计数器,bit有多少个0代表指针指 ...

哥,我想了一天..您说的是这个意思吗?
按您说的,好像是真的无敌哦...就是代码难倒我了!!!!






页: 1 [2] 3 4 5 6
查看完整版本: 请教下这位老哥说的,可以减少eeprom的磨损.