Kabdim 0 25 апреля, 2018 Опубликовано 25 апреля, 2018 · Жалоба ОЗУ? 140 кБ встроенной, и снаружи 32 Мб. Вряд ли эта ОЗУ вся забита кодом, т.е. реально упаковать код ошибки + pc в 32битное слово, или +lr и возвращать 64 бита. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 25 апреля, 2018 Опубликовано 25 апреля, 2018 · Жалоба Если не умеете читать и понимать даже выдержки из даташита - Ваши проблемы. Может приведёте какие-то аргументы? Я аргументы привёл, от Вас - только трёп. :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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 25 апреля, 2018 Опубликовано 25 апреля, 2018 · Жалоба И откуда сиё взято? В "IAR C/C++ Development Guide" поиск даже просто любого из слов "containerized" или "128-bit" - Not found. Вряд ли эта ОЗУ вся забита кодом, т.е. реально упаковать код ошибки + pc в 32битное слово, или +lr и возвращать 64 бита. Не понятна эта фраза. Вы предлагаете к адресу возврата прибавлять некое число, которое и является результатом? Тогда после каждой точки вызова этой функции придётся располагать таблицу из N*2 инструкций B (где N - максимальное возвращаемое значение). И на си такое будет сложно проделать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 25 апреля, 2018 Опубликовано 25 апреля, 2018 · Жалоба http://infocenter.arm.com/help/topic/com.a...0042F_aapcs.pdf Я, правда, процитировал предыдущую версию. Там есть небольшое отличие, для данной темы несущественное. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 25 апреля, 2018 Опубликовано 25 апреля, 2018 · Жалоба Если кто-то знает другое (или про компилятор использующий большее число регистров) - плиз приведите аргументы. Я вообще никогда не задумывался над этим. Возвращал стурктуры, и всё. Методами класса. Т.к. использую Си++, но это наверно сути не меняет. Возвращал структуры до 100 байт размером. Думаю, что если есть ограничение, компилятор какую-то подстановку выполняет. Но разве это имеет значение? Вряд ли эта ОЗУ вся забита кодом, т.е. реально упаковать код ошибки + pc в 32битное слово, или +lr и возвращать 64 бита. По-прежнему не понимаю вас) Вот пример возвращаемой структуры: typedef struct FuncResult { CodeResult result; uint32_t lrReg; uint32_t pcReg; }; Правильно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 25 апреля, 2018 Опубликовано 25 апреля, 2018 · Жалоба Не понятна эта фраза. Просто битовая упаковка структуры. По-прежнему не понимаю вас) Вот пример возвращаемой структуры: 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; } } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 25 апреля, 2018 Опубликовано 25 апреля, 2018 · Жалоба Я, правда, процитировал предыдущую версию. Там есть небольшое отличие, для данной темы несущественное. И что? Я разве отрицал, что возможно возвращать более чем два регистра? Да, раз R0-R3, R12 - scratch registers, то (согласно логике) можно хоть все их использовать для return. Но мне неизвестен такой компилятор, который так делает. Про него и спрашивал. Вам такой известен? Я вообще никогда не задумывался над этим. Возвращал стурктуры, и всё. Методами класса. Т.к. использую Си++, но это наверно сути не меняет. Возвращал структуры до 100 байт размером. Думаю, что если есть ограничение, компилятор какую-то подстановку выполняет. Но разве это имеет значение? А следует задумываться. Конечно имеет. Такой возврат будет выполняться на стеке. И это место на стеке выделяется вызывающим кодом. В точке вызова. Соответственно - в стеке должно быть достаточно места. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 25 апреля, 2018 Опубликовано 25 апреля, 2018 · Жалоба Только я бы добавил еще bool для детектирование ошибка/без ошибок. Я бы добавил в эту структуру конструктор для установки членов структуры в значения по умолчанию. Можно добавить метод isError(), isSuccess() и т.д. и т.п. :1111493779: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
one_eight_seven 6 25 апреля, 2018 Опубликовано 25 апреля, 2018 (изменено) · Жалоба Думаю, что если есть ограничение, компилятор какую-то подстановку выполняет. Но разве это имеет значение? Ну, значение, находящееся в регистрах можно использовать сразу же. Значение, которое сначала сохраняется в память, а потом из неё читается в регистры, чтобы его можно было использовать - запускает как минимум 2 операции работы с памятью, что гораздо медленее, особенно, если у вашей машины нет кэша. Операции с памятью, они, вообще, достаточно дорогие в плане производительности. А, возвращаясь к первоначальному вопросу - возвращению кода ошибки... 2^800 кодов ошибок - это уже слишком :) В этом случае лучше вернуть наличие/отсутствие ошибки через регистр, а остальное поместить в память, и пусть оно (остальное) считывается, только если нужно. Изменено 25 апреля, 2018 пользователем one_eight_seven Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 25 апреля, 2018 Опубликовано 25 апреля, 2018 · Жалоба Я бы добавил в эту структуру конструктор для установки членов структуры в значения по умолчанию. Можно добавить метод isError(), isSuccess() и т.д. и т.п. :1111493779: ......вот так и рождается калокуб. Когда для записи одного значения в регистр периферии вызывается куча функций и получается монстр..... :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 25 апреля, 2018 Опубликовано 25 апреля, 2018 · Жалоба Я бы добавил в эту структуру конструктор для установки членов структуры в значения по умолчанию. Можно добавить метод isError(), isSuccess() и т.д. и т.п. :1111493779: Конечно, а еще макрос unwrap что бы делал ранний возврат из ошибок и насыпать функциональных map, flat_map, filter. Но это уже другой разговор. :) ......вот так и рождается калокуб. Когда для записи одного значения в регистр периферии вызывается куча функций и получается монстр..... :laughing: Куб рождается индусами(как минимум в душе) что бы и в каком стиле они не делали. Если делать по уму этот синтаксический сахар оптимизируется до почти нуля. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 25 апреля, 2018 Опубликовано 25 апреля, 2018 · Жалоба возвращаясь к первоначальному вопросу - возвращению кода ошибки... 2:800 кодов ошибок - это уже слишком :) Тема изначального вопроса: изобретение сферического коня на все случаи жизни. Наверняка найдётся такой случай который потребует столько значений. А значит и для функции из одной строки возвращающей истина/ложь надо этого коня запрячь. Со всеми вытекающими. PS: Как показывает практика - универсальные кони нафиг не нужны в реальных проектах. В каждом конкретном случае формат возвращаемых значений следует выбирать наиболее оптимальным для этого конкретного случая. Всё универсальное - неоптимально по определению и годится только для быдлокодерства в ардуино-стиле. :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
one_eight_seven 6 25 апреля, 2018 Опубликовано 25 апреля, 2018 · Жалоба Всё универсальное - неоптимально по определению и годится только для быдлокодерства в ардуино-стиле. А если не "универсальное", а "унифицированное"? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 25 апреля, 2018 Опубликовано 25 апреля, 2018 · Жалоба Вот пример возвращаемой структуры: typedef struct FuncResult { CodeResult result; uint32_t lrReg; uint32_t pcReg; }; Правильно? Неаккуратненько ;) Должно быть как минимум так: typedef struct FuncResult { CodeResult result; uintptr_t lrReg; uintptr_t pcReg; }; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 3 25 апреля, 2018 Опубликовано 25 апреля, 2018 · Жалоба Я бы добавил в эту структуру конструктор для установки членов структуры в значения по умолчанию. Можно добавить метод isError(), isSuccess() и т.д. и т.п. :1111493779: Как-то мало энтузиазма. Наверно начать надо было бы с абстрактного синглтона фабрики объектов ошибок. На фабрике регистрировались бы все заинтересованные сторонние классы которым нужно знать и реагировать на ошибки. При регистрации классы обменивались бы своими делегатами и получали бы объекты готовых к использованию типизированных ошибок там с сериализацей, потоками, логами, конвертерами и прочей х... И крышеснос готов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться