
Сообщение от
Titus
Это было бы очень грубой ошибкой.
Да и если бы было так, то на периодах 16мкс (96 тактов), сбоили бы 23 из 24 записей, т.к. цикл шины весьма мал, скажем 4 такта, и если бы таймер мог воспринимать информацию на шине всего лишь раз в 96 тактов (по такту с предделителя), почти все записи улетали бы мимо.
Тут явно глюк другого плана.
Вот какой глюк и какого плана надо думать. С разрешения Titus-а воспользовался его исходником теста и получил листинг. Доказательства насчет адреса.
Первоначально адрес загрузки в ОЗУ ПП неизвестен, поэтому п/п пользователя может быть загружена по любому адресу, но с помощью утилиты PMEM можно определить адрес загрузки. Сперва, когда был загружен только драйвер WD, свободная область начиналась с адреса 024566, прибавим размер заголовка в 6 байт, получим 024574. Так глючное число в этом случае было равно 3598, или 07016 в восьмеричном представлении. Так как счетчик в программируемом таймере 12-разрядный, то уместно предположить, что это часть адреса, и предположительно, с учетом начального адреса загрузки полный адрес будет равен 027016. Разница между ними составляет 027016-024574=02222.
Теперь глянем на листинг, вот начало программы, загружаемой в ОЗУ ПП:
Код:
707 ;===================================================================================
708 ;
709 ; nA^ALO PEREME]AEMOJ OBLASTI
710 ;
711 ;===================================================================================
712 002340 PPUTBeg:
713
714 ;===================================================================================
715 ;
716 ; fUNKCIQ TESTIROWANIQ SKOROSTI RABOTY TAJMERA
717 ;
718 ; wYHODNYE DANNYE: PSTATE - ZNA^ENIE TAJMERA
719 ;
720 ;===================================================================================
721 002340 SPDPPU:
722 002340 106427 000340 MTPS #^O340 ;zAPRETITX PRERYWANIQ
723
Как видно при трансляции она получила адрес 02340. Прибавим к нему полученное ранее значение 02222, получается 04562. Глянем в листинг:
Код:
1373 ;===============================================
1374 004550 TBErrProc:
1375 004550 010701 MOV PC,R1 ;R1 = TEMP2
1376 004552 062701 000310 ADD #TEMP2-.,R1 ;
1377 004556 011137 177712 MOV (R1),@#TMRBUF ;(TEMP2) -> TMRBUF
1378
1379 004562 011010 MOV (R0),(R0) ;pAUZA >= 480 TAKTOW
1380 004564 011010 MOV (R0),(R0) ;(DLQ TO^NOJ ZAPISI BUFERNOGO REGISTRA
1381 004566 011010 MOV (R0),(R0) ;W S^ET^IK)
1382 004570 011010 MOV (R0),(R0) ;
1383 004572 011010 MOV (R0),(R0) ;
1384 004574 011010 MOV (R0),(R0) ;
1385 004576 011010 MOV (R0),(R0) ;
1386 004600 011010 MOV (R0),(R0) ;
1387
1388 004602 012701 177714 MOV #TMRCURR,R1 ;tO^NOE ^TENIE REGISTRA TEKU]EGO ZNA^ENIQ
1389 004606 011100 MOV (R1),R0 ;TAJMERA S RAZBLOKIROWKOJ
1390 004610 051100 BIS (R1),R0 ;R0 - REGISTR TEKU]EGO ZNA^ENIQ
1391 004612 010000 MOV R0,R0 ;
1392 004614 051100 BIS (R1),R0 ;
1393 004616 051100 BIS (R1),R0 ;
1394 004620 010000 MOV R0,R0 ;
1395 004622 051100 BIS (R1),R0 ;
1396 004624 051100 BIS (R1),R0 ;
1397 004626 010000 MOV R0,R0 ;
1398 004630 051100 BIS (R1),R0 ;
1399
1400 004632 010701 MOV PC,R1 ;R1 = TEMP2
1401 004634 062701 000226 ADD #TEMP2-.,R1 ;
1402
1403 004640 005700 TST R0 ;
1404 004642 001002 BNE 1$ ;
1405 004644 005215 INC (R5) ;eSLI R0 = 0, TO PRIRA]IWAEM S^ET^IK NULEJ
1406 004646 000406 BR 2$ ;--> 2$
1407
1408 004650 1$:
1409 004650 021100 CMP (R1),R0 ;eSLI R0 <> (TEMP2), TO
1410 004652 001404 BEQ 2$ ;PRIRA]IWAEM ^ISLO PROMAHOW
1411 004654 005265 000002 INC 2(R5) ;
1412
1413 004660 050065 000004 BIS R0,4(R5) ;zAPISYWAEM S^ITANNOE ^ISLO W PAMQTX PO OR
1414 004664 2$:
1415
1416 004664 011100 MOV (R1),R0 ;(R1) <-> (R1 + 2)
1417 004666 016111 000002 MOV 2(R1),(R1) ;(OBMENQTX MESTAMI KONSTANTY PROWERKI)
1418 004672 010061 000002 MOV R0,2(R1) ;
1419
1420 004676 000207 RETURN
Здесь как раз та самая подпрограмма, которая проверяет вероятность незаписи в буферный регистр. Как раз по адресу 04562 находится следующая команда, которая следует за командой MOV (R1),@#TMRBUF, осуществляющей запись в буферный регистр. Как ведет себя процессор при исполнении этой команды. Т.к. предыдущая команда состоит из двух слов, поэтому условие предвыборки нарушено. Процессор по адресу 027012 читает код команды 011137. Во время ее дешифрации читается следующее слово из памяти по предвыборке - адрес 027014, значение 177712. Во время дешифрации читается значение из памяти по значению регистра R1, это источник. Далее по адресу 027014 у нас уже прочитано значение 177712, по этому адресу происходит запись, это приемник. Т.к. предвыборка нарушена, то процессору остается выставить на шину адрес 027016 для чтения следующей команды. Вот это значение иногда и попадает в буферный регистр.
Попадающее иногда значение 976 при 4 мкс я пока объяснить не могу, ясно, что это не адрес, т.к. оно постоянно, вне зависимости от того, сколько загружено резидентов в ОЗУ ПП. Единственно, что могу предположить, это то, что процессор в это время снимает собственно данные с шины, а снятие немного проходит неравномерно, то часть битов становится битами данных, а часть нулями. Пока только так.
Жду комментариев и критики.