Помогите состыковать програмный модуль на Ассемблере с UltraLogik
Подскажите пожалуйста, где ошибка в программном модуле для UltraLogik16 (программа для сброса Wathcdog Timer)
.386 .model small .code STACK segment para use16 stack 'STACK' dw 32 dup(?) STACK ends SYSTEM SEGMENT byte public 'code' use16 ASSUME ds:DGROUP, CS:SYSTEM, SS:STACK RWQ proc near push ds push ss push sp push bp mov al,13h ; unlock configuration register out 22h,al mov al,0c5h out 23h,al mov al,3ch ; reset timer out 22h,al in al,23h or al,01000000b out 23h,al mov al,13h ; luck configuration register out 22h,al mov al,00 out 23h,al pop bp pop sp pop ss pop ds retn RWQ endp SYSTEM ends end RWQ
Запуск программы на UltraLogik с программным модулем сброса Watchdog Timer приводит к зависанию контроллера - черный(чуть подсвеченный экран) На клавиатуру (Enter, Alt+Ctrl+Del) не реагирует. Но программный модуль однократно сбрасывает Watchdog (судя по времени перезагрузки).
Контроллер ICOP-6021 (на чипе M6117D, совместимый 386SX CPU)
Первоначально опубликовано Vladimir_V
Контроллер ICOP-6021 (на чипе M6117D, совместимый 386SX CPU)
Не делайте lock в конце процедуры. Потому что другие библиотеки, которые обращаются к системным регистрам (например GPIO), делают unlock и все. Поэтому, если вы вызываете в таком порядке:
1) GPIO_Init
2) Watch_Dog_Init
3) InGpio - подвесит программу
AlexZ
Сделал модуль без блокировки регистра конфигураций (Lock configuration register). Та же самая проблема. GPIO не используется.
Похоже, что программный модуль не стыкуется с UltraLogik16
Вот мой кусок кода для программы для ICOP 6015, основная часть написана на C++.
.286 .model large,C .code public wd_init, wd_reset, wd_unhook
read_cr proc near ; на входе al = адрес, на выходе al - знач. out 22h,al jmp $+2 in al,23h jmp $+2 retn read_cr endp
write_cr proc near ; на входе al = адрес, ah - знач. out 22h,al jmp $+2 xchg al,ah out 23h,al jmp $+2 retn write_cr endp
wd_init proc cli ; disable wd mov ax,37h call read_cr and al,0BFh mov ah,37h xchg ah,al call write_cr ; set counter 4 sec mov ax,023Bh call write_cr mov ax,3Ah call write_cr mov ax,39h call write_cr ; set action to reset mov ax,38h call read_cr and al,0Fh or al,0D0h mov ah,38h xchg ah,al call write_cr ; enable wd mov ax,37h call read_cr or al,40h mov ah,37h xchg ah,al call write_cr sti ret wd_init endp
wd_reset proc pushf cli mov ax,3Ch call read_cr or al,40h mov ah,3Ch xchg ah,al call write_cr popf ret wd_reset endp
Еще подумал и пришла следующая мысль: попробуйте сделать так, чтобы при создании исполнительного модуля также создавался .map файл (результат компоновки) и опубликуйте этот файл. Тогда, что-то можно будет сказать.
AlexZ
Программа сделанная под DOS работает: .386 .model small .code StacK SEGMENT PARA STACK 'STACK' DB 32 DUP (?) Stack ends SYSTEM SEGMENT byte public 'code' use16 ASSUME CS:SYSTEM, SS:stack RWQ proc near push ds sub ax,ax push ax mov al,13h ; unlock configuration register out 22h,al mov al,0c5h out 23h,al mov ax,03c3ch ; reset timer out 22h,al in al,23h or al,40h xchg ah,al out 22h,al xchg ah,al out 23h,al mov al,13h out 22h,al mov al,000h out 23h,al nop retn RWQ endp SYSTEM ends end RWQ
Аналогичная программа для Ultralogik (немного переделал сброс timer): .386 .model small .code StacK SEGMENT PARA STACK 'STACK' DB 32 DUP (?) Stack ends SYSTEM SEGMENT byte public 'code' use16 ASSUME CS:SYSTEM, SS:stack public RWQ RWQ proc near push ax push ds push ss push sp push bp mov al,13h ; unlock configuration register out 22h,al mov al,0c5h out 23h,al mov ax,03c3ch ; reset timer out 22h,al in al,23h or al,40h xchg ah,al out 22h,al xchg ah,al out 23h,al mov al,13h ; lock configuration register out 22h,al mov al,000h out 23h,al nop pop bp pop sp pop ss pop ds pop ax retn RWQ endp SYSTEM ends end RWQ вешает контроллер: т.е. при запуске исполняемой программы (UL) Wathdog Timer однократно сбрасывается и по истечении времени Wathdog Timer контроллер перезагружается.
RWQ.map содержит следующее: Start Stop Length Name Class
00000H 00000H 00000H _TEXT CODE 00000H 0002CH 0002DH SYSTEM CODE 00030H 00030H 00000H _DATA DATA 00030H 0004FH 00020H STACK STACK
Program entry point at 0000:0000
1) Думаю нужно не <.386>, а <.286>
2) сегмент стека не нужен - он в основной программе (assume оставьте только для кода).
3) Вызывает сомнение модель small, т.к. скорей всего вся программа выполнена в модели large
4) оставьте только push ax и pop ax!!!
AlexZ
Ах да. Я уже вам писал не делайте lock config register!
Вы не можете публиковать новые темы в этом форуме Вы не можете отвечать на сообщения в этом форуме Вы не можете удалять Ваши сообщения на этом форуме Вы не можете редактировать Ваши сообщения на этом форуме Вы не можете создавать голосования на этом форуме Вы не можете выражать своё мнение в голосованиях на этом форуме