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

 
 
10 страниц V  « < 2 3 4 5 6 > »   
Reply to this topicStart new topic
> __LDREX __STREX в STM32F407
jcxz
сообщение Jun 6 2017, 21:36
Сообщение #46


Гуру
******

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



Цитата(KnightIgor @ Jun 6 2017, 22:34) *
Рассмотрим пример. Сразу оговорюсь, что речь не о глобальном запрете прерывания, а о запрете периферийного. Но и Вы пишете об ISR вообще.

Передёргиваете. При чём тут маскирование определённого прерывания? Это вполне штатная ситуация, сам так часто делаю. Разговор был о глобальном флаге запрета всех прерываний.
Если даже это вдруг по каким-то причинам нужно, то это не является штатным случаем. Но для таких особых случаев и код особый. В остальных 99.9% - те критические секции что я описал вполне работоспособны.
Да вообще - какой смысл спорить то? О чём?? Откройте исходники какой-нить ОС - посмотрите как эти критические секции реализованы. И объясняйте их создателем что они дураки, а Вы один умный.
Откройте любые примеры идущие с компилятором - посмотрите.
Понятно что все вокруг дураки, один Вы умный.....

Цитата(_lexa_ @ Jun 6 2017, 22:56) *
для синхронизации на LDREX/STREX достаточно одной единственной ячейки памяти

Ну если Вашему коду достаточно - Вы счастливый человек, так как у Вас очень простая программа.
Обычно таких мест в программе - десятки.

Цитата(_lexa_ @ Jun 6 2017, 22:56) *
По поводу того, где это сказано, конечно не совсем про то, но в принципе сюда можно взглянуть:

Это не то что "не совсем то", а совсем не то. Там речь о "других CPU". Для других CPU - кто-ж спорит - это конечно нужно, если программа выполняется на нескольких ядрах.
Я писал про другие bus-masters типа DMA, Ethernet-контроллеров и прочего, которое не выполняет программы, задачи, не выполняет какой-то код, задачи которого не нужно синхронизировать с другими задачами.
Go to the top of the page
 
+Quote Post
Alechek
сообщение Jun 7 2017, 08:31
Сообщение #47


Профессионал
*****

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Цитата(jcxz @ Jun 6 2017, 13:20) *
Фантазии про некий регистр рассеиваются laughing.gif


Опять открываем мануалs

Цитата(ARM ® v7-M Architecture Reference Manual)
A3.4 Synchronization and semaphores
The model for the use of a Load-Exclusive/Store-Exclusive instruction pair, accessing memory address x is:
• The Load-Exclusive instruction always successfully reads a value from memory address x
• The corresponding Store-Exclusive instruction succeeds in writing back to memory address x only if no other
processor or process has performed a more recent store of address x
. The Store-Exclusive operation returns
a status bit that indicates whether the memory write succeeded.
A Load-Exclusive instruction tags a small block of memory for exclusive access. The size of the tagged block is
IMPLEMENTATION DEFINED, see Tagging and the size of the tagged memory block on page A3-75. A Store-Exclusive
instruction to the same address clears the tag.

A3.4.3 Tagging and the size of the tagged memory block
As shown in Figure A3-6 on page A3-71 and Figure A3-7 on page A3-74, when a LDREX instruction is executed, the
resulting tag address ignores the least significant bits of the memory address:
Tagged_address == Memory_address[31:a]
The value of a in this assignment is IMPLEMENTATION DEFINED, between a minimum value of 2 and a maximum
value of 11. For example, in an implementation where a = 4, a successful LDREX of address 0x000341B4 gives a tag
value of bits[31:4] of the address, giving 0x000341B. This means that the four words of memory from 0x000341B0 to
0x000341BF are tagged for exclusive access. Subsequently, a valid STREX to any address in this block will remove the
tag.A3 ARM Architecture Memory Model
A3.4 Synchronization and semaphores
A3-76 Copyright © 2006-2008, 2010, 2014 ARM. All rights reserved. ARM DDI 0403E.b
Non-Confidential ID120114
The size of the tagged memory block is called the Exclusives reservation granule. The Exclusives reservation
granule is IMPLEMENTATION DEFINED between:
• One word, in an implementation with a == 2.
• 512 words, in an implementation with a == 11.
Note
For the local monitor, one of the IMPLEMENTATION DEFINED options is for the monitor to treat any access as
matching the address of the previous Load-Exclusive access. In such an implementation, the Exclusives reservation
granule is the entire memory address range.


Цитата(ARM® Cortex®‑M4 Processor Technical Reference Manual )
3.6 Exclusive monitor

The Cortex-M4 processor implements a local exclusive monitor. The local monitor within the processor has been constructed so that it does not hold any physical address, but instead treats any access as matching the address of the previous LDREX. This means that the implemented exclusives reservation granule is the entire memory address range.



Цитата(Cortex-M3 Technical Reference Manual (r2p0))
3.6. Exclusive monitor
The Cortex-M3 processor implements a local exclusive monitor. For more information about semaphores and the local exclusive monitor see the ARMv7M ARM Architecture Reference Manual.


Так что вырисовывается вот что:
- вся память поделена на регионы размером [Exclusives reservation granule]
- есть N регистров эксклюзивного доступа к памяти, где N от 1 до RAM_SIZE/[Exclusives reservation granule]
- сбрасывается эксклюзивный доступ РЕГИОНА при ЛЮБОЙ явной записи в этот РЕГИОН
- для Cortex-M3 размер [Exclusives reservation granule] явно не определен и, по всей видимости, определяется производителем.
- для Cortex-M4 размер [Exclusives reservation granule] равен всей памяти.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 7 2017, 08:56
Сообщение #48


Гуру
******

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



Цитата(Alechek @ Jun 7 2017, 10:31) *
Опять открываем мануалs

Не тот мануал открываете. Этот мануал - на архитектуру в целом (по которой построены разные ядра), а я Вам приводил на конкретное ядро, соответствующее топику - читайте внимательнее.
И даже в выделенном Вами фрагменте архитектурного мануала уже указано "IMPLEMENTATION DEFINED", а в мануале на ядро M4, основанное на этой архитектуре это NOT IMPLEMENTED - вполне законно.

Цитата(Alechek @ Jun 7 2017, 10:31) *
- есть N регистров эксклюзивного доступа к памяти, где N от 1 до RAM_SIZE/[Exclusives reservation granule]
...

Ещё раз, для самых непонятливых: откройте мануал на конкретное ядро, то есть - "ARM Cortex-M4 Processor Technical Reference Manual" и оставьте свои пустые фантазии.

Цитата(Alechek @ Jun 7 2017, 10:31) *
- вся память поделена на регионы размером [Exclusives reservation granule]

Эта фраза из TRM: "This means that the implemented exclusives reservation granule is the entire memory address range." - означает что "есть только одна гранула, размером со всю память".

А эта фраза TRM:
"The local monitor within the processor has been constructed so that it does not hold any physical address, but instead treats any access as matching the address of the previous LDREX."
Означает что инструкция LDREX относится к предыдущей инструкции STREX с любым адресом (т.е. - любой адрес является "matching the address") вне зависимости от адреса.
Go to the top of the page
 
+Quote Post
Alechek
сообщение Jun 7 2017, 09:18
Сообщение #49


Профессионал
*****

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Цитата
Не тот мануал открываете

Ну почему же не тот? Я все открыл, смотрите выше.
И мануалы на М4 и на М3 там тоже есть.
Выводы подправил.

А вот Вы вводите людей в заблуждение:
Цитата(jcxz @ Jun 5 2017, 12:49) *
Если между LDREX и STREX произошло прерывание или был выполнен другой эксклюзивный доступ, до будет нарушение эксклюзивности.
Ну и где у вас между LDREX и STREX нарушение эксклюзивности?


Про условие эксклюзивной записи для нарушения эксклюзивности - нет такого!
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 7 2017, 09:29
Сообщение #50


Гуру
******

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



Цитата(Alechek @ Jun 7 2017, 11:18) *
Про условие эксклюзивной записи для нарушения эксклюзивности - нет такого!

В смысле нет?
Если у Вас есть пара LDREX_1/STREX_1 и Вы внутри этой пары, между LDREX_1 и STREX_1 поставите другую STREX_2, то STREX_1 вернёт статус - нарушение эксклюзивности.
Потому что триггер эксклюзивного доступа был сброшен STREX_2.
Go to the top of the page
 
+Quote Post
Alechek
сообщение Jun 7 2017, 10:21
Сообщение #51


Профессионал
*****

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Цитата(jcxz @ Jun 7 2017, 14:29) *
В смысле нет?
Если у Вас есть пара LDREX_1/STREX_1 и Вы внутри этой пары, между LDREX_1 и STREX_1 поставите другую STREX_2, то STREX_1 вернёт статус - нарушение эксклюзивности.
Потому что триггер эксклюзивного доступа был сброшен STREX_2.

В смысле, если между LDREX_1/STREX_1 сделать простой STR (в этот регион), то будет нарушение эксклюзивности.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 7 2017, 10:27
Сообщение #52


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Alechek @ Jun 7 2017, 13:21) *
В смысле, если между LDREX_1/STREX_1 сделать простой STR (в этот регион), то будет нарушение эксклюзивности.

Это называется "глюк в софте". Систему можно и проще поломать - просто забейте весь стек мусором biggrin.gif
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 7 2017, 11:23
Сообщение #53


Гуру
******

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



Цитата(Alechek @ Jun 7 2017, 12:21) *
В смысле, если между LDREX_1/STREX_1 сделать простой STR (в этот регион), то будет нарушение эксклюзивности.

А зачем так делать??
Go to the top of the page
 
+Quote Post
LightElf
сообщение Jun 7 2017, 11:52
Сообщение #54


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

Группа: Участник
Сообщений: 180
Регистрация: 5-04-09
Пользователь №: 47 205



QUOTE (jcxz @ Jun 7 2017, 00:36) *
Я писал про другие bus-masters типа DMA, Ethernet-контроллеров и прочего, которое не выполняет программы, задачи, не выполняет какой-то код, задачи которого не нужно синхронизировать с другими задачами.

На жирных камнях с многоуровневыми кэшами - вполне может проверяться активность других bus-masters. На Cortex-M точно нет.
Вообще про LDREX/STREX лучше читать не у ARM, а у авторов - Hitachi SH. А правильное применение есть в сорцах Keil RTX

QUOTE (Alechek @ Jun 7 2017, 13:21) *
В смысле, если между LDREX_1/STREX_1 сделать простой STR (в этот регион), то будет нарушение эксклюзивности.

Нет, не будет.
Go to the top of the page
 
+Quote Post
Alechek
сообщение Jun 7 2017, 12:22
Сообщение #55


Профессионал
*****

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Цитата(scifi @ Jun 7 2017, 15:27) *
Это называется "глюк в софте". Систему можно и проще поломать - просто забейте весь стек мусором biggrin.gif

Цитата(jcxz @ Jun 7 2017, 16:23) *
А зачем так делать??

Господа, оставьте эти риторические вопросы. Здесь не обсуждается вопрос ЗАЧЕМ.
Нет ничего невозможного.
Arduino уже добрался до Cortex! Сделать вызов функции между LDREX/STREX - как раз плюнуть!

От неправильного применения может спасти только чтение правильной документации.

Цитата(LightElf @ Jun 7 2017, 16:52) *
Нет, не будет.


А поподробней? Практика или документация?
Пока что из того, что я привел, должно быть нарушение. Ошибка в ней или я что-то недочитал?
Go to the top of the page
 
+Quote Post
Forger
сообщение Jun 7 2017, 12:39
Сообщение #56


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(LightElf @ Jun 7 2017, 14:52) *
А правильное применение есть в сорцах Keil RTX


Действительно - готовое решение. Спасибо за наводку )))

Причем в примере ниже два способа - через запрет /разрешения всех прерываний и через ldrex/strex.

..\Keil 5\ARM\Pack\ARM\CMSIS\5.0.0\CMSIS\RTOS\RTX\SRC\rt_MemBox.c:

CODE
/*--------------------------- rt_alloc_box ----------------------------------*/

void *rt_alloc_box (void *box_mem) {
/* Allocate a memory block and return start address. */
void **free;
#ifndef __USE_EXCLUSIVE_ACCESS
U32 irq_mask;

irq_mask = (U32)__disable_irq ();
free = ((P_BM) box_mem)->free;
if (free) {
((P_BM) box_mem)->free = *free;
}
if (irq_mask == 0U) { __enable_irq (); }
#else
do {
if ((free = (void **)__ldrex(&((P_BM) box_mem)->free)) == 0U) {
__clrex();
break;
}
} while (__strex((U32)*free, &((P_BM) box_mem)->free));
#endif
return (free);
}


и тут: rt_HAL_CM.h

Код
/* Functions */
#ifdef __USE_EXCLUSIVE_ACCESS
#define rt_inc(p)     while(__strex((__ldrex(p)+1U),p))
#define rt_dec(p)     while(__strex((__ldrex(p)-1U),p))
#else
#define rt_inc(p)     __disable_irq();(*p)++;__enable_irq();
#define rt_dec(p)     __disable_irq();(*p)--;__enable_irq();
#endif



--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 7 2017, 12:50
Сообщение #57


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Alechek @ Jun 7 2017, 15:22) *
Сделать вызов функции между LDREX/STREX - как раз плюнуть!

И эта функция называется SelfDestruct(!Now) biggrin.gif
Хватит вы думывать небылицы wacko.gif
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 7 2017, 13:13
Сообщение #58


Гуру
******

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



Цитата(Forger @ Jun 7 2017, 14:39) *
Причем в примере ниже два способа - через запрет /разрешения всех прерываний и через ldrex/strex.
#define rt_inc(p) __disable_irq();(*p)++;__enable_irq();
#define rt_dec(p) __disable_irq();(*p)--;__enable_irq();

В uCOS сделано лучше:
typedef unsigned int OS_CPU_SR;
#define OS_CPU_SR_ALLOCATE() OS_CPU_SR cpu_sr //Allocate storage for CPU status register
#define OS_ENTER_CRITICAL() {cpu_sr = __get_PRIMASK(); __disable_interrupt();}
#define OS_EXIT_CRITICAL() {__set_PRIMASK(cpu_sr);}

чтобы, если перед OS_ENTER_CRITICAL() были запрещены, то после OS_EXIT_CRITICAL() так и остались.
Go to the top of the page
 
+Quote Post
Forger
сообщение Jun 7 2017, 13:27
Сообщение #59


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(jcxz @ Jun 7 2017, 16:13) *
чтобы, если перед OS_ENTER_CRITICAL() были запрещены, то после OS_EXIT_CRITICAL() так и остались.

Оно так и сделано в приведенном выше примере. см. void *rt_alloc_box (void *box_mem) в файле rt_MemBox.c

Но мне гораздо нравится больше как это сделано во freertos, там юзается basepri (кроме CM0), т. е. запрещаются не все прерывания.
Точнее, никогда не запрещаются прерывания, обладающие приоритетом выше, чем заданный в настройках порта freertos - configMAX_SYSCALL_INTERRUPT_PRIORITY
С одним ограничением - в таких lockfree прерываниях категорически нельзя использовать сервисы rtos.
Чтобы это все правильно работало, NVIC нужно настраивать исключительно на полностью вытесняющие прерывания:

Код
NVIC_SetPriorityGrouping(0); // 4 bits for pre-emption priority, 0 bits for subpriority



CODE

#define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI()
#define portENABLE_INTERRUPTS() vPortSetBASEPRI( 0 )
#define portENTER_CRITICAL() vPortEnterCritical()
#define portEXIT_CRITICAL() vPortExitCritical()

.....

static portFORCE_INLINE void vPortRaiseBASEPRI( void )
{
uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY;

__asm
{
/* Set BASEPRI to the max syscall priority to effect a critical
section. */
msr basepri, ulNewBASEPRI
dsb
isb
}
}
/*-----------------------------------------------------------*/

static portFORCE_INLINE void vPortClearBASEPRIFromISR( void )
{
__asm
{
/* Set BASEPRI to 0 so no interrupts are masked. This function is only
used to lower the mask in an interrupt, so memory barriers are not
used. */
msr basepri, #0
}
}


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 7 2017, 13:30
Сообщение #60


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

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



Цитата(Alechek @ Jun 7 2017, 17:22) *
А поподробней? Практика или документация?
Пока что из того, что я привел, должно быть нарушение. Ошибка в ней или я что-то недочитал?

Практика. Выше я уже приводил ссылку на предыдущее обсуждение LDREX/STREX. Там тесты разных вариантов.

Видимо, в документации под словом "more recent store of address x" подразумевается всё же STREX.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

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

 


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


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