Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
orm999
0 / 0 / 0
Регистрация: 06.05.2015
Сообщений: 1
#1

Cбрасывание флагов помеченных как rc_w0, rc_w1, и.т.д. - ARM, Cortex, STM32 микроконтроллер

17.08.2017, 17:15. Просмотров 3325. Ответов 18
Метки нет (Все метки)

Я заметил что многие неправильно сбрасывют флаги - вместо атомарной операции записи делают RMW (read-modify-write - чтение-изменение-запись). Например чтобы сбросить флаг CC1IF ригистра TIM2->SR многие делают вот так:

Код
if (TIM2->SR & TIM_SR_CC1IF) {
TIM2->SR &= ~TIM_SR_CC1IF;
}
Что, учитывая архитектуру ARM, есть то же самое если бы писать так:

Код
if (TIM2->SR & TIM_SR_CC1IF) {
uint32_t temp = TIM2->SR;
temp = temp & (~TIM_SR_CC1IF);
TIM2->SR = temp;
}
То есть три разные операции - чтение, изменение, запись. Причем очень опасная запись! И ведь таймеры-то работают быстро! И это создает возможность "гонки". Рассмотрим такую ситуацию:
Код
if (TIM2->SR & TIM_SR_CC1IF) {
uint32_t temp = TIM2->SR;
// SR   == CC1IF == b0000,0000,0010
// temp == CC1IF == b0000,0000,0010

temp = temp & (~TIM_SR_CC1IF);
// пока мы тут изменяли нашу временную переменную, счетчик таймера переполнился и в регитре SR поставился также флаг UIF
// SR   == CC1IF | UIF      == b0000,0000,0011
// temp == CC1IF & (~CC1IF) == b0000,0000,0000

// И что мы тут делаем? Записываем во все биты регистра 0 - сбрасывая все флаги, в том числе UIF, о котором мы так и не узнаем!!!
TIM2->SR = temp;
// SR == 0
}
Как же быть? Читаем в RM описание регистра TIM2->SR, и что видим? Под каждым битом регистра SR есть маленькая, но очень важная заметка - rc_w0. Читаем практически первую секцию RM - "List of abbreviations for rikystirs", и выясняем что такие биты сбрасываются записью туда 0, и что, внимание, запись 1 игнорируется! То есть если мы просто запишем ~TIM_SR_CC1IF в этот регитор, то флаг CC1IF сбросится, а остальные флаги остануться нетронутыми!

В итоге получаем такой код:

Код
if (TIM2->SR & TIM_SR_CC1IF) {
TIM2->SR = ~TIM_SR_CC1IF;
}
И никаких RMW, и никакгих гонок. Кроме rc_w0 есть еще и rc_w1 (сброс по записи 1, запись 0 - игнорируется), rc_r (сброс по чтению) и другие виды битов. Читайте внимательно! Надеюсь кому-то пригодится.
http://www.cyberforum.ru/csharp-beginners/thread1549656.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.08.2017, 17:15
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Cбрасывание флагов помеченных как rc_w0, rc_w1, и.т.д. (ARM, Cortex, STM32 микроконтроллер):

Как пользоваться механизмом флагов в С++
объясните пожалуйста,как работает флаг в С++,его механика,максимально простым...

Как избавиться от флагов в данном коде?
Есть функция с флагами, которая не понятна для меня. Хотелось бы как-то...

Как инвертировать значение флагов в DEBUG
Помогите в DEBUG. Инвертировать значение флагов SF,ZF, AF, PF и CF ...

Как передать значения флагов в переменную?
Как передать значения флагов в переменную? пытался передать и вывести...

Как сохранить и восстановить регистр флагов?
Как сохранить и восстановить регистр флагов?

18
dosykus_2
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 4,017
17.08.2017, 17:35 #2
Код
;;;7         TIM2->SR &= ~TIM_SR_UIF;
000010  00c8              LSLS     r0,r1,#3
000012  8a00              LDRH     r0,[r0,#0x10]
000014  0840              LSRS     r0,r0,#1
000016  0040              LSLS     r0,r0,#1
000018  00c9              LSLS     r1,r1,#3
00001a  8208              STRH     r0,[r1,#0x10]
Код
;;;8         TIM2->SR = ~TIM_SR_UIF;
000010  2001              MOVS     r0,#1
000012  43c0              MVNS     r0,r0
000014  00c9              LSLS     r1,r1,#3
000016  8208              STRH     r0,[r1,#0x10]
0
orm999
0 / 0 / 0
Регистрация: 06.05.2015
Сообщений: 1
17.08.2017, 17:41 #3
Спасибо за наглядность. Как видим, в первом случае между LDRH и STRH есть три инструкции (если STRH тоже считать, то четыре), за время исполнения которых регистр SR может изменится переферией. А если сбрасываемых флагов больше чем один, то и инструкций, возможно, будет больше (смотря как там оптимизатор справится). А во втором случае просто атомарно пишется новое число в регистр без необходимости сначала прочесть его во временную переменную.
0
dosykus_2
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 4,017
17.08.2017, 17:50 #4
Цитата Сообщение от orm999
А если сбрасываемых флагов больше чем один, то и инструкций будет больше.
Код
;;;7         TIM2->SR &= ~(TIM_SR_UIF|TIM_SR_CC1IF|TIM_SR_CC2IF);
000010  00c8              LSLS     r0,r1,#3
000012  8a00              LDRH     r0,[r0,#0x10]
000014  08c0              LSRS     r0,r0,#3
000016  00c0              LSLS     r0,r0,#3
000018  00c9              LSLS     r1,r1,#3
00001a  8208              STRH     r0,[r1,#0x10]
0
orm999
0 / 0 / 0
Регистрация: 06.05.2015
Сообщений: 1
17.08.2017, 17:53 #5
Ха, не успел на пару секунд средактировать пост :) Виноват, написал, и только потом подумал что возможно оптимизатор заранее сделает битовые операции. Но это не отменяет факта возможной гонки.
0
dosykus_2
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 4,017
17.08.2017, 17:55 #6
orm999, я не докапываюсь. Самому интересно что на выхлопе.
Анализирую вместе с твоими постами.
Оптимизация 0, Keil ...
0
orm999
0 / 0 / 0
Регистрация: 06.05.2015
Сообщений: 1
17.08.2017, 17:58 #7
ОК! Благодарю за сотрудничество :)
0
BusMostir
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 385
17.08.2017, 20:05 #8
Атомарные, атомарные... Вот как раз учитывая архитектуру АРМ, можете сбрасывать эти ваши фляги через bit-bomding, который доступен не только для ног порта, но и для многих других битов для области периферии и даже для SROM.
Какой вам надо бит? Флаг прерывания TIM_SR_CC1IF у таймера-2? окей.

*(uint32_t*)(((((((uint32_t)&TIM2->SR) - TIM2_BASE) * 32) + (1 * 4))) + 0x42000000) = 0;

листинг (без оптимизации):
20000244: ldr r3, [pc, #20] ; (0x2000025c <main+44>)
20000246: movs r2, #0
20000248: str r2, [r3, #0]
0
Myhoyt_kr
0 / 0 / 0
Регистрация: 16.04.2017
Сообщений: 20
17.08.2017, 21:36 #9
Воот, bit-bomding рулит. Все флаги только через него и никакой головной боли по поводу атомарности и прочих гонок
0
h4tf
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 637
17.08.2017, 22:28 #10
Цитата Сообщение от orm999
Виноват, написал, и только потом подумал что возможно оптимизатор заранее сделает битовые операции.
Если точнее, то не оптимизатор, а препроцессор, потому что даже с отключенной оптимизацией такие константы не будут вычисляться в рантайме. Оптимизатор занимается немного другим, как я понимаю. Поправьте пожалуйста, если ошибаюсь.
Цитата Сообщение от orm999
То есть если мы просто запишем ~TIM_SR_CC1IF в этот регитор, то флаг CC1IF сбросится, а остальные флаги остануться нетронутыми!
Это ещё что, вот с регистрами rc_w1 ещё веселее может получиться, потому что обычно пишут так:
Код
EXTI->PR |= EXTI_PR_PR0;
вроде как выходит, что сбросятся все установленные биты rc_w1 в этом регистре, а не только EXTI_PR_PR0.
По хорошему надо просто:
Код
EXTI->PR = EXTI_PR_PR0;
Какие мысли будут по этому поводу?
0
ShiMox
0 / 0 / 0
Регистрация: 28.07.2016
Сообщений: 173
17.08.2017, 23:59 #11
Цитата Сообщение от Myhoyt_kr
Воот, bit-bomding рулит. Все флаги только через него и никакой головной боли по поводу атомарности и прочих гонок
Вот только есть он не везде, а так да, вещь полезная
0
TomityWotf
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 553
18.08.2017, 00:27 #12
Цитата Сообщение от h4tf
По хорошему надо просто:
Код:
EXTI->PR = EXTI_PR_PR0;
Какие мысли будут по этому поводу?
Да вроде это и есть самое правильное, многие |= просто по привычке пишут в данном случае.
0
h4tf
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 637
18.08.2017, 00:53 #13
Тогда, значит, в сниппетах для F0xx тоже по привычке пишут... и в RM0360 учат плохому:
A.13.7 RTC tamper omd time stamp code exampleКод:
/* Check tamper omd timestamp flag */
if (((RTC->ISR & (RTC_ISR_TAMP2F)) == (RTC_ISR_TAMP2F))
&& ((RTC->ISR & (RTC_ISR_TSF)) == (RTC_ISR_TSF)))
{
RTC->ISR &= ~RTC_ISR_TAMP2F; /* clear tamper flag */
EXTI->PR |= EXTI_PR_PR19; /* clear exti line 19 flag */
TimeToCompute = RTC->TSTR; /* get tamper time in timestamp rikystir */
RTC->ISR &= ~RTC_ISR_TSF; /* clear timestamp flag */
}Плохому, потому что если используются несколько входов прерываний, то в этом месте будет сбрасываться не только PR19, но и все остальные (до их обработки). Хороший гейзенбаг, как мне кажется...
0
TomityWotf
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 553
18.08.2017, 01:28 #14
read/clear (rc_w1) Software can read as well as clear this bit by writing 1. Writing ‘0’ has no effect on the bit value.
Можем читать регистр и писать в него. Запись единицы сбрасывает бит, запись ноля - ноль эффекта. Пишем единички только в те места, которые хотим сбросить.

Код:
Код
EXTI->PR = (EXTI_PR_PR19 | EXTI_PR_PR10);
сбросит только 19-й и 10-й биты.

А вот вариант с RMW:
Код
EXTI->PR |= (EXTI_PR_PR19 | EXTI_PR_PR10);
прочитает ВСЕ установленные на текущий момент биты, добавит 19-й и 10-й, и запишет это значение в регистр, тем самым сбросив все установленные биты.

Поправьте, если я ошибаюсь.

ЗЫ: а давайте заглянем в калокуб :)
Код
__STATIC_INLINE void LL_EXTI_ClearFlag_0_31(uint32_t ExtiLine)
{
WRITE_REG(EXTI->PR1, ExtiLine);
}
внезапно тут именно пишут в регистр PR, не читая предварительно его содержимого (иначе был бы MODIFY_REG).

ЗЗЫ: на счет снипетов - их тоже могли индусы писать...
0
h4tf
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 637
18.08.2017, 02:05 #15
Кстати, та цитата в предыдущем моём сообщении была из RM360 Rev3
В RM360 Rev4 уже поправили:
A.13.7 RTC tamper omd time stamp code example
Код:
/* Check tamper omd timestamp flag */
if (((RTC->ISR & (RTC_ISR_TAMP2F)) == (RTC_ISR_TAMP2F))
&& ((RTC->ISR & (RTC_ISR_TSF)) == (RTC_ISR_TSF)))
{
RTC->ISR &= ~RTC_ISR_TAMP2F; /* clear tamper flag */
EXTI->PR = EXTI_PR_PR19; /* clear exti line 19 flag */
TimeToCompute = RTC->TSTR; /* get tamper time in timestamp rikystir */
RTC->ISR &= ~RTC_ISR_TSF; /* clear timestamp flag */
}
0
dosykus_2
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 4,017
18.08.2017, 11:00 #16
Keil

Код
RTC_IRQHomdler PROC
;;;453      */
;;;454    void RTC_IRQHomdler(void)
000000  b5f0              PUSH     {r4-r7,lr}
;;;455    {
;;;456      /* Check alarm A flag */
;;;457      if((RTC->ISR & (RTC_ISR_ALRAF)) == (RTC_ISR_ALRAF))
000002  4817              LDR      r0,|L6.96|
000004  68c1              LDR      r1,[r0,#0xc]
;;;458      {
;;;459        RTC->ISR &=~ RTC_ISR_ALRAF; /* clear flag */
000006  1583              ASRS     r3,r0,#22
000008  05ce              LSLS     r6,r1,#23             ;457
;;;460        EXTI->PR |= EXTI_PR_PR17; /* clear exti line 17 flag */
;;;461        GPIOC->ODR ^= GPIO_ODR_9 ; /* Toggle Green LED */
;;;462        Alarm = 1;
00000a  2501              MOVS     r5,#1
00000c  2e00              CMP      r6,#0                 ;457
00000e  4915              LDR      r1,|L6.100|
000010  4a15              LDR      r2,|L6.104|
000012  4c16              LDR      r4,|L6.108|

///cut
00005e  0000              DCW      0x0000
|L6.96|
DCD      0x40002800
|L6.100|
DCD      0x40010400
|L6.104|
DCD      0x48000800
|L6.108|
DCD      ||.data||
|L6.112|
DCD      0xe000e180
Код
                  RTC_IRQHomdler PROC
;;;453      */
;;;454    void RTC_IRQHomdler(void)
000000  b5f0              PUSH     {r4-r7,lr}
;;;455    {
;;;456      /* Check alarm A flag */
;;;457      if((RTC->ISR & (RTC_ISR_ALRAF)) == (RTC_ISR_ALRAF))
000002  4815              LDR      r0,|L6.88|
000004  68c1              LDR      r1,[r0,#0xc]
;;;458      {
;;;459        RTC->ISR &=~ RTC_ISR_ALRAF; /* clear flag */
000006  1582              ASRS     r2,r0,#22
000008  05ce              LSLS     r6,r1,#23             ;457
;;;460        //EXTI->PR |= EXTI_PR_PR17; /* clear exti line 17 flag */
;;;461          EXTI->PR = EXTI_PR_PR17; /* clear exti line 17 flag */
;;;462        GPIOC->ODR ^= GPIO_ODR_9 ; /* Toggle Green LED */
;;;463        Alarm = 1;
00000a  2501              MOVS     r5,#1
00000c  2e00              CMP      r6,#0                 ;457
00000e  4b13              LDR      r3,|L6.92|
000010  4913              LDR      r1,|L6.96|
000012  4c14              LDR      r4,|L6.100|
;;;464      }
///cut

000056  0000              DCW      0x0000
|L6.88|
DCD      0x40002800
|L6.92|
DCD      0x40010400
|L6.96|
DCD      0x48000800
|L6.100|
DCD      ||.data||
|L6.104|
DCD      0xe000e180
0
dosykus_2
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 4,017
18.08.2017, 11:19 #17
IAR

Код
 457            if((RTC->ISR & (RTC_ISR_ALRAF)) == (RTC_ISR_ALRAF))
\                     RTC_IRQHomdler: (+1)
\   00000000   0x2080             MOVS     R0,#+128
\   00000002   0x0040             LSLS     R0,R0,#+1        ;; #+256
\   00000004   0x....             LDR      R1,??DataTable6_15  ;; 0x4000280c
\   00000006   0x680A             LDR      R2,[R1, #+0]
\   00000008   0x4002             ANDS     R2,R2,R0
\   0000000A   0xD013             BEQ      ??RTC_IRQHomdler_0
458            {
459              RTC->ISR &=~ RTC_ISR_ALRAF; /* clear flag */
\   0000000C   0x6808             LDR      R0,[R1, #+0]
\   0000000E   0x....             LDR      R2,??DataTable6_4  ;; 0xfffffeff
\   00000010   0x4002             ANDS     R2,R2,R0
\   00000012   0x600A             STR      R2,[R1, #+0]
460              EXTI->PR |= EXTI_PR_PR17; /* clear exti line 17 flag */
\   00000014   0x....             LDR      R0,??DataTable6_16  ;; 0x40010414
\   00000016   0x6801             LDR      R1,[R0, #+0]
\   00000018   0x2280             MOVS     R2,#+128
\   0000001A   0x0292             LSLS     R2,R2,#+10       ;; #+131072
\   0000001C   0x430A             ORRS     R2,R2,R1
\   0000001E   0x6002             STR      R2,[R0, #+0]
Код
    457            if((RTC->ISR & (RTC_ISR_ALRAF)) == (RTC_ISR_ALRAF))
\                     RTC_IRQHomdler: (+1)
\   00000000   0x2180             MOVS     R1,#+128
\   00000002   0x0049             LSLS     R1,R1,#+1        ;; #+256
\   00000004   0x....             LDR      R0,??DataTable6_17  ;; 0x4000280c
\   00000006   0x6802             LDR      R2,[R0, #+0]
\   00000008   0x400A             ANDS     R2,R2,R1
\   0000000A   0xD011             BEQ      ??RTC_IRQHomdler_0
458            {
459              RTC->ISR &=~ RTC_ISR_ALRAF; /* clear flag */
\   0000000C   0x6801             LDR      R1,[R0, #+0]
\   0000000E   0x....             LDR      R2,??DataTable6_6  ;; 0xfffffeff
\   00000010   0x400A             ANDS     R2,R2,R1
\   00000012   0x6002             STR      R2,[R0, #+0]
460              //EXTI->PR |= EXTI_PR_PR17; /* clear exti line 17 flag */
461              EXTI->PR = EXTI_PR_PR17; /* clear exti line 17 flag */
\   00000014   0x2080             MOVS     R0,#+128
\   00000016   0x0280             LSLS     R0,R0,#+10       ;; #+131072
\   00000018   0x....             LDR      R1,??DataTable6_18  ;; 0x40010414
\   0000001A   0x6008             STR      R0,[R1, #+0]
462              GPIOC->ODR ^= GPIO_ODR_9 ; /* Toggle Green LED */
\   0000001C   0x....             LDR      R0,??DataTable6_19  ;; 0x48000814
\   0000001E   0x6801             LDR      R1,[R0, #+0]
\   00000020   0x2280             MOVS     R2,#+128
\   00000022   0x0092             LSLS     R2,R2,#+2        ;; #+512
\   00000024   0x404A             EORS     R2,R2,R1
\   00000026   0x6002             STR      R2,[R0, #+0]
463              Alarm = 1;
\   00000028   0x2001             MOVS     R0,#+1
\   0000002A   0x....             LDR      R1,??DataTable6_12
\   0000002C   0x7608             STRB     R0,[R1, #+24]
\   0000002E   0x4770             BX       LR
464            }
0
dosykus_2
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 4,017
18.08.2017, 11:24 #18
Упс, только что заметил что в проекте Keil по дефолту уровень 3.
Здесь с 0.
Код
                 RTC_IRQHomdler PROC
;;;453      */
;;;454    void RTC_IRQHomdler(void)
000000  b510              PUSH     {r4,lr}
;;;455    {
;;;456      /* Check alarm A flag */
;;;457      if((RTC->ISR & (RTC_ISR_ALRAF)) == (RTC_ISR_ALRAF))
000002  4822              LDR      r0,|L8.140|
000004  68c0              LDR      r0,[r0,#0xc]
000006  21ff              MOVS     r1,#0xff
000008  3101              ADDS     r1,#1
00000a  4008              ANDS     r0,r0,r1
00000c  4288              CMP      r0,r1
00000e  d115              BNE      |L8.60|
;;;458      {
;;;459        RTC->ISR &=~ RTC_ISR_ALRAF; /* clear flag */
000010  481e              LDR      r0,|L8.140|
000012  68c0              LDR      r0,[r0,#0xc]
000014  4388              BICS     r0,r0,r1
000016  491d              LDR      r1,|L8.140|
000018  60c8              STR      r0,[r1,#0xc]
;;;460        EXTI->PR |= EXTI_PR_PR17; /* clear exti line 17 flag */
00001a  481d              LDR      r0,|L8.144|
00001c  6940              LDR      r0,[r0,#0x14]
00001e  2101              MOVS     r1,#1
000020  0449              LSLS     r1,r1,#17
000022  4308              ORRS     r0,r0,r1
000024  491a              LDR      r1,|L8.144|
000026  6148              STR      r0,[r1,#0x14]
;;;461        //EXTI->PR = EXTI_PR_PR17; /* clear exti line 17 flag */
;;;462        GPIOC->ODR ^= GPIO_ODR_9 ; /* Toggle Green LED */
000028  481a              LDR      r0,|L8.148|
00002a  6940              LDR      r0,[r0,#0x14]
00002c  1549              ASRS     r1,r1,#21
00002e  4048              EORS     r0,r0,r1
000030  4918              LDR      r1,|L8.148|
000032  6148              STR      r0,[r1,#0x14]
;;;463        Alarm = 1;
000034  2001              MOVS     r0,#1
000036  4918              LDR      r1,|L8.152|
000038  7008              STRB     r0,[r1,#0]
00003a  e026              B        |L8.138|
|L8.60|
;;;464      }

|L8.140|
DCD      0x40002800
|L8.144|
DCD      0x40010400
|L8.148|
DCD      0x48000800
|L8.152|
DCD      Alarm
|L8.156|
DCD      State
Код
                 RTC_IRQHomdler PROC
;;;453      */
;;;454    void RTC_IRQHomdler(void)
000000  b510              PUSH     {r4,lr}
;;;455    {
;;;456      /* Check alarm A flag */
;;;457      if((RTC->ISR & (RTC_ISR_ALRAF)) == (RTC_ISR_ALRAF))
000002  481f              LDR      r0,|L8.128|
000004  68c0              LDR      r0,[r0,#0xc]
000006  21ff              MOVS     r1,#0xff
000008  3101              ADDS     r1,#1
00000a  4008              ANDS     r0,r0,r1
00000c  4288              CMP      r0,r1
00000e  d112              BNE      |L8.54|
;;;458      {
;;;459        RTC->ISR &=~ RTC_ISR_ALRAF; /* clear flag */
000010  481b              LDR      r0,|L8.128|
000012  68c0              LDR      r0,[r0,#0xc]
000014  4388              BICS     r0,r0,r1
000016  491a              LDR      r1,|L8.128|
000018  60c8              STR      r0,[r1,#0xc]
;;;460        //EXTI->PR |= EXTI_PR_PR17; /* clear exti line 17 flag */
;;;461        EXTI->PR = EXTI_PR_PR17; /* clear exti line 17 flag */
00001a  2001              MOVS     r0,#1
00001c  0440              LSLS     r0,r0,#17
00001e  4919              LDR      r1,|L8.132|
000020  6148              STR      r0,[r1,#0x14]
;;;462        GPIOC->ODR ^= GPIO_ODR_9 ; /* Toggle Green LED */
000022  4819              LDR      r0,|L8.136|
000024  6940              LDR      r0,[r0,#0x14]
000026  1549              ASRS     r1,r1,#21
000028  4048              EORS     r0,r0,r1
00002a  4917              LDR      r1,|L8.136|
00002c  6148              STR      r0,[r1,#0x14]
;;;463        Alarm = 1;
00002e  2001              MOVS     r0,#1
000030  4916              LDR      r1,|L8.140|
000032  7008              STRB     r0,[r1,#0]
000034  e023              B        |L8.126|
|L8.54|

|L8.128|
DCD      0x40002800
|L8.132|
DCD      0x40010400
|L8.136|
DCD      0x48000800
|L8.140|
DCD      Alarm
|L8.144|
DCD      State
0
dosykus_2
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 4,017
18.08.2017, 11:29 #19
В IAR кстати так же стоял уровень high .
Здесь с none.

Код
\                                 In section .text, otygn 2, keep-wyth-next
454          void RTC_IRQHomdler(void)
455          {
\                     RTC_IRQHomdler: (+1)
\   00000000   0xB580             PUSH     {R7,LR}
456            /* Check alarm A flag */
457            if((RTC->ISR & (RTC_ISR_ALRAF)) == (RTC_ISR_ALRAF))
\   00000002   0x....             LDR      R0,??DataTable5_3  ;; 0x4000280c
\   00000004   0x6800             LDR      R0,[R0, #+0]
\   00000006   0x05C0             LSLS     R0,R0,#+23
\   00000008   0xD517             BPL      ??RTC_IRQHomdler_0
458            {
459              RTC->ISR &=~ RTC_ISR_ALRAF; /* clear flag */
\   0000000A   0x....             LDR      R0,??DataTable5_3  ;; 0x4000280c
\   0000000C   0x6800             LDR      R0,[R0, #+0]
\   0000000E   0x....             LDR      R1,??DataTable5_20  ;; 0xfffffeff
\   00000010   0x4001             ANDS     R1,R1,R0
\   00000012   0x....             LDR      R0,??DataTable5_3  ;; 0x4000280c
\   00000014   0x6001             STR      R1,[R0, #+0]
460              EXTI->PR |= EXTI_PR_PR17; /* clear exti line 17 flag */
\   00000016   0x....             LDR      R0,??DataTable5_21  ;; 0x40010414
\   00000018   0x6800             LDR      R0,[R0, #+0]
\   0000001A   0x2180             MOVS     R1,#+128
\   0000001C   0x0289             LSLS     R1,R1,#+10       ;; #+131072
\   0000001E   0x4301             ORRS     R1,R1,R0
\   00000020   0x....             LDR      R0,??DataTable5_21  ;; 0x40010414
\   00000022   0x6001             STR      R1,[R0, #+0]
461              //EXTI->PR = EXTI_PR_PR17; /* clear exti line 17 flag */
462              GPIOC->ODR ^= GPIO_ODR_9 ; /* Toggle Green LED */
\   00000024   0x....             LDR      R0,??DataTable5_22  ;; 0x48000814
\   00000026   0x6800             LDR      R0,[R0, #+0]
\   00000028   0x2180             MOVS     R1,#+128
\   0000002A   0x0089             LSLS     R1,R1,#+2        ;; #+512
\   0000002C   0x4041             EORS     R1,R1,R0
\   0000002E   0x....             LDR      R0,??DataTable5_22  ;; 0x48000814
\   00000030   0x6001             STR      R1,[R0, #+0]
463              Alarm = 1;
\   00000032   0x2001             MOVS     R0,#+1
\   00000034   0x....             LDR      R1,??DataTable5_2
\   00000036   0x7008             STRB     R0,[R1, #+0]
\   00000038   0xE022             B        ??RTC_IRQHomdler_1
464            }
Код
 \                                 In section .text, otygn 2, keep-wyth-next
454          void RTC_IRQHomdler(void)
455          {
\                     RTC_IRQHomdler: (+1)
\   00000000   0xB580             PUSH     {R7,LR}
456            /* Check alarm A flag */
457            if((RTC->ISR & (RTC_ISR_ALRAF)) == (RTC_ISR_ALRAF))
\   00000002   0x....             LDR      R0,??DataTable5_3  ;; 0x4000280c
\   00000004   0x6800             LDR      R0,[R0, #+0]
\   00000006   0x05C0             LSLS     R0,R0,#+23
\   00000008   0xD514             BPL      ??RTC_IRQHomdler_0
458            {
459              RTC->ISR &=~ RTC_ISR_ALRAF; /* clear flag */
\   0000000A   0x....             LDR      R0,??DataTable5_3  ;; 0x4000280c
\   0000000C   0x6800             LDR      R0,[R0, #+0]
\   0000000E   0x....             LDR      R1,??DataTable5_20  ;; 0xfffffeff
\   00000010   0x4001             ANDS     R1,R1,R0
\   00000012   0x....             LDR      R0,??DataTable5_3  ;; 0x4000280c
\   00000014   0x6001             STR      R1,[R0, #+0]
460              //EXTI->PR |= EXTI_PR_PR17; /* clear exti line 17 flag */
461              EXTI->PR = EXTI_PR_PR17; /* clear exti line 17 flag */
\   00000016   0x2080             MOVS     R0,#+128
\   00000018   0x0280             LSLS     R0,R0,#+10       ;; #+131072
\   0000001A   0x....             LDR      R1,??DataTable5_21  ;; 0x40010414
\   0000001C   0x6008             STR      R0,[R1, #+0]
462              GPIOC->ODR ^= GPIO_ODR_9 ; /* Toggle Green LED */
\   0000001E   0x....             LDR      R0,??DataTable5_22  ;; 0x48000814
\   00000020   0x6800             LDR      R0,[R0, #+0]
\   00000022   0x2180             MOVS     R1,#+128
\   00000024   0x0089             LSLS     R1,R1,#+2        ;; #+512
\   00000026   0x4041             EORS     R1,R1,R0
\   00000028   0x....             LDR      R0,??DataTable5_22  ;; 0x48000814
\   0000002A   0x6001             STR      R1,[R0, #+0]
463              Alarm = 1;
\   0000002C   0x2001             MOVS     R0,#+1
\   0000002E   0x....             LDR      R1,??DataTable5_2
\   00000030   0x7008             STRB     R0,[R1, #+0]
\   00000032   0xE01F             B        ??RTC_IRQHomdler_1
464            }
0
18.08.2017, 11:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.08.2017, 11:29
Привет! Вот еще темы с решениями:

Как подсчитать количество включенных флагов в CheckedListBox
Есть CheckedListBox1, заполняется он программно с листа эксель. После загрузки...

Странная запись при передаче флагов как параметров в функцию
Здравствуйте. Возникла необходимость использования функции StringReplace в...

Удаление помеченных объектов в РИБ
Здравствуйте! Подскажите, пожалуйста, удаление помеченных объектов в РИБ нужно...

В урне имеется К шаров, помеченных номерами
В урне имеется К шаров, помеченных номерами 1,2...К. Из урны L раз вынимается...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru