|
Библиотека атомарных операций для STM32 |
|
|
|
 |
Ответов
|
Jun 19 2015, 04:40
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Цитата(AHTOXA @ Jun 18 2015, 23:40)  Не то, чтобы библиотека, но часть примитивов там точно есть: тынц. Ну это уж совсем низкий уровень. Там в SoC-ах на ARM Cortex столько нюансов, что писать это на C значит просто "прострелить себе ногу". Лучше тогда дать ссылку на первоисточник: http://infocenter.arm.com/help/index.jsp?t...008a/index.htmlГде выяснится, что реализация эксклюзивных мониторов зависит от производителя SoC-а. От него же зависит и такая вещь как Exclusives Reservation Granule. Совершенно темной остается тема конфликтов с DMA. Помнить надо и о типе памяти (normal, device, ordered), т.е. совершенно четко его знать. И проч.
|
|
|
|
|
Jun 19 2015, 07:48
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Вот моя реализация инкремента/декремента, обмена и сравнения-обмена для разных типов: CODE PUBLIC _Z9AtomicIncPVh, _Z9AtomicDecPVh PUBLIC _Z10AtomicSwapPVhj, _Z10AtomicSwapPVtj _Z10AtomicSwapPVjj PUBLIC _Z13AtomicCmpSwapPVhjj, _Z13AtomicCmpSwapPVtjj, _Z13AtomicCmpSwapPVjjj
;uint AtomicInc(u8 volatile *); _Z9AtomicIncPVh: aInc8_01: LDREXB R3, [R0] ADDS R1, R3, #1 STREXB R2, R1, [R0] CMP R2, #0 BNE aInc8_01 MOV R0, R3 BX LR
;uint AtomicDec(u8 volatile *); _Z9AtomicDecPVh: aDec8_01: LDREXB R3, [R0] SUBS R1, R3, #1 STREXB R2, R1, [R0] CMP R2, #0 BNE aDec8_01 MOV R0, R3 BX LR
;АтомарнаЯ операциЯ "обмен" длЯ типа u8. ;uint AtomicSwap(u8 volatile *, uint); _Z10AtomicSwapPVhj: aSwap8_01: LDREXB R3, [R0] STREXB R2, R1, [R0] CMP R2, #0 BNE aSwap8_01 MOV R0, R3 BX LR
;АтомарнаЯ операциЯ "обмен" длЯ типа u16. ;uint AtomicSwap(u16 volatile *, uint); _Z10AtomicSwapPVtj: aSwap16_01: LDREXH R3, [R0] STREXH R2, R1, [R0] CMP R2, #0 BNE aSwap16_01 MOV R0, R3 BX LR
;АтомарнаЯ операциЯ "обмен" длЯ типа u32. ;u32 AtomicSwap(u32 volatile *, u32); _Z10AtomicSwapPVjj: aSwap32_01: LDREX R3, [R0] STREX R2, R1, [R0] CMP R2, #0 BNE aSwap32_01 MOV R0, R3 BX LR
;АтомарнаЯ операциЯ "сравнение и обмен" длЯ типа u8. ;uint AtomicCmpSwap(u8 volatile *ptr, uint newVal, uint cmpVal); _Z13AtomicCmpSwapPVhjj: aCmpSwap8_01: LDREXB R12, [R0] CMP R12, R2 ITT EQ STREXBEQ R3, R1, [R0] CMPEQ R3, #1 BEQ aCmpSwap8_01 MOV R0, R12 BX LR
;АтомарнаЯ операциЯ "сравнение и обмен" длЯ типа u16. ;uint AtomicCmpSwap(u16 volatile *ptr, uint newVal, uint cmpVal); _Z13AtomicCmpSwapPVtjj: aCmpSwap16_01: LDREXH R12, [R0] CMP R12, R2 ITT EQ STREXHEQ R3, R1, [R0] CMPEQ R3, #1 BEQ aCmpSwap16_01 MOV R0, R12 BX LR
;АтомарнаЯ операциЯ "сравнение и обмен" длЯ типа u32. ;u32 AtomicCmpSwap(u32 volatile *ptr, u32 newVal, u32 cmpVal); _Z13AtomicCmpSwapPVjjj: aCmpSwap32_01: LDREX R12, [R0] CMP R12, R2 ITT EQ STREXEQ R3, R1, [R0] CMPEQ R3, #1 BEQ aCmpSwap32_01 MOV R0, R12 BX LR
си++ - хидеры: Код uint AtomicInc(u8 volatile *); uint AtomicDec(u8 volatile *); uint AtomicSwap(u8 volatile *, uint); uint AtomicSwap(u16 volatile *, uint); u32 AtomicSwap(u32 volatile *, u32); uint AtomicCmpSwap(u8 volatile *, uint newVal, uint cmpVal); uint AtomicCmpSwap(u16 volatile *, uint newVal, uint cmpVal); u32 AtomicCmpSwap(u32 volatile *, u32 newVal, u32 cmpVal); Все остальные операции сможете сами реализовать если прочитаете доку о командах LDREX/STREX.
|
|
|
|
Сообщений в этой теме
ArtDenis Библиотека атомарных операций для STM32 Jun 18 2015, 16:31 Gleb80 Атомарная, тоесть выполняющаяся за один машинный ц... Jun 18 2015, 18:47 ArtDenis Цитата(Gleb80 @ Jun 18 2015, 23:47) Атома... Jun 19 2015, 12:40  AlexandrY Цитата(ArtDenis @ Jun 19 2015, 15:40) Их ... Jun 19 2015, 19:14 AlexandrY Цитата(ArtDenis @ Jun 18 2015, 19:31) Кто... Jun 18 2015, 19:27 Aner QUOTE (AlexandrY @ Jun 18 2015, 23:27) ST... Jun 18 2015, 19:41    jcxz Цитата(AlexandrY @ Jun 19 2015, 14:24) А ... Jun 19 2015, 08:27     AlexandrY Цитата(jcxz @ Jun 19 2015, 11:27) Работае... Jun 19 2015, 08:34      jcxz Цитата(AlexandrY @ Jun 19 2015, 14:34) Но... Jun 19 2015, 08:42 ViKo Объясните, на какой диапазон памяти распространяет... Jun 19 2015, 08:19 ArtDenis Может особо не париться с атомарными операциями, и... Jun 20 2015, 05:07 jcxz Цитата(ArtDenis @ Jun 20 2015, 11:07) Как... Jun 20 2015, 11:12 ArtDenis Ковыряю std::atomic. Оказывается они работают для ... Jun 22 2015, 04:01 AHTOXA Цитата(ArtDenis @ Jun 22 2015, 09:01) В а... Jun 22 2015, 06:08 ArtDenis Так непонятно, нужны ли там барьеры. У STM32 вроде... Jun 22 2015, 08:16 AHTOXA Насколько я понимаю, эти барьеры (DMB) нужны для м... Jun 22 2015, 08:56 jcxz Цитата(ArtDenis @ Jun 22 2015, 14:16) Так... Jun 22 2015, 08:59 AlexandrY Цитата(ArtDenis @ Jun 22 2015, 11:16) Так... Jun 22 2015, 10:03  AlexandrY Цитата(AlexandrY @ Jun 22 2015, 13:03) Из... Jun 22 2015, 13:26   ArtDenis Цитата(AlexandrY @ Jun 22 2015, 18:26) Те... Jun 22 2015, 13:53    AHTOXA Цитата(ArtDenis @ Jun 22 2015, 18:53) А м... Jun 22 2015, 18:40   jcxz Цитата(AlexandrY @ Jun 22 2015, 19:26) Зн... Jun 23 2015, 02:44    AHTOXA Цитата(jcxz @ Jun 23 2015, 07:44) Даташит... Jun 23 2015, 05:01 ArtDenis Ну вообще это очень легко проверить. Завтра поэксп... Jun 22 2015, 19:34 ViKo Если бы эксклюзивные операции отслеживали только с... Jun 23 2015, 05:55 AlexandrY Цитата(ViKo @ Jun 23 2015, 08:55) Если бы... Jun 23 2015, 06:45 jcxz Цитата(ViKo @ Jun 23 2015, 11:55) Если бы... Jun 23 2015, 07:21  AlexandrY Цитата(jcxz @ Jun 23 2015, 10:21) Вполне ... Jun 23 2015, 17:24   AHTOXA Цитата(AlexandrY @ Jun 23 2015, 22:24) Вы... Jun 23 2015, 17:29    AlexandrY Цитата(AHTOXA @ Jun 23 2015, 20:29) А как... Jun 23 2015, 17:32   jcxz Цитата(AlexandrY @ Jun 23 2015, 23:24) Т.... Jun 23 2015, 18:14 ArtDenis На моём STM32L151 получились такие результаты:
Мо... Jun 23 2015, 17:45 AlexandrY Цитата(ArtDenis @ Jun 23 2015, 20:45) Мон... Jun 23 2015, 18:25  ArtDenis Цитата(AlexandrY @ Jun 23 2015, 23:25) Ст... Jun 23 2015, 18:42   ArtDenis Цитата(ArtDenis @ Jun 23 2015, 23:42) Воо... Jun 24 2015, 02:48 ViKo Программы - в студию.
И выводы, желательно, не про... Jun 24 2015, 04:00 ArtDenis Цитата(ViKo @ Jun 24 2015, 09:00) Програм... Jun 24 2015, 04:19  ViKo Цитата(ArtDenis @ Jun 24 2015, 07:19) К с... Jun 24 2015, 07:44   ArtDenis Цитата(ViKo @ Jun 24 2015, 12:44) Устроят... Jun 24 2015, 08:00    jcxz Цитата(ArtDenis @ Jun 24 2015, 14:00) PS:... Jun 24 2015, 09:42     ArtDenis Цитата(jcxz @ Jun 24 2015, 14:42) Все тес... Jun 24 2015, 09:49      jcxz Цитата(ArtDenis @ Jun 24 2015, 15:49) Воо... Jun 24 2015, 10:34       ArtDenis Цитата(jcxz @ Jun 24 2015, 15:34) Вообще ... Jun 24 2015, 10:44 ArtDenis Недокопипастил. Там в конце main() ещё
Кодfor ... Jun 24 2015, 09:02 AHTOXA Ну, вроде всё вполне согласуется с моими опытами.
... Jun 24 2015, 09:19  ArtDenis Цитата(AHTOXA @ Jun 24 2015, 14:19) Ну, в... Jun 24 2015, 09:31   AHTOXA Цитата(ArtDenis @ Jun 24 2015, 14:31) Так... Jun 24 2015, 10:27
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0
|
|
|