Могу ли я оптимизировать использование памяти функцией, которая возвращает 12-байтовую структуру? - PullRequest
0 голосов
/ 21 марта 2020

У меня есть такой код:

// my struct size is 12 bytes
typedef struct timer_entry_t {
    uint16_t t1_time_setting;
    uint16_t t2_time_setting;
    uint8_t time_range;
    uint8_t timer_mode;
    uint8_t relay_output_mask;
    uint8_t failure_relay_output_mask;
    uint8_t activating_scheduler_rule_id;
    uint8_t deactivation_inputs_mask;
    uint8_t activation_inputs_mask;
    uint8_t p12;
} timer_entry_t;

timer_entry_t GetTimerEntry(uint8_t e_idx) // uint8_t e_idx: 1 byte Local
{
    uint16_t mb_reg_idx; // 2 bytes Local
    uint16_t mb_reg;     // 2 bytes Local

    timer_entry_t entry; // 12 bytes Local

    // (...) fill timer_entry_t struct content

    return entry;        // 12 bytes Params
}

Мой компилятор (XC8 для 8-разрядных микроконтроллеров Microchip) создает файл .lst с такой информацией:

 49215 ;; Data sizes:     COMRAM   BANK0   BANK1   BANK2   BANK3   BANK4   BANK5   BANK6   BANK7   BANK8   BANK9  BANK10  BANK1
      +1  BANK12  BANK13
 49216 ;;      Params:         0      12       0       0       0       0       0       0       0       0       0       0       
      +0       0       0
 49217 ;;      Locals:         0      17       0       0       0       0       0       0       0       0       0       0       
      +0       0       0
 49218 ;;      Temps:          0       2       0       0       0       0       0       0       0       0       0       0       
      +0       0       0
 49219 ;;      Totals:         0      31       0       0       0       0       0       0       0       0       0       0       
      +0       0       0
 49220 ;;Total ram usage:       31 bytes

Итак, это функция использует 12 байтов для локальной timer_entry_t entry; переменной и 12 байтов для возврата значения. Это также тратит некоторое время на перемещение данных.

Можно ли как-то избежать этого "двойного распределения" и перемещения данных?

1 Ответ

1 голос
/ 21 марта 2020

Измените функцию, чтобы она принимала указатель на структуру в качестве параметра, а не возвращала ее в качестве значения. Он по-прежнему должен передавать что-то, но это, вероятно, всего 4 байта, а не 12.

void GetTimerEntry(uint8_t e_idx, timer_entry_t *entry) // uint8_t e_idx: 1 byte Local
{
    uint16_t mb_reg_idx; // 2 bytes Local
    uint16_t mb_reg;     // 2 bytes Local


    // (...) fill timer_entry_t struct content

    return;
}

Тогда вместо

timer_entry_t entry = GetTimerEntry(idx);

вы используете

timer_entry_t entry;
GetTimerEntry(idx, &entry);
...