реклама на сайте
подробности

 
 
> FAT для EEPROM?
asket
сообщение May 8 2008, 13:52
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 24-08-06
Из: Москва
Пользователь №: 19 809



С наступающим великим праздником!)

Мне интересуют точки зрения профи, для записи и чтения EEPROM я использую некую структуру, содержащие данные, иначе говоря чтобы прочитать байт я указателю на структуру присваиваю нуль, и по адресу читаю/записываю байты
например

struct eeprom_fat{
unsigned char h;
unsigned long a;
}ptr;

ptr = 0;
eeprom.read ((unsigned int)&ptr->h, &var, sizeof(ptr->h); // читаю по адресу (0+смешение h), 1 байт

насколько корректен такой подход с точки зрения сериализации? В частности если пишется на C++.
Какие еще бывают способы организации адресного пространства во внешней памяти через SPI или i2c?

Спасибо за внимание!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
diper
сообщение May 8 2008, 15:30
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 94
Регистрация: 12-11-05
Из: Росиия, Нижний Новгород
Пользователь №: 10 750



Например так smile.gif

Код
/**
*******************************************************************************
*  \file
*
*  \brief    Говорят что наркотики сводят с ума...
*
******************************************************************************/

#ifndef MEMORY_H
#define MEMORY_H

#include "memory_map.h"

#include "scmRTOS.h"
#include "crc-modbus.h"


////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////// FRAM /////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

#include "fram.h"
extern OS::TMutex FRAMMutex;
#define FRAM_CRC_SIZE        2     // размер CRC

//////////////////////////////// Базовый шаблон ////////////////////////////////
template <typename T, unsigned int OFFSET, unsigned int SIZEX=1, unsigned int SIZEY=1, unsigned int SIZEZ=1>
class FRAM;

//////////////////////////// Одноэлементные записи /////////////////////////////
template <typename T, unsigned int OFFSET>
class FRAM<T, OFFSET, 1, 1, 1>
{
public:
  bool Get(T &t);
  void Set(const T &t);
  void Bad(const T &t);
};

template <typename T, unsigned int OFFSET>
bool FRAM<T, OFFSET, 1, 1, 1> :: Get(T &t)
{
  unsigned short crc;
  FRAMMutex.Lock();
  FRAMReadBlock (FRAM_MAC, OFFSET, (uchar*)&t, sizeof(T));
  FRAMReadBlock (FRAM_MAC, OFFSET + sizeof(T), (uchar*)&crc, FRAM_CRC_SIZE);
  FRAMMutex.Unlock();
  return (CRC16((char*)&t, sizeof(T)) == crc);
}

template <typename T, unsigned int OFFSET>
void FRAM<T, OFFSET, 1, 1, 1> :: Set(const T &t)
{
  unsigned short crc;
  FRAMMutex.Lock();
  FRAMWriteBlock (FRAM_MAC, OFFSET, (uchar*)&t, sizeof(T));
  crc = CRC16((char*)&t, sizeof(T));
  FRAMWriteBlock (FRAM_MAC, OFFSET + sizeof(T), (uchar*)&crc, FRAM_CRC_SIZE);
  FRAMMutex.Unlock();
}

template <typename T, unsigned int OFFSET>
void FRAM<T, OFFSET, 1, 1, 1> :: Bad(const T &t)
{
  unsigned short crc;
  FRAMMutex.Lock();
  FRAMWriteBlock (FRAM_MAC, OFFSET, (uchar*)&t, sizeof(T));
  crc = ~CRC16((char*)&t, sizeof(T)); // заведомо ложный CRC
  FRAMWriteBlock (FRAM_MAC, OFFSET + sizeof(T), (uchar*)&crc, FRAM_CRC_SIZE);
  FRAMMutex.Unlock();
}


///////////////////////////// Одномреный массив ////////////////////////////////
template <typename T, unsigned int OFFSET, unsigned int SIZEX>
class FRAM<T, OFFSET, SIZEX, 1, 1>
{
public:
  bool Get (T &t, unsigned int x);
  void Set (const T &t, unsigned int x);
  void Bad (const T &t, unsigned int x);
};

template <typename T, unsigned int OFFSET, unsigned int SIZEX>
bool FRAM<T, OFFSET, SIZEX, 1, 1> :: Get(T &t, unsigned int x)
{
  unsigned short crc;
  unsigned int offs;
  if(x>=SIZEX) for(;;); // hook
  offs = x;
  FRAMMutex.Lock();
  FRAMReadBlock (FRAM_MAC, OFFSET + offs*(sizeof(T)+FRAM_CRC_SIZE), (uchar*)&t, sizeof(T));
  FRAMReadBlock (FRAM_MAC, OFFSET + offs*(sizeof(T)+FRAM_CRC_SIZE)+sizeof(T), (uchar*)&crc, FRAM_CRC_SIZE);
  FRAMMutex.Unlock();
  return (CRC16((char*)&t, sizeof(T)) == crc);
}

template <typename T, unsigned int OFFSET, unsigned int SIZEX>
void FRAM<T, OFFSET, SIZEX, 1, 1> :: Set(const T &t, unsigned int x)
{
  unsigned short crc;
  unsigned int offs;
  if(x>=SIZEX) for(;;); // hook
  offs = x;
  FRAMMutex.Lock();
  FRAMWriteBlock (FRAM_MAC, OFFSET + offs*(sizeof(T)+FRAM_CRC_SIZE), (uchar*)&t, sizeof(T));
  crc = CRC16((char*)&t, sizeof(T));
  FRAMWriteBlock (FRAM_MAC, OFFSET + offs*(sizeof(T)+FRAM_CRC_SIZE)+sizeof(T), (uchar*)&crc, FRAM_CRC_SIZE);
  FRAMMutex.Unlock();
}

template <typename T, unsigned int OFFSET, unsigned int SIZEX>
void FRAM<T, OFFSET, SIZEX, 1, 1> :: Bad(const T &t, unsigned int x)
{
  unsigned short crc;
  unsigned int offs;
  if(x>=SIZEX) for(;;); // hook
  offs = x;
  FRAMMutex.Lock();
  FRAMWriteBlock (FRAM_MAC, OFFSET + offs*(sizeof(T)+FRAM_CRC_SIZE), (uchar*)&t, sizeof(T));
  crc = ~CRC16((char*)&t, sizeof(T)); // заведомо ложный CRC
  FRAMWriteBlock (FRAM_MAC, OFFSET + offs*(sizeof(T)+FRAM_CRC_SIZE)+sizeof(T), (uchar*)&crc, FRAM_CRC_SIZE);
  FRAMMutex.Unlock();
}


Создаем объект:
Код
  ...
  typedef struct
  {
    ...
  }sTimeDate;
  ...
  // сохраненное время (сохраняется периодически чтоб после сбоя можно было восстановить) (несколько копий)
  FRAM <sTimeDate, FRAM_RTC_OFFSET, RTC_COPY_AMOUNT> TimeDateNVM;
  ...


Используем гденито в коде
Код
  ...
  sTimeDate tmp;
  ...
  // Restore time from NVM
  // В FRAM хранится несколько копий, при считываении используем первое корректное значение
  for(i=0; i<RTC_COPY_AMOUNT; i++)
  {
    if(TimeDateNVM.Get(tmp, i))
    {
      if(SetTime(tmp))
      {
        break;
      }
    }
  }

  // время не удалось считать - выставляем флаг
  if(i==RTC_COPY_AMOUNT)  
  {
    SetStatusCode(STATUS_RTC_ERROR);
  }


Для "больших" контроллеров можно делать более красиво типа так:
http://electronix.ru/forum/index.php?s=&am...st&p=383618
http://electronix.ru/forum/index.php?s=&am...st&p=384003
Плюс если компилятор поддерживал бы исключения то можно и обработку ошибок культурно реализовать.
Go to the top of the page
 
+Quote Post
asket
сообщение May 9 2008, 18:46
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 24-08-06
Из: Москва
Пользователь №: 19 809



diper, спасибо за ответ! smile.gif Буду разбираться..)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 14:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.01409 секунд с 7
ELECTRONIX ©2004-2016