- PVSM.RU - https://www.pvsm.ru -
Опустим вопрос, зачем это нужно. Это одна из немногих компактных операционных систем open source с поддержкой русского языка, которые шагнули дальше концептуальной версии.
Источниками информации для вас будут (начало тут [1]):
Установить SVN-клиент по выбору – например для командной строки есть SlikSVN [4], визуальные RapidSVN [5], SubTile [6](нужен Firefox runtime), а есть в виде расширения Windows Exporer TortoiseSVN [7].
Полный учебник по работе с SVN ищем в сети, приведу здесь примеры типовых команд для SlikSVN, находясь в нужном каталоге:
>
svn co svn://kolibrios.org/contrib/sdk sdk
— получить себе актуальную копию;
>svn status --show-updates
— просмотреть измененные по сравнению с сервером файлы;
>svn up
— обновить свою копию с сервера;
>svn add *.c
— добавить все новые c-файлы под контроль;
>svn commit --username XXXX --password YYYY -m "метка билда"
— загрузить на сервер свои изменения (сначала не забыв проанализировать status);
Для загрузки исходных текстов с SVN пароль не требуется. Можно для просмотра кода Колибри и приложений пользоваться Web-возможностями сервера SVN, но в нем не видно русскоязычных комментариев в кодировке CP1251 (CP866 поддерживается).
Единственное неудобство кросс-компиляции – нужно каждый раз копировать полученную программу в систему. Варианты – или через FTP если сервер заработает с вашей сетевой картой, или через USB-флэшку, или модифицируя ISO-образ системы (например с помощью Magic ISO Maker) и перезапуская ее. По этому компилятору есть статья на Хабре [14] от pascualle [15], из которой можно взять makefile. В ближайшей перспективе (уже в тесте) выпуск порта версии gcc 5.4 от ion2 [16]
Чем пользоваться в качестве редактора при кросс-компиляции? Ваше личное дело, я прописал отдельный toolchain в CodeBlocks.
Для С отсутствует отладчик исходного кода, потому приходится использовать системный Mtdbg.
Для некоторого удобства можно компилироваться с .map файлом для gcc и с отладочным файлом для tcc – это даст в отладчике подсказку в виде имен функций и частично строк исходника для tcc.
Для GCC поддерживается статическая и динамическая линковка – потому два варианта makefile. Не забудьте при динамической линковке в образ системы в /lib сложить libc.dll и stdlibc++.dll (в ISO версии системы сразу присутствуют)
Примеры строк компиляции для отладки:
>
kos32-gcc -c -g -U__WIN32__ -U_Win32 -U_WIN32 -U__MINGW32__ -UWIN32 -I $(SDK_DIR)/sources/newlib/libc/include -o hello hello.cpp
— обычная компиляция>
kos32-ld -static -nostdlib -T $(SDK_DIR)/sources/newlib/static.lds -Map=hello.map -L $(SDK_DIR)/lib -L /home/autobuild/tools/win32/mingw32/lib -o hello hello.o -lstdc++ -lsupc++ -lgcc_eh -lc -lapp -lgcc -lc
— линковка с нужным для Колибри форматом файла и созданием .map -файла для отладчика>
kos32-objdump -d -M intel -S hello.o > hello.asm
— создание ассемблерного файла со строками исходного cpp файла для удобства
>kos32-objcopy hello -O binary
— обрезание лишнего и генерация исполняемого файла Колибри
Немного сложно, но в итоге по map файлу мы можем смотреть физические адреса данных и функций и видеть соответствие ассемблерного и С-кода.
>
kos32-ld -static -S -nostdlib -T $(SDK_DIR)/sources/newlib/app.lds --image-base 0 -Map=hello.map -L $(SDK_DIR)/lib -L /home/autobuild/tools/win32/mingw32/lib -o hello hello.o -lstdc++ -lsupc++ -lgcc_eh -lc.dll -lapp -lgcc -lc.dll
>
tcc hello.c -o hello -lck -g
Здесь все проще, поскольку компилятор модифицирован специально для Колибри.
В системе отсутствует поддержка консольных приложений через системное API, это как ни странно система с графическим интерфейсом, если вы заметили. Создание таких приложений возможно с использованием системной же библиотеки console.obj, с документацией SVN:/programs/develop/libraries/console. Пример использования на ассемблере – там же examples.
Небольшое отступление – в Колибри формат .obj это не обычный объектный файл для линкера, а динамически загружаемая библиотека формата COFF, с сформированной специальным образом таблицей экспорта. В каждой программе необходимо выполнить ее загрузку через системное API и связывание явным образом. GCC также поддерживает загрузку .dll формата PE.
Для GCC использование консоли для стандартных функций встроено в С-библиотеку libc.
Для TinyC тоже возможно использование libck, но также имеется уменьшенные по размеру кода функции tiny_printf и прямая обертка над console.obj в виде conio.h
Нюансом для КолибриОС является отсутствие потоков ввода-вывода и их перенаправления, потому написать что то типа cat a.txt > aaa.txt | more
не получится.
Для взаимодействия консольных программ есть 4 способа:
Также при использовании console.obj ваше приложение будет состоять из двух одноименных процессов, не пугайтесь.
Сразу скажу, это очень широкая тема, и в данной статье будет только обзор немногим сложнее Хелловорлрд’а плюс некоторые наметки, куда бы еще посмотреть.
В настоящий момент для разработки графических приложений можно использовать системные вызовы, библиотеку виджетов box_lib и gui.h для C--. Для C тоже выполнена обвязка box_lib, частично в рамках GSoC 2016, расширение GUI-библиотеки запланировано на осень 2016.
Поскольку оконное GUI встроено в ядро, то стандартная заготовка оконной программы очень простая.
; Простой пример программы для KolibriOS
; озвучивает код нажатой клавиши
;
; Компилировать FASM'ом
; Можно открыть example.asm через программу FASM (её ярлык есть
; на рабочем столе)
; А можно просто нажать F9 в Tinypad'е. Лог компиляции
; отображается на доске отладки (программа BOARD)
;
; Что важно знать при программировании под Колибри:
; Номер функции помещается в регистр eax.
; Вызов системной функции осуществляется командой "int 0x40".
; Все регистры, кроме явно указанных в возвращаемом значении,
; включая регистр флагов eflags, сохраняются.
;
; Пример:
; mov eax, 1 ;Функция 1 - поставить точку в окне
; ;список сисфункций см. в DOCPACK - sysfuncr.txt
; mov ebx, 10 ; координата x=10
; mov ecx, 20 ; координата y=10
; mov edx, 0xFFFfff ;цвет точки
; int 0x40 ;вызвать функцию
;
; Тоже самое с использованием макроса:
; mcall 1, 10, 20, 0xFFFfff
;---------------------------------------------------------------------
use32 ; включить 32-битный режим ассемблера
org 0x0 ; адресация с нуля
db 'MENUET01' ; 8-байтный идентификатор MenuetOS
dd 0x01 ; версия заголовка (всегда 1)
dd START ; адрес первой команды
dd I_END ; размер программы
dd 0x1000 ; количество памяти
dd 0x1000 ; адрес вершины стэка
dd 0x0 ; адрес буфера для параметров
dd 0x0 ; зарезервировано
include "macros.inc" ; макросы облегчают жизнь ассемблерщиков!
;---------------------------------------------------------------------
;--- НАЧАЛО ПРОГРАММЫ ----------------------------------------------
;---------------------------------------------------------------------
START:
red: ; перерисовать окно
call draw_window ; вызываем процедуру отрисовки окна
;---------------------------------------------------------------------
;--- ЦИКЛ ОБРАБОТКИ СОБЫТИЙ ----------------------------------------
;---------------------------------------------------------------------
still:
mcall 10 ; функция 10 - ждать события
cmp eax,1 ; перерисовать окно ?
je red ; если да - на метку red
cmp eax,2 ; нажата клавиша ?
je key ; если да - на key
cmp eax,3 ; нажата кнопка ?
je button ; если да - на button
jmp still ; если другое событие - в начало цикла
;---------------------------------------------------------------------
key: ; нажата клавиша на клавиатуре
mcall 2 ; функция 2 - считать код символа (в ah)
mov [Music+1], ah ; записать код символа как код ноты
; функция 55-55: системный динамик ("PlayNote")
; esi - адрес мелодии
; mov eax,55
; mov ebx,eax
; mov esi,Music
; int 0x40
; или коротко:
mcall 55, eax, , , Music
jmp still ; вернуться к началу цикла
;---------------------------------------------------------------------
button:
mcall 17 ; 17 - получить идентификатор нажатой кнопки
cmp ah, 1 ; если НЕ нажата кнопка с номером 1,
jne still ; вернуться
.exit:
mcall -1 ; иначе конец программы
;---------------------------------------------------------------------
;--- ОПРЕДЕЛЕНИЕ И ОТРИСОВКА ОКНА ----------------------------------
;---------------------------------------------------------------------
draw_window:
mcall 12, 1 ; функция 12: сообщить ОС о начале отрисовки
mcall 48, 3, sc,sizeof.system_colors
; далее: сначала длинный вариант (закомментированный)
; затем короткий аналог с использованием макросов
; mov eax,0 ; функция 0: определить окно
; mov ebx,200*65536+300 ; [x старт] *65536 + [x размер]
; mov ecx,200*65536+150 ; [y старт] *65536 + [y размер]
; mov edx, [sc.work] ; цвет фона
; or edx, 0x33000000 ; и тип окна 3
; mov edi,header ; ЗАГОЛОВОК ОКНА
; int 0x40
mov edx, [sc.work] ; цвет фона
or edx, 0x33000000 ; и тип окна 3
mcall 0, <200,300>, <200,150>, , ,title
; вывод текстовой строки
mov ecx, [sc.work_text] ; цвет фона
or ecx, 0x90000000 ; и тип строки
mcall 4, <10, 20>, 0x90000000, message
mcall 12, 2 ; функция 12.2, закончили рисовать
ret ; выходим из процедуры
;---------------------------------------------------------------------
;--- ДАННЫЕ ПРОГРАММЫ ----------------------------------------------
;---------------------------------------------------------------------
; Вот такая вот короткая "мелодия".
; Второй байт изменяется нажатием клавишы
Music:
db 0x90, 0x30, 0
sc system_colors
message db 'Нажмите любую клавишу...',0
title db 'Пример программы',0
;---------------------------------------------------------------------
I_END: ; метка конца программы
Примеры для Ассемблера использования box_lib.
SVN:/programs/develop/libraries/box_lib/asm/trunk/ctrldemo.asm [26] и editbox_ex.asm [27]
#define MEMSIZE 4096*10
#include "../lib/io.h"
#include "../lib/gui.h"
void main()
{
word id;
dword file;
io.dir.load(0,DIR_ONLYREAL);
loop() switch(WaitEvent())
{
case evButton:
id=GetButtonID();
if (id==1) ExitProcess();
break;
case evKey:
GetKeys();
if (key_scancode == SCAN_CODE_ESC ) ExitProcess();
break;
case evReDraw:
draw_window();
break;
}
}
void draw_window()
{
proc_info Form;
int i;
DefineAndDrawWindow(215,100,350,300,0x34,0xFFFFFF,"Window header");
GetProcessInfo(#Form, SelfInfo);
for (i=0; i<io.dir.count; i++)
{
WriteText(5,i*8+3,0x80,0xFF00FF,io.dir.position(i));
}
DrawCaptButton(100, 10, 100, 22, 22, 0xCCCccc, 0x000000, "Button");
WriteText(100,50,0x80,0,"Textline small");
WriteText(100,70,0x90,0,"Textline big");
DrawBar(100, 110, 100, 100, 0x66AF86);
}
Примеры для gcc/tcc:
» svn:/programs/develop/libraries/newlib_example/ [28]
» svn:/programs/develop/ktcc/trunk/samples/ [29]
» Примеры использования box_lib из C: SVN:/contrib/C_Layer/EXAMPLE/ [30]
Компиляция как указана выше, для GCC линковать приложение нужно с ключиком --subsystem windows
(или --subsystem native
), если у вас не используется консольное окно.
Перечень библиотек можно посмотреть на Wiki. Это и работа с изображениями, и со шрифтами, OpenGL реализации, общесистемные библиотеки.
Автор: KolibriOS Project Team
Источник [31]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/203469
Ссылки в тексте:
[1] тут: http://kolibrios.org/ru/
[2] SVN:/kernel/trunk/docs/sysfunc*.txt: http://websvn.kolibrios.org/listing.php?repname=Kolibri+OS&path=%2Fkernel%2Ftrunk%2Fdocs%2F&#a9c10d0a9ec4d4bb1adfc4e75aeef8f61
[3] Вики: http://wiki.kolibrios.org/wiki/Ru/api/kernel
[4] SlikSVN: https://sliksvn.com/download/
[5] RapidSVN: http://www.rapidsvn.org/
[6] SubTile : http://sourceforge.net/projects/subtile
[7] TortoiseSVN: https://tortoisesvn.net/
[8] Лежит тут: http://board.kolibrios.org/viewtopic.php?f=45&t=3237&p=65759#p65636
[9] статья на Хабре: https://habrahabr.ru/company/kolibrios/blog/303582/
[10] Punk_Joker: https://habrahabr.ru/users/punk_joker/
[11] Лежит тут: http://ftp.kolibrios.org/users/Serge/new/Toolchain/
[12] страницы mingw: https://sourceforge.net/projects/mingw/
[13] библиотеку newlib: https://sourceware.org/newlib/
[14] статья на Хабре: https://habrahabr.ru/company/kolibrios/blog/229231/
[15] pascualle: https://habrahabr.ru/users/pascualle/
[16] ion2: https://habrahabr.ru/users/ion2/
[17] тут: http://board.kolibrios.org/viewtopic.php?f=45&t=565&start=195#p65432
[18] этой статье: http://kolibri-n.org/inf/hll/hll
[19] Компилятор и документация тут: http://board.kolibrios.org/viewtopic.php?f=33&t=2443&start=30
[20] fbreader: http://board.kolibrios.org/viewtopic.php?f=46&t=3128&p=65654#p65654
[21] PascalPro: http://board.kolibrios.org/viewtopic.php?f=9&t=2353
[22] TinyPy: http://board.kolibrios.org/viewtopic.php?f=45&t=1655
[23] Lua: http://board.kolibrios.org/viewtopic.php?f=9&t=1663
[24] Forth: http://board.kolibrios.org/viewtopic.php?f=45&t=395
[25] Basic : http://board.kolibrios.org/viewtopic.php?f=33&t=2202
[26] SVN:/programs/develop/libraries/box_lib/asm/trunk/ctrldemo.asm: http://websvn.kolibrios.org/filedetails.php?repname=Kolibri+OS&path=%2Fprograms%2Fdevelop%2Flibraries%2Fbox_lib%2Fasm%2Ftrunk%2Fctrldemo.asm
[27] editbox_ex.asm: http://websvn.kolibrios.org/filedetails.php?repname=Kolibri+OS&path=%2Fprograms%2Fdevelop%2Flibraries%2Fbox_lib%2Fasm%2Ftrunk%2Feditbox_ex.asm
[28] svn:/programs/develop/libraries/newlib_example/: http://websvn.kolibrios.org/filedetails.php?repname=Kolibri+OS&path=%2Fprograms%2Fdevelop%2Flibraries%2Fnewlib_example%2Fmain.c
[29] svn:/programs/develop/ktcc/trunk/samples/: http://websvn.kolibrios.org/listing.php?repname=Kolibri+OS&path=%2Fprograms%2Fdevelop%2Fktcc%2Ftrunk%2Fsamples%2F
[30] SVN:/contrib/C_Layer/EXAMPLE/: http://websvn.kolibrios.org/listing.php?repname=Kolibri+OS&path=%2Fcontrib%2FC_Layer%2FEXAMPLE%2F
[31] Источник: https://habrahabr.ru/post/313772/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.