ouch-ouch 0 9 июля, 2019 Опубликовано 9 июля, 2019 · Жалоба Сабж. 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. Хотя ++. Почему так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
antis 1 9 июля, 2019 Опубликовано 9 июля, 2019 (изменено) · Жалоба volatile uint16_t rxB=0; должно помочь Изменено 9 июля, 2019 пользователем antis Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ouch-ouch 0 9 июля, 2019 Опубликовано 9 июля, 2019 · Жалоба 1 минуту назад, antis сказал: volatile uint16_t rxB=0; должно помочь пробовала, не помогает Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 9 июля, 2019 Опубликовано 9 июля, 2019 · Жалоба Где объявлена переменная? uint16_t rxB=0; Если в функции, то не хватает 'static'. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ouch-ouch 0 9 июля, 2019 Опубликовано 9 июля, 2019 · Жалоба 23 минуты назад, adnega сказал: Где объявлена переменная? uint16_t rxB=0; Если в функции, то не хватает 'static'. Нет, глобальная Если в функции и static - всё равно та же петрушка Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 9 июля, 2019 Опубликовано 9 июля, 2019 · Жалоба 2 hours ago, ouch-ouch said: Почему так? Наверное, rxB кто-то обнуляет. В представленном фрагменте какого-либо криминала нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 235 9 июля, 2019 Опубликовано 9 июля, 2019 · Жалоба Поставить на неё watchpoint и узнать где она обнуляется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ouch-ouch 0 10 июля, 2019 Опубликовано 10 июля, 2019 · Жалоба Загадка становится сложней) Там есть еще Wake_up на RTC, который я врубаю по приходу определенного байта (CMD_received=1; в обработчике прихода как раз для этого). По прерыванию wake_up в обработчике происходит последовательная отправка двух пакетов по 2 метра через DMA. И вот происходит отправка 20-25 пар пакетов (по-разному), а потом всё почему-то останавливается. Именно в этот таинственный момент эта переменная rxB, которая нигде там не фигурирует, и обнуляется. Чего-то с памятью? Что делать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jury093 2 10 июля, 2019 Опубликовано 10 июля, 2019 · Жалоба 1 час назад, ouch-ouch сказал: Загадка становится сложней) Там есть еще Wake_up на RTC, который я врубаю по приходу определенного байта (CMD_received=1; в обработчике прихода как раз для этого). По прерыванию wake_up в обработчике происходит последовательная отправка двух пакетов по 2 метра через DMA. И вот происходит отправка 20-25 пар пакетов (по-разному), а потом всё почему-то останавливается. Именно в этот таинственный момент эта переменная rxB, которая нигде там не фигурирует, и обнуляется. Чего-то с памятью? Что делать? может программа банально ребутается, отсюда и таинственное обнуление rxB или данные наползают на область стека.. откусите все лишнее или напишите отдельный тестовый фрагмент с подозрительным местом, иначе можно долго гадать и толковать без кофейной гущи.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_4afc_ 25 10 июля, 2019 Опубликовано 10 июля, 2019 · Жалоба 1 hour ago, ouch-ouch said: Загадка становится сложней) Чего-то с памятью? Что делать? Если код правильный - то неправильно инициализирован: кеш, мму, тдм или чаще всего маленькие задержки для вычитвания кода из флеши при высокой частоте работы и низком напряжении. А ещё бывает неверное отношение частот переферии и процессора. Микроконтроллер то какой? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ouch-ouch 0 10 июля, 2019 Опубликовано 10 июля, 2019 · Жалоба 1 час назад, _4afc_ сказал: Микроконтроллер то какой? stm32f415zgt6 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 59 10 июля, 2019 Опубликовано 10 июля, 2019 · Жалоба 21 minutes ago, ouch-ouch said: stm32f415zgt6 2 hours ago, ouch-ouch said: ....происходит последовательная отправка двух пакетов по 2 метра через DMA. У данного МК нет столько памяти. Или у вас внешняя RAM ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ouch-ouch 0 10 июля, 2019 Опубликовано 10 июля, 2019 · Жалоба 5 минут назад, dimka76 сказал: У данного МК нет столько памяти. Или у вас внешняя RAM ? Да это я уже прост совсем с кукушечкой прощаюсь, чего-то на каждом шаге прблемы. По 2к примерно. Там фактически сейчас 2 массива по 1730b Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ouch-ouch 0 10 июля, 2019 Опубликовано 10 июля, 2019 · Жалоба Reset_Handler:0800442c: ldr.w sp, [pc, #52] ; 0x8004464 <LoopFillZerobss+20>08004430: movs r1, #008004432: 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, #4LoopCopyDataInit:0800443c: ldr r0, [pc, #44] ; (0x800446c <LoopFillZerobss+28>)0800443e: ldr r3, [pc, #48] ; (0x8004470 <LoopFillZerobss+32>)08004440: adds r2, r0, r108004442: cmp r2, r308004444: 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, r308004454: bcc.n 0x800444a <FillZerobss>08004456: bl 0x8003fa8 <SystemInit>0800445a: bl 0x8004480 <__libc_init_array>0800445e: bl 0x8003af8 <main>08004462: bx lr08004464: movs r0, r008004466: movs r0, #208004468: cmp r0, r110800446a: lsrs r0, r0, #320800446c: movs r0, r00800446e: movs r0, #008004470: movs r4, r108004472: movs r0, #008004474: movs r4, r108004476: movs r0, #008004478: asrs r0, r2, #40800447a: movs r0, #0Вот эта хрень мне подчищает и переменную и еще кучку всего после нее.Почему она это делает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 10 июля, 2019 Опубликовано 10 июля, 2019 (изменено) · Жалоба Потому что ресет хэндлер, очевидно. Контроллер перезапускается. Почему он это делает, надо разбираться. Судя по упоминанию вэйк-ап, возможно, он это делает из-за слишком глубокого режима энергосбережения. PS судя по слову RxCpltCallback, там ещё и кубо-хал. Работать одновременно через регистры и хал с одной и той же периферией - прямейший путь к граблям. Оно там уже байтик из USART->DR вычитало, и вам, возможно, уже отдают следующий. Или этот же. Как повезёт... Изменено 10 июля, 2019 пользователем esaulenka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться