Page 1 of 6

Пропуски зажигания при сборке GCC и новыми верс. IAR

Posted: Fri May 11, 2012 1:09 pm
by STC
Если собирать прошивку при помощи GCC и IAR-ом версии > 4.21, то наблюдаются пропуски зажигания.
Я тестировал на WinAVR 20100110. Более старые версии не проверял. Если у вас есть информация по более старым версиям GCC, то будет интересно.

Цель данной темы - выяснить и исправить причину описанного поведения.
Для начала нужно попытаться локализовать проблему. Наиболее вероятно что проблема в модуле ckps.c, так как этот модуль непосредственно отвечает за зажигание.
1. Нужно попробовать увеличить размер стека. В опциях компилятора;
2. Нужно убедиться что в момент пропусков микроконтроллер не перезагружается;
2. Убедиться что опции оптимизации кода не влияют на проявление проблемы;
3. Попробовать локализовать проблему путем компиляции выбранных модулей разными версиями компиляторов с последующей линковкой. Если такое возможно.

Re: Пропуски зажигания при сборке GCC и новыми верс. IAR

Posted: Fri May 11, 2012 1:40 pm
by skodafelicia
STC wrote:2. Нужно убедиться что в момент пропусков микроконтроллер не перезагружается;
Как?
STC wrote:2. Убедиться что опции оптимизации кода не влияют на проявление проблемы;
Это покопаю...

Re: Пропуски зажигания при сборке GCC и новыми верс. IAR

Posted: Fri May 11, 2012 2:03 pm
by STC
Проверить перезагружался ли микроконтроллер можно используя биты регистра:
MCU Control and Status Register – MCUCSR
В даташите больше информации.

В принципе, если происходит перезагрузка, то загорается СЕ на пол секунды. Так что перезагрузку будет видно.
Но я хочу сказать что микроконтроллер необязательно может перезагружаться. Может просто происходить слетание программы (например, прыжок по некорректному адресу), а потом восстановление.

Re: Пропуски зажигания при сборке GCC и новыми верс. IAR

Posted: Fri May 11, 2012 2:51 pm
by nikll
Попробуйте отключить оптимизацию (флаг -O0), более свежие версии gcc лудьше оптимизируют код, к примеру я сталкивался с тем что банальный цикл задержки типа:
for (uint16_t i = 0; i < 10000; i++);
превращался по сути в:
uint16_t i = 10000;
чтобы такого не происходило следует использовать volatile переменные в тех местах где требуется явное отключение оптимизации.
так же оптимизатор частенько разворачивает циклы и функции.

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

Re: Пропуски зажигания при сборке GCC и новыми верс. IAR

Posted: Fri May 11, 2012 2:57 pm
by STC
Да, кстати насчет volatile nikll правильно заметил. Я мог забыть кое-где поставить его.

Re: Пропуски зажигания при сборке GCC и новыми верс. IAR

Posted: Fri May 11, 2012 8:45 pm
by CrAzYMaN
хм, а может у меня с датчиком проблем нет? и перегружается МК?

Re: Пропуски зажигания при сборке GCC и новыми верс. IAR

Posted: Fri May 11, 2012 10:48 pm
by STC
На тех бинарях прошивок что в релизе пропусков не должно быть.

Re: Пропуски зажигания при сборке GCC и новыми верс. IAR

Posted: Sat May 12, 2012 4:10 am
by Stranger21
бинарники собранные STC без пропусков , проверено .

когда у меня были пропуски от 5го ИАР , то перезагрузки процессора я не наблюдал , ни в живую , ни в протеусе .

Re: Пропуски зажигания при сборке GCC и новыми верс. IAR

Posted: Sat May 12, 2012 6:42 pm
by ender11
http://sourceforge.net/projects/winavr/ ... /20060421/
-- тут winavr со старым добрым gcc 3-й версии.
и он таки не компилирует проект. может, кто допилит?

Re: Пропуски зажигания при сборке GCC и новыми верс. IAR

Posted: Sat May 12, 2012 9:58 pm
by skodafelicia
nikll wrote:как вариант найти ближайшую предыдущую версию которая компилирует нормально и сравнить асемблерные листинги.
2 листинга файла ckps на версии 4.21 и 6.10 - отличия на лице, тока я в них не разбираюсь (( - может кто умный посмотрит... Там-же и опции компилятора видны - я ничего не менял (кроме путей), все по дефолту из релиза
Собранную прошивку на 4.21 еще не тестил, завтра залью...