Easyelectronics.ru

Электроника для всех
Текущее время: 23 ноя 2017, 03:03

Часовой пояс: UTC + 5 часов



    • 10 шт. 2-слоя 100*100mm 2$. Быстрый заказ: JLCPCB.com
    • JLCPCB - это крупнейшая фабрика PCB прототипов в Китае.
    • Имеющий более 290,000 клиентов и выполняющий более 8,000 заказов в день.
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Semihosting в CoIDE. Уходит в HardFault_Handler_Ret и виснет
СообщениеДобавлено: 06 июл 2017, 16:04 
Заглядывает иногда

Зарегистрирован: 17 окт 2015, 14:26
Сообщения: 58
В общем понадобилось для отладки сделать передачу данных на комп с АЦП. Использую плату stm32l-discovery с камнем stm32l152rbt6. Разумеется самое быстрое и простое это использовать уже распаянный на плате программатор и отладчиком принимать данные в консоль. Но возникла проблема:
Вначале я попытался для проверки работоспоcобности канала вывести строку "Hello world" с помощью функции SH_SendString. Это получилось. Ну а дальше чтоб передавать именно числа мне необходимо использовать printf. А вот он уже работать отказывается. Дебагом вижу следующее:
после захода в функцию printf:
Код:
signed int printf(const char *pFormat, ...)
{
    va_list ap;
    signed int result;

    /* Forward call to vprintf */
    va_start(ap, pFormat);
    result = vprintf(pFormat, ap);
    va_end(ap);

    return result;
}

В функцию va_start залезть по чему то не могу, но её то программа проделывает без зависания. а вот дальше залезаем в vprintf:
Код:
signed int vprintf(const char *pFormat, va_list ap)
{
    return vfprintf(stdout, pFormat, ap);
}

Ок лезем внутрь:
Код:
HardFault_Handler:
   LDR    R0, [R13, #24]            /* Get previous PC */
   LDRH   R1, [R0]                  /* Get instruction */
   LDR    R2, =0xBEAB               /* The sepcial BKPT instruction */
   CMP    R1, R2                    /* Test if the instruction at previous PC is BKPT */
   BNE    HardFault_Handler_Ret     /* Not BKPT */

   ADDS   R0, #4                    /* Skip BKPT and next line */
   STR    R0, [R13, #24]            /* Save previous PC */

   BX     LR

HardFault_Handler_Ret:
   B      .


.end

0_0 Тут я если честно в замешательстве. Попадаем куда-то судя по всему в асемблерный факл. Функция уходит в HardFault_Handler_Ret и там зависает. Я честно хз что делать. На форум кокоса пробиться не могу. Ни один из браузеров не показывает картинки на этом форуме и капчу при регистрации. Пробовал ставить последний CooCox V2 beta. Там без регистрации не скачать все нужные либы в repository.
Сам сижу на версии 1.7.8. Винда 10. Пробовал делать то что советуют вот здесь:
https://www.youtube.com/watch?v=wiIcF-i1Hd8
и здесь:
http://we.easyelectronics.ru/CADSoft/za ... coide.html
Не помогает.
Я в курсах что кокос не лучшая среда, но переходить на новую сейчас будет для меня слишком много времени. Подскажите что исправить, чтоб я мог работать с функцией printf. Заранее спасибо. Проект прикрепляю ниже:
https://cloud.mail.ru/public/Gjw9/nCmGo89AH
Может кому-то пригодиться, там я в своё время сделал либу для работы с дисплеем на этой платке. Она корявая, но работает. Когда я не знал что такое дебаг, очень помогала отлаживать проекты) Как скромную плату за помощь можете забрать себе :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Semihosting в CoIDE. Уходит в HardFault_Handler_Ret и виснет
СообщениеДобавлено: 06 июл 2017, 16:22 
Старожил
Аватара пользователя

Зарегистрирован: 01 ноя 2011, 23:51
Сообщения: 438
Насколько я понимаю ф-ция printf должна быть переопределена под собственные нужды. Иначе Вы попадете куда-то но не ясно куда. Вернее в данном случае Вы пишите куда-то в запрещенную область памяти и сваливаетесь в обработчик ошибки.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Semihosting в CoIDE. Уходит в HardFault_Handler_Ret и виснет
СообщениеДобавлено: 06 июл 2017, 16:43 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2010, 15:41
Сообщения: 1026
Откуда: Германия
используйте sprintf в свой локальный буффер, и потом именно его передавайте SH_SendString.
Еще неплохо было бы показать ваш вызов printf'а. С какими параметрами вы его вызываете?

_________________
Мои поделки
http://www.fun-electronic.net/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Semihosting в CoIDE. Уходит в HardFault_Handler_Ret и виснет
СообщениеДобавлено: 06 июл 2017, 17:12 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 3377
Переделайте отладчик в JLINK и используйте его механизм вывода.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Semihosting в CoIDE. Уходит в HardFault_Handler_Ret и виснет
СообщениеДобавлено: 06 июл 2017, 18:04 
Заглядывает иногда

Зарегистрирован: 17 окт 2015, 14:26
Сообщения: 58
MasterAlexei писал(а):
С какими параметрами вы его вызываете?

Я свой проект расшарил в облаке и ссыль кинул в топике. там в main.c единственный вызов этой функции, легко найдёте.
Цитата:
используйте sprintf в свой локальный буффер, и потом именно его передавайте SH_SendString.

Боюсь sprintf в кокосе ни чем не отличается от printf
Код:
signed int sprintf(char *pStr, const char *pFormat, ...)
{
    va_list ap;
    signed int result;

    // Forward call to vsprintf
    va_start(ap, pFormat);
    result = vsprintf(pStr, pFormat, ap);
    va_end(ap);

    return result;
}

Цитата:
Переделайте отладчик в JLINK и используйте его механизм вывода.

То есть перепрошить программатор на плате придётся. А он точно стабильный? Помню как долго добивался того что бы ST-link-ом прямо из кокоса шить и дебажить можно было. Как бы в принципе возможность дебага не потерять.
Цитата:
Насколько я понимаю ф-ция printf должна быть переопределена под собственные нужды.

А не тыкните носом где прочитать о том как её переписывать и на что? Уж не имеете ли вы в виду что собственноручно надо функции семихостинга писать для этого?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Semihosting в CoIDE. Уходит в HardFault_Handler_Ret и виснет
СообщениеДобавлено: 06 июл 2017, 18:24 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 3377
Show по JLink


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Semihosting в CoIDE. Уходит в HardFault_Handler_Ret и виснет
СообщениеДобавлено: 06 июл 2017, 19:43 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2010, 15:41
Сообщения: 1026
Откуда: Германия
Код:
int rez_temp=0;
...
printf("aaa=%a \r\n",rez_temp);


Ни о чем не говорит?
Цитата:
тут
%a Hexadecimal floating point, lowercase -0xc.90fep-2

Ну и потом - в ембеддед поддержка float типов в printf'ах не шибко сильно поддерживается. Старайтесь избегать этого. Пишите свою функцию вывода float типов.

_________________
Мои поделки
http://www.fun-electronic.net/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Semihosting в CoIDE. Уходит в HardFault_Handler_Ret и виснет
СообщениеДобавлено: 06 июл 2017, 22:35 
Заглядывает иногда

Зарегистрирован: 17 окт 2015, 14:26
Сообщения: 58
И правда с аргументами printf я ошибся. Но проблемы это не меняет. Пытался написать так:
Код:
printf("aaa=%i \r\n",rez_temp);

Результат тот же. Я подумал что это из за того что типы int в моём 64-битном комне и в 32-битном МК имеют разную длину. Тогда надо использовать дополнительные параметры. Я честно попробовал для верности все. И ни с одним ничего не поменялось. Что интересно даже с параметром "Li" всё компилируется хотя параметр "L" не относится к параметру "i". Чтото тут вообще не то.
Но прибавилась ещё проблема. Я пока ждал ответов набросал себе костыль с использованием работающей функции SH_SendString что бы передавать int:
Show

Но работает он крайне медленно. С ним я не смогу гнать данные даже килогерцовой частоты. Кто знает в принципе semihosting даже если все функции работают может передавать данные хотя бы с килогерцовой частотой?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Semihosting в CoIDE. Уходит в HardFault_Handler_Ret и виснет
СообщениеДобавлено: 06 июл 2017, 22:44 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2010, 15:41
Сообщения: 1026
Откуда: Германия
Prizrak_kommunizma писал(а):
И правда с аргументами printf я ошибся. Но проблемы это не меняет.

А sprintf тоже вешается?

_________________
Мои поделки
http://www.fun-electronic.net/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Semihosting в CoIDE. Уходит в HardFault_Handler_Ret и виснет
СообщениеДобавлено: 06 июл 2017, 22:58 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 4329
Просто не использовать долбаный кокос, просто же...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Semihosting в CoIDE. Уходит в HardFault_Handler_Ret и виснет
СообщениеДобавлено: 06 июл 2017, 23:02 
Заглядывает иногда

Зарегистрирован: 17 окт 2015, 14:26
Сообщения: 58
dosikus_2 писал(а):
Просто не использовать долбаный кокос, просто же...

Я кажется ясно написал:
Цитата:
Я в курсах что кокос не лучшая среда, но переходить на новую сейчас будет для меня слишком много времени.


Цитата:
А sprintf тоже вешается?

да


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Semihosting в CoIDE. Уходит в HardFault_Handler_Ret и виснет
СообщениеДобавлено: 06 июл 2017, 23:02 
Старожил
Аватара пользователя

Зарегистрирован: 04 окт 2011, 10:19
Сообщения: 1077
Думаю кокос тут не при делах.
Тогда уже gcc не использовать.
Хотя весь мир не может ошибаться.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Semihosting в CoIDE. Уходит в HardFault_Handler_Ret и виснет
СообщениеДобавлено: 06 июл 2017, 23:22 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2010, 15:41
Сообщения: 1026
Откуда: Германия
Prizrak_kommunizma писал(а):
Цитата:
А sprintf тоже вешается?

да

Тогда дело в инициализации стека, слишком мало его у вас, здается мне.
У меня sprintf пашет и жужжит. (gcc-arm-none-eabi-5_4q3)
Но все эти (x)printf функции очень уж прожорливые до стека.

Еще вопрос и кажется - в нем все и дело: вы используете стандартную библиотеку полную или урезанную?
параметр компилятора "-specs=nano.specs" включает использование именно урезанной stdlib. А она имеет неприятную особенность - передача параметров НЕ выравнена на 4 байта. Точнее там нет выравнивания вовсе, и в STM32 все падает в HardFault на самых безобидных местах (у меня падает на memcpy). Причем иногда перестает падать, когда вызов функций передвинуть на одну - две операции вперед-назад, т.е. поменять расположение параметров в памяти.

_________________
Мои поделки
http://www.fun-electronic.net/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Semihosting в CoIDE. Уходит в HardFault_Handler_Ret и виснет
СообщениеДобавлено: 06 июл 2017, 23:42 
Заглядывает иногда

Зарегистрирован: 17 окт 2015, 14:26
Сообщения: 58
Переключился тоже на версию компилятора 5.4, но воз и ныне там.
MasterAlexei писал(а):
Еще вопрос и кажется - в нем все и дело: вы используете стандартную библиотеку полную или урезанную?
параметр компилятора "-specs=nano.specs" включает использование именно урезанной stdlib. А она имеет неприятную особенность - передача параметров НЕ выравнена на 4 байта. Точнее там нет выравнивания вовсе, и в STM32 все падает в HardFault на самых безобидных местах (у меня падает на memcpy). Причем иногда перестает падать, когда вызов функций передвинуть на одну - две операции вперед-назад, т.е. поменять расположение параметров в памяти.

ээээээ прошу прощения я пока не понимаю такое колдунство. Где глянуть параметры компилятора и как поменять чтоб заработало?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Semihosting в CoIDE. Уходит в HardFault_Handler_Ret и виснет
СообщениеДобавлено: 06 июл 2017, 23:46 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2010, 15:41
Сообщения: 1026
Откуда: Германия
Ну это уже вопрос к кокосоводам. Я компилятор из командной строки запускаю :)

_________________
Мои поделки
http://www.fun-electronic.net/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Semihosting в CoIDE. Уходит в HardFault_Handler_Ret и виснет
СообщениеДобавлено: 07 июл 2017, 17:25 
Старожил
Аватара пользователя

Зарегистрирован: 01 ноя 2011, 23:51
Сообщения: 438
http://blablacode.ru/mikrokontrollery/450
http://we.easyelectronics.ru/STM32/prim ... m32f4.html


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Semihosting в CoIDE. Уходит в HardFault_Handler_Ret и виснет
СообщениеДобавлено: 07 июл 2017, 23:00 
Заглядывает иногда

Зарегистрирован: 17 окт 2015, 14:26
Сообщения: 58
kos писал(а):
http://blablacode.ru/mikrokontrollery/450

Поднимать аппаратный uart только ради отладки уж больно не хочется. У меня есть переходник usb-uart но это оставил пока на крайний случай если через дебагер никак не получиться считывать данные.
kos писал(а):
http://we.easyelectronics.ru/STM32/primenenie-printf-v-stm32f4.html

Тут для меня слишком сложно написано. Что бы было понятно, я на высоком уровне вообще не работал :). Как собирать компиляторы, ковырять линковщики и т.д. это для меня тёмный лес. В универе работали только в плюсах с тамошним printf но там всё было зашибись и дербанить компилятор что бы выводить данные в консоль ненужно было. Видимо по этому и проблемы такие возникают, что в С-коде мк разобраться могу, а в компиляторы никогда не влезал. Если кто-то посоветует дельную литературу на эту тему буду признателен.

Ну а тем временем я поменял прошивку программатора на j-link, добавил в проект файлы для семихостинга от SEGGER, а также поставил их ПО. Что интересно теперь я могу только дебажить, кнопка, просто заливающая прошивку в МК, стала серой. В настройках в графе download пишет: "No configuration items". Да и фиг бы с ним. Хуже другое:
При попытке использования функций SEGGER_RTT_printf, SEGGER_RTT_vprintf, SEGGER_RTT_WriteString и, подозреваю, остальных тоже ПРОГА ВСЁ ТАК ЖЕ ВИСНЕТ! Теперь при пошаговой отладке вижу что все дороги ведут вот к этой функции:
Код:
int SEGGER_RTT_Write(unsigned BufferIndex, const char* pBuffer, unsigned NumBytes)

А она в свою очередь работает норм. Но на строчке
Код:
MEMCPY(_SEGGER_RTT.aUp[BufferIndex].pBuffer + _SEGGER_RTT.aUp[BufferIndex].WrOff, pBuffer, NumBytesToWrite);

повисает. А при дальнейшей работе улетает аж в файл surtup_stm32l1xx_md.c, а точнее сюда:
Код:
static void Default_Handler(void)
{
  /* Go into an infinite loop. */
  while (1)
  {
  }
}

Проект прикрепляю:
https://cloud.mail.ru/public/65MA/nxBiXFEs4
Меня преследует злой рок. Что сейчас я делаю не так?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Semihosting в CoIDE. Уходит в HardFault_Handler_Ret и виснет
СообщениеДобавлено: 07 июл 2017, 23:41 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2010, 15:41
Сообщения: 1026
Откуда: Германия
Default_Handler(void)
это заглушка на всякие прерывания, на которые у вас нет своего обработчика.

Какой адрес конкретно получается в вызове MEMCPY(_SEGGER_RTT.aUp[BufferIndex].pBuffer + _SEGGER_RTT.aUp[BufferIndex].WrOff, pBuffer, NumBytesToWrite);
Какое значение дает выражение _SEGGER_RTT.aUp[BufferIndex].pBuffer + _SEGGER_RTT.aUp[BufferIndex].WrOff
и какое значение у pBuffer.
Если нечетное (нулевой бит в 1), то Default_Handler(void) это скрорее всего MemManage_Handler.

Найдите в файле surtup_stm32l1xx_md.c (скорее всего все же startup_stm32l1xx_md.c) таблицу векторов и поглядите как называются функции векторов MPU Fault, Bus Fault, Usage Fault. Определите эти функции типа такого:

Код:
void MemManage_Handler( void )
{
    while ( 1 )
    {
       __asm("BKPT #0\n") ; // Break into the debugger
    }
}

void BusFault_Handler( void )
{
    while ( 1 )
    {
       __asm("BKPT #0\n") ; // Break into the debugger
    }
}

void UsageFault_Handler( void )
{
    while ( 1 )
    {
       __asm("BKPT #0\n") ; // Break into the debugger
    }
}

И посмотрите, где остановится.

Еще почитайте вот эту ссылочку: viewtopic.php?f=35&t=25347

Цитата:
Тут для меня слишком сложно написано. Что бы было понятно, я на высоком уровне вообще не работал :). Как собирать компиляторы, ковырять линковщики и т.д. это для меня тёмный лес.

Зажгите свет в этом лесу - читайте! Иначе ничего не выйдет, и вы заблудитесь в лесу и помрете с голоду.

_________________
Мои поделки
http://www.fun-electronic.net/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Semihosting в CoIDE. Уходит в HardFault_Handler_Ret и виснет
СообщениеДобавлено: 08 июл 2017, 17:03 
Старожил
Аватара пользователя

Зарегистрирован: 04 окт 2011, 10:19
Сообщения: 1077
А можно взять SES (segger) - по шаблону сделать проект. И сразу получить код для RTT, HardFault и прочей лабудени. И тот же gcc будет из коробки


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Semihosting в CoIDE. Уходит в HardFault_Handler_Ret и виснет
СообщениеДобавлено: 09 июл 2017, 18:05 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 4329
X893, и никаких кокосов...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Semihosting в CoIDE. Уходит в HardFault_Handler_Ret и виснет
СообщениеДобавлено: 09 июл 2017, 23:38 
Старожил

Зарегистрирован: 19 апр 2016, 11:59
Сообщения: 252
Prizrak_kommunizma писал(а):
Я в курсах что кокос не лучшая среда, но переходить на новую сейчас будет для меня слишком много времени.
Возьмите среду EmBitz. В ней импортер проектов из кокоса. Semihosting совместно с ST-Link работает нормально. Неоднократно проверено.
Его нужно включить в настройках отладчика и линкера.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Semihosting в CoIDE. Уходит в HardFault_Handler_Ret и виснет
СообщениеДобавлено: 13 авг 2017, 22:58 
Заглядывает иногда

Зарегистрирован: 17 окт 2015, 14:26
Сообщения: 58
В итоге решил что стоит с умирающего кокоса пока что уйти и перешёл на SES. Попыхтеть пришлось пока переносил в него проект из кокоса, в заголовочных файлах, загружаемых в SES, не описано куча регистров, которые имелись и спокойно юзались в заголовочных файлах, которые автоматом загружались в кокосе. Но их я дописал, попутно возникло другое затруднение. Наверное не стоит заводить новую тему, спрошу тут:
Понадобилось передавать переменные типа float и double по семихостингу. Однако при попытке их передать ничего кроме пробелов не передаётся. Функцию юзаю так:
printf("%f\r\n",sum);
В хэлпе нашёл такое вот пояснение к printf:
Show

Из этого следует, что возможно я юзаю неправильные либы. Тогда вопрос, где взять правильные? К проекту автоматом подключается 4 либы:
SEGGER_RTT.с
SEGGER_RTT.h
SEGGER_RTT_conf.h
SEGGER_RTT_SES.с
Но ни в одной из них я не нашёл настроек, связанных с передачей плавающей точки.
Находил я так же советы, связанные с тем, что надо прописать какую-то хитрую команду в настройках линковщика:
https://mcuoneclipse.com/2015/04/23/sem ... gn-studio/
Однако в SES я этой возможности не нашёл.
Обычные символы и int передаётся без проблем.
В общем пока что в замешательстве, тыкнете носом, что делать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Semihosting в CoIDE. Уходит в HardFault_Handler_Ret и виснет
СообщениеДобавлено: 14 авг 2017, 10:35 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 4329
Prizrak_kommunizma писал(а):
не описано куча регистров, которые имелись и спокойно юзались в заголовочных файлах, которые автоматом загружались в кокосе. Но их я дописал, попутно возникло другое затруднение.


Prizrak_kommunizma писал(а):
В общем пока что в замешательстве, тыкнете носом, что делать?



О каких хэдерах вы вещаете? Все регистры описаны в stm32Fxxx.h .
Насчет float

Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Semihosting в CoIDE. Уходит в HardFault_Handler_Ret и виснет
СообщениеДобавлено: 14 авг 2017, 16:09 
Старожил

Зарегистрирован: 19 апр 2016, 11:59
Сообщения: 252
Prizrak_kommunizma писал(а):
Проект прикрепляю ниже:
https://cloud.mail.ru/public/Gjw9/nCmGo89AH
404


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Semihosting в CoIDE. Уходит в HardFault_Handler_Ret и виснет
СообщениеДобавлено: 14 авг 2017, 21:32 
Старожил
Аватара пользователя

Зарегистрирован: 04 окт 2011, 10:19
Сообщения: 1077
SES использует gcc, значит надо прочитать как устроен вывод из printf (STDOUT и про стэк не забыть), потом одну функцию опредить для вывода байта (куда надо) и танцевать танец радости без бубна.
Хотя в кокосе это есть (да и в любот из 3 компилятор тоже)

Можете в CubeMX посмотреть файл retarget.c (если совсем лень читать).


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB