Медленная работа ADAM5510 |
Ответить |
Автор | |||||
Новичок Присоединился: 30 Июнь 2011 Online Status: Offline Публикации: 5 |
Опубликовано: 30 Июнь 2011 14:54 |
||||
Пишу программу для адама которая крутится в жестком цикле 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> #ifdef __cplusplus #define __CPPARGS ... #else #define __CPPARGS #endif #define T1_CA 0x0FF5A #define T1_CB 0x0FF5C #define T1_CON 0x0FF5E #define T1_CNT 0x0FF58 unsigned int __gl_CurTick=0; unsigned char was=0; void interrupt time(__CPPARGS) { __gl_CurTick++; 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; } |
|||||
Prosoft.ru Присоединился: 21 Июнь 2003 Online Status: Offline Публикации: 432 |
|||||
Кварцы одинаковые на всех платах стоят?
У них там BIOS и системный диск на флешке в колодке стоит. Если снять с рабочего и поставить в проблемный что-нибудь изменится?
|
|||||
Новичок Присоединился: 30 Июнь 2011 Online Status: Offline Публикации: 5 |
|||||
Еще не знаю, но хорошая мысля приходит опосля. Не успел я поменять флешки. Отобрал у меня ADAMы другой отдел, но скоро вернутся, возможно в эту пятницу, то есть завтра, тогда и проверим. Хотя почему-то надежды на плохой BIOS мало.
|
|||||
Участник Присоединился: 04 Декабрь 2008 Категория: Russian Federation Online Status: Offline Публикации: 81 |
|||||
2 Andrey_5510E
а с чего вы взяли, что у вас цикл будет ровно 17мс? Многое зависит от флагов оптимизации и пр. Тем более, вы как то странно перехватываете вектор и перегружаете таймер и обрабатываете прерывание. |
|||||
Новичок Присоединился: 30 Июнь 2011 Online Status: Offline Публикации: 5 |
|||||
Цикл 17 мс не относится к написанной выше программе. Это в другой. Приведенная выше программа просто замеряет цикл пустой беготни в for.
Что за флаги оптимизации? Вы имеете ввиду компилятор? Если да, то это единственная программа просто скопированная на разные контроллеры.
Я его не перехватываю, а заменяю на свой.
что значит перегружаю?
Да извините выложил не поглядев, там остался лишний мусор должно быть так void interrupt timevect(__CPPARGS) { __gl_CurTick++; outport(0xFF22,0x0012); } Но согласен, смешно было пытаться записать чтото в read-only регистр обслуживания прерывания 0x2С |
|||||
Новичок Присоединился: 30 Июнь 2011 Online Status: Offline Публикации: 5 |
|||||
А нет, неправ, забыл что он read-only только в Slave режиме. Тогда все было верно должно быт так : void interrupt timevect(__CPPARGS) { __gl_CurTick++; outport(0xFF22,0x0012); was = inportb(0xFF2C); was&=0xFE; // регистор обслуживания outportb(0xFF2C,was); } я попутал и себя и народ! |
|||||
Участник Присоединился: 04 Декабрь 2008 Категория: Russian Federation Online Status: Offline Публикации: 81 |
|||||
Не, я не про то.
Судя по коду перегрузки таймера 1 из библиотеки utilityX.lib (функция Timer_Init), китайцы вообще по-другому перегружают таймер. Правда они грузят на тики в 200Гц. Вот листинг: [code=asm] _TEXT:0897 public _Timer_Init _TEXT:0897 _Timer_Init proc near _TEXT:0897 push bp _TEXT:0898 mov bp, sp _TEXT:089A push si _TEXT:089B ; #line 746 _TEXT:089B cmp ds:word_10A7B, 1 _TEXT:08A0 jnz short loc_108A7 _TEXT:08A2 ; #line 747 _TEXT:08A2 mov ax, 1 _TEXT:08A5 _TEXT:08A5 loc_108A5: ; CODE XREF: _Timer_Init+71j _TEXT:08A5 jmp short loc_1090A _TEXT:08A7 ; --------------------------------------------------------------------------- _TEXT:08A7 ; #line 751 _TEXT:08A7 _TEXT:08A7 loc_108A7: ; CODE XREF: _Timer_Init+9j _TEXT:08A7 push 12h _TEXT:08A9 call _getvect _TEXT:08AC pop cx _TEXT:08AD mov word_10EDC, dx _TEXT:08B1 mov _oldT1_vector, ax _TEXT:08B4 ; #line 753 _TEXT:08B4 push seg _TEXT _TEXT:08B7 push offset _timer_irq_handle _TEXT:08BA call _timerSetTimer1Vect _TEXT:08BD add sp, 4 _TEXT:08C0 ; #line 754 _TEXT:08C0 mov dx, 0FF5Eh _TEXT:08C3 mov ax, 6003h _TEXT:08C6 out dx, ax _TEXT:08C7 ; #line 755 _TEXT:08C7 mov dx, 0FF5Ah _TEXT:08CA mov ax, 0C350h _TEXT:08CD out dx, ax _TEXT:08CE ; #line 756 _TEXT:08CE mov dx, 0FF5Ch _TEXT:08D1 mov ax, 0C350h _TEXT:08D4 out dx, ax _TEXT:08D5 ; #line 757 _TEXT:08D5 mov dx, 0FF58h _TEXT:08D8 xor ax, ax _TEXT:08DA out dx, ax _TEXT:08DB ; #line 758 _TEXT:08DB mov dx, 0FF2Ch _TEXT:08DE in ax, dx _TEXT:08DF mov si, ax _TEXT:08E1 ; #line 759 _TEXT:08E1 mov ax, si _TEXT:08E3 and ax, 7FEh _TEXT:08E6 mov dx, 0FF2Ch _TEXT:08E9 out dx, ax _TEXT:08EA ; #line 761 _TEXT:08EA mov dx, 0FF28h _TEXT:08ED in ax, dx _TEXT:08EE mov si, ax _TEXT:08F0 ; #line 762 _TEXT:08F0 mov ax, si _TEXT:08F2 and ax, 7FEh _TEXT:08F5 mov dx, 0FF28h _TEXT:08F8 out dx, ax _TEXT:08F9 ; #line 764 _TEXT:08F9 mov dx, 0FF5Eh _TEXT:08FC mov ax, 0E003h _TEXT:08FF out dx, ax _TEXT:0900 ; #line 766 _TEXT:0900 mov ds:word_10A7B, 1 _TEXT:0906 ; #line 768 _TEXT:0906 xor ax, ax _TEXT:0908 jmp short loc_108A5 _TEXT:090A ; --------------------------------------------------------------------------- _TEXT:090A ; #line 769 _TEXT:090A _TEXT:090A loc_1090A: ; CODE XREF: _Timer_Init:loc_108A5j _TEXT:090A pop si _TEXT:090B pop bp _TEXT:090C retn _TEXT:090C _Timer_Init endp [/code] И код обработчика: [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), если можно было загрузить один регистр А этим числом и настроить таймер в режим одинарного счета (т.е. как у Вас). |
|||||
Новичок Присоединился: 30 Июнь 2011 Online Status: Offline Публикации: 5 |
|||||
Мне показалось проще и надежнее использовать свое где возможно, чем полагаться на разработчиков, тем более китайцев. Да и их таймер более грубый.
|
|||||
Ответить |
Переход на форум | Права доступа на форуме Вы не можете публиковать новые темы в этом форуме Вы не можете отвечать на сообщения в этом форуме Вы не можете удалять Ваши сообщения на этом форуме Вы не можете редактировать Ваши сообщения на этом форуме Вы не можете создавать голосования на этом форуме Вы не можете выражать своё мнение в голосованиях на этом форуме |