Вызов функции

Первые четыре аргумента передаются в первые четыре регистра ARM — r0, r1, r2 и r3. Все последующие кладутся в стек — sp, sp + 4, sp + 8… Возвращаемое значение функции записывается в регистр r0.

Данное описание справедливо только для целочисленных переменных. Переменные, занимающие два слова, например, long long или double, передаются в два соседних регистра, а возвращаемое значение передается в r0, r1.

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

Следующий пример иллюстрирует преимущества использования структур.

uint32_t solver_1(uint32_t *x, uint32_t *y, uint32_t *z,
uint32_t c, uint32_t *arr) {
    // do something
    return 0;
}
// ...
typedef struct {
    uint32_t *x;
    uint32_t *y;
    uint32_t *z;
} COORDINATES_t;
​
uint32_t solver_2(COORDINATES_t *cor, uint32_t c, uint8_t *arr) {
    // do something
    return 0;
}

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


Изменено:

Эффективный код для Cortex-M: 3 комментария

  1. >Вопрос 48. Какой тип целочисленной переменной лучше всего СПОЛЬЗОВАТЬ в микроконтроллере PIC24 и почему?

  2. Здравствуйте.
    Мучаю STM32F030F4P6 и изучаю вашу книгу.
    Замерял сегодня скорость выполнения вышеприведённых циклов на разных оптимизациях кода O1 O2 O3.
    И у меня получилось что цикл
    for (i = 0; i < 1000000; i++) {} выполняется на любой оптимизации за 4800 микросекунд
    цикл for ( i = 1000000; i != 0; i—){} выполняется за 4800 микросек. только на оптимизации O1 . При оптимизации O2 и O3 он выполняется за 10800 микросекунд.
    цикл
    n = 1000000;
    do {
    // code here
    } while (—n != 0); на любой оптимизации выполняется за 10800 микросекунд

    может это связано с компиляцией и оптимизацией именно для данного чипа.
    но лучше я буду писать for (i = 0; i < 1000000; i++){}

  3. Взял осциллограф и всё перепроверил. Оказалось что у меня таймер переполнялся.
    Думаю что мои коменты публиковать не нужно )

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.