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.
 
proj/qnx/howto.txt · Последние изменения: 2015/08/26 12:37
 
Copyright (C) 1996-2013 Serge Vakulenko
serge@vak.ru