Easyelectronics.ru

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

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



    • Изготовление печатных плат
    • Создание принципиальных схем и проектирование печатных плат
    • Симуляция работы на spice моделях
    • Просмотр GERBER файлов

Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: Странные задержки в работе программы на AT89C55WD
СообщениеДобавлено: 13 янв 2016, 13:52 
Свой человек

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 158
Доброго времени суток. Опять я со своими косяками...
В общем, перешли в приборе на OLED-индикатор, библиотеку для него переписал с нуля, индикатор работает. Но возникло вместе с ней странное явления в программе. Дело в том, что прибор перед входом непосредственно в рабочий режим проходит процедуру инициализации периферии. Ранее, со старым люминесцентным или ЖК индикатором, эта процедура занимала 900 мс. Теперь же, с введением нового индикатора задержка возросла сразу же до 2800 мс! При том, что вся процедура инициализации занимает около 560 мс, т.е. более полуторы секунды инициализация не должна быть, с учетом того, что в программу не было внесено более никаких изменений. Может ли кто подсказать, в чем могла возникнуть проблема?
Что самое странное, с внедрением данной библиотеки появился еще один стабильный глюк: при считывании данных с внешнего АЦП (AD7714), один критически важный параметр стал всегда стабильно выдавать больше нормы, при том, что в программе со старой библиотекой всегда работал корректно. При этом, никаких изменений в код АЦП уж тем более не было внесено.
Если что, все задержки завязаны на таймер. Сделать многозадачность никак не получалось, так как код влуплен в цикл while(1) всухую, никаких флаговых автоматов в коде не было, не говоря уже о диспетчерах.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Странные задержки в работе программы на AT89C55WD
СообщениеДобавлено: 13 янв 2016, 14:51 
Старожил

Зарегистрирован: 19 июн 2012, 14:17
Сообщения: 3338
Не видя код сложно что нибудь сказать по задержкам.
С АЦП возможно помехи. В OLED дисплеях обычно интегрирован импульсный повышающий преобразователь, он может шуметь.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Странные задержки в работе программы на AT89C55WD
СообщениеДобавлено: 13 янв 2016, 15:08 
Свой человек

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 158
яверт писал(а):
Не видя код сложно что нибудь сказать по задержкам.

Код такой громоздкий, что даже не знаю, с какой стороны его выкладывать. Могу показать лишь куски кода своей библиотеки, если нужно.
яверт писал(а):
С АЦП возможно помехи. В OLED дисплеях обычно интегрирован импульсный повышающий преобразователь, он может шуметь.

Может быть. Надо будет проверить, померить напругу. Но странно другое - даже если подключить старый индикатор - проблема остается. Потому закрадывается подозрение, что дело все-таки в коде.

В общем, если необходимо - могу выложить код своей библиотеки.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Странные задержки в работе программы на AT89C55WD
СообщениеДобавлено: 14 янв 2016, 14:01 
Свой человек

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 158
Хм... Продолжение следует.
Решил покопаться в дизассемблированной прошивке, чтобы понять, что же не так, т.к. в исходниках на Си все хорошо, насколько это может быть так.
И обнаружил очень странный баг.

Вот код того куска, где этот баг возникает:
Код:
      ORG 0000H
0000|    LJMP 000EH
      ORG 000BH
000B|    LJMP 1D1EH
000E|    MOV 81H,#0BCH
0011|    MOV R0,#0BCH
0013|    MOV @R0,#00H
0015|    DJNZ R0,0FCH
0017|    MOV DPTR, #0000H
001A|    MOV R6,83H
001C|    MOV R7,82H
001E|    MOV DPTR, #0000H
0021|    LCALL 004CH
0024|    JZ 05H
0026|    CLR A
0027|    MOVX @DPTR,A
0028|    INC DPTR
0029|    SJMP 0F6H
002B|    MOV DPTR, #00AAH
002E|    LCALL 0055H
0031|    MOV DPTR, #00AEH
0034|    LCALL 0055H
0037|    MOV DPTR, #00B2H
003A|    LCALL 0073H
003D|    MOV DPTR, #00B8H
0040|    LCALL 0073H
0043|    MOV 0D0H,#00H
0046|    LCALL 0999H
0049|    LJMP 00BEH
004C|    MOV A,R7
004D|    XRL A,82H
004F|    JNZ 03H
0051|    MOV A,R6
0052|    XRL A,83H
0054|    RET
0055|    CLR A
0056|    MOVC A,@A+DPTR
0057|    MOV R0,A
0058|    MOV A,#01H
005A|    MOVC A,@A+DPTR
005B|    MOV R1,A
005C|    MOV A,#02H
005E|    MOVC A,@A+DPTR
005F|    MOV R6,A
0060|    MOV A,#03H
0062|    MOVC A,@A+DPTR
0063|    MOV 82H,A
0065|    MOV 83H,R6
0067|    MOV A,R0
0068|    XRL A,R1
0069|    JNZ 01H
006B|    RET


Суть в следующем: исполняется этот кусок кода в самом начале себе распрекрасно, с вызовами и прыжками, все хорошо. За каким-то лешим балуется с DPTR'ом - по всей видимости, подготавливает память аргументов подпрограмм, вызываемых функций. До тех пор, пока не доходит до команды
Код:
LCALL 0055H
Там он аналогично занимается обработкой DPTR'а, доходит до адреса 0x006B, где стоит RET и возвращается ВНЕЗАПНО по адресу 0x0010, которого, собственно, и в листинге нет. Судя по всему, из-за того, что PC бросило на ошибочный адрес, процессор прочел команду, которой нет:
Код:
CJNE R4,#78H, 0BCH
Оттуда вдруг осуществляет прыжок в конец программной памяти (причем, каждый раз конечный адрес произволен, но варьируется где-то в окрестности конца Flash), где десяток-другой выполняет FF'ы, т.е. NOP'ы до самого 0xFFFF и благополучно возвращается в 0x0000, откуда все это повторяется.

Все эти результаты были получены в симуляторе EdSim. На приборе в железе, конечно, намертво не зависает, но задержка при инициализации возникает существенная. Появилось подозрение, что дело как раз-таки в этом. Может кто подсказать, откуда такая проблема могла вдруг возникнуть - при том, что в этом коде явного использования стека нигде нет.

На всякий случай, прикладываю исходники старой библиотеки для индикатора, новой библиотеки для OLED и начала кода вместе с инициализацией индикатора.

-Старая библиотека индикатора. Написана не мной.
Show


-Новая библиотека для OLED индикатора. Написана мной.
Show


-Начало кода программы, возможно, что-нибудь это даст. Написано не мной, кроме куска инициализации OLED-индикатора
Show



P.S. Код написан для компилятора IAR 92-го года.

P.P.S. Сразу извиняюсь за кракозябры вместо комментариев в коде - это издержки очень старого редактора MultiEdit, да и они сами по себе не информативны.


Последний раз редактировалось sdv_cyborg 14 янв 2016, 16:36, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Странные задержки в работе программы на AT89C55WD
СообщениеДобавлено: 15 янв 2016, 11:24 
Свой человек

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 158
Дополню еще тем кодом, который нагенерировал С-компилятор IAR'а понавставляв своих макросов объявления областей памяти под аргументы функций:

Show код


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Странные задержки в работе программы на AT89C55WD
СообщениеДобавлено: 26 янв 2016, 15:13 
Свой человек

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 158
В общем, тема закрывается - проблема решена очередным костылем, ответов не получил, но сам, покопавшись в дизасме, понял, что дело в жутком расточительстве ОЗУ.
Более тема не актуальна.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

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


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

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


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

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

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