СТА 2/2010
72 СТА 2/2010 РАЗ РА БОТ КИ / МАШИНОС Т РОЕ НИЕ www.cta.ru ЛИСТИНГ 3 RTKSemaphore semaphorePIDRegulator; RTKSemaphore magneticsSemaphore; RTKMailbox consoleBox; RTKMailbox interpretatorBox; RTKMailbox interpolatorBox; RTKMailbox regulatorBox; RTKMailbox magneticsBox; // время системного такта параметр СЧПУ unsigned machineCycle; void RTKAPI userInterface(void*) { TConsoleMessage data; while(true) { // обработка нажатия клавиши TUserFrame userFrame; RTKGet(consoleBox, &data); ... if (frameExecuteRequest(data)) RTKPut(interpretatorBox, &userFrame); ... } } void RTKAPI interpretator(void*) { while(true) { TUserFrame userFrame; RTKGet(interpretatorBox, &data); TInternalFrame* frame = parse(data); ASSERT(frame != NULL); if (!frame.geometry().Empty()) RTKPut(interpolatorBox, &frame); if (!frame.magnetics().Empty()) RTKPut(magneticsBox, &frame); } } void RTKAPI interpolator(void*) { while(true) { TInternalFrame* frame = NULL; RTKGet(interpolatorBox, &frame); // расчет эпюр скоростей calculate(frame >geometry()); do { TRegulatorTickTask* tickTask = new TRegulatorTickTask; frame >geometry().nextTick(tickTask); RTKPut(regulatorBox, &tickTask); } while ( !frame >geometry().Empty() && !frame >Stopped() ); // контроль кадра, освобождение ресурсов ... } } void RTKAPI PIDRegulator(void*) { while(true) { RTKWait(semaphorePIDRegulator); TRegulatorTickTask* data = NULL; if (RTKGetCond(regulatorBox, &data)) { // обработка задания ... } // обработка обратной связи, // запись в данные драйвера ... } } void RTKAPI magnetics(void*) { while(true) { TInternalFrame* frame; RTKWait(magneticsSemaphore); if (RTKGetCond(magneticsBox, &frame)) { runTech(frame >magnetics()); // индексирование кадра, // освобождение ресурсов ... } techStep(); chainStep(); // обработка данных от электроавтоматики, // если произошли ошибки генерация сообщений ... } } typedef void (RTKAPI *TinterruptHandler)(void); void RTKAPI timerInterrupt(void) { static unsigned ticks = 0; ++ticks; if (ticks >= machineCycle) { // обмен данными с оборудованием refreshSignals(); RTKSignal(semaphorePIDRegulator); RTKSignal(magneticsSemaphore); } // вызов стандартного обработчика прерывания ((TinterruptHandler)OldHandlerTimer.D.Local)(); } void initResources(void) { // инициализация данных ... semaphorePIDRegulator = RTKCreateSemaphore(ST_BINARY, 0, "Regulator"); magneticsSemaphore = RTKCreateSemaphore(ST_BINARY, 0, "Magnetics"); consoleBox = RTKCreateMailbox( sizeof(TConsoleMessage), CONSOLE_BUFFER, "Console messages"); interpretatorBox = RTKCreateMailbox( sizeof(TUserFrame), FRAMES_BUFFER, "ISO frames"); interpolatorBox = RTKCreateMailbox( sizeof(TInternalFrame*), MOVE_DATA_BUFFER, "Interpolator data"); regulatorBox = RTKCreateMailbox( sizeof(TRegulatorTickTask*), REGULATOR_BUFFER, "Regulator data"); magneticsBox = RTKCreateMailbox( sizeof(TInternalFrame*), MAGNETICS_BUFFER, "Magnetics data"); RTKRTLCreateThread(userInterface, INTERFACE_PRIORITY, 0, 0, NULL, "Interface thread"); RTKRTLCreateThread(interpretator, INTERPRETATOR_PRIORITY, 0, 0, NULL, "Interpretator"); RTKRTLCreateThread(interpolator, INTERPOLATOR_PRIORITY, 0, 0, NULL, "Interpolator"); RTKRTLCreateThread(PIDRegulator, REGULATOR_PRIORITY, 0, 0, NULL, "PIDRegulator"); RTKRTLCreateThread(magnetics, MAGNETICS_PRIORITY, 0, 0, NULL, "Magnetics thread"); // сохранили дескриптор старого прерывания по таймеру RTKSaveIRQHandlerFar(IRQTimer, &OldHandlerTimer); // запретили прерывания по таймеру RTKDisableIRQ(IRQTimer); // установили новый обработчик прерываний по таймеру RTKSetIRQHandler(IRQTimer, TimerInt); // разрешили прерывания по таймеру RTKEnableIRQ(IRQTimer); } © СТА-ПРЕСС
Made with FlippingBook
RkJQdWJsaXNoZXIy MTQ4NjUy