реклама на сайте
подробности

 
 
6 страниц V  < 1 2 3 4 5 > »   
Reply to this topicStart new topic
> STM32 OTG USB проблема с отладкой
Chameleon
сообщение Feb 21 2017, 16:25
Сообщение #31


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 5-07-08
Пользователь №: 38 757



QUOTE (jcxz @ Feb 21 2017, 18:49) *
Если человек вызывает такие функции (как в 5-м посте) из ISR ничтоже сумняшеся, то и в остальном коде он мог наделать очевидных глупостей.
Например вызывать этот UARTPrint() из ISR и из фоновой задачи без блокировок.
Переписывание этого под гал или чего-то другое ничего не даст. Если нет понимания как всё в сумме оно работает.....

ЗЫ: теме место - в "помощи начинающему".


Go to the top of the page
 
+Quote Post
Forger
сообщение Feb 21 2017, 16:32
Сообщение #32


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(Chameleon @ Feb 21 2017, 18:46) *
Про малоуловимые глюки в макросах и смысла нет говорить.
А уж условная компиляция так помогает понять логику работы...

Ну, судя по тому, как вы спотыкаетесь на примитивной функции и можно сказать на ровном месте, то действительно вам не стоит пользоваться ни препроцессором ни чем-то еще более функциональным smile3046.gif
Пожалуй, очень правильно, что вам кто-то строго настрого запретил пользоваться препроцессором, внушив, что, якобы, это злейшее зло.... Пусть уж лучше так biggrin.gif

Цитата(jcxz @ Feb 21 2017, 18:49) *
Переписывание этого под гал или чего-то другое ничего не даст. Если нет понимания как всё в сумме оно работает.....
ЗЫ: теме место - в "помощи начинающему".

Трудно не согласиться sm.gif


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
Chameleon
сообщение Feb 22 2017, 04:53
Сообщение #33


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 5-07-08
Пользователь №: 38 757



Чем дальше в лес, тем толще партизаны.

Сделал отладочный вывод в массив в озу и затем из него в UART.
Устройство подключается и определяестя.
Но когда начинается вывод через UART, устройство отваливается.
Через отладчик выяснил, что процессор падает в HardFault.

Падает на этой функции:

CODE
void up(void)
{
    volatile char *s = mem;
    for(;;)
    {
        while((USART1->SR & USART_SR_TXE) == 0);
        USART1->DR = *s++;
        if (*s == 0) break;
    }
}

mem - это массив с данными.

Если в отладчике зайти в эту фунцию и вручную шагать, то все работает. Если же сделать Step Over - HardFault.

Проект сгенерирован кубом. Он же правильно все тайминги выставляет? Задержка доступа к FLASH, частоты шин APB, AHB?
Go to the top of the page
 
+Quote Post
Forger
сообщение Feb 22 2017, 05:50
Сообщение #34


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(Forger @ Feb 21 2017, 18:31) *
Правильно так: кидать байты строки в некую программную очередь и разрешать передачу, заранее настроив прерывания от USART.


Цитата( @ Feb 22 2017, 07:53) *
Так и делаю сейчас.

Покажите код, где вы это делаете.


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
Chameleon
сообщение Feb 22 2017, 06:14
Сообщение #35


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 5-07-08
Пользователь №: 38 757



QUOTE (Forger @ Feb 22 2017, 08:50) *
Покажите код, где вы это делаете.


CODE
static char mem[16384];
static volatile uint32_t p;


void up(void)
{
    HAL_UART_Transmit(&huart1,(uint8_t *)mem,strlen(mem),100);
}

void dbgInit(void)
{
    memset(mem,0,16384);
    p = 0;
}

void UARTPrint(char *s)
{
    volatile uint32_t x;
    if(p > 16000) return;
  for(;;)
  {
        mem[p++] = *s++;
        if(*s == 0) break;
  }
}


в main:

dbgInit();
MX_USB_DEVICE_Init();

... задержка

up();

внутри перывания USB в самом начале

UARTPrint("\r\m-----IRQ");
Go to the top of the page
 
+Quote Post
Forger
сообщение Feb 22 2017, 06:49
Сообщение #36


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Я имел ввиду другое, гораздо более грамотное решение, связанное с обработчиком прерываний от USART, ну, да бог с ним, суть не в этом.
Короче, этот код работает или виснет в некой up()?


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
Chameleon
сообщение Feb 22 2017, 08:18
Сообщение #37


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 5-07-08
Пользователь №: 38 757



QUOTE (Forger @ Feb 22 2017, 09:49) *
Я имел ввиду другое, гораздо более грамотное решение, связанное с обработчиком прерываний от USART, ну, да бог с ним, суть не в этом.
Короче, этот код работает или виснет в некой up()?


Падает на этой функции:

CODE
void up(void)
{
    volatile char *s = mem;
    for(;;)
    {
        while((USART1->SR & USART_SR_TXE) == 0);
        USART1->DR = *s++;
        if (*s == 0) break;
    }
}

mem - это массив с данными.

Если в отладчике зайти в эту фунцию и вручную шагать, то все работает. Если же сделать Step Over - HardFault.

Сообщение отредактировал Chameleon - Feb 22 2017, 08:19
Go to the top of the page
 
+Quote Post
Forger
сообщение Feb 22 2017, 08:27
Сообщение #38


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(Chameleon @ Feb 22 2017, 11:18) *
Падает на этой функции:
Код
void up(void)
{
    volatile char *s = mem;
    for(;;)
    {
        while((USART1->SR & USART_SR_TXE) == 0);
        USART1->DR = *s++;
        if (*s == 0) break;
    }
}

Мля, я не про эту несчастную кривую функцию, которая не предназначенная для использования в прерываниях в принципе!
Я про тот набор текста, который приведен в посте #35. Оно работает как вам нужно или тоже типит?


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
Chameleon
сообщение Feb 22 2017, 08:33
Сообщение #39


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 5-07-08
Пользователь №: 38 757



QUOTE (Forger @ Feb 22 2017, 11:27) *
Мля, я не про эту несчастную кривую функцию, которая не предназначенная для использования в прерываниях в принципе!
Я про тот набор текста, который приведен в посте #35. Оно работает как вам нужно или тоже типит?


Падает на up().

Сообщение отредактировал Chameleon - Feb 22 2017, 08:33
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Feb 22 2017, 08:43
Сообщение #40


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Цитата(Chameleon @ Feb 21 2017, 10:35) *
Дефайн __HAL_PCD_CLEAR_FLAG определен как
Код
GINTSTS &= 0x40000000;

Но ведь для сброса флага прерывания в него надо записывать "1" ????
Т.е. делать так:
Код
GINTSTS |= 0x40000000;


Вообще говоря, этот код работает.
В это место вы попадаете с установленным 30-м битом; он ещё раз умножается на 30-й бит и записывается обратно.
Вариант
Код
GINTSTS |= 0x40000000;

неправильный, он лишние флажки поскидывает.
Простой и понятный вариант
Код
GINTSTS = 0x40000000;

но для индусов это слишком просто.

По делу не помогу. Я это нагромождение дефайнов и абстракций не осилил. Заметно лучше, чем SPL, но для прикручивания своего протокола понадобилось бы переписать половину этой "библиотеки". Плюнул, взял libopencm3 - там тоже переписывать надо, но хотя бы структура прозрачная.

Цитата(Forger @ Feb 22 2017, 11:27) *
Мля, я не про эту несчастную кривую функцию, которая не предназначенная для использования в прерываниях в принципе!


У меня вопрос. Где граница, при превышении которой этот самый-лучший-в-мире стек упадёт нафиг? Убираем несчастную кривую функцию, добавляем два высокоприоритетных прерывания. Будет работать? Увеличиваем частоту прерываний на порядок. Будет работать?

Стандартом заложено, что интерфейс может "подтормаживать". А библиотекописатели это не проверяли, у них в случае торможений всё вообще раком встаёт. Это проблема библиотеки, разве не так?


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
uriy
сообщение Feb 22 2017, 08:59
Сообщение #41


Гуру
******

Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606



Вероятно надо использовать HAL_UART_Transmit_IT или HAL_UART_Transmit_DMA для передачи по прерываниям или по DMA.
HAL_UART_Transmit передает по поллингу, эта функция блокирующая на все время передачи.
Go to the top of the page
 
+Quote Post
Forger
сообщение Feb 22 2017, 09:11
Сообщение #42


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(esaulenka @ Feb 22 2017, 11:43) *
Код
GINTSTS = 0x40000000;

но для индусов это слишком просто.
Так было сделано в одной из старых версий HAL, а щас стоит "&=". Видать, есть на то причины ...
Полагаю, что дело в разных особенностях работы разных битов в одном и том же регистре. В нюансы не вникал, но других причин не вижу.


Цитата
По делу не помогу. Я это нагромождение дефайнов и абстракций не осилил.

Не надо читать и вникать в эту кучу кода, достаточно лишь один раз скомпилировать в одну либу и подключить к проекту вместе с H-файлами.
Не забыть про ключик компиляции, при котором каждая функция кладется в свою ELF-секцию, так в финальную прошивку попадут только те функции, которые используются, а не целиком соотв. С-файл.

Цитата
У меня вопрос. Где граница, при превышении которой этот самый-лучший-в-мире стек упадёт нафиг? Убираем несчастную кривую функцию, добавляем два высокоприоритетных прерывания. Будет работать? Увеличиваем частоту прерываний на порядок. Будет работать?

Речь тут не про HAL/CUBE и т. п, а про совсем другое - про банальное нарушение базового правила кода под МК: заходить в прерывания можно только для того, чтобы "отметиться" и что-то просемафорить наружу в основной код.
А число-дробилки и циклы ожидания выносятся наружу в основной код. Иначе жди беды!




Цитата(uriy @ Feb 22 2017, 11:59) *
Вероятно надо использовать HAL_UART_Transmit_IT или HAL_UART_Transmit_DMA для передачи по прерываниям или по DMA.
HAL_UART_Transmit передает по поллингу, эта функция блокирующая на все время передачи.

Дык, с самого начала этой темы тока об этом и говорю, но что-то очень туго это доходит 1111493779.gif


Цитата(Chameleon @ Feb 22 2017, 11:33) *
Падает на up().

Вижу простое решение: отладить это чудо-код на ПУСТОМ проекте, добиться от него стабильной работы в разных ситуациях (банально тесты), и уже только после этого куда-то сувать.

Но я лично воспользовался бы уже готовым решением, которое не требует наличия UART и т.п.
Для этого достаточно уже существующего SWD или JTAG: https://electronix.ru/forum/index.php?s=&am...t&p=1482569
Таких тормозов нет и в помине. Работает как раз с полпинка, но обладает в сотни раз бОльшим функционалом. Бесплатно, исходники открыты.

Но коли нравиться изобретать велосипед, то конечно же продолжайте в том же духе:
Код
void UARTPrint(char *s)
{
    for(;;)
    {
        while((USART1->SR & USART_SR_TXE) == 0);
        USART1->DR = *s++;
        if (*s == 0) break;
    }
}


rolleyes.gif


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
Chameleon
сообщение Feb 22 2017, 09:20
Сообщение #43


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 5-07-08
Пользователь №: 38 757



QUOTE (Forger @ Feb 22 2017, 12:11) *
Вижу простое решение: отладить это чудо-код на ПУСТОМ проекте, добиться от него стабильной работы в разных ситуациях (банально тесты), и уже только после этого куда-то сувать.


Спасибо, КЭП.

Вы что, не понимаете, что это и есть ПУСТОЙ ПРОЕКТ. Только USB и UART. Что я и пытаюсь добиться стабильной работы в разных ситуациях? Да, да, передача строки по поллингу и есть СИТУАЦИЯ. И они должны работать вместе в любых комбинациях?

QUOTE (Forger @ Feb 22 2017, 12:11) *
Но я лично воспользовался бы уже готовым решением, которое не требует наличия UART и т.п.
Для этого достаточно уже существующего SWD или JTAG: https://electronix.ru/forum/index.php?s=&am...t&p=1482569
Таких тормозов нет и в помине. Работает как раз с полпинка, но обладает в сотни раз бОльшим функционалом. Бесплатно, исходники открыты.

Но коли нравиться изобретать велосипед, то продолжайте в том же духе:
CODE
void UARTPrint(char *s)
{
    for(;;)
    {
        while((USART1->SR & USART_SR_TXE) == 0);
        USART1->DR = *s++;
        if (*s == 0) break;
    }
}


rolleyes.gif


Отличный совет - не получается? Как нибудь придумай обход. Прилепи костыль. Авось по другому прокатит.

Go to the top of the page
 
+Quote Post
Forger
сообщение Feb 22 2017, 09:38
Сообщение #44


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(Chameleon @ Feb 22 2017, 12:20) *
Спасибо, КЭП.

Вы что, не понимаете, что это и есть ПУСТОЙ ПРОЕКТ. Только USB и UART.

А что делает тут USB?
Короче, ПУСТОЙ НОВЫЙ проект только для того, чтобы отладить ваши несчастные костыльные функции.
Добейтесь тут от них нормальной работы в ПУСТОМ проекте. Поиграйтесь с размером стека (например).
В конце концов, сделайте нормальный функционал БЕЗ поллинга!

Цитата
Что я и пытаюсь добиться стабильной работы в разных ситуациях? Да, да, передача строки по поллингу и есть СИТУАЦИЯ. И они должны работать вместе в любых комбинациях?

Я не пойму, чего вы хотите добиться? Чтобы проект был сделан сразу нормально и без костылей или, просто, хотите что-то доказать себе или кому-то?

Цитата
Отличный совет - не получается? Как нибудь придумай обход. Прилепи костыль. Авось по другому прокатит.

Костыль - это как раз ваша самодеятельная чудо-функция, использующая поллинг в прерывании.
Я же говорю про готовое решение, которое отлажено за вас и отлично работает как раз с полпинка, благодаря наличию документации и тому, что это написано профессионалами, а не любителями-изобретателями.
Если не хотите или не можете освоить готовые решения, так пользуйтесь и далее своими чудо-функциями, которая как вы говорите, "с полпинка работает на sam4s" и т. п.

Короче, далее бейтесь о стену уже без моей помощи - все, чем я мог помочь, тут уже прозвучало и неоднократно и не только от меня. Удачи wink.gif


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
Chameleon
сообщение Feb 22 2017, 09:52
Сообщение #45


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 5-07-08
Пользователь №: 38 757



QUOTE (Forger @ Feb 22 2017, 12:38) *
А что делает тут USB?
Короче, ПУСТОЙ НОВЫЙ проект только для того, чтобы отладить ваши несчастные костыльные функции.
Добейтесь тут от них нормальной работы в ПУСТОМ проекте. Поиграйтесь с размером стека (например).
В конце концов, сделайте нормальный функционал БЕЗ поллинга!


Я не пойму, чего вы хотите добиться? Чтобы проект был сделан сразу нормально и без костылей или, просто, хотите что-то доказать себе или кому-то?


Костыль - это как раз ваша самодеятельная чудо-функция, использующая поллинг в прерывании.
Я же говорю про готовое решение, которое отлажено за вас и отлично работает как раз с полпинка, благодаря наличию документации и тому, что это написано профессионалами, а не любителями-изобретателями.
Если не хотите или не можете освоить готовые решения, так пользуйтесь и далее своими чудо-функциями, которая как вы говорите, "с полпинка работает на sam4s" и т. п.

Короче, далее бейтесь о стену уже без моей помощи - все, чем я мог помочь, тут уже прозвучало и неоднократно и не только от меня. Удачи wink.gif


Вы вообще читаете, что я пишу? Какая от вас может быть помощь, если вы помните только то что было написано на первой странице поста?
Go to the top of the page
 
+Quote Post

6 страниц V  < 1 2 3 4 5 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 15th August 2025 - 22:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.01514 секунд с 7
ELECTRONIX ©2004-2016