Перейти к содержанию
    

Почему переменная не сохраняет значение при выходе из прерывания?

Сабж.

uint16_t rxB=0;

/*---------------receive--------------------*/
void RxCpltCallback()
	{
			Rdata[rxB] = USART1->DR;
			rxB++;
			USART1->DR=rxB;
			USART1->SR&=~USART_SR_RXNE;
			CMD_received=1;
	}
/*-----------------------------------------*/

Прерывания срабатывают по приходу значений, дальше там еще идет пляска в while по CMD_received!=0, но при каждом заходе в это прерывание rxB=0. Хотя ++. Почему так?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Где объявлена переменная?

uint16_t rxB=0;

Если в функции, то не хватает 'static'.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

23 минуты назад, adnega сказал:

Где объявлена переменная?


uint16_t rxB=0;

Если в функции, то не хватает 'static'.

Нет, глобальная

Если в функции и static - всё равно та же петрушка

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, ouch-ouch said:

Почему так?

Наверное, rxB кто-то обнуляет. В представленном фрагменте какого-либо криминала нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Загадка становится сложней)

Там есть еще Wake_up на RTC, который я врубаю по приходу определенного байта (CMD_received=1; в обработчике прихода как раз для этого). По прерыванию wake_up в обработчике происходит последовательная отправка двух пакетов по 2 метра через DMA. И вот происходит отправка 20-25 пар пакетов (по-разному), а потом всё почему-то останавливается. Именно в этот таинственный момент эта переменная rxB, которая нигде там не фигурирует, и обнуляется. Чего-то с памятью? Что делать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, ouch-ouch сказал:

Загадка становится сложней)

Там есть еще Wake_up на RTC, который я врубаю по приходу определенного байта (CMD_received=1; в обработчике прихода как раз для этого). По прерыванию wake_up в обработчике происходит последовательная отправка двух пакетов по 2 метра через DMA. И вот происходит отправка 20-25 пар пакетов (по-разному), а потом всё почему-то останавливается. Именно в этот таинственный момент эта переменная rxB, которая нигде там не фигурирует, и обнуляется. Чего-то с памятью? Что делать?

может программа банально ребутается, отсюда и таинственное обнуление rxB или данные наползают на область стека..

откусите все лишнее или напишите отдельный тестовый фрагмент с подозрительным местом, иначе можно долго гадать и толковать без кофейной гущи..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, ouch-ouch said:

Загадка становится сложней)

 Чего-то с памятью? Что делать?

Если код правильный - то неправильно инициализирован:

кеш, мму, тдм или чаще всего маленькие задержки для вычитвания кода из флеши при высокой частоте работы и низком напряжении.

А ещё бывает неверное отношение частот переферии и процессора.

 

Микроконтроллер то какой?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

21 minutes ago, ouch-ouch said:

stm32f415zgt6

2 hours ago, ouch-ouch said:

....происходит последовательная отправка двух пакетов по 2 метра через DMA. 

У данного МК нет столько памяти.

Или у вас внешняя RAM ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 минут назад, dimka76 сказал:

 

У данного МК нет столько памяти.

Или у вас внешняя RAM ?

Да это я уже прост совсем с кукушечкой прощаюсь, чего-то на каждом шаге прблемы. По 2к примерно. Там фактически сейчас 2 массива по 1730b 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Reset_Handler:
0800442c: ldr.w sp, [pc, #52] ; 0x8004464 <LoopFillZerobss+20>
08004430: movs r1, #0
08004432: b.n 0x800443c <LoopCopyDataInit>
08004434: ldr r3, [pc, #48] ; (0x8004468 <LoopFillZerobss+24>)
08004436: ldr r3, [r3, r1]
08004438: str r3, [r0, r1]
0800443a: adds r1, #4
LoopCopyDataInit:
0800443c: ldr r0, [pc, #44] ; (0x800446c <LoopFillZerobss+28>)
0800443e: ldr r3, [pc, #48] ; (0x8004470 <LoopFillZerobss+32>)
08004440: adds r2, r0, r1
08004442: cmp r2, r3
08004444: bcc.n 0x8004434 <Reset_Handler+8>
08004446: ldr r2, [pc, #44] ; (0x8004474 <LoopFillZerobss+36>)
08004448: b.n 0x8004450 <LoopFillZerobss>
FillZerobss:
0800444a: movs r3, #0
0800444c: str.w r3, [r2], #4
LoopFillZerobss:
08004450: ldr r3, [pc, #36] ; (0x8004478 <LoopFillZerobss+40>)
08004452: cmp r2, r3

08004454: bcc.n 0x800444a <FillZerobss>
08004456: bl 0x8003fa8 <SystemInit>
0800445a: bl 0x8004480 <__libc_init_array>
0800445e: bl 0x8003af8 <main>
08004462: bx lr
08004464: movs r0, r0
08004466: movs r0, #2
08004468: cmp r0, r11
0800446a: lsrs r0, r0, #32
0800446c: movs r0, r0
0800446e: movs r0, #0
08004470: movs r4, r1
08004472: movs r0, #0
08004474: movs r4, r1
08004476: movs r0, #0
08004478: asrs r0, r2, #4
0800447a: movs r0, #0


Вот эта хрень мне подчищает и переменную и еще кучку всего после нее.
Почему она это делает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Потому что ресет хэндлер, очевидно.

Контроллер перезапускается. Почему он это делает, надо разбираться.

Судя по упоминанию вэйк-ап, возможно, он это делает из-за слишком глубокого режима энергосбережения.

 

 

PS судя по слову RxCpltCallback, там ещё и кубо-хал. Работать одновременно через регистры и хал с одной и той же периферией - прямейший путь к граблям. Оно там уже байтик из USART->DR вычитало, и вам, возможно, уже отдают следующий. Или этот же. Как повезёт...

 

Изменено пользователем esaulenka

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...