Программирование STM8

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Сообщение axillent »

подскажите, как настроить IAR 3.10 на то, чтобы при компиляции выводиласт статистика по занятым ресурсам?
в 2.20 выводилось по умолчанию, в 3.10 по умолчанию нет ничего
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

в окошке вывода Build нажать правую кнопку мышы -> птичка All
Реклама
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Сообщение axillent »

спасибо! заработало
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Сообщение axillent »

есть ли какие то опции компилятора повысить стандарт С++?
в частности хотелось бы, чтобы принимался nullptr
Реклама
Эиком - электронные компоненты и радиодетали
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Сообщение axillent »

что может быть причиной того, что МК зависает внутри вектора прерываний ADC?

переписываю библиотеки на С++
всю инициализацию и все настройки регистров беру из рабочего варианта на Си
но при активации ADC судя по отладчику МК бесконечно отрабатывает только прерывания ADC, в основную программу не возвращается
флаги сбрасываю

внутри обработчика иедт вызов функции по адресу и если этот вызов закоментарить, то зависания прекращаются
при этом по отладке сам выхов отрабатывает так как надо, МК не виснат полностью, а хацикливается на векторе прерываний ADC

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

как то пагубно влияет сам факт вызова по адресу
потому, что даже если комментирую все строки кода которые вызываются то все равно циклится
как только убераю вызов по адресу цикл прекращается
Реклама
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 197
Зарегистрирован: Пн янв 24, 2011 01:51:48
Откуда: Украина, Киев

Сообщение RusikOk »

может переполнение стека?
Контактная информация:
Реклама
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Сообщение axillent »

[uquote="RusikOk",url="/forum/viewtopic.php?p=3179377#p3179377"]переполнение стека?[/uquote]
с чего оно возникнет?
опять же если бы было переполнение через какое то время МК просто ушел бы в никуда
а он упорно отрабатываепт вектор и весь мой код внутри вектора
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 197
Зарегистрирован: Пн янв 24, 2011 01:51:48
Откуда: Украина, Киев

Сообщение RusikOk »

[uquote="axillent",url="/forum/viewtopic.php?p=3179383#p3179383"]с чего оно возникнет?[/uquote]
от недостаточного размера стека[uquote="axillent",url="/forum/viewtopic.php?p=3179383#p3179383"]а он упорно отрабатываепт вектор и весь мой код внутри вектора[/uquote]ну так адрес возврата затертый
Контактная информация:
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Сообщение axillent »

[uquote="RusikOk",url="/forum/viewtopic.php?p=3179385#p3179385"]ну так адрес возврата затертый[/uquote]

если бы было так то два прерывания по таймерам бы тоже не работали, разве нет?
два прерывания работают а это одно даже одно не работает
сомнительно что это стек как то может быть причастен
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 197
Зарегистрирован: Пн янв 24, 2011 01:51:48
Откуда: Украина, Киев

Сообщение RusikOk »

ну stm8 я знаю плохо. потому чем смог тем попытался помочь
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

axillent писал(а): внутри обработчика иедт вызов функции по адресу и если этот вызов закоментарить, то зависания прекращаются
Возможно эта функция выполняется так долго, что АЦП успевает сделать следующее преобразование. Если это так, то можно уменьшить приоритет прерывания или выключать АЦП пока находишься в обработчике прерывания, сбрасывать флаг перед выходом из прерывания.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Сообщение axillent »

Там мизер кода, тем более как я выше написал влияет сам вызов даже если весь остальнойк од закомментировать
В программе которую переписываю кода больше и все работает
Явно какая то другая причина, что то упускаю
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Наверное без кода тогда Вам не помочь. Ищите что вносит закоментная функция. Вы ее по адресу вызываете, возможно RusikOk в правильном направлении наколку дал.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Сообщение axillent »

Кода довольно много из разных файлов

Есть универсальный класс шаблон который хранит статичный указатель на функцию и имеет методы sethandler и callhandler
Этот же шаблон применен для двух таймеров где все работает
Для универсальности ссылка описана как void (*handler_ptr)(void) и в таймерах это описание соотвествует реальным функциям
А в ADC реальная функция имеет аргумент типа uint16_t
Чтобы тем не менее использовать универсальный класс я делаю одно явное преобразование типа указателя при присвоении адреса статичной переменной и одно когда вызываю функцию из хандлера
Не может быть именно в этом какого то сюрприза?


добавка
все таки действительно что то не так с временем
после того как поменял предделитель ADC с 4 на максимальное 18 зацикливание прекратилось

но это не снимает вопроса - почему так?
есть старая программа на Си на том же железе и с теми же настройками железа - там работает с предделителем при том что кода внутри вектора больше, но нет выхова функций
в обоих случаях CLK_CKDIVR = 0
в программе на си ADC_CR1_SPSEL = 2, в программе на С++ так не работает, работает с ADC_CR1_SPSEL = 7

что еще может быть причиной? не может же один вызов функции быть таким времязатрантным?
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Сообщение axillent »

переписал проект на с++ получил +250 байт read write memory от линковщика
это RAM?
как понять на что ушло?
что еще странно - пишу новый проект, совершенно пустой проект на С++ - 524 байта read write memory
это вообще как?
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Стек?
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Сообщение arkhnchul »

а что за компилятор? sdcc, к примеру, кроме собственно результирующего бинарника выдает на гора еще ворох файлов, весьма во всех отношениях познавательных - ассемблерные листинги каждого компилируемого файла с комментариями из исходника; выхлоп диагностики линковщика, куда чего он какие символы положил, откуда их взял и сколько каждый занимает места; сводка использования областей памяти - вот такое, штук около десятка. В вашем такое поведение не присутствует или не включается флагами?
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Сообщение axillent »

я IAR использую, да, надо будет погружаться в схему распределения памяти у линковщика для С++
она явно отличается от Си

другой вопрос
происходит прерывание по GPIO и по усолчанию прерывания от таймеров не могут прозойти пока я не завершил прерывание по GPIO
можно как то внутри обработчика прерывания GPIO узнать, что тот или иной таймер переполнился? т.е. что должно будет следом произойти прерывание таймера
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

axillent писал(а):можно как то внутри обработчика прерывания GPIO узнать, что тот или иной таймер переполнился?
Ну у таймеров же флаги есть.
axillent писал(а):и по усолчанию прерывания от таймеров не могут прозойти пока я не завершил прерывание по GPIO
Приоритет можно сменить.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Сообщение axillent »

спасибо

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

а какой это флаг? TIF?
почему то для TIM4 он отмечен как "In TIM4 this bit is reserved."
Ответить

Вернуться в «Разные вопросы по МК»