Рисунок 1. Схема основных частей спектрометра
Плата интерфейса использует часть пространства ввода/вывода ЦП. Адресное пространство расположено в диапазоне адресов 0x300-0х31F (64 порта).
Адресное пространство интерфейса распределено между устройствами спектрометра. Для операций ввода/вывода устройства отображают на шину по два регистра (по 16bit): регистр данных (data reg) и регистр команд (cmd reg).
Так, например, операция записи слова выглядит следующим образом:
1. Запись в регистр команд кода команды записи;
2. Запись в регистр данных слова;
После выполнения второго шага произойдет запись слова в ячейку памяти с адресом, указанным в адресном счетчике.
Рисунок 3. Адресное пространство устройства
Существуют команды процессора in и out, которые осуществляют чтение и запись в порт ввода/вывода. С помощью этих команд осуществляется ввод/вывод с устройствами спектрометра. Однако исполнять их из пользовательского уровня («напрямую») разрешено далеко не во всех операционных системах (ОС), например, в WinNT/XP. Помимо этого в многозадачных ОС возможны критические ситуации, когда параллельно выполняются неатомарные операции (подоперации которых разнесены во времени, в течение которого может выполниться операция другого процесса) с одним устройством, что может привести к неверным и неожиданным результатам. Во избежание этого специалистами лаборатории ММФ КазНЦ был разработан драйвер нижнего уровня.
Для абстрагирования программного обеспечения прикладного уровня от аппаратной части в лаборатории так же был разработан набор драйверов верхнего уровня.
Использование драйверов нижнего и верхнего уровня в данной работе позволяет диагностировать спектрометр на ПК с различными ОС.
Сопровождение развивающейся аппаратной части МР-томографа влечет необходимость модификации драйверов. Одной из возможностей программы является диагностика новых версий драйверов (с помощью разных уровней доступа).
Пример использования уровней доступа для записи данных в устройство
Доступ «Напрямую» (дляWin9X)
void CHardWare::dioWrite(WORD adr,WORD val)
{//запись через порты (W9X) слова val в регистр устройства с адресом adr
adr+=DEFAULT_IO_BASE; //Переход к адресному пространству интерфейса
__asm{
movdx,adr //Запись в регистр dx адреса
movax,val //Запись в регистр ax значения
outdx,ax //Выполнение команды записи в порт
}
}
Доступ с использованием драйвера низкого уровня
void CHardWare::OUTWORD(WORD adr,WORD val)
{
fxbOutWord(IOSession,adr,val,0xffff); //враппер функции записи слова в драйвере низкого уровня
}
Доступ с использованием драйвера высокого уровня
int CHardWare::WriteBuf(UINT ndev,PWORD buf,int len)
{
switch(ndev)
{
case CH_SYN:
fnmrtResetSynth(0);
fnmrtLoadSynth((XBPInt16)buf,len,0,0);
break;
case CH_PPU:
fnmrtStopPPU();
fnmrtResetPPU(0);
fnmrtLoadPPUCode(buf,len,0,0);
break;
case CH_GX:
case CH_GY:
case CH_GZ:
case CH_RFP:
fnmrtLoadGradChannel(ndev+1,(XBPInt16)buf,len,0,0);
break;
default:
return -1;
}
return 0;
}
Для работы с устройствами был разработан отдельный класс – CHardWare. В связи с имеющимися различными уровнями доступа для удобства было разработано три уровня абстракции работы с устройствами.
1. Ввод/вывод слов в регистры устройств
2. Ввод/вывод команд и данных в память устройств спектрометра
3. Ввод/вывод массивов в память устройств
Пример использования различных уровней абстракции для записи данных в устройство
1. Ввод/вывод слов в регистры устройств
void CHardWare::OUTWORD(WORD adr,WORD val);
void CHardWare::INWORD(WORD adr,WORD *val);
2. Ввод/вывод команд и данных в память устройств спектрометра
DWORD CHardWare::writeword(UINT ndev, WORD val);
DWORD CHardWare::readword(UINT ndev, WORD *val);
DWORD CHardWare::resetaddr(UINT ndev);
DWORD CHardWare::incraddr(UINT ndev);
3. Ввод/вывод массивов в память устройств
int CHardWare::GetMemSize(UINT ndev);
int CHardWare::GetMask(UINT ndev);
int CHardWare::WriteBuf(UINT ndev,PWORD buf,int len);
int CHardWare::ReadBuf(UINT ndev,PWORD buf,int len);
Рисунок 4. Структура программы тестирования спектрометра
Режим 1. Запись данных на устройство, чтение данных с устройства, проверка (сравнение записанных и считанных данных).
Режим 2. Запись данных на устройство, чтение данных с устройства, проверка, повтор до обнаружения первой ошибки.
Режим 3. Запись или чтение на указанный адрес порта ввода/вывода однократно.
Режим 4. Циклическое повторение записи или чтения с интервалом, указанным пользователем.
Если организовать запуск функции тестирования в основном потоке, то во время её выполнения работа с интерфейсом программы, включая кнопку Стоп, будут недоступны, а так же не будет производиться прорисовка результатов выполнения. Режим стресс-тестирования (режим 2) может занять длительное время, а режим циклического тестирования (режим 4) вообще не сможет быть остановлен. Поэтому при нажатии кнопки Пуск в зависимости от указанных пользователем параметров тестирующая функция запускается в отдельном потоке.
void Cmain::OnStart()
{
DWORD ExitCode;
CString pusk; //состояние кнопки пуск
m_start.GetWindowText(pusk);
nTab = m_ctrTab.GetCurSel();
if (nTab==0){ //Если выбрана первая вкладка
…………………
if (pusk == "Пуск"){
…………………
//запускаем поток
PWinThread = AfxBeginThread(fContr,this);
}else{
//если поток не окончен
::GetExitCodeThread(PWinThread->m_hThread,&ExitCode);
if (ExitCode == STILL_ACTIVE){
TerminateThread(PWinThread->m_hThread,0);
delete PWinThread;//удаляем
…………………
}
};
} else { //если вторая вкладка
if (pusk == "Пуск"){
if(ppage2->m_bRepeatMode.GetCheck()==BST_CHECKED)
{ //если выбран циклический режим
…………………
//запускаем поток
PWinThread = AfxBeginThread(fCikl,this);
} else {//запускаем поток
PWinThread = AfxBeginThread(fAddr,this);
};
}else{
…………………
//если поток не окончен
::GetExitCodeThread(PWinThread->m_hThread,&ExitCode);
if (ExitCode == STILL_ACTIVE){
AfxEndThread (0); //останавливаем поток
TerminateThread(PWinThread->m_hThread,0);
delete PWinThread;//удаляем
}
};
}
}
При запуске появляется окно программы и вкладка Тест устройств. В блоке Тип тестирования возможность выбора типа тестирования, в блоке Тестируемые устройства выбор доступных для проверки устройств.
Рисунок 5. Закладка Тест устройств пользовательского интерфейса программы
На вкладке Тест ввода/вывода в блоке Тестирование возможность выбора тестируемого адреса, типа уровня тестирования. В блоке Параметры чтение данных с адреса или запись данных на адрес, а так же формат представления (система счисления) данных поля Содержание записи.
Рисунок 6. Закладка Тест ввода/вывода пользовательского интерфейса программы
При нажатии кнопки Пуск начинается процесс тестирования.
Тест устройств. Внизу окна с вкладкой Тест устройств появляется область с таблицей, в которой выводятся ошибки устройств (Рисунок 7).
Рисунок 7. Окно с результатами тестирования устройств
Следующая таблица описывает основные типы аппаратных ошибок и неполадки, которыми они могли быть вызваны.
Тип ошибки | Возможные неполадки |
Записываются разные значения, а считываются одинаковые | 1. Не проходит строб записи 2. Не проходит строб чтения 3. Устройство не подключено |
Считываются значения из соседних ячеек | Ошибки инкремента |
Записываемые и считываемые данные не совпадают | 1. Битые ячейки памяти 2. Ошибки стробов чтения/записи |
Таблица 1. Типы аппаратных ошибок
При несовпадении результатов тестирований разными уровнями доступа диагностируются ошибки драйвера.
Тест ввода/вывода. Используется для проверки интерфейсной логики устройств спектрометра с использованием осциллографа. Диагностируются, как правило, ошибки монтажа электронных компонентов.
Графический интерфейс разработанной системы реализует удобный механизм диагностирования аппаратных неисправностей блоков радиоспектрометра, а так же отладки драйверов верхнего уровня программного комплекса mrscan. На данный момент программа введена в эксплуатацию и применяется разработчиками в лаборатории для выявления аппаратных неисправностей собранных или эксплуатируемых спектрометров.
В процессе выполнения данной работы свои знания и умения в области математики и программирования применила в прикладных науках – радиофизике и медицине. Приняла участие в серьезном и интересном научном проекте и процессе производства важного медицинского оборудования. Ознакомилась с работой и взаимодействием в команде ученых разных специальностей.
Попытка постигнуть основы мироздания с помощью физики - наиболее естественна. Совершается она уже многие тысячелетия. Сначала строение вещества пытались объяснить понятием материи, затем физики пришли к мысли о том, что в основе мира лежат неделимые атомы. Атомы, как оказалось, делятся. Физики стали эксплуатировать идею, что в основе мироздания находятся элементарные частицы. У современной физики возникло серьезное опасение, что и элементарные частицы имеют сложное строение и могут делиться. Основа мира, в этой связи, снова становится призраком, и снова нет достаточно четкого и ясного ответа.