Пишу программу для адама которая крутится в жестком цикле 17 мс. Само наполнение программы выполняется чуть быстрее и далее в холостую цикл выравнивается до 17. Залил программу на 4 лабораторных адама и увидел что один из адамов никак не вписывался в 17 мс. Написал простую програму в которой адам тупо гоняется по пустым циклам много раз и снова замерил на всех адамах. В итоге получилось что проблемный работал в 2 раза медленнее. На всех стоят r8800. Но судя по маркировке 3ое из 4 адамов принадлежат одной партии, а проблемный другой. Стыковался с Адвантехом, те перенаправили к китайцам, китайцы запросили прогу, я отослал. В итоге: Время 1 цикла: 3 адама: 13.6 мс 1 адам : 25.3 мс Китайские тесты: 21.7 мс
(При запущенной программе результаты печатаются на консоль и мигает светодиод.)
Китайцы больше ничего не отвечали. Это нормально что имеется такой разброс в производительности?
Вот программа замера времени: #include "5510DRV.H" #include <stdlib.H> #include <stdio.H> #include <conio.H> #include <dos.H>
outport(0xFF22,0x0012); was = inportb(0xFF2C); was&=0xFE;
outportb(0xFF2C,was);
}
int main() { LED_init();
LED_OFF(PWR); LED_OFF(RUN);
// (40 000 000 / 4) / 1 000 = 10 000 срабатываний в 1 сек или 10 сраб в 1 мс outport(T1_CA,1000); setvect(0xFF12,time); outport(T1_CON,0xE001);
while(1) { LED_OFF(PWR);
__gl_CurTick = 0; for(unsigned int i=0; i<0xFF; i++) for(unsigned int i=0; i<0xFF; i++);
LED_ON(PWR);
for( i=0; i<0xFF; i++) for(unsigned int i=0; i<0xFF; i++);
unsigned int end = __gl_CurTick; printf("%d\n" ,end);
}
return 0; }
Кварцы одинаковые на всех платах стоят?
У них там BIOS и системный диск на флешке в колодке стоит. Если снять с рабочего и поставить в проблемный что-нибудь изменится?
Еще не знаю, но хорошая мысля приходит опосля. Не успел я поменять флешки. Отобрал у меня ADAMы другой отдел, но скоро вернутся, возможно в эту пятницу, то есть завтра, тогда и проверим. Хотя почему-то надежды на плохой BIOS мало.
2 Andrey_5510E
а с чего вы взяли, что у вас цикл будет ровно 17мс?
Многое зависит от флагов оптимизации и пр. Тем более, вы как то странно перехватываете вектор и перегружаете таймер и обрабатываете прерывание.
Первоначально опубликовано kuzulis
а с чего вы взяли, что у вас цикл будет ровно 17мс?
Цикл 17 мс не относится к написанной выше программе. Это в другой. Приведенная выше программа просто замеряет цикл пустой беготни в for.
Первоначально опубликовано kuzulis
Многое зависит от флагов оптимизации и пр.
Что за флаги оптимизации? Вы имеете ввиду компилятор? Если да, то это единственная программа просто скопированная на разные контроллеры.
Первоначально опубликовано kuzulis
Тем более, вы как то странно перехватываете вектор
Я его не перехватываю, а заменяю на свой.
Первоначально опубликовано kuzulis
и перегружаете таймер
что значит перегружаю?
Первоначально опубликовано kuzulis
и обрабатываете прерывание.
Да извините выложил не поглядев, там остался лишний мусор должно быть так void interrupt timevect(__CPPARGS) { __gl_CurTick++; outport(0xFF22,0x0012); }
Но согласен, смешно было пытаться записать чтото в read-only регистр обслуживания прерывания 0x2С
Первоначально опубликовано Andrey_5510E
Да извините выложил не поглядев, там остался лишний мусор должно быть так void interrupt timevect(__CPPARGS) { __gl_CurTick++; outport(0xFF22,0x0012); }
Но согласен, смешно было пытаться записать чтото в read-only регистр обслуживания прерывания 0x2С
А нет, неправ, забыл что он read-only только в Slave режиме. Тогда все было верно должно быт так : void interrupt timevect(__CPPARGS) {
__gl_CurTick++;
outport(0xFF22,0x0012); was = inportb(0xFF2C); was&=0xFE; // регистор обслуживания outportb(0xFF2C,was);
}
я попутал и себя и народ!
Не, я не про то. Судя по коду перегрузки таймера 1 из библиотеки utilityX.lib (функция Timer_Init), китайцы вообще по-другому перегружают таймер. Правда они грузят на тики в 200Гц.
И код обработчика: [code=asm] .... .... _TEXT:0886 ; #line 724 _TEXT:0886 mov dx, 0FF22h _TEXT:0889 mov ax, 8 _TEXT:088C out dx, ax .... .... [/code]
Найдите отличия в вашем коде и их ;)
Только непонятно, зачем они у таймера 1 делают режим двойного счета для регистров A и В и загружают их числом 0C350h (50000), если можно было загрузить один регистр А этим числом и настроить таймер в режим одинарного счета (т.е. как у Вас).
Мне показалось проще и надежнее использовать свое где возможно, чем полагаться на разработчиков, тем более китайцев. Да и их таймер более грубый.
Вы не можете публиковать новые темы в этом форуме Вы не можете отвечать на сообщения в этом форуме Вы не можете удалять Ваши сообщения на этом форуме Вы не можете редактировать Ваши сообщения на этом форуме Вы не можете создавать голосования на этом форуме Вы не можете выражать своё мнение в голосованиях на этом форуме