в 2.20 выводилось по умолчанию, в 3.10 по умолчанию нет ничего
Программирование STM8
- Сообщения: 1040
- Зарегистрирован: Вс сен 25, 2011 19:09:33
подскажите, как настроить IAR 3.10 на то, чтобы при компиляции выводиласт статистика по занятым ресурсам?
в 2.20 выводилось по умолчанию, в 3.10 по умолчанию нет ничего
в 2.20 выводилось по умолчанию, в 3.10 по умолчанию нет ничего
- Реклама
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
- Сообщения: 1040
- Зарегистрирован: Вс сен 25, 2011 19:09:33
- Сообщения: 1040
- Зарегистрирован: Вс сен 25, 2011 19:09:33
есть ли какие то опции компилятора повысить стандарт С++?
в частности хотелось бы, чтобы принимался nullptr
в частности хотелось бы, чтобы принимался nullptr
- Сообщения: 1040
- Зарегистрирован: Вс сен 25, 2011 19:09:33
что может быть причиной того, что МК зависает внутри вектора прерываний ADC?
переписываю библиотеки на С++
всю инициализацию и все настройки регистров беру из рабочего варианта на Си
но при активации ADC судя по отладчику МК бесконечно отрабатывает только прерывания ADC, в основную программу не возвращается
флаги сбрасываю
внутри обработчика иедт вызов функции по адресу и если этот вызов закоментарить, то зависания прекращаются
при этом по отладке сам выхов отрабатывает так как надо, МК не виснат полностью, а хацикливается на векторе прерываний ADC
причем точно такой же подход - вызов функции по адресу применен и для векторов по таймерам, там такой проблемы нет
пересмотрел все и настройки регистров и пошагов весь код который отрабатывает по вектору - не могу понять причины
как то пагубно влияет сам факт вызова по адресу
потому, что даже если комментирую все строки кода которые вызываются то все равно циклится
как только убераю вызов по адресу цикл прекращается
переписываю библиотеки на С++
всю инициализацию и все настройки регистров беру из рабочего варианта на Си
но при активации ADC судя по отладчику МК бесконечно отрабатывает только прерывания ADC, в основную программу не возвращается
флаги сбрасываю
внутри обработчика иедт вызов функции по адресу и если этот вызов закоментарить, то зависания прекращаются
при этом по отладке сам выхов отрабатывает так как надо, МК не виснат полностью, а хацикливается на векторе прерываний ADC
причем точно такой же подход - вызов функции по адресу применен и для векторов по таймерам, там такой проблемы нет
пересмотрел все и настройки регистров и пошагов весь код который отрабатывает по вектору - не могу понять причины
как то пагубно влияет сам факт вызова по адресу
потому, что даже если комментирую все строки кода которые вызываются то все равно циклится
как только убераю вызов по адресу цикл прекращается
- Реклама
может переполнение стека?
- Сообщения: 1040
- Зарегистрирован: Вс сен 25, 2011 19:09:33
[uquote="RusikOk",url="/forum/viewtopic.php?p=3179377#p3179377"]переполнение стека?[/uquote]
с чего оно возникнет?
опять же если бы было переполнение через какое то время МК просто ушел бы в никуда
а он упорно отрабатываепт вектор и весь мой код внутри вектора
с чего оно возникнет?
опять же если бы было переполнение через какое то время МК просто ушел бы в никуда
а он упорно отрабатываепт вектор и весь мой код внутри вектора
[uquote="axillent",url="/forum/viewtopic.php?p=3179383#p3179383"]с чего оно возникнет?[/uquote]
от недостаточного размера стека[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
[uquote="RusikOk",url="/forum/viewtopic.php?p=3179385#p3179385"]ну так адрес возврата затертый[/uquote]
если бы было так то два прерывания по таймерам бы тоже не работали, разве нет?
два прерывания работают а это одно даже одно не работает
сомнительно что это стек как то может быть причастен
если бы было так то два прерывания по таймерам бы тоже не работали, разве нет?
два прерывания работают а это одно даже одно не работает
сомнительно что это стек как то может быть причастен
ну stm8 я знаю плохо. потому чем смог тем попытался помочь
Возможно эта функция выполняется так долго, что АЦП успевает сделать следующее преобразование. Если это так, то можно уменьшить приоритет прерывания или выключать АЦП пока находишься в обработчике прерывания, сбрасывать флаг перед выходом из прерывания.axillent писал(а): внутри обработчика иедт вызов функции по адресу и если этот вызов закоментарить, то зависания прекращаются
- Сообщения: 1040
- Зарегистрирован: Вс сен 25, 2011 19:09:33
Там мизер кода, тем более как я выше написал влияет сам вызов даже если весь остальнойк од закомментировать
В программе которую переписываю кода больше и все работает
Явно какая то другая причина, что то упускаю
В программе которую переписываю кода больше и все работает
Явно какая то другая причина, что то упускаю
Наверное без кода тогда Вам не помочь. Ищите что вносит закоментная функция. Вы ее по адресу вызываете, возможно RusikOk в правильном направлении наколку дал.
- Сообщения: 1040
- Зарегистрирован: Вс сен 25, 2011 19:09:33
Кода довольно много из разных файлов
Есть универсальный класс шаблон который хранит статичный указатель на функцию и имеет методы sethandler и callhandler
Этот же шаблон применен для двух таймеров где все работает
Для универсальности ссылка описана как void (*handler_ptr)(void) и в таймерах это описание соотвествует реальным функциям
А в ADC реальная функция имеет аргумент типа uint16_t
Чтобы тем не менее использовать универсальный класс я делаю одно явное преобразование типа указателя при присвоении адреса статичной переменной и одно когда вызываю функцию из хандлера
Не может быть именно в этом какого то сюрприза?
добавка
все таки действительно что то не так с временем
после того как поменял предделитель ADC с 4 на максимальное 18 зацикливание прекратилось
но это не снимает вопроса - почему так?
есть старая программа на Си на том же железе и с теми же настройками железа - там работает с предделителем при том что кода внутри вектора больше, но нет выхова функций
в обоих случаях CLK_CKDIVR = 0
в программе на си ADC_CR1_SPSEL = 2, в программе на С++ так не работает, работает с ADC_CR1_SPSEL = 7
что еще может быть причиной? не может же один вызов функции быть таким времязатрантным?
Есть универсальный класс шаблон который хранит статичный указатель на функцию и имеет методы 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
переписал проект на с++ получил +250 байт read write memory от линковщика
это RAM?
как понять на что ушло?
что еще странно - пишу новый проект, совершенно пустой проект на С++ - 524 байта read write memory
это вообще как?
это RAM?
как понять на что ушло?
что еще странно - пишу новый проект, совершенно пустой проект на С++ - 524 байта read write memory
это вообще как?
- Сообщения: 6457
- Зарегистрирован: Пт сен 13, 2013 13:11:31
а что за компилятор? sdcc, к примеру, кроме собственно результирующего бинарника выдает на гора еще ворох файлов, весьма во всех отношениях познавательных - ассемблерные листинги каждого компилируемого файла с комментариями из исходника; выхлоп диагностики линковщика, куда чего он какие символы положил, откуда их взял и сколько каждый занимает места; сводка использования областей памяти - вот такое, штук около десятка. В вашем такое поведение не присутствует или не включается флагами?
- Сообщения: 1040
- Зарегистрирован: Вс сен 25, 2011 19:09:33
я IAR использую, да, надо будет погружаться в схему распределения памяти у линковщика для С++
она явно отличается от Си
другой вопрос
происходит прерывание по GPIO и по усолчанию прерывания от таймеров не могут прозойти пока я не завершил прерывание по GPIO
можно как то внутри обработчика прерывания GPIO узнать, что тот или иной таймер переполнился? т.е. что должно будет следом произойти прерывание таймера
она явно отличается от Си
другой вопрос
происходит прерывание по GPIO и по усолчанию прерывания от таймеров не могут прозойти пока я не завершил прерывание по GPIO
можно как то внутри обработчика прерывания GPIO узнать, что тот или иной таймер переполнился? т.е. что должно будет следом произойти прерывание таймера
Ну у таймеров же флаги есть.axillent писал(а):можно как то внутри обработчика прерывания GPIO узнать, что тот или иной таймер переполнился?
Приоритет можно сменить.axillent писал(а):и по усолчанию прерывания от таймеров не могут прозойти пока я не завершил прерывание по GPIO
- Сообщения: 1040
- Зарегистрирован: Вс сен 25, 2011 19:09:33
спасибо
приоритет не хотелось бы менять. вложенные прерывания могут создать еще проблем как мне кажется
а какой это флаг? TIF?
почему то для TIM4 он отмечен как "In TIM4 this bit is reserved."
приоритет не хотелось бы менять. вложенные прерывания могут создать еще проблем как мне кажется
а какой это флаг? TIF?
почему то для TIM4 он отмечен как "In TIM4 this bit is reserved."



