
- •1 Создание простого приложения в Eclipse
- •1.1. Запуск приложения Real-Time Java на целевой системе qnx Neutrino
- •1.2. Приложение демонстрирующее основные функциональные возможности rmi api of Jamaica
- •2 Building and Running an Example Java Program
- •2 Performance Optimization
- •2.1. Creating a profile
- •2.1.1. Creating a profiling application
- •2.2. Using a profile with the Builder
- •2.2.1. Building with a profile
- •2.3. Interpreting the profiling output
- •2.3.1. Format of the profile file
- •6.3.2. Example
- •3 Reducing Footprint and Memory
- •Import javax.Realtime.AsyncEventHandler;
- •Import javax.Realtime.PosixSignalHandler;
- •4 Дополнительное задание
1 Создание простого приложения в Eclipse
Теперь давайте научимся программировать приложения с использованием Eclipse. Создадим программу, которая будет обрабатывать POSIX сигналы SIGUSR1 и SIGUSR2. При получении сигнала SIGUSR1 программа будет выводить в консоль строку «I'm a POSIX signal handler!». При получении сигнала SIGUSR1 программа будет выводить на консоль строку «Good bye!» и завершаться с кодом возврата 0.
Для выполнения этого задания сначала создадим новый проект Java — выберем элемент меню File | New | Project. Откроется окно помощника создания проектов. Введем имя проекта (try_rtjava) и нажмем кнопку Finish (рис. 1).
Р
ис.1.
Создание проекта try_rtjava
Обратите внимание, что в разделе JRE с помощью выбора переключателя Use a project specific JRE можно выбрать среду исполнения Java для данного проекта из числа установленных JRE.
Итак, после нажатия кнопки Finis в представлении Package Explorer появится папка «try_rtjava» - это и есть наш проект.
Создадим новый класс (File | New | Class). В открывшемся окне (рис. 2) укажем имя класса (HelloRTJava) и в группе флажков Which method stubs would you like to create? Установим первый флажок, т. е. выберем метод «main», чтобы затем меньше текста вводить руками. Остальное оставляем как есть и нажимаем кнопку Finish.
В папке src проекту try_rtjava появится файл HelloyRTJava.java (Lab/program/HelloRTJava/). Модифицируем его так, чтобы получить такое содержимое:
import javax.realtime.AsyncEventHandler;
import javax.realtime.POSIXSignalHandler;
public class HelloRTJava {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
POSIXSignalHandler.addHandler(POSIXSignalHandler.SIGUSR1,new AsyncEventHandler(){
public void handleAsyncEvent() {
System.out.println("I'm a POSIX signal handler!");
}
});
POSIXSignalHandler.addHandler(POSIXSignalHandler.SIGUSR2,new AsyncEventHandler(){
public void handleAsyncEvent() {
System.out.println("Good bye!");
System.exit(0);
}
});
while (true) {
try {
Thread.sleep(2000);
} catch (Exception e) {
System.err.println("POSIX signal example error:" + e.getMessage());
e.printStackTrace();
}
System.out.println("Kick me with the QNX command:");
System.out.println("slay -s SIGUSR1 HelloRTJava");
System.out.println();
System.out.println("or kill me with the QNX command:");
System.out.println("slay -s SIGUSR2 HelloRTJava");
System.out.println("");
}
}
}
Рис.2. Создание класса HelloRTJava
Выделим имя проекта в представлении Package Explorer и путем выбора элемента меню Project | Build Project скомпилируем класс. В каталоге bin проекта появится файлы HelloRTJava.class.
Для запуска Java-приложения выберем элемент меню Run | Run. Класс HelloRTJava выполнится на установленной в нашей среде разработки виртуальной машине JamaicaVm — в представлении Console мы увидим периодически выводимые строки:
Kick me with the QNX command:
slay -s SIGUSR1 HelloRTJava
or kill me with the QNX command:
slay -s SIGUSR2 HelloRTJava
А теперь давайте превратим байт-код класса HelloRTJava в исполняемый файл. Для этой цели проще всего воспользоваться Eclipse-модулем Jamaica и создать для Java-проекта try-rtjava соответствующий Ant-сценарий — сценарий на языке XML, предназначенный для автоматизации сборки проектов Java на основе использования программы ant. По сути дела, назначение программы ant в Java-проектах аналогично назначению программы make в проектах C/C++. Нажмем File | New | Jamaica Buildfile (Ant Buildfile to launch jamaica tools).
Р
ис.
3. Параметры Ant-сценария для создания
исполняемого файла
Откроется окно New Jamaica Buildfile, в котором задаются параметры Ant-сценария. Укажем имя проекта, тип целевой системы и имя класса, содержащего статический метод main (рис.3). Сохраним параметры, нажав кнопку Finish.
Как результат, в списке слева увидите наш сценарий - «SignalHandler». Его файл (build_jamaica.xml) будет находиться в папке проекта try_rtjava. Сценарий можно запустить кнопкой Build.
Созданный Ant-сценарий можно открыть в специальном редакторе. Для этого надо дважды щелкнуть мышью на имени файла Ant-сценария в проекте try_rtjava — build_jamaica.xml. Файл откроется в редакторе, как это показано на рисунке 4(a).
На рис. 4(a) показано представление Overview редактора Ant-сценариев. Вы можете построить исполняемый файл с помощью Ant-сценария build_jamaica.xml, щелкнув на гиперссылке «invoke Ant on this target». Давайте так и сделаем — в результате в проекте появится исполняемый файл для ОСРВ QNX Neutrino — HelloRTJava.
Параметры Ant-сценария можно менять с помощью представления Options редактора Ant-сценариев (риc. 4.(b)), для перехода в эту вкладку нужно нажать на гиперссылку «show the options».
Р
ис.4(а).
Редактор Ant-сценария — представление
Overview.
Р
ис.
4(b). Редактор Ant-сценария — представление
Options
Результаты выводимые в консоль при сборке исполняемого приложения:
Buildfile: /home/stolyarenko/workspace/try_rtjava/build_jamaica.xml
build_HelloRTJava:
[jamaicabuilder] Reading configuration from '/usr/local/jamaica-6.0-2/etc/jamaica.conf'...
[jamaicabuilder] Reading configuration from '/usr/local/jamaica-6.0-2/target/linux-x86/etc/jamaica.conf'...
[jamaicabuilder] Reading configuration from '/usr/local/jamaica-6.0-2/target/qnx-x86/etc/jamaica.conf'...
[jamaicabuilder] Jamaica Builder Tool 6.0 Release 2 (User: Yuriy Stolyarenko, Expires: 2013.02.08)
[jamaicabuilder] Generating code for target 'qnx-x86', optimisation 'speed'
[jamaicabuilder] + bin/PKG__V14acb94a97a93be9__.c
[jamaicabuilder] + bin/PKG_com_aicas_util_V9bc5428c708c8407__.c
[jamaicabuilder] ** warning jamaica: The dynamic library libgf.so cannot be found.
[jamaicabuilder] + bin/PKG_java_awt_V9bc5428c708c8407__.c
[jamaicabuilder] + bin/PKG_java_awt_event_V9bc5428c708c8407__.c
[jamaicabuilder] + bin/PKG_java_awt_font_V9bc5428c708c8407__.c
[jamaicabuilder] + bin/PKG_java_awt_geom_V9bc5428c708c8407__.c
[jamaicabuilder] + bin/PKG_java_io_V9bc5428c708c8407__.c
[jamaicabuilder] + bin/PKG_java_lang_V9bc5428c708c8407__.c
[jamaicabuilder] + bin/PKG_java_lang_ref_V9bc5428c708c8407__.c
[jamaicabuilder] + bin/PKG_java_lang_reflect_V9bc5428c708c8407__.c
[jamaicabuilder] + bin/PKG_java_net_V9bc5428c708c8407__.c
[jamaicabuilder] + bin/PKG_java_nio_V9bc5428c708c8407__.c
[jamaicabuilder] + bin/PKG_java_nio_charset_V9bc5428c708c8407__.c
[jamaicabuilder] + bin/PKG_java_security_V9bc5428c708c8407__.c
[jamaicabuilder] + bin/PKG_java_text_V9bc5428c708c8407__.c
[jamaicabuilder] + bin/PKG_java_util_V9bc5428c708c8407__.c
[jamaicabuilder] + bin/PKG_java_util_concurrent_V9bc5428c708c8407__.c
[jamaicabuilder] + bin/PKG_java_util_concurrent_locks_V9bc5428c708c8407__.c
[jamaicabuilder] + bin/PKG_java_util_jar_V9bc5428c708c8407__.c
[jamaicabuilder] + bin/PKG_java_util_logging_V4b928c2a106ded30__.c
[jamaicabuilder] + bin/PKG_javax_realtime_V9bc5428c708c8407__.c
[jamaicabuilder] + bin/PKG_sun_awt_V9bc5428c708c8407__.c
[jamaicabuilder] + bin/PKG_sun_font_V9bc5428c708c8407__.c
[jamaicabuilder] + bin/PKG_sun_java2d_V9bc5428c708c8407__.c
[jamaicabuilder] + bin/PKG_sun_java2d_pipe_V920fb1f94bf9048a__.c
[jamaicabuilder] + bin/PKG_sun_misc_V9bc5428c708c8407__.c
[jamaicabuilder] + bin/PKG_sun_net_www_V9bc5428c708c8407__.c
[jamaicabuilder] + bin/PKG_sun_net_www_protocol_jar_V9bc5428c708c8407__.c
[jamaicabuilder] + bin/PKG_sun_nio_cs_V9bc5428c708c8407__.c
[jamaicabuilder] + bin/PKG_sun_reflect_V9bc5428c708c8407__.c
[jamaicabuilder] + bin/PKG_sun_security_provider_V9bc5428c708c8407__.c
[jamaicabuilder] + bin/PKG_sun_security_util_V9bc5428c708c8407__.c
[jamaicabuilder] + bin/PKG_sun_text_V9bc5428c708c8407__.c
[jamaicabuilder] + bin/PKG_sun_text_normalizer_V9bc5428c708c8407__.c
[jamaicabuilder] + bin/PKG_sun_util_calendar_V9bc5428c708c8407__.c
[jamaicabuilder] + bin/HelloRTJava__.c
[jamaicabuilder] + bin/HelloRTJava__.h
[jamaicabuilder] Class file compaction gain: 76.3132% (14020804 ==> 3321080)
[jamaicabuilder] * C compiling 'bin/HelloRTJava__.c'
[jamaicabuilder] * C compiling 'bin/PKG__V14acb94a97a93be9__.c'
[jamaicabuilder] * C compiling 'bin/PKG_com_aicas_util_V9bc5428c708c8407__.c'
[jamaicabuilder] * C compiling 'bin/PKG_java_awt_V9bc5428c708c8407__.c'
[jamaicabuilder] * C compiling 'bin/PKG_java_awt_event_V9bc5428c708c8407__.c'
[jamaicabuilder] * C compiling 'bin/PKG_java_awt_font_V9bc5428c708c8407__.c'
[jamaicabuilder] * C compiling 'bin/PKG_java_awt_geom_V9bc5428c708c8407__.c'
[jamaicabuilder] * C compiling 'bin/PKG_java_io_V9bc5428c708c8407__.c'
[jamaicabuilder] * C compiling 'bin/PKG_java_lang_V9bc5428c708c8407__.c'
[jamaicabuilder] * C compiling 'bin/PKG_java_lang_ref_V9bc5428c708c8407__.c'
[jamaicabuilder] * C compiling 'bin/PKG_java_lang_reflect_V9bc5428c708c8407__.c'
[jamaicabuilder] * C compiling 'bin/PKG_java_net_V9bc5428c708c8407__.c'
[jamaicabuilder] * C compiling 'bin/PKG_java_nio_V9bc5428c708c8407__.c'
[jamaicabuilder] * C compiling 'bin/PKG_java_nio_charset_V9bc5428c708c8407__.c'
[jamaicabuilder] * C compiling 'bin/PKG_java_security_V9bc5428c708c8407__.c'
[jamaicabuilder] * C compiling 'bin/PKG_java_text_V9bc5428c708c8407__.c'
[jamaicabuilder] * C compiling 'bin/PKG_java_util_V9bc5428c708c8407__.c'
[jamaicabuilder] * C compiling 'bin/PKG_java_util_concurrent_V9bc5428c708c8407__.c'
[jamaicabuilder] * C compiling 'bin/PKG_java_util_concurrent_locks_V9bc5428c708c8407__.c'
[jamaicabuilder] * C compiling 'bin/PKG_java_util_jar_V9bc5428c708c8407__.c'
[jamaicabuilder] * C compiling 'bin/PKG_java_util_logging_V4b928c2a106ded30__.c'
[jamaicabuilder] * C compiling 'bin/PKG_javax_realtime_V9bc5428c708c8407__.c'
[jamaicabuilder] * C compiling 'bin/PKG_sun_awt_V9bc5428c708c8407__.c'
[jamaicabuilder] * C compiling 'bin/PKG_sun_font_V9bc5428c708c8407__.c'
[jamaicabuilder] * C compiling 'bin/PKG_sun_java2d_V9bc5428c708c8407__.c'
[jamaicabuilder] * C compiling 'bin/PKG_sun_java2d_pipe_V920fb1f94bf9048a__.c'
[jamaicabuilder] * C compiling 'bin/PKG_sun_misc_V9bc5428c708c8407__.c'
[jamaicabuilder] * C compiling 'bin/PKG_sun_net_www_V9bc5428c708c8407__.c'
[jamaicabuilder] * C compiling 'bin/PKG_sun_net_www_protocol_jar_V9bc5428c708c8407__.c'
[jamaicabuilder] * C compiling 'bin/PKG_sun_nio_cs_V9bc5428c708c8407__.c'
[jamaicabuilder] * C compiling 'bin/PKG_sun_reflect_V9bc5428c708c8407__.c'
[jamaicabuilder] * C compiling 'bin/PKG_sun_security_provider_V9bc5428c708c8407__.c'
[jamaicabuilder] * C compiling 'bin/PKG_sun_security_util_V9bc5428c708c8407__.c'
[jamaicabuilder] * C compiling 'bin/PKG_sun_text_V9bc5428c708c8407__.c'
[jamaicabuilder] * C compiling 'bin/PKG_sun_text_normalizer_V9bc5428c708c8407__.c'
[jamaicabuilder] * C compiling 'bin/PKG_sun_util_calendar_V9bc5428c708c8407__.c'
[jamaicabuilder] + bin/HelloRTJava__nc.o
[jamaicabuilder] * linking
[jamaicabuilder] * stripping
[jamaicabuilder] Application memory demand will be as follows:
[jamaicabuilder] initial max
[jamaicabuilder] Thread C stacks: 512KB (= 8* 64KB) 31MB (= 511* 64KB)
[jamaicabuilder] Thread Java stacks: 128KB (= 8* 16KB) 8176KB (= 511* 16KB)
[jamaicabuilder] Heap Size: 2048KB 256MB
[jamaicabuilder] GC data: 128KB 16MB
[jamaicabuilder] TOTAL: 2816KB 311MB
[echo]
[echo] The executable has been created successfully:
[echo] /home/stolyarenko/workspace/try_rtjava/HelloRTJava
[echo] Please transfer it to your target device manually.
[echo]
BUILD SUCCESSFUL
Total time: 1 minute 38 seconds
Теперь все подготовлено для проведения анализа и профилирование программ для ОСРВ QNX.