Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Работа с массивом.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Jenya7
Есть два варианта.
Первый
Код
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;
}

первый вариант более генерик. не привязан к конкретному массиву поэтому легко переносимый. но с точки зрения скорости - тратит ли первый вариант лишние такты на передачу адреса?
MrYuran
Цитата(Jenya7 @ Mar 24 2016, 09:41) *
с точки зрения скорости - тратит ли первый вариант лишние такты на передачу адреса?

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

Если вызов однократный, может и заинлайнить
Jenya7
Цитата(MrYuran @ Mar 24 2016, 11:53) *
Если даже и тратит, то что?

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

да. вы правы. спасибо. просто начал со второго варианта, задумался, решил перейти на первый. надо действовать в обратном порядке - сначала задумался потом все остальное.
XVR
Так, замечание по ходу дела - вы в курсе, что в С массивы индексируются начиная с 0? А то вы, судя по примеру кода, их индексируете с 1 rolleyes.gif
Jenya7
Цитата(XVR @ Mar 24 2016, 16:56) *
Так, замечание по ходу дела - вы в курсе, что в С массивы индексируются начиная с 0? А то вы, судя по примеру кода, их индексируете с 1 rolleyes.gif

у меня в нулевом байте опкод лежит. по нему я знаю что по каким байтам рассовать. sm.gif
Сергей Борщ
Почему тогда не сделать упакованную структуру из опкода и безымянного union-а структур с наборами данных для разных опкодов? Исходник получится более осмысленный и магических чисел в виде индексов массива в нем не будет.
На плюсах я бы предложил базовый класс с опкодом (generic_command) и отнаследованные от него конкретные команды со своими данными.
Jenya7
Цитата(Сергей Борщ @ Mar 24 2016, 17:56) *
Почему тогда не сделать упакованную структуру из опкода и безымянного union-а структур с наборами данных для разных опкодов? Исходник получится более осмысленный и магических чисел в виде индексов массива в нем не будет.
На плюсах я бы предложил базовый класс с опкодом (generic_command) и отнаследованные от него конкретные команды со своими данными.

это не от меня зависит. я работаю с модулем и его API принимают массив uint8_t в качестве аргумента.
Сергей Борщ
Цитата(Jenya7 @ Mar 24 2016, 15:20) *
я работаю с модулем и его API принимают массив uint8_t в качестве аргумента.
Приведите указатель на структуру к указателю на uint8_t перед вызовом функции. Делов-то. Или напишите свою статическую функцию-обертку, в которой делайте это приведение.
Jenya7
Цитата(Сергей Борщ @ Mar 24 2016, 18:38) *
Приведите указатель на структуру к указателю на uint8_t перед вызовом функции. Делов-то. Или напишите свою статическую функцию-обертку, в которой делайте это приведение.

это как? sm.gif

у меня не все данные размером 1 байт. есть 2-4 байта.
skripach
Цитата(Jenya7)
тратит ли первый вариант лишние такты на передачу адреса?

Выкиньте эти мысли из головы...
Jenya7
Цитата(skripach @ Mar 24 2016, 19:13) *
Выкиньте эти мысли из головы...

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

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

Код
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 @ Mar 24 2016, 15:59) *
это как? sm.gif

у меня не все данные размером 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);
}


Цитата(Jenya7 @ Mar 24 2016, 16:21) *
по моему до меня дошел посыл Сергея.
Не совсем, но ход вашей мысли мне уже нравится.
Jenya7
большое спасибо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.