====== QNX ======
[[http://qnx.com | QNX]] представляет собой коммерческую операционную систему
для встраиваемых применений. Начиная с версии 6.4.0 часть системы
распространяется в исходных текстах.
===== Установка системы программирования =====
Система программирования называется
[[http://qnx.com/products/tools/ | QNX Momentics]].
Для установки необходимо скачать образы компакт-дисков:
* [[http://qnx.com/download/download/16782/6.3.2-win32-200709062316.iso | Версия 6.3.2 для Windows]]
* [[http://qnx.com/download/download/16786/6.3.2-linux-200709062316.iso | Версия 6.3.2 для Linux]]
В Линуксе запускаем установщик:
cd /media/cdrom0
sudo ./momentics-6.3.2-200709062316-linux.bin
Установщик спросит ключ лицензии. Файлы будут размещены в каталогах
/opt/qnx632 и /etc/qnx. Потребуется 1210 Мбайт дискового пространства.
Чтобы не мучиться с активацией, просто заменяем файл /etc/qnx/licence/licences
на аналогичный от прежней установки. Альтернативный вариант установки [[manual-install | описан здесь]].
Установщик добавляет необходимые переменные окружения в /etc/profile.
Требуется выйти и заново войти в систему.
В качестве ярлыка запуска используем файл {{QNX Momentics.desktop}}.
При первом запуске введите имя каталога, где будут размещаться разрабатываемые
проекты, например "/home/vak/Project/QNX".
===== Поддержка целевой платформы =====
Пакет поддержки целевой платформы (BSP, board support package) для плат
ИТМиВТ с процессором Элвис МС-24 разработан фирмой [[http://www.swd.ru/ | SWD Software]].
Пакет включает следующие файлы:
| mipsle/bin/mc24_flash | Утилита записи во flash-память |
| mipsle/boot/sys/ipl-mc24 | Начальный загрузчик |
| mipsle/boot/sys/startup-mc24 | Стартовая утилита |
| mipsle/boot/sys/procnto-32-mc24 | Менеджер процессов QNX |
| mipsle/boot/build/mc24.build | Пример скрипта построения системы |
| mipsle/sbin/devc-ser8250 | Драйвер портов UART |
| mipsle/sbin/fs-etfs-mc24 | Драйвер файловой системы flash-памяти |
Поместим эти файлы в каталоге ~/Project/QNX/bsp-mc24-swd.
===== Простейший проект =====
По традиции, создадим простейший проект в стиле "Hello, World". Делаем каталог:
cd ~/Project/QNX
mkdir hello
cd hello
Создаём файл hello.c:
#include
int main ()
{
printf ("Welcome to QNX\n");
return 0;
}
Создаём файл hello.use, содержащий текстовую информацию о вызове программы:
Usage:
hello
С помощью утилиты [[http://www.qnx.com/developers/docs/6.3.0SP3/neutrino/utilities/a/addvariant.html | addvariant]] порождаем стандартные файлы сборки "Makefile", "common.mk" и "mips-le/Makefile". Подробнее о файлах сборки можно прочитать в статье [[http://www.qnx.com/developers/docs/6.3.2/neutrino/prog/make_convent.html | "Conventions for Makefiles and Directories"]].
addvariant -i VARIANT mips-le
Компилируем утилиту hello:
make
Протокол компиляции можно [[hello-compile | посмотреть здесь]].
===== Образ для загрузки =====
Создадим образ для прошивки в flash-память целевой платы.
Добавим в файл "common.mk" требуемые правила сборки:
ifndef QCONFIG
QCONFIG=qconfig.mk
endif
include $(QCONFIG)
POST_TARGET = $(PROJECT).srec
EXTRA_CLEAN = *.ifs *.srec *~ $(PROJECT_ROOT)/*.bin $(PROJECT_ROOT)/*~
include $(MKFILES_ROOT)/qtargets.mk
$(PROJECT).srec: $(PROJECT).ifs $(PROJECT_ROOT)/ipl.bin
cat $(PROJECT_ROOT)/ipl.bin $(PROJECT).ifs | mkrec -r -oBFC00000 > $@
ls -l $@
$(PROJECT).ifs: $(PROJECT_ROOT)/$(PROJECT).build hello
mkifs -v -r$(PROJECT_ROOT)/../bsp-mc24-swd $(PROJECT_ROOT)/$(PROJECT).build $@
$(PROJECT_ROOT)/ipl.bin:
$(QNX_HOST)/usr/bin/ntomips-objcopy -Ielf32-littlemips \
-Obinary $(PROJECT_ROOT)/../bsp-mc24-swd/mipsle/boot/sys/ipl-mc24 \
ipl-tmp.bin
mkrec -r -ffull -s8k ipl-tmp.bin > $(PROJECT_ROOT)/ipl.bin
@rm -f ipl-tmp.bin
Создаём файл "hello.build" с заданием для утилиты
[[http://www.qnx.com/developers/docs/6.3.2/neutrino/utilities/m/mkifs.html | mkifs]].
Здесь собран комплект базовых утилит операционной системы, а также наш файл "hello":
[image=0x80200000]
[virtual=mipsle,binary +compress] .bootstrap = {
startup-mc24 -f 80M,80M
PATH=/bin:/sbin LD_LIBRARY_PATH=/lib procnto-32-mc24 -v
}
[+script] .script = {
display_msg ""
display_msg >>> Welcome to QNX Neutrino running on MC24 ITMVT board <<<
uname -a
SYSNAME=nto
TERM=qansi
[+session] ksh &
}
[type=link] /usr = /
[type=link] /lib/ldqnx.so.2 = libc.so.2
[type=link] /tmp = /dev/shmem
[type=link] /bin/sh = ksh
[type=link] /bin/less = more
/lib/libc.so = libc.so
/lib/libm.so = libm.so
[search=${QNX_TARGET}] /lib/terminfo/q/qansi = usr/lib/terminfo/q/qansi
[data=copy]
/bin/ksh = ksh
/bin/echo = echo
/bin/env = env
/bin/ls = ls
/bin/cat = cat
/bin/more = more
/bin/cp = cp
/bin/ln = ln
/bin/mv = mv
/bin/mkdir = mkdir
/bin/rm = rm
/bin/rmdir = rmdir
/bin/touch = touch
/bin/date = date
/bin/uname = uname
/bin/tty = tty
/bin/du = du
/bin/pidin = pidin
/bin/sin = sin
/bin/hogs = hogs
/bin/slay = slay
/bin/stty = stty
/bin/on = on
/bin/use = use
/bin/hd = hd
/bin/vi = vi
/sbin/pipe = pipe
/bin/hello = ./hello
Запускаем сборку:
make
Получаем файл "hello.srec", занимающий 875 килобайт памяти.
Протокол можно [[hello-build | посмотреть здесь]].
Образ можно прошить в flash-память платы
[[https://github.com/sergev/mcprog | утилитой mcprog]]:
mcprog hello.srec
===== Стартовая утилита =====
В стартовом скрипте первой должна выполняться стартовая утилита startup-mc24.
Её аргументы описаны в документе [[http://qnx.com/developers/docs/6.3.2/neutrino/building/startup.html#handle_common_option | "Image startup programs: handle common options"]].
| A | Reboot switch. If set, an OS crash will cause the system to reboot. If not set, an OS crash will cause the system to hang. |
| D | Output channel specification (e.g. kprintf(), stdout, etc.). |
| f [cpu_freq][,[cycles_freq][,timer_freq]] | Specify CPU frequencies. |
| K | kdebug remote debug protocol channel. |
| M | Placeholder for processing additional memory blocks. The parsing of additional memory blocks is deferred until init_system_private(). |
| N | Add the hostname specified to the typed name string space under the identifier _CS_HOSTNAME. |
| R | Used for reserving memory at the bottom of the address space. |
| r | Used for reserving memory at any address space you specify. |
| S | Placeholder for processing debug code's -S option.|
| P | Specify maximum number of CPUs in an SMP system. |
| j | Add Jtag-related options. Reserves four bytes of memory at the specified location and copies the physical address of the system page to this location so the hardware debugger can retrieve it. |
| v | Increment the verbosity global flag, debug_flag. |
| I | |
| i | |
For 'f' option, all frequencies can be followed by H for hertz, K for kilohertz, or M for megahertz (these suffixes aren't case-sensitive). If no suffix is given, the library assumes megahertz if the number is less than 1000; otherwise, it assumes hertz. If they're specified, cpu_freq, cycles_freq, and timer_freq are used to set the corresponding variables in the startup code:
* cpu_freq -- the CPU clock frequency. Also sets the speed field in the cpuinfo section of the system page.
* cycles_freq -- the frequency at which the value returned by ClockCycles() increments. Also sets the cycles_per_sec field in the qtime section of the system page.
* timer_freq -- the frequency at which the timer chip input runs. Also sets the timer_rate and timer_scale values of the qtime section of the system page.