реклама на сайте
подробности

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Библиотека атомарных операций для STM32
ArtDenis
сообщение Jun 18 2015, 16:31
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 142
Регистрация: 10-11-12
Пользователь №: 74 318



Кто-нибудь встречал в природе готовую библиотеку для атомарных операций над целочисленными значениями? Интересуют стандартные операции типа "сравнить и обменять", арифметические операции (сложить и вернуть предыдущее значение), битовые и т.д.

Сообщение отредактировал ArtDenis - Jun 18 2015, 16:32


--------------------
http://ufa-darts.ru/ - собираем дартс-лигу в Уфе
Go to the top of the page
 
+Quote Post
Gleb80
сообщение Jun 18 2015, 18:47
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 75
Регистрация: 25-09-08
Из: Москва
Пользователь №: 40 470



Атомарная, тоесть выполняющаяся за один машинный цикл? Может лучше использовать ассемблер для конкретного контроллера?
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Jun 18 2015, 19:27
Сообщение #3


Ally
******

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



Цитата(ArtDenis @ Jun 18 2015, 19:31) *
Кто-нибудь встречал в природе готовую библиотеку для атомарных операций над целочисленными значениями? Интересуют стандартные операции типа "сравнить и обменять", арифметические операции (сложить и вернуть предыдущее значение), битовые и т.д.


STM32 мало чем отличается от других чипов на архитектуре ARMv7-M
поэтому вам подойдет и такое - http://mintomic.github.io/

Кстати, спасибо что напомнили. Самому уже надоело запрещение прерываний расставлять по всем углам.
В том проекте только один файл и интересен. Это - https://github.com/mintomic/mintomic/blob/m.../mintomic_gcc.c
Там несколько примеров ассемблерных функций сравнения, сложения и логические, но и их хватает чтобы полностью понять тему.
Go to the top of the page
 
+Quote Post
Aner
сообщение Jun 18 2015, 19:41
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 4 869
Регистрация: 28-02-08
Из: СПБ
Пользователь №: 35 463



QUOTE (AlexandrY @ Jun 18 2015, 23:27) *
STM32 мало чем отличается от других чипов на архитектуре ARMv7-M
поэтому вам подойдет и такое - http://mintomic.github.io/

Отличия то есть поскольку STM32 это Cortexы не совсем ARMv7-M. То что подойдет, это да.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 18 2015, 20:40
Сообщение #5


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(ArtDenis @ Jun 18 2015, 21:31) *
Кто-нибудь встречал в природе готовую библиотеку для атомарных операций над целочисленными значениями? Интересуют стандартные операции типа "сравнить и обменять", арифметические операции (сложить и вернуть предыдущее значение), битовые и т.д.

Не то, чтобы библиотека, но часть примитивов там точно есть: тынц.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Jun 19 2015, 04:40
Сообщение #6


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), т.е. совершенно четко его знать. И проч.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 19 2015, 07:48
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 19 2015, 08:19
Сообщение #8


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Объясните, на какой диапазон памяти распространяется мониторинг LDREX/STREX - на то слово, с которым работаем, или на больший?
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Jun 19 2015, 08:24
Сообщение #9


Ally
******

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



Цитата(jcxz @ Jun 19 2015, 10:48) *
Вот моя реализация инкремента/декремента, обмена и сравнения-обмена для разных типов:


А оно работает?
Тут самое интересное как это тестировалось и на чем или ком. wink.gif
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 19 2015, 08:27
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(AlexandrY @ Jun 19 2015, 14:24) *
А оно работает?
Тут самое интересное как это тестировалось и на чем или ком. wink.gif

Работает. На LPC17xx в нескольких проектах, под uCOS. Хотя довольно редко использую.
А что там тестировать? Три строчки...
Совместно с DMA не использую конечно, да и не нужно это. А для взаимодействия между разными задачами ОС и ISR - вполне подходит. И тип памяти никакой роли не играет.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Jun 19 2015, 08:34
Сообщение #11


Ally
******

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



Цитата(jcxz @ Jun 19 2015, 11:27) *
Работает. На LPC17xx в нескольких проектах, под uCOS. Хотя довольно редко использую.
А что там тестировать? Три строчки...
Совместно с DMA не использую конечно, да и не нужно это. А для взаимодействия между разными задачами ОС и ISR - вполне подходит. И тип памяти никакой роли не играет.


Т.е. даете честное слово? Без тестирования?
Но при этом ни Exclusives Reservation Granule, ни влияние DMA не знаете?

Смысл то этой штуки быть быстрой, а какой толк если задача на ней застрянет пока не исполнится все, что так или иначе использует RAM.
А если есть код в RAM? Вообще капец?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 19 2015, 08:42
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(AlexandrY @ Jun 19 2015, 14:34) *
Но при этом ни Exclusives Reservation Granule, ни влияние DMA не знаете?

Зачем тут DMA??? Это средство синхронизации задач/ISR. Вы задачи между собой при помощи DMA синхронизируете???
Зачем к переменным, служащим для синхронизации задач, обращаться через DMA???

Цитата(AlexandrY @ Jun 19 2015, 14:34) *
Смысл то этой штуки быть быстрой, а какой толк если задача на ней застрянет пока не исполнится все, что так или иначе использует RAM.
А если есть код в RAM? Вообще капец?

Тогда используйте обычный запрет прерываний.
Go to the top of the page
 
+Quote Post
ArtDenis
сообщение Jun 19 2015, 12:40
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 142
Регистрация: 10-11-12
Пользователь №: 74 318



Цитата(Gleb80 @ Jun 18 2015, 23:47) *
Атомарная, тоесть выполняющаяся за один машинный цикл? Может лучше использовать ассемблер для конкретного контроллера?

Атомарная - это "выглядящая" как одно изменение для кода, который придерживается правил использования атомарных операций.

В общем, судя по ответам, с этим довольно-таки грустно у STM32. Для начала попробую встроенные в gcc функции, которые тут посоветовали: https://gcc.gnu.org/onlinedocs/gcc-4.4.3/gc...c-Builtins.html
Их кто-нибудь проверял для STM32? Насколько надёжно они работают?

Ещё в C++11 в стандартную библиотеку добавлена поддержка атомарности через шаблон std::atomic. Интересно есть ли его реализация для STM32?


--------------------
http://ufa-darts.ru/ - собираем дартс-лигу в Уфе
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Jun 19 2015, 19:14
Сообщение #14


Ally
******

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



Цитата(ArtDenis @ Jun 19 2015, 15:40) *
Их кто-нибудь проверял для STM32? Насколько надёжно они работают?


Да, не все так гладко.
Недаром в RTOS этот финт не используют. Нет детерминизма.
Фича явно планировалаcь для мультипроцессорных систем, а не для RTOS.
Go to the top of the page
 
+Quote Post
ArtDenis
сообщение Jun 20 2015, 05:07
Сообщение #15


Частый гость
**

Группа: Участник
Сообщений: 142
Регистрация: 10-11-12
Пользователь №: 74 318



Может особо не париться с атомарными операциями, и по старинке на короткий промежуток запрещать прерывания? Как я понимаю, если какое-то одно или несколько прерываний разных типов не произошли во время запрета, то после разрешения прерываний, они должны выполнится?

Сообщение отредактировал ArtDenis - Jun 20 2015, 05:08


--------------------
http://ufa-darts.ru/ - собираем дартс-лигу в Уфе
Go to the top of the page
 
+Quote Post

4 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 06:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.01476 секунд с 7
ELECTRONIX ©2004-2016