Перейти к содержанию
    

Работа с массивом.

Есть два варианта.

Первый

void ParseGeneralParam(uint8_t *data_packet)
{
     data_packet[1] = aaa;
     data_packet[2] = bbb;
     data_packet[3] = ccc;
}

и потом передаем глобальный массив

uint8_t glob_arr[20];
ParseGeneralParam(glob_arr);

Второй - сразу передаем глобальный массив

void ParseGeneralParam(void)
{
    glob_arr[1] = aaa;
    glob_arr[2] = bbb;
    glob_arr[3] = ccc;
}

первый вариант более генерик. не привязан к конкретному массиву поэтому легко переносимый. но с точки зрения скорости - тратит ли первый вариант лишние такты на передачу адреса?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

с точки зрения скорости - тратит ли первый вариант лишние такты на передачу адреса?

Если даже и тратит, то что?

 

Если вызов однократный, может и заинлайнить

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если даже и тратит, то что?

 

Если вызов однократный, может и заинлайнить

да. вы правы. спасибо. просто начал со второго варианта, задумался, решил перейти на первый. надо действовать в обратном порядке - сначала задумался потом все остальное.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так, замечание по ходу дела - вы в курсе, что в С массивы индексируются начиная с 0? А то вы, судя по примеру кода, их индексируете с 1 :rolleyes:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так, замечание по ходу дела - вы в курсе, что в С массивы индексируются начиная с 0? А то вы, судя по примеру кода, их индексируете с 1 :rolleyes:

у меня в нулевом байте опкод лежит. по нему я знаю что по каким байтам рассовать. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почему тогда не сделать упакованную структуру из опкода и безымянного union-а структур с наборами данных для разных опкодов? Исходник получится более осмысленный и магических чисел в виде индексов массива в нем не будет.

На плюсах я бы предложил базовый класс с опкодом (generic_command) и отнаследованные от него конкретные команды со своими данными.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почему тогда не сделать упакованную структуру из опкода и безымянного union-а структур с наборами данных для разных опкодов? Исходник получится более осмысленный и магических чисел в виде индексов массива в нем не будет.

На плюсах я бы предложил базовый класс с опкодом (generic_command) и отнаследованные от него конкретные команды со своими данными.

это не от меня зависит. я работаю с модулем и его API принимают массив uint8_t в качестве аргумента.

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я работаю с модулем и его API принимают массив uint8_t в качестве аргумента.
Приведите указатель на структуру к указателю на uint8_t перед вызовом функции. Делов-то. Или напишите свою статическую функцию-обертку, в которой делайте это приведение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приведите указатель на структуру к указателю на uint8_t перед вызовом функции. Делов-то. Или напишите свою статическую функцию-обертку, в которой делайте это приведение.

это как? :)

 

у меня не все данные размером 1 байт. есть 2-4 байта.

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

тратит ли первый вариант лишние такты на передачу адреса?

Выкиньте эти мысли из головы...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Выкиньте эти мысли из головы...

у меня прибор на батарейке. скорость мне очень важна.

 

по моему до меня дошел посыл Сергея.

 

union two_byte
    {
        uint16_t b;
        uint8_t b1;
        uint8_t b2;
    };
    union four_byte
    {
        uint32_t b;
        uint8_t b1;
        uint8_t b2;
        uint8_t b3;
        uint8_t b4;
    };
    struct sPacket
    {
        uint8_t var1;
        union two_byte var2;
        union four_byte var3;
    };

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

это как? :)

 

у меня не все данные размером 1 байт. есть 2-4 байта.

Примерно так:

enum opcode
{
    cmd1_name = 0,
    cmd2_name = 0x57,
    cmd3_name = 0xFE,
};

typedef struct 
{
     opcode Opcode;
     union
     {
        struct
        {
            uint8_t     Param1_name;
            uint16_t    Param2_name;
        }   cmd1_param;

        struct
        {
            uint16_t    Param1_name;
            uint8_t     Param2_name;
        }   cmd2_param;
        
        struct
        {
            uint8_t     Param1_name;
        }   cmd3_param;
     };
} command_t __attribute__((packed));


extern void api_func1(uint8_t * data);

void Test()
{
    command_t Commad;

    Command.Opcode = cmd2_name;
    Command.cmd2_param.Param1_name = 45678;
    Command.cmd2_param.Param2_name = 123;
    
    api_func1((uint8_t *)&Command);
}

 

по моему до меня дошел посыл Сергея.
Не совсем, но ход вашей мысли мне уже нравится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...