Jump to content

    
jcxz

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

Recommended Posts

4 minutes ago, jcxz said:

Объясните.

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

Share this post


Link to post
Share on other sites
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:

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
31 minutes ago, jcxz said:

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

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

Share this post


Link to post
Share on other sites
Цитата

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
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.

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

Share this post


Link to post
Share on other sites
4 minutes ago, jcxz said:

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

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

 

15 minutes ago, jcxz said:

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

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

Share this post


Link to post
Share on other sites
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.


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

Share this post


Link to post
Share on other sites
2 часа назад, aaarrr сказал:

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.