aaarrr 69 28 апреля, 2021 Опубликовано 28 апреля, 2021 · Жалоба 4 minutes ago, jcxz said: Объясните. Ну, это и на infocenter.arm.com внятно объяснить не смогли. Но факт остается фактом - STRD прерываема. Погуглите, не ленитесь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 231 28 апреля, 2021 Опубликовано 28 апреля, 2021 · Жалоба 10 минут назад, Kabdim сказал: Атомик будьте добры, протестируйте. Мне это интересно. Больше чем то что я неправильно угадал вашу цель в условиях вашего молчания по её поводу. :) Не знает мой IAR такого слова. Ни подобных (_atomic, __atomic) - тоже не знает. Более того в мануале IAR есть следующее: In the IAR C/C++ Compiler for ARM, accesses to volatile declared objects are subject to these rules: ● All accesses are preserved ● All accesses are complete, that is, the whole object is accessedData types in C++ ● All accesses are performed in the same order as given in the abstract machine ● All accesses are atomic, that is, they cannot be interrupted. Но применение volatile также не приводит к появлению STRD. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 28 апреля, 2021 Опубликовано 28 апреля, 2021 · Жалоба Тогда ваша проблема похоже не решается без ассемблерных вствок, потому как с точки зрения стандарта поведение компилятора на этот код - полностью правильное в обоих случаях, никаких гарантий "атомарности" всех присваиваний язык не дает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 28 апреля, 2021 Опубликовано 28 апреля, 2021 · Жалоба 31 minutes ago, jcxz said: Как он вообще сможет её завершить после возврата? Как я понимаю, в данном случае механизм отличается от такового у LDM/STM - LDRD/STRD не завершаются, а полностью перезапускаются, если были прерваны. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 28 апреля, 2021 Опубликовано 28 апреля, 2021 · Жалоба Цитата In the base ARMv7-M architecture the exception-continuable instructions are LDM, LDMDB, STM, STMDB, POP, and PUSH. If a processor implements the FP extension the exception-continuable floating-point instructions are VLDM, VSTM, VPOP, and VPUSH Мне кажется что в не кастомизированом ядре strd будет атомарным в желаемом jcxz виде. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 28 апреля, 2021 Опубликовано 28 апреля, 2021 · Жалоба И всё же, виноват порванный презерватив. IAR 9.10.1 #include <atomic> struct FocQ { union { struct { uint32_t amplitude; uint32_t angle; }; std::atomic<uint64_t> ampl_angle; }; int64_t reduI; }; __attribute__ ((aligned (4))) FocQ focQ; На результат влияет либо наличие atomic, либо выравнивание на 8. __packed влияет на выравнивание и соответственно на результат. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 28 апреля, 2021 Опубликовано 28 апреля, 2021 · Жалоба 13 minutes ago, Kabdim said: Мне кажется что в не кастомизированом ядре strd будет атомарным в желаемом jcxz виде. LDRD/STRD не относятся к exception-continuable: Quote An instruction that generates a sequence of accesses as described in Atomicity in the Arm architecture on page A3-79 might be abandoned as a result of an exception being taken during the sequence of accesses. On return from the exception the instruction is restarted, and therefore one or more of the memory locations might be accessed multiple times. This can result in repeated write accesses to a location that has been changed between the write accesses. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 28 апреля, 2021 Опубликовано 28 апреля, 2021 · Жалоба Да, пожалуй вы правы. Нашел тред посвященный вопросу, там упоминается регистр ACTLR для stm, в котором (как утверждает автор поста) можно отключить прерывние strd. Регистр vendor-specific, а jcxz не указал какого производителя он использует, так что подойдет ли ему этот рецепт сказать невозможно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 28 апреля, 2021 Опубликовано 28 апреля, 2021 · Жалоба ACTLR не vendor-specific, это регистр SCB. Но отключить можно только прерывания глобально для всех типов инструкций. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 231 28 апреля, 2021 Опубликовано 28 апреля, 2021 · Жалоба Чтобы инструкцию можно было прервать с последующим продолжением, нужно где-то сохранить информацию о том, что она прервана. Единственное подходящее место для этого - EPSR. Но в его описании ничего про это нет. Можно конечно предположить, что STRD эмулируется через STMxx {Rx, Ry}, но как-то странно это.... 2 часа назад, aaarrr сказал: Как я понимаю, в данном случае механизм отличается от такового у LDM/STM - LDRD/STRD не завершаются, а полностью перезапускаются, если были прерваны. Тогда будут косяки при использовании этой команды например для IO-регистров чувствительных к записи. Но про это опять-же - нигде ни слова. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 28 апреля, 2021 Опубликовано 28 апреля, 2021 · Жалоба 4 minutes ago, jcxz said: Тогда будут косяки при использовании этой команды например для IO-регистров чувствительных к записи. Так и есть. А на CM0 и LDM/STM ведут себя аналогично - рестарт со всеми вытекающими. 15 minutes ago, jcxz said: Чтобы инструкцию можно было прервать с последующим продолжением, нужно где-то сохранить информацию о том, что она прервана. Не с продолжением, с рестартом. А для этого достаточно вернуться чуть раньше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 173 28 апреля, 2021 Опубликовано 28 апреля, 2021 · Жалоба 2 часа назад, jcxz сказал: Тогда будут косяки при использовании этой команды например для IO-регистров чувствительных к записи. Но про это опять-же - нигде ни слова. ARMv7-M Architecture Reference Manual, стр. 65 Цитата Note The exception behavior for these multiple access instructions means they are not suitable for use for writes to memory for the purpose of software synchronization. Это имеются ввиду инструкции LDM, LDC, LDC2, LDRD, STM, STC, STC2, STRD, PUSH, and POP (выше описано). Дальше, стр. 69 Цитата Note Do not use an instruction that generates a sequence of accesses to access Device memory if the instruction might restart after an exception and repeat any write accesses, see Exceptions in LDM and STM operations on page B1-30 for more information. Дальше, стр. 71 Цитата Any multi-access instruction that loads or stores the PC must access only Normal memory. If the instruction accesses Device or Strongly-ordered memory the result is UNPREDICTABLE. И все что рядом по тексту тоже интересно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 173 28 апреля, 2021 Опубликовано 28 апреля, 2021 · Жалоба 2 часа назад, aaarrr сказал: Так и есть. А на CM0 и LDM/STM ведут себя аналогично - рестарт со всеми вытекающими. У ядра, насколько я понимаю, есть специальные регистры, из которых можно узнать, являются ли LDM/STM прерываемыми, если являются то какими конкретно (с рестартом или продолжением). Так что можно прочитать отладчиком и понять. Более того: если шина данных, например, 64-битная, то LDRD/STRD будут атомарными и не прерываемыми. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 29 апреля, 2021 Опубликовано 29 апреля, 2021 · Жалоба Так что в результате то? Заработало? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться