![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
SuperMax |
![]()
Сообщение
#21
|
![]() Администратор ![]() ![]() ![]() ![]() ![]() Группа: Root Admin Сообщений: 6 248 Регистрация: 7.1.2006 Из: Красноярск Пользователь №: 1 ![]() |
Обновление драйверов AZ.
V05.00
Код .IND AZGEN ; ;AZ/RT-11 HANDLER GENERATION PROGRAM. ; ;AZ V05.01 ; * USE EIS INSTRUCTIONS? [Y/N D:N]: * ENTER HANDLER NAME (AZ/DA) [S R:0-204 D:"DA"]: ; ;BUILDING DA.SYS (RT-11SJ/SB/FB): ; NO ERROR LOGGING SUPPORT ; NO MEMORY MANAGEMENT SUPPORT ; NO DEVICE TIMEOUT SUPPORT ; USING BASE INSTRUCTION SET ; .MAC/OB:DA AZPRE+AZ .LIN/NOBI/EXE:DA.SYS DA ; ;BUILDING DAE.SYS (RT-11SJ/SB/FB): ; ERROR LOGGING SUPPORT ; NO MEMORY MANAGEMENT SUPPORT ; NO DEVICE TIMEOUT SUPPORT ; USING BASE INSTRUCTION SET ; .MAC/OB:DAE AZPRE+AZ .LIN/NOBI/EXE:DAE.SYS DAE ; ;BUILDING DAT.SYS (RT-11SJ/SB/FB): ; NO ERROR LOGGING SUPPORT ; NO MEMORY MANAGEMENT SUPPORT ; DEVICE TIMEOUT SUPPORT ; USING BASE INSTRUCTION SET ; .MAC/OB:DAT AZPRE+AZ .LIN/NOBI/EXE:DAT.SYS DAT ; ;BUILDING DAET.SYS (RT-11SJ/SB/FB): ; ERROR LOGGING SUPPORT ; NO MEMORY MANAGEMENT SUPPORT ; DEVICE TIMEOUT SUPPORT ; USING BASE INSTRUCTION SET ; .MAC/OB:DAET AZPRE+AZ .LIN/NOBI/EXE:DAET.SYS DAET ; ;BUILDING DAX.SYS (RT-11XM/XB/ZM/ZB/TSX-PLUS): ; NO ERROR LOGGING SUPPORT ; MEMORY MANAGEMENT SUPPORT ; DEVICE TIMEOUT SUPPORT ; USING EXTENDED INSTRUCTION SET ; .MAC/OB:DAX AZPRE+AZ .LIN/NOBI/EXE:DAX.SYS DAX ; ;BUILDING DAXE.SYS (RT-11XM/XB/ZM/ZB): ; ERROR LOGGING SUPPORT ; MEMORY MANAGEMENT SUPPORT ; DEVICE TIMEOUT SUPPORT ; USING EXTENDED INSTRUCTION SET ; .MAC/OB:DAXE AZPRE+AZ .LIN/NOBI/EXE:DAXE.SYS DAXE ; .DEL/NOQ AZPRE.MAC .DEL/NOQ DA(,E,T,ET,X,XE).OBJ ; 15-Apr-2021 DA .SYS 3 15-Apr-2021 DAT .SYS 3 15-Apr-2021 DAE .SYS 3 15-Apr-2021 DAX .SYS 3 15-Apr-2021 DAET .SYS 3 15-Apr-2021 DAXE .SYS 3 15-Apr-2021 6 Files, 18 Blocks 19561 Free blocks ; @ <EOF> . ![]() ![]() ![]() ![]() ![]() ![]() ![]() -------------------- Живы будем - Не помрем !
|
SuperMax |
![]()
Сообщение
#22
|
![]() Администратор ![]() ![]() ![]() ![]() ![]() Группа: Root Admin Сообщений: 6 248 Регистрация: 7.1.2006 Из: Красноярск Пользователь №: 1 ![]() |
Выложил образ диска AZ с дистрибутивом RSX-11M-PLUS V4.6.
см https://zx-pk.ru/threads/28134-kontroller-p...l=1#post1113574 Изменения в дистрибутиве по сравнению с оригиналом:
Для поддержки более 8 устройств требуется Firmware v2.0 или новее. Для контроллера AZ поддерживается автоконфигурация. При этом количество устройств будет посчитано по максимальному используемому номеру. Если такой вариант не подходит - можно подправить результат автоконфигурации. Если при генерации не была выбрана автоконфигурация или было выбрано изменение результатов автоконфигурации - будут заданы вопросы про количество AZ11 контроллеров (пока поддерживается не более одного), про количестве устройств, про соответствие номеров устройств драйвера физическим номерам устройств, а также про адрес регистра контроллера и его вектор. В большинстве случаев можно использовать ответы по умолчанию. Следует обратить внимание, что в вопросах про номер устройства используется восьмеричная система счисления, тогда как в файле AZ.INI - десятичная. Код >; >; DA: controller: AZ11 >; >; The AZ11 disk controller supports up to 32 disk drives mapped to >; disk image files stored on FAT32-formatted microSD memory stick. >; >* CP3604 How many AZ11 disk image controllers do you have? [O R:0-1 D:0]: 1 >; >; Enter the total number of AZ11 disk drives in your system. >; >* CP3608 How many AZ11 disk drives do you have? [D R:1.-32. D:32.]: >; >; >; The physical unit number of a drive is the number specified >; in AZ.INI file in the root of microSDHC card filesystem. >; >* CP3636 What is the physical unit number of DA0:? [O R:0-37 D:0]: >; >; >* CP3636 What is the physical unit number of DA1:? [O R:0-37 D:1]: ... >; >* CP3636 What is the physical unit number of DA37:? [O R:0-37 D:37]: >; >; >; Enter the vector address for this controller. This vector address >; can be changed after the SYSGEN by using the VMR CON SET command. >; >* CP3668 Enter the vector address of DAA [O R:60-774 D:174]: >; >; Enter the CSR address for this controller. This CSR address can >; be changed after the SYSGEN by using the VMR CON SET command. >; >* CP3672 What is its CSR address? [O R:160000-177700 D:177220]: Особенности генерации системы на ДВК: Прежде всего стоит отметить, что для нормальной работы системы требуется хотя бы 512Кб памяти. В принципе загрузить RSX-11M-PLUS можно и в 256Кб (минимальная 22-битная конфигурация), но процесс подготовки системы к этому весьма трудоемкий, а результат не будет стоить затраченных усилий. В базовой системе используется частота таймера 60Hz. Если хочется более точно наблюдать за временем в процессе генерации системы - стоит установить правильную частоту и время перед запуском SYSGEN. Код >CON SET SYS $TKPS=50. >TIM 28-APR-2021 22:54:30 В данном дистрибутиве ACF определяет процессор ВМ3 как 11/23-PLUS - это позволяет использовать автоконфигурацию оборудования. Код >* SU100 Do you want to run Autoconfigure on the host system >* hardware? [Y/N D:N]: [B]Y[/B] Если автоконфигурация не была выбрана - на вопрос о типе процессора стоит ввести 11/23-PLUS. Код >* CE010 What is your target processor type? [S R:3.-12. D:"11/70"]: [B]11/23-PLUS[/B] Процессор ВМ3 не поддерживает разделения пространств инструкций и данных. Для таких систем лучше не включать XDT при генерации (это уменьшает количество свободной динамической памяти), а использовать загружаемый XDT. Код * CE270 Do you want to include XDT? [Y/N D:N]: [B]N[/B] В качестве устройства крэш-дампа стоит выбрать XX: (загружаемый драйвер). Код >* CE290 On what device and unit do you want crash dumps >* to be written? [S R:2-6]: [B]XX:[/B] После завершения процесса генерации, грузим новую систему командой BOO [1,54] и сохраняем с записью апраратного загрузчика командой SAV /WB. Так же для улучшения производительности стоит добавить опцию /MOU="/ACP=UNIQUE". Код >SAV /WB/MOU="/ACP=UNIQUE" В рабочей системе есть смысл включить кэширование дисков (если память позволяет). Это значительно ускоряет работу (хотя и не всегда). Код >SET /CACHE=LB:(CRE=::1200:TOP,LOG=10,VIR=10,DIR=10,OVE= 10,REA=10,DEF) Можно загрузить системный отладчик XDT. Код >LOA /EXP=XDT/VEC/FLAGS=2/HIGH На случай сбоев можно загрузить CRASH драйвер DA: для сохранения аварийного дампа с целью его анализа программой CDA. Код >SET /CRASHDEV=DA37: https://youtu.be/0TiHkDidjtE ![]() -------------------- Живы будем - Не помрем !
|
SuperMax |
![]()
Сообщение
#23
|
![]() Администратор ![]() ![]() ![]() ![]() ![]() Группа: Root Admin Сообщений: 6 248 Регистрация: 7.1.2006 Из: Красноярск Пользователь №: 1 ![]() |
Новые команды контроллеров AZ*
Старые команды тут Работа с энергонезависимой памятью интерфейс предоставляет любому AZ-контроллеру доступ к 255 словам энергонезависимой памяти: для работы есть команды 021: //считать блок 1 энергонезависимой памяти в буфер 022: // отдать на шину считанный блок энергонезависимой памяти из буфера 023: // принять с шины в буфер данные для последующей записи в буфер 024: // записать из буфера в блок 1 энергонезависимой памяти все команды по выполнению, просто устанавливает бит готовности по завершению примеры работы Код AZ$CSR = 177220; регистр команд и состояния (CSR) AZ$DR = 177222; регистр данных (DR) ; trap 50 - cброс AZ ; результат в R1 =0 ok AZreset: MOV #AZ$CSR,R1 1$: CLR (R1); Пошлем команду "Сброс" TSTB (R1); Проверим готовность контроллера BPL 1$; Если не готов, сбрасываем еще ; раз и проверяем снова TST (R1); Проверим на ошибку, BMI 0ERR$ CLR R1 return 0ERR$: CLR R1 COM R1 return ; trap 54 - чтение энергонезависимой памяти блока 1 EEPROM в буфер с адреса ADREEPROMMEM ; результат R3 - адрес, если R3=0 ошибка ; статус чтения в R1 0 - ok ; 1 - размер не соответствует сохраненному ; 2 - oшибка версии ; 3 - oшибка контрольной суммы ReadEEPROM: push R2 call AZreset; сбросим tst R1 bne 0ERR$ ; теперь читаем MOV #AZ$CSR,R1 mov #21,(R1); считать блок 1 энергонезависимой памяти в буфер 0$: TSTB (R1); проверяем результат выполнения BPL 0$; ждем mov #22,(R1); отдать на шину считанный блок энергонезависимой памяти из буфера 1$: TSTB (R1); проверяем результат выполнения BPL 1$; ждем TST (R1)+; инкрементируем mov #ADREEPROMMEM,R3 mov #256.,R2; читаем 256. слов; первое слово - результат чтения 2$: mov (R1),(R3)+; читаем блок слов в память sob R2,2$ mov #ADREEPROMMEM,R3; успешно mov (R3),R1 br 0END$ 0ERR$: CLR R3 0END$: pop R2 return ; trap 55 - запись энергонезависимой памяти из буфера с адреса ADREEPROMMEM в блок 1 EEPROM WriteEEPROM: push R1 push R2 push R3 call AZreset; сбросим tst R1 bne 0ERR$ MOV #AZ$CSR,R1 mov #23,(R1); командуем что будем писать данные в буфер 0$: TSTB (R1); проверяем результат выполнения BPL 0$; ждем TST (R1)+; инкрементируем mov #ADREEPROMMEM+2,R3 mov #255.,R2; пишем 255. слов; первое слово пропускаем - результат чтения 1$: mov (R3)+,(R1); отдаем в контроллер sob R2,1$ tst -(R1); декрементируем mov #24,(R1); записать из буфера в блок 1 энергонезависимой памяти 2$: TSTB (R1); проверяем результат выполнения BPL 2$; ждем br 0END$ 0ERR$: CLR R3 0END$: pop R3 pop R2 pop R1 return очевидно, после считывания памяти необходимо проверить код результата в первом слове - см расшифровку кодов ошибок Примеры возвращаемых данных по командам последовательная подача команды 021 и затем 022 позволит считать 256. слов из энергонезависимой памяти первое слово это будет статус успешности чтения коды ошибок ; 0 - ok ; 1 - размер не соответствует сохраненному ; 2 - oшибка версии ; 3 - oшибка контрольной суммы технически для эмуляции данного фунционала, нужен файл 255. слов. Обращаю внимание, при записи, буфер идет сразу с данными, те нет первого слова со статусом. Считывание версии 027: // отдаем версию firmware AZ STM32 типовое возвращаемое значение на шину первое слово - 06404 = старший байт 13. это версия прошивки, младший байт 4. это версия железа - те AZБК в данном случае второе слово - 037 = это максимальный монтируемый диск - 31. RTC Часы 031: // получить время из часов МК в буфер timestamp 032: // получить время из буфера timestamp в МПИ 033: // запись времени-даты в буфер (ручная установка часов) формат SimpleIN ( 7 слов) 034: // установка автономных часов на основании данных из буфера 035: // стимуляция запроса времени с NTP сервера, установка на основании ответа 036: // установка автономных часов STM32 на основании часов в TCP/IP стеке 042: // получить время из часов TCP/IP стека в буфер timestamp все команды по выполнению, просто устанавливает бит готовности по завершению формат timestamp на чтение Код ; формат буфера даты-времени ; offset в восьмеричной системе - те слова ; формат буфера даты-времени ; offset ; [0]=rtc_rt11date(); ; [2]=rt11 time 50Hz big word; ; [4]=rt11 time 50Hz little word; ; [6]=rt11 time 60Hz big word; ; [10]=rt11 time 60Hz little word; ; [12]=rtc_fat_date(); ; [14]=rtc_fat_time(); ; [16]=year+2000; ; [20]=month; ; [22]=day; ; [24]=wday; ; [26]=hour; ; [30]=min; ; [32]=sec; формат буфера SimpleIN - 7 слов Код ; [0]=year год, младшие две цифры - те 22 а не 2022(!) ; [2]=month; месяц ; [4]=day; день ; [6]=wday; день недели =0 не установлен, 1- понедельник 2 - вторник итд ; [10]=hour; час ; [12]=min; минута ; [14]=sec; секунда Примеры работы с часами Получение времени Код ; работа с часами ; trap 60 - чтение данных часов из TCP/IP стека ; R3 - адрес буфера куда надо считать ; результат в R3 адрес, если успешно. R3=0 если ошибка GetDateFromLAN: push R0 push R1 push R2 call AZreset; сбросим tst R1 bne G60ERR MOV #AZ$CSR,R1 mov #42,(R1) G60: TSTB (R1); проверяем результат выполнения BPL G60; ждем mov #32,(R1) 1$: TSTB (R1); проверяем результат выполнения BPL 1$; ждем TST (R1)+; инкрементируем mov R3,R0; запомним R3 - адрес mov #10.,R2; читаем 10 слов 2$: mov (R1),(R3)+; читаем блок слов в память sob R2,2$ mov R0,R3; успешно, вернем адрес в R3 br 0END$ G60ERR: CLR R3 0END$: pop R2 pop R1 pop R0 return ; trap 61 - чтение данных часов из автономных часов RTC ; R3 - адрес буфера куда надо считать ; результат в R3 адрес, если успешно. R3=0 если ошибка GetDateFromRTC: push R0 push R1 push R2 call AZreset; сбросим tst R1 bne G60ERR MOV #AZ$CSR,R1 mov #31,(R1) br G60; идем туда тк дальше код одинаковый отсылка запроса на установку времени с NTP сервера Код ; trap 62 - отсылка запроса на установку времени с NTP сервера GetDateNTPtoNET:push R1 call AZreset; сбросим tst R1 bne 0ERR$ MOV #AZ$CSR,R1 mov #35,(R1) 0$: TSTB (R1); проверяем результат выполнения BPL 0$; ждем 0ERR$: pop R1 return технически на это надо 1-2 секунды проверка Код ; trap 63 - проверка корректности времени ; R3 - адрес буфера, результат в R3, если адрес буфера то OK, =0 ошибка CheckDateTime: Cmp 6(r3),#2021. Blos 1err Cmp 6(r3),#2100. Bhi 1err 0ok$: return 1err$: clr R3 return пример цикла опроса с целью получить время с сети Код ; дата-время mov #S_DateTime_0,R3; "Lan Date:" trap 10 mov #20,R4; количество циклов ожидания $datry: trap 62; отослали запрос к NTP серверу mov #110,@#AZ$CSR; включим сеть trap 47; ожидание trap 47; ожидание mov #ADRTMPSTR,R3 trap 60; считали в буфер дату-время trap 63; проверили дату-время tst R3 bne $ok $sob: sob R4,$datry mov #S_DateTime_2,R3; печать ошибки trap 7 br $go $ok: mov #ADRTMPSTR,R3 trap 24; печать даты trap 25; времени $go: mov #110,@#AZ$CSR; включим сеть установка времени RTC на основании времени стека Код ; trap 64 - установка времени RTC на основании времени стека ; R1 - результат R1=0 - OK SetDateNETtoRTC:call AZreset; сбросим tst R1 bne 0ERR$ MOV #AZ$CSR,R1 mov #36,(R1) 0$: TSTB (R1); проверяем результат выполнения BPL 0$; ждем clr R1 0ERR$: return те изначально надо получить в стеке нормальное время, затем установить время в RTC на основании времени стека Примеры возвращаемых данных, восьмеричные значения 067362 ; [0]=rtc_rt11date(); 000062 ; [2]=rt11 time 50Hz big word; 024240; [4]=rt11 time 50Hz little word; 000074; [6]=rt11 time 60Hz big word; 030300; [10]=rt11 time 60Hz little word; 055567; [12]=rtc_fat_date(); 044766; [14]=rtc_fat_time(); 003746; [16]=year+2000; 000013; [20]=month; 000027; [22]=day; 000003; [24]=wday; 000022; [26]=hour; 000017; [30]=min; 000054; [32]=sec; Пример исходного кода который формирует данные форматы даты-времени Код // функция форматирования даты в формат FAT // Двухбайтовая отметка даты имеет следующий формат: // биты 0–4 — день месяца, допускаются значения 1–31; // биты 5–8 — месяц года, допускаются значения 1–12; // биты 9–15 — год, считая от 1980 года («эпоха MS-DOS»), возможны значения от 0 до 127 включительно, то есть 1980–2107 годы. unsigned short int rtc_fat_date(void) { unsigned char day , month , year; rtc_get_date(&day,&month,&year); return(day+month*32+(year-1980)*256); } // // функция форматирования времени в формат FAT //Двухбайтовая отметка времени имеет следующий формат: // биты 0–4 — счётчик секунд (по две), допустимы значения 0–29, то есть 0–58 секунд; // биты 5–10 — минуты, допустимы значения 0–59; // биты 11–15 — часы, допустимы значения 0–23. unsigned short int rtc_fat_time(void) { unsigned char hour,min,sec; rtc_get_time(&hour,&min,&sec); return(sec/2+min*32+hour*1024); } // // функция форматирования даты в формат RT11 unsigned short int rtc_rt11date(void) { unsigned char mday , mmonth , myear; rtc_get_date(&mday,&mmonth,&myear); unsigned short int rt11date; myear = myear + 2000 - 1972; rt11date= (myear / 32) <<14 | mmonth<<10 | mday <<5 | (myear % 32); //printf("rtc_rt11date: a.m.d.y=%d.%d.%d.%d > 0%06o ", (myear / 32), mmonth, mday, (myear % 32), rt11date); return rt11date; } // // функция форматирования времени в формат RT11 для таймера 50Гц unsigned int rtc_rt11time50(void) { unsigned char hour,min,sec; rtc_get_time(&hour,&min,&sec); unsigned int rt11time; rt11time = hour * 3600 * 50 + min * 60 * 50 + sec * 50; //printf("rtc_rt11time50: %d -> %06o . %06o ",rt11time , (unsigned short int) (rt11time>>16) , (unsigned short int) (rt11time & 0xFFFF) ); return (rt11time); } // // функция форматирования времени в формат RT11 для таймера 60Гц unsigned int rtc_rt11time60(void) { unsigned char hour,min,sec; rtc_get_time(&hour,&min,&sec); unsigned int rt11time; rt11time = hour * 3600 * 60 + min * 60 * 60 + sec * 60; //printf("rtc_rt11time60: %d -> %06o . %06o ",rt11time , (unsigned short int) (rt11time>>16) , (unsigned short int) (rt11time & 0xFFFF) ); return (rt11time); } // Перезапуск БК аппаратный, команда актуальна только для AZБК остальные AZ ее игнорируют 037: // перезапуск AZБК и всей БК пример применения Код AZ$CSR = 177220; регистр команд и состояния (CSR) AZ$DR = 177222; регистр данных (DR) ; trap 57 - перезапуск БК полный AZcouldReboot: call AZreset; сбросим AZ дабы он был готов принимать команды mov #37,@#AZ$CSR return Работа со стеком TCP/IP 040: // получить ip адреса в буфер 041: // чтение буфера ip адреса - 8 слов 16bit эта пара команд позволяет получить текущую информацию со стека - IP адрес - MASK маску - GW гейтвей - NTP адрес NTP-сервера - DNS1 адрес основного DNS - DNS2 адрес резервного DNS соответственно это 12 слов (16bit) примеры работы Код ; trap 52 - чтение блока IP адресов в блок памяти IPADDDBLOCK (8. ячеек) ; результат в R3 =0 error, иначе адрес куда считано (IPADDDBLOCK) GetIPaddrs: push R1 push R2 call AZreset; сбросим tst R1 bne 0ERR$ MOV #AZ$CSR,R1 mov #40,(R1) 0$: TSTB (R1); прочитать адреса в свою память BPL 0$; ждем mov #41,(R1) 1$: TSTB (R1); подготовить буфер BPL 1$; ждем TST (R1)+; инкрементируем mov #IPADDDBLOCK,R3 mov #12.,R2 2$: mov (R1),(R3)+; читаем блок слов в память sob R2,2$ mov #IPADDDBLOCK,R3; успешно br 0END$ 0ERR$: CLR R3 0END$: pop R2 pop R1 return Примеры данных - возвращаемые слова в восьмеричном формате 124300 116400 - IP адрес 192.168.0.157 177777 000377 - MASK маску 255.255.255.0 124300 000400 - GW гейтвей 192.168.0.1 124300 000400 - NTP адрес NTP-сервера 192.168.0.1 124300 050000 - DNS1 адрес основного DNS 192.168.0.90 124300 055000 - DNS2 адрес резервного DNS 192.168.0.80 Работа с SD картой, дополнительные функции данный комплект команд позволяет читать/писать файлы на карточку те можно сделать процедуры копирования файлов с карточки и на карточку 050: установить имя файла который будем читать 051: получить размер файла на чтение (или его статус) на МПИ 052: читать блок установленного файла в буфер эти команды используют буфер 256. слов который задействован в интерфейсе работы с энергонезависимой памятью (см выше команды 022 023) буфер длины имени файла 128. слов = 256 байт Соответственно схема чтения файла выглядит вот так 023 - заливаем имя файла в буфер 050 - устанавливаем файл на чтение 051 - читаем длину файла или ошибку открытия файла если ошибка - повторяем сначала 023 050 051 если все ok - приступаем к чтению файла 052 - читает блок файла в буфер 022 - забираем данные из буфера пары 052 022 повторяем нужное количество раз дабы считать весь файл как файл будет считан - последняя 052 команда закроет его автоматически формирование ошибки выглядит так: sizeanyfile=1<<31 + FFres; // если установлен старший бит 32х битного слова - то в младшей части код ошибки FFres = ошибка FatFS см http://elm-chan.org/fsw/ff/doc/open.html ![]() Код typedef enum { FR_OK = 0, /* (0) Succeeded */ FR_DISK_ERR, /* (1) A hard error occurred in the low level disk I/O layer */ FR_INT_ERR, /* (2) Assertion failed */ FR_NOT_READY, /* (3) The physical drive cannot work */ FR_NO_FILE, /* (4) Could not find the file */ FR_NO_PATH, /* (5) Could not find the path */ FR_INVALID_NAME, /* (6) The path name format is invalid */ FR_DENIED, /* (7) Access denied due to prohibited access or directory full */ FR_EXIST, /* (8) Access denied due to prohibited access */ FR_INVALID_OBJECT, /* (9) The file/directory object is invalid */ FR_WRITE_PROTECTED, /* (10) The physical drive is write protected */ FR_INVALID_DRIVE, /* (11) The logical drive number is invalid */ FR_NOT_ENABLED, /* (12) The volume has no work area */ FR_NO_FILESYSTEM, /* (13) There is no valid FAT volume */ FR_MKFS_ABORTED, /* (14) The f_mkfs() aborted due to any problem */ FR_TIMEOUT, /* (15) Could not get a grant to access the volume within defined period */ FR_LOCKED, /* (16) The operation is rejected according to the file sharing policy */ FR_NOT_ENOUGH_CORE, /* (17) LFN working buffer could not be allocated */ FR_TOO_MANY_OPEN_FILES, /* (18) Number of open files > _FS_LOCK */ FR_INVALID_PARAMETER /* (19) Given parameter is invalid */ } FRESULT; пример кода для чтения файла и вывода его на экран Код call AZRST; сбросим ; заливаем в буфер имя файла 7$: mov #23,(R1); командуем что будем писать данные в буфер 5$: TSTB (R1); проверяем результат выполнения BPL 5$ ; ждем TST (R1)+; инкрементируем mov #FILNM,R3 1$: mov (R3),(R1); отдаем в контроллер tst (R3)+ bne 1$ tst -(R1); декрементируем ; устанавливаем файл на чтение mov #50,(R1); устанавливаем файл на чтение 2$: TSTB (R1); проверяем результат выполнения BPL 2$ ; ждем ; читаем длину файда mov #51,(R1); устанавливаем файл на чтение 3$: TSTB (R1); проверяем результат выполнения BPL 3$ ; ждем TST (R1)+; инкрементируем mov #FILSZ,R3 mov (R1),(R3)+; читаем с контроллера mov (R1),(R3); читаем с контроллера ; выведем длину файла на экран clr R0 mov #FILSZ+2,R3 mov (R3),R1 call DNOZ mov -(R3),R1 call DNOZ .print #STMS2 ; читаем файл mov R1,R4; в R1 осталась длина файла MOV #AZ$CSR,R1 mov #BUFFL,R5 bit #1,R4; если нечетное число байт beq 47$ inc R4; добавим еще 1 байт тк читаем словами 47$: tst R4 beq 45$ ; уже нечего читать - выходим mov #52,(R1); читаем блок в буфер 4$: TSTB (R1); проверяем результат выполнения BPL 4$ ; ждем mov #22,(R1); будем читать буфер 51$: TSTB (R1); проверяем результат выполнения BPL 51$ ; ждем cmp R4,#512.; сравниваем c размером буфера в байтах Blos 44$ ; осталось меньше чем буфер .print #STMS1 mov #256.,R2 TST (R1)+; переходим на регистр данных 46$: mov (R1),(R5)+; читаем в буфер sob R2,46$ sub #512.,R4; вычитаем TST -(R1); переходим на регистр команд br 47$ 44$: .print #STMS3 mov R4,R2 asr R2 ; /2 тк читаем словами TST (R1)+; переходим на регистр данных 43$: mov (R1),(R5)+; читаем в буфер sob R2,43$ 45$: clr (R5); проставим конец файла ; файл считан - выводим на экран .print #STMS4 .print #BUFFL .print #STMS5 mov #110,@#AZ$CSR; включаем сеть .Exit пример полностью в виде утилиты RT11 выложен вот тут Для записи файла добавлены команды 053: установить имя файла который будем писать 054: установка длины файла 055: записать в файл данные из буфера Схема подачи команд при записи вот такая 023 - заливаем имя файла в буфер 053 - устанавливаем файл на чтение 051 - статус открытия/создания файла если ошибка - повторяем сначала 023 053 051 если все ok - идем дальше 054 - установка длины файла, те надо сразу объявить какая у нас будет длина файла 023 - заливаем блок данных в буфер 055 - пишем из буфера в файл пары 023 055 повторяем нужное количество раз дабы записать весь файл как файл будет записан - последняя 055 команда закроет его автоматически пример кода записи файла Код ; заливаем в буфер имя файла MOV #AZ$CSR,R1 17$: mov #23,(R1); командуем что будем писать данные в буфер 15$: TSTB (R1) ; проверяем результат выполнения BPL 15$ ; ждем TST (R1)+ ; переходим на регистр данных mov #FILNM2,R3 11$: mov (R3),(R1); отдаем в контроллер tst (R3)+ bne 11$ tst -(R1) ; переходим на регистр команд ; устанавливаем файл на запись mov #53,(R1); устанавливаем файл на запись 12$: TSTB (R1) ; проверяем результат выполнения BPL 12$ ; ждем ; читаем статус создания файла mov #51,(R1) 13$: TSTB (R1) ; проверяем результат выполнения BPL 13$ ; ждем TST (R1)+ ; переходим на регистр данных mov #STATS,R3 mov (R1),(R3)+; читаем с контроллера mov (R1),(R3); читаем с контроллера ; тут надо проверить - если файл создан то оба слова нулевые mov #STATS,R3 TST (R3)+ BNE 66$ TST (R3) BEQ 60$ 66$: .print #ERRMS1 ; печать ошибки .exit 60$: MOV #AZ$CSR,R1 mov #54,(R1); установим длину файла который будем писать 23$: TSTB (R1) ; проверяем результат выполнения BPL 23$ ; ждем TST (R1)+ ; переходим на регистр данных mov #FILSZ,R3 mov (R3)+,(R1); пишем в контроллер mov (R3),(R1); пишем в контроллер tst -(R1) ; переходим на регистр команд ; пишем файл mov @#FILSZ,R4; длина файла MOV #AZ$CSR,R1 mov #BUFFL,R5; буфер файла bit #1,R4 ; если нечетное число байт beq 147$ inc R4 ; добавим еще 1 байт тк читаем словами 147$: tst R4 ; проверим длину beq 145$ ; уже нечего писать - выходим mov #23,(R1); будем писать в буфер 151$: TSTB (R1) ; проверяем результат выполнения BPL 151$ ; ждем cmp R4,#512.; сравниваем c размером буфера в байтах Blos 144$ ; осталось меньше чем буфер .print #STMS6 ; заливка полного блока mov #256.,R2 TST (R1)+ ; переходим на регистр данных 146$: mov (R5)+,(R1); пишем в буфер контроллера sob R2,146$ sub #512.,R4; вычитаем TST -(R1) ; переходим на регистр команд mov #55,(R1); запись буфера в файл 104$: TSTB (R1) ; проверяем результат выполнения BPL 104$ ; ждем br 147$ ; в начало 144$: .print #STMS7 ; заливка последнего блока TST (R1)+ ; переходим на регистр данных mov R4,R2 asr R2 ; /2 тк пишем словами 143$: mov (R5)+,(R1); пишем в буфер контроллера sob R2,143$ TST -(R1) ; переходим на регистр команд mov #55,(R1); запись пследнего буфера в файл 105$: TSTB (R1) ; проверяем результат выполнения BPL 105$ ; ждем 145$: .print #STMSE ; конец mov #110,@#AZ$CSR; включаем сеть .Exit ; выходим пример полностью в виде утилиты RT11 выложен вот тут получение объема SD карты всего/свободно в мегабайтах 056: // получить данные по размеру карты в буфер sizecard 057: // чтение буфера sizecard - 2 cлова 16bit первое слово - общий объем карты доступный для FAT в МБ второе слово - свободный объем на карте в МБ Код ; trap 51 - получение объема SD карты всего/свободно в мегабайтах ; результат в R1 - всего; R2 - свободно GetSizeSD: call AZreset; сбросим tst R1 bne 0ERR$ MOV #AZ$CSR,R1 mov #56,(R1) 1$: TSTB (R1); подготовить буфер BPL 1$; ждем mov #57,(R1) 2$: TSTB (R1); подготовить буфер BPL 2$; ждем mov @#AZ$DR ,R1; всего мегабайт mov @#AZ$DR ,R2; свободно мегабайт return clr R1 clr R2 return Примеры данных 035521 - всего на карточке мегабайт - 15185. 035417 - свободно мегабайт - 15119. Старые команды тут -------------------- Живы будем - Не помрем !
|
SuperMax |
![]()
Сообщение
#24
|
![]() Администратор ![]() ![]() ![]() ![]() ![]() Группа: Root Admin Сообщений: 6 248 Регистрация: 7.1.2006 Из: Красноярск Пользователь №: 1 ![]() |
Прошивка V13 от 2022-11-26
(единая нумерация с AZБК - дабы уменьшить отличия прошивок) добавлен блок команд - см выше работают часы и прочие навороты Утилита установки времени AZSDT выложена тут cама прошивка STM32 ![]() данная прошивка для AZ-МПИ AZ-УКНЦ AZ-QBUS v1.xx и 2.xx прошивка для GAL-ок или EPM240 прежняя, менять не надо Важный момент, не забудьте явно проставить в блоке NETWORK свой часовой пояс иначе время будет GMT Рабочий образ ![]() Типовая работа AZSDT при наличии сети ![]() Типовая работа AZSDT при отключенной сети, но выставленном времени-дате в RTC ![]() -------------------- Живы будем - Не помрем !
|
SuperMax |
![]()
Сообщение
#25
|
![]() Администратор ![]() ![]() ![]() ![]() ![]() Группа: Root Admin Сообщений: 6 248 Регистрация: 7.1.2006 Из: Красноярск Пользователь №: 1 ![]() |
Новые команды контроллеров AZ*
Старые команды тут и тут данные команды действительны для контроллеров начиная с V14 прошивки Работа со стеком TCP/IP 043 чтение MAC-адреса в ip буфер данная команда читает текущий фактический MAC адрес в буфер IP адресов те сначала 043 а затем 041 команды пример применения Код ; trap 72 - чтение MAC адреса в блок памяти IPADDDBLOCK (12. ячеек) ; результат в R3 =0 error, иначе адрес куда считано (IPADDDBLOCK) GetMACaddrs: push R1 push R2 call AZreset ; сбросим tst R1 bne 0ERR$ MOV #AZ$CSR,R1 mov #43,(R1) 0$: TSTB (R1) ; прочитать адреса в свою память BPL 0$ ; ждем mov #41,(R1) 1$: TSTB (R1) ; подготовить буфер BPL 1$ ; ждем TST (R1)+ ; инкрементируем mov #IPADDDBLOCK,R3 mov #12.,R2 2$: mov (R1),(R3)+ ; читаем блок слов в память sob R2,2$ mov #IPADDDBLOCK,R3; успешно br 0END$ 0ERR$: CLR R3 0END$: pop R2 pop R1 return -------------------- Живы будем - Не помрем !
|
![]() ![]() |
Текстовая версия | Сейчас: 4.12.2023, 17:06 |