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

Коды завершения функции

ОЗУ? 140 кБ встроенной, и снаружи 32 Мб.

Вряд ли эта ОЗУ вся забита кодом, т.е. реально упаковать код ошибки + pc в 32битное слово, или +lr и возвращать 64 бита.

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


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

Если не умеете читать и понимать даже выдержки из даташита - Ваши проблемы.

Может приведёте какие-то аргументы? Я аргументы привёл, от Вас - только трёп. :laughing:

 

О том, что компилятор IAR (for ARM) позволяет использовать для возвращаемых значений до двух регистров (R0,R1).

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

5.4 Result Return

The manner in which a result is returned from a function is determined by the type of that result.

For the base standard:

 A Half-precision Floating Point Type is converted to single precision and returned in r0.

 A Fundamental Data Type that is smaller than 4 bytes is zero- or sign-extended to a word and returned in r0.

 A word-sized Fundamental Data Type (e.g., int, float) is returned in r0.

 A double-word sized Fundamental Data Type (e.g., long long, double and 64-bit containerized vectors) is

returned in r0 and r1.

 A 128-bit containerized vector is returned in r0-r3.

 A Composite Type not larger than 4 bytes is returned in r0. The format is as if the result had been stored in

memory at a word-aligned address and then loaded into r0 with an LDR instruction. Any bits in r0 that lie

outside the bounds of the result have unspecified values.

 A Composite Type larger than 4 bytes, or whose size cannot be determined statically by both caller and

callee, is stored in memory at an address passed as an extra argument when the function was called (§5.5,

rule A.4). The memory to be used for the result may be modified at any point during the function call.

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


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

И откуда сиё взято? В "IAR C/C++ Development Guide" поиск даже просто любого из слов "containerized" или "128-bit" - Not found.

 

Вряд ли эта ОЗУ вся забита кодом, т.е. реально упаковать код ошибки + pc в 32битное слово, или +lr и возвращать 64 бита.

Не понятна эта фраза. :wacko:

Вы предлагаете к адресу возврата прибавлять некое число, которое и является результатом? Тогда после каждой точки вызова этой функции придётся располагать таблицу из N*2 инструкций B (где N - максимальное возвращаемое значение). И на си такое будет сложно проделать.

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


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

http://infocenter.arm.com/help/topic/com.a...0042F_aapcs.pdf

Я, правда, процитировал предыдущую версию. Там есть небольшое отличие, для данной темы несущественное.

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


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

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

Я вообще никогда не задумывался над этим. Возвращал стурктуры, и всё. Методами класса. Т.к. использую Си++, но это наверно сути не меняет. Возвращал структуры до 100 байт размером. Думаю, что если есть ограничение, компилятор какую-то подстановку выполняет. Но разве это имеет значение?

 

Вряд ли эта ОЗУ вся забита кодом, т.е. реально упаковать код ошибки + pc в 32битное слово, или +lr и возвращать 64 бита.

По-прежнему не понимаю вас)

Вот пример возвращаемой структуры:

typedef struct FuncResult {
    CodeResult result;
    uint32_t lrReg;
    uint32_t pcReg;
};

Правильно?

 

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


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

Не понятна эта фраза. :wacko:

Просто битовая упаковка структуры.

По-прежнему не понимаю вас)

Вот пример возвращаемой структуры:

typedef struct FuncResult {
    CodeResult result;
    uint32_t lrReg;
    uint32_t pcReg;
};

Правильно?

В стартовом варианте, до уапковки - да. Только я бы добавил еще bool для детектирование ошибка/без ошибок. Без ошибки значения структуры нужно использовать для возвращения собственно результата.

Т.е. скорее

template<class T, class E>struct Result {
    bool is_valid;
    union {
        T t;
        struct {
            E e;
            uint32_t lrReg;
            uint32_t pcReg;
        }
    }
}

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


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

Я, правда, процитировал предыдущую версию. Там есть небольшое отличие, для данной темы несущественное.

И что? Я разве отрицал, что возможно возвращать более чем два регистра? Да, раз R0-R3, R12 - scratch registers, то (согласно логике) можно хоть все их использовать для return.

Но мне неизвестен такой компилятор, который так делает. Про него и спрашивал.

Вам такой известен?

 

Я вообще никогда не задумывался над этим. Возвращал стурктуры, и всё. Методами класса. Т.к. использую Си++, но это наверно сути не меняет. Возвращал структуры до 100 байт размером. Думаю, что если есть ограничение, компилятор какую-то подстановку выполняет. Но разве это имеет значение?

А следует задумываться. Конечно имеет. Такой возврат будет выполняться на стеке. И это место на стеке выделяется вызывающим кодом. В точке вызова. Соответственно - в стеке должно быть достаточно места.

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


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

Только я бы добавил еще bool для детектирование ошибка/без ошибок.

Я бы добавил в эту структуру конструктор для установки членов структуры в значения по умолчанию. Можно добавить метод isError(), isSuccess() и т.д. и т.п. :1111493779:

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


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

Думаю, что если есть ограничение, компилятор какую-то подстановку выполняет. Но разве это имеет значение?

Ну, значение, находящееся в регистрах можно использовать сразу же. Значение, которое сначала сохраняется в память, а потом из неё читается в регистры, чтобы его можно было использовать - запускает как минимум 2 операции работы с памятью, что гораздо медленее, особенно, если у вашей машины нет кэша. Операции с памятью, они, вообще, достаточно дорогие в плане производительности. А, возвращаясь к первоначальному вопросу - возвращению кода ошибки... 2^800 кодов ошибок - это уже слишком :) В этом случае лучше вернуть наличие/отсутствие ошибки через регистр, а остальное поместить в память, и пусть оно (остальное) считывается, только если нужно.

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

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


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

Я бы добавил в эту структуру конструктор для установки членов структуры в значения по умолчанию. Можно добавить метод isError(), isSuccess() и т.д. и т.п. :1111493779:

......вот так и рождается калокуб. Когда для записи одного значения в регистр периферии вызывается куча функций и получается монстр..... :laughing:

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


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

Я бы добавил в эту структуру конструктор для установки членов структуры в значения по умолчанию. Можно добавить метод isError(), isSuccess() и т.д. и т.п. :1111493779:

Конечно, а еще макрос unwrap что бы делал ранний возврат из ошибок и насыпать функциональных map, flat_map, filter. Но это уже другой разговор. :)

 

......вот так и рождается калокуб. Когда для записи одного значения в регистр периферии вызывается куча функций и получается монстр..... :laughing:

Куб рождается индусами(как минимум в душе) что бы и в каком стиле они не делали. Если делать по уму этот синтаксический сахар оптимизируется до почти нуля.

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


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

возвращаясь к первоначальному вопросу - возвращению кода ошибки... 2:800 кодов ошибок - это уже слишком :)

Тема изначального вопроса: изобретение сферического коня на все случаи жизни. Наверняка найдётся такой случай который потребует столько значений. А значит и для функции из одной строки возвращающей истина/ложь надо этого коня запрячь. Со всеми вытекающими.

 

PS: Как показывает практика - универсальные кони нафиг не нужны в реальных проектах. В каждом конкретном случае формат возвращаемых значений следует выбирать наиболее оптимальным для этого конкретного случая. Всё универсальное - неоптимально по определению и годится только для быдлокодерства в ардуино-стиле. :laughing:

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


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

Всё универсальное - неоптимально по определению и годится только для быдлокодерства в ардуино-стиле.

А если не "универсальное", а "унифицированное"?

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


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

Вот пример возвращаемой структуры:

typedef struct FuncResult {
    CodeResult result;
    uint32_t lrReg;
    uint32_t pcReg;
};

Правильно?

Неаккуратненько ;) Должно быть как минимум так:

typedef struct FuncResult {
    CodeResult result;
    uintptr_t lrReg;
    uintptr_t pcReg;
};

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


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

Я бы добавил в эту структуру конструктор для установки членов структуры в значения по умолчанию. Можно добавить метод isError(), isSuccess() и т.д. и т.п. :1111493779:

Как-то мало энтузиазма.

Наверно начать надо было бы с абстрактного синглтона фабрики объектов ошибок.

На фабрике регистрировались бы все заинтересованные сторонние классы которым нужно знать и реагировать на ошибки.

При регистрации классы обменивались бы своими делегатами и получали бы объекты готовых к использованию типизированных ошибок там с сериализацей, потоками, логами, конвертерами и прочей х...

И крышеснос готов. :biggrin:

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


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

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

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

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

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

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

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

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

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

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