Специальные процедуры nxtOSEK

API nxtOSEK

NxtOSEK C

Программный интерфейс ОС РВ nxtOSEK содержит низкоуровневые функции доступа к устройствам и функции-обертки (wrapper) для пакета ECRobot (последние имеют префикс ecrobot_) которые разработаны для создания программ управления устройствами в режиме реального времени.

При описании программного интерфейса отдельно помечались функции, которые являются надстройками над низкоуровневыми функциями (функции-обертки). Чтобы не иметь лишних потерь времени при выполнении программы, лучше воздержаться от их использования. Для использования программного интерфейса необходимо подключить в исходном коде заголовочный файлecrobot_interface.h

В программе, написанной для ОС РВ nxtOSEK, должны быть описаны три специальные процедуры, так называемые функции-обработчики или функции-ловушки (hook routines): ecrobot_device_initialize, ecrobot_device_terminate,user_1ms_isr_type2. Их определение и описание должны быть в главном с-файле программы. Система вызывает их автоматически, первую в начале работы программы, вторую в конце, а третью периодически каждую миллисекунду. Что бы легче было понять, как правильно их использовать, рассмотрим примеры этих процедур из файла ecrobot_main.c программы NXTway.

· void ecrobot_device_initialize(void): Эта процедура вызывается в самом начале работы программы. В ней нужно помещать вызовы функций инициализации датчиков и моторов.

· void ecrobot_device_initialize(void)· {· /* Инициализировать используемые устройства */· ecrobot_set_light_sensor_active(NXT_PORT_S1);· ecrobot_set_light_sensor_active(NXT_PORT_S3);· ecrobot_init_sonar_sensor(NXT_PORT_S2); · ecrobot_set_motor_speed(NXT_PORT_B, 0);· ecrobot_set_motor_speed(NXT_PORT_C, 0);· ecrobot_init_bt_connection();· }

· void ecrobot_device_terminate(void): Эта процедура вызывается в случае, если нажали кнопку STOP или EXIT. В ней нужно помещать вызовы функций, корректно завершающих работу датчиков и моторов.

· void ecrobot_device_terminate(void)· {· /* Завершить работу датчиков, остановить моторы */· ecrobot_set_light_sensor_inactive(NXT_PORT_S1);· ecrobot_set_light_sensor_inactive(NXT_PORT_S3);· ecrobot_set_motor_speed(NXT_PORT_B, 0);· ecrobot_set_motor_speed(NXT_PORT_C, 0);· ecrobot_term_sonar_sensor(NXT_PORT_S2);· ecrobot_term_bt_connection();· }

· void user_1ms_isr_type2(void): Эта процедура вызывается процедурой обработки прерываний второго типа, работающей с периодом 1 мсек. В ней, например, можно реализовать счетчик системных тактов подсистемы запуска задач (OSEK Alarm) для реализации Планировщика Периодических Вызовов Задач.

· #include "kernel.h"· #include "kernel_id.h"· void user_1ms_isr_type2(void)· {· StatusType ercd;· /* Увеличить счетчик системного времени */· ercd = SignalCounter(SysTimerCnt);· if (ercd != E_OK)· {· ShutdownOS(ercd);· }· }