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

Разные результаты компиляции вроде бы одного и того же присваивания.

4 minutes ago, jcxz said:

Объясните.

Ну, это и на infocenter.arm.com внятно объяснить не смогли. Но факт остается фактом - STRD прерываема. Погуглите, не ленитесь.

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


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

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.   :sad:

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


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

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

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


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

31 minutes ago, jcxz said:

Как он вообще сможет её завершить после возврата?

Как я понимаю, в данном случае механизм отличается от такового у LDM/STM - LDRD/STRD не завершаются, а полностью перезапускаются, если были прерваны.

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


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

Цитата

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 виде.

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


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

И всё же, виноват порванный презерватив. 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 влияет на выравнивание и соответственно на результат.

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


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

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.

 

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


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

Да, пожалуй вы правы. Нашел тред посвященный вопросу, там упоминается регистр ACTLR для stm, в котором (как утверждает автор поста) можно отключить прерывние strd. Регистр vendor-specific, а jcxz не указал какого производителя он использует, так что подойдет ли ему этот рецепт сказать невозможно.

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


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

ACTLR не vendor-specific, это регистр SCB. Но отключить можно только прерывания глобально для всех типов инструкций.

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


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

Чтобы инструкцию можно было прервать с последующим продолжением, нужно где-то сохранить информацию о том, что она прервана. Единственное подходящее место для этого - EPSR. Но в его описании ничего про это нет.

Можно конечно предположить, что STRD эмулируется через STMxx {Rx, Ry}, но как-то странно это....

2 часа назад, aaarrr сказал:

Как я понимаю, в данном случае механизм отличается от такового у LDM/STM - LDRD/STRD не завершаются, а полностью перезапускаются, если были прерваны.

Тогда будут косяки при использовании этой команды например для IO-регистров чувствительных к записи. Но про это опять-же - нигде ни слова.

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


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

4 minutes ago, jcxz said:

Тогда будут косяки при использовании этой команды например для IO-регистров чувствительных к записи.

Так и есть. А на CM0 и LDM/STM ведут себя аналогично - рестарт со всеми вытекающими.

 

15 minutes ago, jcxz said:

Чтобы инструкцию можно было прервать с последующим продолжением, нужно где-то сохранить информацию о том, что она прервана.

Не с продолжением, с рестартом. А для этого достаточно вернуться чуть раньше.

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


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

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.


И все что рядом по тексту тоже интересно.

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


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

2 часа назад, aaarrr сказал:

Так и есть. А на CM0 и LDM/STM ведут себя аналогично - рестарт со всеми вытекающими.

У ядра, насколько я понимаю, есть специальные регистры, из которых можно узнать, являются ли LDM/STM прерываемыми, если являются то какими конкретно (с рестартом или продолжением). Так что можно прочитать отладчиком и понять. Более того: если шина данных, например, 64-битная, то LDRD/STRD будут атомарными и не прерываемыми.

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


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

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

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

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

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

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

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

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

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

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