Table of Contents
QNX
QNX представляет собой коммерческую операционную систему для встраиваемых применений. Начиная с версии 6.4.0 часть системы распространяется в исходных текстах.
Установка системы программирования
Система программирования называется QNX Momentics. Для установки необходимо скачать образы компакт-дисков:
В Линуксе запускаем установщик:
cd /media/cdrom0 sudo ./momentics-6.3.2-200709062316-linux.bin
Установщик спросит ключ лицензии. Файлы будут размещены в каталогах /opt/qnx632 и /etc/qnx. Потребуется 1210 Мбайт дискового пространства.
Чтобы не мучиться с активацией, просто заменяем файл /etc/qnx/licence/licences на аналогичный от прежней установки. Альтернативный вариант установки описан здесь.
Установщик добавляет необходимые переменные окружения в /etc/profile. Требуется выйти и заново войти в систему.
В качестве ярлыка запуска используем файл qnx_momentics.desktop. При первом запуске введите имя каталога, где будут размещаться разрабатываемые проекты, например “/home/vak/Project/QNX”.
Поддержка целевой платформы
Пакет поддержки целевой платформы (BSP, board support package) для плат ИТМиВТ с процессором Элвис МС-24 разработан фирмой 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 <stdio.h> int main () { printf ("Welcome to QNX\n"); return 0; }
Создаём файл hello.use, содержащий текстовую информацию о вызове программы:
Usage: hello
С помощью утилиты addvariant порождаем стандартные файлы сборки “Makefile”, “common.mk” и “mips-le/Makefile”. Подробнее о файлах сборки можно прочитать в статье "Conventions for Makefiles and Directories".
addvariant -i VARIANT mips-le
Компилируем утилиту hello:
make
Протокол компиляции можно посмотреть здесь.
Образ для загрузки
Создадим образ для прошивки в 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” с заданием для утилиты 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 килобайт памяти. Протокол можно посмотреть здесь.
Образ можно прошить в flash-память платы утилитой mcprog:
mcprog hello.srec
Стартовая утилита
В стартовом скрипте первой должна выполняться стартовая утилита startup-mc24. Её аргументы описаны в документе "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.