Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: struct и Dataflash
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
KostyanPro
Имеем структуру вида:
Код
struct  buf
        {
        {
        uint8_t a;
        uint8_t b;
        uint16_t c[16];
        uint16_t d[16];
        uint16_t e[16];
        uint16_t f[16];
        };
        };


и ее обьявление :
Код
struct     buf my_buf[16];


Вопрос: как грамотно это дело в виде массива my_buf[] положить в Dataflash и потом считать ??

Самый простой выход мне видется в использовании указателя на эту структуру, но не понятно тогда как определить sizeof и как передавать разные размеры переменных -- uint8_t и uint16_t.

з.ы компилятор carm
Calculator
Цитата(KostyanPro @ Jul 12 2007, 15:33) *
Имеем структуру вида:
Код
struct  buf
        {
        {
        uint8_t a;
        uint8_t b;
        uint16_t c[16];
        uint16_t d[16];
        uint16_t e[16];
        uint16_t f[16];
        };
        };


и ее обьявление :
Код
struct     buf my_buf[16];


Вопрос: как грамотно это дело в виде массива my_buf[] положить в Dataflash и потом считать ??

Самый простой выход мне видется в использовании указателя на эту структуру, но не понятно тогда как определить sizeof и как передавать разные размеры переменных -- uint8_t и uint16_t.

з.ы компилятор carm

Допустим, есть функции чтения и записи в DataFlash
void DataFlashWr(uWORD Addr, uBYTE Buf, WORD Len);
void DataFlashRd(uWORD Addr, uBYTE Buf, WORD Len);

Записываем весь массив структур my_buf[]:
DataFlashWr(Addr, (BYTE*)my_buf, sizeof(my_buf));

Записываем один из элементов структуры my_buf[]:
DataFlashWr(Addr, (BYTE*)&my_buf[5], sizeof(my_buf[5]));

Читаем аналогично
Сергей Борщ
Цитата(KostyanPro @ Jul 12 2007, 12:33) *
Вопрос: как грамотно это дело в виде массива my_buf[] положить в Dataflash и потом считать ??

Код
class at45_t : private spi_t
{
public:
  ...........
    void LoadBuffer1 (AT45_page_t page);
    void SaveBuffer1 (AT45_page_t page);
    void WriteBuffer1 ( AT45_offset_t offset, void const *psrc, uint16_t len );
    void ReadBuffer1( AT45_offset_t offset, void *pdst, uint16_t len);
    void Load( AT45_page_t page, AT45_offset_t offset, void *pdst, uint16_t len);
   .....
};
at45_t DataFlash;

struct     buf my_buf[16];
void Test()
{
    // чтение
    DataFlash.LoadBuffer1 (0);
    DataFlash.ReadBuffer1(0, my_buf, sizeof(my_buf));
    // или
    DataFlash.Load(0, 0,  my_buf, sizeof(my_buf));
    // запись
    DataFlash.WriteBuffer1 (0, my_buf, sizeof(my_buf));
    DataFlash.SaveBuffer1(0);
}
KostyanPro
Благодарю, идея понятна и работоспособна.

Единсвенный момент для общего развития smile.gif . В приведенных примерах в первом случае идет преобразования типа (Byte * ) для указателя , во втором нет . Как правильние и почему ?? (у себя использовал с byte*)
AlexBoy
Цитата(KostyanPro @ Jul 12 2007, 17:04) *
Благодарю, идея понятна и работоспособна.

Единсвенный момент для общего развития smile.gif . В приведенных примерах в первом случае идет преобразования типа (Byte * ) для указателя , во втором нет . Как правильние и почему ?? (у себя использовал с byte*)


Преобразование из любого указателя на void* происходит автоматически. А для других типов нужно явное преобразование.
Сергей Борщ
Цитата(KostyanPro @ Jul 12 2007, 17:04) *
Как правильние и почему ?? (у себя использовал с byte*)
Как вы заметили, работает и так и так. AlexBoy объяснил почему. Оба варианта правильны, но: параметр функции byte* неявно намекает программисту, что функция ожидает от него массива(строки) байтов. Параметр же void* как бы подсказывает "да суй все что угодно, скушаю, специально так реализована". Я не считаю, что в данном случае использование параметра типа byte* и загромождение исходника явными приведениями аргумента в местах вызова к byte* способствует повышению читаемости исходника, скорее наоборот, загромождает его.
Естественно, внутри функции существет указатель типа byte* к которому и приводится параметр типа void*, но это уже скрыто в реализации.
KostyanPro
Спасибо за теорию , не знал 07.gif
Вопрос исчерпан .
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.