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

 
 
 
Reply to this topicStart new topic
KostyanPro
сообщение Jul 12 2007, 09:33
Сообщение #1


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

Группа: Свой
Сообщений: 160
Регистрация: 30-01-07
Из: Minsk
Пользователь №: 24 870



Имеем структуру вида:
Код
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
Go to the top of the page
 
+Quote Post
Calculator
сообщение Jul 12 2007, 10:10
Сообщение #2


Участник
*

Группа: Свой
Сообщений: 45
Регистрация: 19-04-07
Пользователь №: 27 172



Цитата(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]));

Читаем аналогично
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 12 2007, 10:14
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(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);
}


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
KostyanPro
сообщение Jul 12 2007, 14:04
Сообщение #4


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

Группа: Свой
Сообщений: 160
Регистрация: 30-01-07
Из: Minsk
Пользователь №: 24 870



Благодарю, идея понятна и работоспособна.

Единсвенный момент для общего развития smile.gif . В приведенных примерах в первом случае идет преобразования типа (Byte * ) для указателя , во втором нет . Как правильние и почему ?? (у себя использовал с byte*)
Go to the top of the page
 
+Quote Post
AlexBoy
сообщение Jul 12 2007, 14:31
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 205
Регистрация: 19-12-05
Из: Kiev
Пользователь №: 12 394



Цитата(KostyanPro @ Jul 12 2007, 17:04) *
Благодарю, идея понятна и работоспособна.

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


Преобразование из любого указателя на void* происходит автоматически. А для других типов нужно явное преобразование.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 12 2007, 14:45
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(KostyanPro @ Jul 12 2007, 17:04) *
Как правильние и почему ?? (у себя использовал с byte*)
Как вы заметили, работает и так и так. AlexBoy объяснил почему. Оба варианта правильны, но: параметр функции byte* неявно намекает программисту, что функция ожидает от него массива(строки) байтов. Параметр же void* как бы подсказывает "да суй все что угодно, скушаю, специально так реализована". Я не считаю, что в данном случае использование параметра типа byte* и загромождение исходника явными приведениями аргумента в местах вызова к byte* способствует повышению читаемости исходника, скорее наоборот, загромождает его.
Естественно, внутри функции существет указатель типа byte* к которому и приводится параметр типа void*, но это уже скрыто в реализации.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
KostyanPro
сообщение Jul 12 2007, 14:48
Сообщение #7


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

Группа: Свой
Сообщений: 160
Регистрация: 30-01-07
Из: Minsk
Пользователь №: 24 870



Спасибо за теорию , не знал 07.gif
Вопрос исчерпан .
Go to the top of the page
 
+Quote Post

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

 


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


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