Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
1 / 1 / 1
Регистрация: 12.12.2014
Сообщений: 35

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

09.07.2019, 16:22. Показов 2077. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
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. Хотя ++. Почему так?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.07.2019, 16:22
Ответы с готовыми решениями:

Почему при использовании цикла, переменная которая находится внутри него не сохраняет значение при его завершении?
Почему при использовании цикла, переменная которая находится внутри него не сохраняет значение при его завершении.Пример: ...

Почему при выходе из цикла while переменная счетчик увеличивается на единицу?
Есть такой код: #include <iostream> using namespace std; int main() { int x = 30; cout<<"Внешнее значение:...

Как создать статическую переменную в Паскале? Переменную, которая сохраняет значение, при выходе из функции
Пробую так, но, естественно, ничего не получается: procedure a; var s : integer; begin s := 0; inc(s); writeln(s); ...

11
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
09.07.2019, 16:37
Цитата Сообщение от ouchouch Посмотреть сообщение
uint16_t rxB=0;
попробуй
C
1
volatile uint16_t rxB=0;
0
1 / 1 / 1
Регистрация: 12.12.2014
Сообщений: 35
09.07.2019, 16:42  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
попробуй
C
1
volatile uint16_t rxB=0;
не-а, не помогло
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
09.07.2019, 19:03
Цитата Сообщение от ouchouch Посмотреть сообщение
не помогло
тогда смотри где еще rxB применяется\изменяется
0
1 / 1 / 1
Регистрация: 12.12.2014
Сообщений: 35
10.07.2019, 11:05  [ТС]
Загадка становится сложней)

Там есть еще Wake_up на RTC, который я врубаю по приходу определенного байта (CMD_received=1; в обработчике прихода как раз для этого). По прерыванию wake_up в обработчике происходит последовательная отправка двух пакетов по 2 метра через DMA. И вот происходит отправка 20-25 пар пакетов (по-разному), а потом всё почему-то останавливается. Именно в этот таинственный момент эта переменная rxB, которая нигде там не фигурирует,*и обнуляется. Чего-то с памятью? Что делать?
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
10.07.2019, 12:28
Цитата Сообщение от ouchouch Посмотреть сообщение
Именно в этот таинственный момент эта переменная rxB, которая нигде там не фигурирует,*и обнуляется.
переполнение буфера, утечка памяти, нехватка стека.....
0
Эксперт по электронике
6785 / 3212 / 335
Регистрация: 28.10.2011
Сообщений: 12,545
Записей в блоге: 7
10.07.2019, 13:04
Цитата Сообщение от ouchouch Посмотреть сообщение
Загадка становится сложней)
Выше написали что нужно делать.
Цитата Сообщение от ValeryS Посмотреть сообщение
тогда смотри где еще rxB применяется\изменяется
Не хотите вручную искать, ставьте точку останова на запись в переменную и запускайте программу под отладчиком.

Цитата Сообщение от ouchouch Посмотреть сообщение
вот происходит отправка 20-25 пар пакетов (по-разному), а потом всё почему-то останавливается.
Выясните почему. В первую очередь проверьте настройки DMA и размеры буферов. В момент остановки передачи проверьте на попадаете ли в обработчик прерывания HardFault или подобный.
0
1 / 1 / 1
Регистрация: 12.12.2014
Сообщений: 35
10.07.2019, 17:39  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
Выше написали что нужно делать.Не хотите вручную искать, ставьте точку останова на запись в переменную и запускайте программу под отладчиком.
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


Вот эта хрень мне подчищает и переменную и еще кучку всего после нее.
Почему она это делает?
0
Эксперт по электронике
6785 / 3212 / 335
Регистрация: 28.10.2011
Сообщений: 12,545
Записей в блоге: 7
10.07.2019, 18:58
Этот код выполняется после начала работы МК.
0
1 / 1 / 1
Регистрация: 12.12.2014
Сообщений: 35
11.07.2019, 11:14  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
Этот код выполняется после начала работы МК.
Да. Контроллер почему-то начинает ресетиться с периодичностью в 540ms.
0
Эксперт по электронике
6785 / 3212 / 335
Регистрация: 28.10.2011
Сообщений: 12,545
Записей в блоге: 7
11.07.2019, 11:38
Собака не включена? Она также может быть включена в битах конфигурации (посмотрите в STM32 ST-LINK Utility, в окне Option Bytes).
1
1 / 1 / 1
Регистрация: 12.12.2014
Сообщений: 35
11.07.2019, 11:52  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
Собака не включена? Она также может быть включена в битах конфигурации (посмотрите в STM32 ST-LINK Utility, в окне Option Bytes).
Да, при прошивке поменяла Hardware на Software, перестал ресетить. Спасибо.
Миниатюры
Почему переменная не сохраняет значение при выходе из прерывания?  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.07.2019, 11:52
Помогаю со студенческими работами здесь

Переменная не сохраняет значение
Суть в том, что у нас есть 2 переменные: n и forN. Вторая переменная генерирует рандомное значение в пределах от 5 до 15 каждую секунду....

Присваивает переменной не то значение (при x=y=z=0, n=4, но почему-то переменная a, которой присваивается n + 0,006 )
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;locale.h&gt; #include &lt;math.h&gt; int main() { setlocale(LC_ALL, &quot;Rus&quot;); float...

Переменная обнуляется при выходе из цикла
Добрый день всем, заполняю в цикле массив, через дебаггер вижу, что он заполняется. Но почему то после выхода из цикла он становится...

Не изменяется глобальная переменная при выходе из функции
Здравствуйте, никак не могу понять, почему глобальная переменная-счетчик меняется в функции Create(вижу в конструкторе), но во время...

Обнуляется глобальная переменная при выходе из функции
#define _CRT_SECURE_NO_WARNINGS #include&lt;stdio.h&gt; #include&lt;malloc.h&gt; void printArr(int* arr, int length) { int i; for (i...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru