|
|
  |
__LDREX __STREX в STM32F407 |
|
|
|
Jun 6 2017, 21:36
|
Гуру
     
Группа: Свой
Сообщений: 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-контроллеров и прочего, которое не выполняет программы, задачи, не выполняет какой-то код, задачи которого не нужно синхронизировать с другими задачами.
|
|
|
|
|
Jun 7 2017, 08:31
|
Профессионал
    
Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882

|
Цитата(jcxz @ Jun 6 2017, 13:20)  Фантазии про некий регистр рассеиваются  Опять открываем мануал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] равен всей памяти.
|
|
|
|
|
Jun 7 2017, 08:56
|
Гуру
     
Группа: Свой
Сообщений: 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") вне зависимости от адреса.
|
|
|
|
|
Jun 7 2017, 09:18
|
Профессионал
    
Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882

|
Цитата Не тот мануал открываете Ну почему же не тот? Я все открыл, смотрите выше. И мануалы на М4 и на М3 там тоже есть. Выводы подправил. А вот Вы вводите людей в заблуждение: Цитата(jcxz @ Jun 5 2017, 12:49)  Если между LDREX и STREX произошло прерывание или был выполнен другой эксклюзивный доступ, до будет нарушение эксклюзивности. Ну и где у вас между LDREX и STREX нарушение эксклюзивности? Про условие эксклюзивной записи для нарушения эксклюзивности - нет такого!
|
|
|
|
|
Jun 7 2017, 11:52
|
Частый гость
 
Группа: Участник
Сообщений: 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 (в этот регион), то будет нарушение эксклюзивности. Нет, не будет.
|
|
|
|
|
Jun 7 2017, 12:22
|
Профессионал
    
Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882

|
Цитата(scifi @ Jun 7 2017, 15:27)  Это называется "глюк в софте". Систему можно и проще поломать - просто забейте весь стек мусором  Цитата(jcxz @ Jun 7 2017, 16:23)  А зачем так делать?? Господа, оставьте эти риторические вопросы. Здесь не обсуждается вопрос ЗАЧЕМ. Нет ничего невозможного. Arduino уже добрался до Cortex! Сделать вызов функции между LDREX/STREX - как раз плюнуть! От неправильного применения может спасти только чтение правильной документации. Цитата(LightElf @ Jun 7 2017, 16:52)  Нет, не будет. А поподробней? Практика или документация? Пока что из того, что я привел, должно быть нарушение. Ошибка в ней или я что-то недочитал?
|
|
|
|
|
Jun 7 2017, 12:39
|

Профессионал
    
Группа: Свой
Сообщений: 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
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Jun 7 2017, 13:27
|

Профессионал
    
Группа: Свой
Сообщений: 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 } }
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Jun 7 2017, 13:30
|

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

|
Цитата(Alechek @ Jun 7 2017, 17:22)  А поподробней? Практика или документация? Пока что из того, что я привел, должно быть нарушение. Ошибка в ней или я что-то недочитал? Практика. Выше я уже приводил ссылку на предыдущее обсуждение LDREX/STREX. Там тесты разных вариантов. Видимо, в документации под словом "more recent store of address x" подразумевается всё же STREX.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|