Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Из программного прерывания не могу работать с файлом
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
cir
Подскажите, пожалуйста. Пишу прогу для промышленного компьютера Fastwel CPU686. Операционная система FDOS-6.22, среда разработки Borland C++ v3.1.
Программа у меня состоит из 2-х частей, одну я вызываю из другой как программное прерывание
intr(INTR,&reg); Через регисты я передаю два нужных мне параметра. Из самого программного прерывания не могу обратиться к файлу, а точнее не могу его открыть. Где-то уже слышал о подобной проблеме, но там ее решали так: в прерывании устанавливали лишь флаги записи в файл, а саму запись проводили в основном цикле программы. Мне это сделать не уластся, поскольку все данные для записи находятся в самом прерывании. Само прерывание, которое я вызываю - это отдельный проект, программа которая его вызывает тоже отдельный проект.
Может кто подскажет как передать данные из прерывания (их достаточно много около 15 переменных типа float - через регистры само собой не получится), или научится работать с файлом прямо из прерывания (что гораздо удобнее).
zltigo
Цитата(cir @ Apr 22 2006, 06:50) *
Программа у меня состоит из 2-х частей, одну я вызываю из другой как программное прерывание
intr(INTR,&reg); Через регисты я передаю два нужных мне параметра. Из самого программного прерывания не могу обратиться к файлу, а точнее не могу его открыть. Где-то уже слышал о подобной проблеме, но там ее решали так:

Сдается мне, что Ваша проблема гораздо проще - добавьте волшебное слово
enable(); в начале Вашей программы и если наследуемый стек будет достаточен, то все будет
работать. То что Вы слышали "звон", это скороее о другом работа с системными DOS вызовами
из них-же. Там пути обхода и выкручивания много сложнее.
Для начала отладьте просто как функцию (без interrupt модификатора ).

Цитата
Может кто подскажет как передать данные из прерывания (их достаточно много около 15 переменных типа float - через регистры само собой не получится), или научится работать с файлом прямо из прерывания (что гораздо удобнее).

Ну вот - сразу за файл хвататьтся. У Вас еще менеджеры памяти есть. Поставатьте (хотя думаю стоит :-) ), например himem, спросите у него памяти кусочек и работайте с ним их обеих модулей.
Там правда, тоже 'лишние' пересылки будут, но скорость не сравнима будет с файловыми операциями.
Если еще быстрее - напишите резидентика оставляющего в памяти кусочек для обмена. Поскольку
Ваша программа вызываемая по int, таким резидентом, как я понимаю и является, то все сводится вообще в возврату из обработчика прерывания far указателя на структуру с Вашими float.
cir
Спасибо за совет. Вот только я не знаю как вернуть как вернуть из обработчика прерывания указатель на структуру, ведь в прерывание состояния регистров передаются просто как параметр (regpack). Если не трудно, объясните как это сделать.
zltigo
Цитата(cir @ Apr 22 2006, 16:17) *
Вот только я не знаю как вернуть как вернуть из обработчика прерывания указатель на структуру, ведь в прерывание состояния регистров передаются просто как параметр (regpack). Если не трудно, объясните как это сделать.

Так в Выбранном Вами варианте по выходу из прерывания состояние регистров в тот-же regpack ОБРАТНО и копируется. Far указатели, возвращаются в DX:AX ну а дальше соответственно макросик MK_FP() в помощь....
cir
Быстренько попробовал написать две маленькие программки, одна из которых вызывается из другой как прервание и пишет по указанному в регистрах адресу случайные значения, а другая соответственно считывае по этому адресу значения и выводи их в файл. Все рабртает! В понедельник прийду на работу и опробую уже на реальном проекте.
Спасибо за совет.
zltigo
Цитата(cir @ Apr 23 2006, 19:23) *
Все рабртает!
Спасибо за совет.

Да не могло не заработать :-).
Пожалуйста!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.