25 Ağustos 2014 Pazartesi

Makefile Kullanma

Makefile
Projeyi yarattıktan sonra Eclipse tabanlı WorkBench'i kullanılabileceği gibi, istenirse komut satırından make yapabilmek te mümkün.

makefile kullanabilmek için workbench'in kurulduğu dizindeki wrenv komutunu çalıştırmak gerekir. Bu komut Windows ve Unix için farklı dosyalar. Bu komut ile kabuktaki (shell) ortam değişkenleri (environment variables) atanıyor. Böylece mutlak dizinleri make dosyasında kullanmak zorunda kalmayız.
Atanan değişkenler şunlar
set PATH=
set WIND_PREFERRED_PACKAGES=
set WIND_HOME=
set WIND_HOST_TYPE=
set WIND_GNU_PATH=
set WIND_TOOLCHAINS=
set WIND_DOCS=
set WIND_TOOLS=
set FLEXLM_NO_CKOUT_INSTALL_LIC=
set LD_LIBRARY_PATH=
set WRSD_LICENSE_FILE=
set WIND_DFW_PATH=
set WIND_JRE_HOME=
set WIND_WRUB_PATH=
set WIND_WRSV_PATH=
set WIND_SAMPLES=
set WIND_USERMODE_AGENT=
set WIND_EXTENSIONS=
set WIND_SCOPE_TOOLS_BASE=
set WIND_RSS_CHANNEL=
set WIND_INSTALLER_HOME=
set WIND_WB_SCRIPTS=
set WIND_ANALYSIS_TARGET_SCRIPT_BASE=
set WIND_INITRO=
set WIND_FOUNDATION_PATH=
set WIND_UTILITIES=
set WIND_TCL_PATH=
set WIND_TCLLIBPATH=
set INCLUDE=
set LIB=

Örnek kullanım şekli.
wrenv -p vxworks653.x.y.z
wrenv komutu kendi shell'ini çalıştırıyor. Eğer sadece ortam değişkenlerini almak ve yeni bir shell açmadan kullanmak istersek aşağıdaki komut ile wrenv'in atadığı değişkenleri başka bir dosyaya almak mümkün.
wrenv -p vxworks653-2.3.0.1 -o print_env -f bat > env.bat
Sadece değişkenleri görmek için ise
wrenv -p vxworks653-2.3.0.1 -o print_env 
komutu çalıştırılmalı.

make dosyamıza VxWorks kurulumunda gelen Makefile.vars dosyasınıa dahil etmek gerekli. Bu dosya işlemci mimarisini tanımlıyor. Örneğin PPC604 gibi. Seçilen işlemciye göre projeyi derlerken kullanılacak işlemci ve ortama mahsus ayarları içeren diğer dosyalar dahil ediliyor. Yukarıdaki örnek için Makefile.vars.PPC604 dahil edilir. Makefile.vars.PPC604 dosyasında TOOLARCH = ppc olarak tanımlı. Dolayısıyla CC = ccppc değerini alır.

Derleyiciler kurulumda gnu\x.y.z-vxworks653\x86-win32\bin dizininde. İşlemciye göre derleyiciler mevcut. PowerPC için ccppc.exe, c++ppc.exe, cppppx.exe, g++ppc.exe gibi derleyiciler mevcut. Aralarındaki farkı bilmiyorum ancak makefile yukarıda da anlattığım gibi ccppc.exe'yi kullanıyor. ccppc "GNU C Compiler for PowerPC" imiş. ccppc.exe Wind River firması tarafından değiştirilmiş gcc tabanlı bir derleyici. Normal gcc sürümünü oldukça gerilden takip ediyor. Örneğin gcc sürümü 4.8 iken, firma 3.3.2 tabanlı bir derleyici sunuyor. Dosya uzantısı .c veya .cpp olmayan ya da tanıyamadığı dosyalar içinse g++ppc'yi kullanmaya çalışıyor. (Bu cümleyi daha sonra açıkla)

19 Ağustos 2014 Salı

VxWorks 653 ve Partition OS Bileşenleri

Bazı PartitionOS Bileşenleri
Routines must be exported from partition OS to user tasks using the  system XML-language description files in the "Interface" section.

PartitionOS esnek bir işletim sistemi olduğu için, uygulamalar sunacağımız kabiliyetleri seçebiliyoruz. Üzerinden düşünülerek karar verilmesi gereken en önemli bileşenler vThread (cert olup olmadığı), APEX (minimal olup olmadığı) , C++ (extended olup olmadığı).

Havacılık uygulamaları kendiliğinden bazı kısıtlamalar getirdiği için vThread (cert), APEX, C++ (minimal) seçileceği belli, ancak diğer alanlarda seçim yapabilme imkanı var.

Bileşenleri Eklemek

Bazı bileşenler XML dosyasından eklenirken, bazılarını linklemek gerekiyor. Yani tutarsız bir yol izlenmiş. Herşey XML ile yapılsaydı daha iyi olurdu.

Değiştirilmesi gereken XML dosyası PartitionOS projesindeki PartitionİsmiOS.xml dosyası.


Örnek bir PartitionOS XML dosyası aşağıda.

<Shared_Library_API xmlns="http://www.windriver.com/vxWorks653/SharedLibraryAPI"
    xmlns:xi="http://www.w3.org/2001/XInclude"
    Name="vThreads"
    >

    <Interface>
        <Version Name="Cert"/>
        <xi:include href="$(WIND_BASE)/target/vThreads/config/comps/xml/apex.xml" />
        <xi:include href="$(WIND_BASE)/target/vThreads/config/comps/xml/vthreads_cert.xml" />
        <xi:include href="$(WIND_BASE)/target/vThreads/config/comps/xml/vthreads_shell.xml" />
   
       <!--Belli bir XML subsetinde olmayan routine'ler böyle export edilebilir. -->
        <Interface_Subset>
                 <Routine Name="sfsprintf"/>
        </Interface_Subset>
    </Interface>
</Shared_Library_API>

Bazı projelerde <Interface_Subset> ile başlayan tag'ler yeni bir XML içine taşınıyor. Böylece PartitionOS.xml dosyası daha rahat okunabilir hale geliyor.

vThread Bileşeni
Bu bileşen, hem işletim sistemi tarafından sunulacak API'leri hem de C runtime API'lerini sunar.

vThread.xml
Daha geniş bir C API'si sunuyor.

vThread_cert.xml
suggested CERT POS API anlamına geliyor. Daha kısıtlı C API'si sunuyor. vThreads dizinindeki libc için kullanılan make dosyasında şöyle bir satır var.
ifdef CERT
 EXCLUDE_SUBDIRS = stdio
Yani C runtime kütüphanesinden stdio başlığı altına düşen fread, fwrite gibi I/O ve dosya sistemini ilgilendiren metodlar cert sürümüne dahil edilmiyor.


Kendi uygulamamız içinde, Partition OS için vThreadsComponent.o ile link etmek gerekiyor.
vthreads_cert.xml örneği aşağıda.
<Interface_Subset xmlns="http://www.windriver.com/vxWorks653/SharedLibraryAPI">
  <Routine Name ="errnoGet"/>
 .
 .
 .
</Interface_Subset>

ARINC 653 APEX Bileşeni
Uygulama ile en çok kullanılan standartlar ARINC 653 APEX ya da POSIX standartları.

VxWorks APEX Supplement 2 Part 1 (Mandatory Services) başlığı altındaki hizmetleri destekliyor.

Supplement 2 Part 2 (Optional Services) başlığı altındaki hizmetleri 2013 yılı itibariyle desteklemiyor.



POSIX Bileşeni
Aynı APEX bileşeni gibi XML ile kullanılıyor.

C++ Bileşeni
Aşağıdaki cümleler önemli.

VxWorks 653 support applications written in C++. However, the C++ support components must be added separately to each application, by adding the C++ components to the application's build.

C++ iki farklı sürüm ile geliyor. İlki "full c++" diğer ise "cert c++" . cert c++ havacılık uygulamalarında kullanılan daha kısıtlı bir sürüm. Aşağıdaki açıklama cert c++ sürümünün farkını ortaya koyuyor.
C++ Cert subset does not support the following C++ features.
* C++ standard library
* Exception handling (catch and throw)
* Pure virtual functions (virtual functions are supported) - bu ne anlama geliyor bilmiyorum
* RTTI
* STL 
Dikkatimi çeken önemli bir nokta proje cert bile olsa template kullanan kodların başarılı bir şekilde derlenmesi oldu.

vThreadsCplusComponent.o : Provides basic C++ support and is suitable for inclusion in cert applications.
vThreadsCplusLibraryComponent.o : Provides extended C++ support but can not be included in cert applications.

C++ bileşeni nedense XML ayarı ile eklenmiyor. Bu bileşenlerden birini Libraries sekmesinde link etmek gerekir. Uygulamamızı link ederken hangi C++ bileşenini kullanacağımızı vermemiz lazım.


Yukarıdaki her iki kütüphane de aslında aşağıda açıklaması olan cpluslib.o'yu kullanıyor. Dolayısıyla yukarıdaki iki kütüphaneyi kullanmadan sadece cpluslib.o'yu kullanmak bile yeterli olabilir.

cpluslib.o: Bu kütüphanenin linki burada. Açıklaması ise "basic run-time support for C++"

Örneğin operator new vThreads/lib/objPPC604gnucert veya vThreads/lib/objPPC604gnuvx altındaki newop.o, newop2.o gibi object dosyaları altında.

Bir diğer önemli nokta ise, VxWorks 653 kullanırken, C ve C++ dillerini beraber kullanmak gerekebilir. Bu durumda şu noktalara dikkat etmek lazım.

C'den C++ dosyasındaki bir metodunu çağırırken metodunun name mangling'e (name decoration) uğramaması için extern "C" 'yi kullanmak gerekir. Örnek
extern "C" {
   void foo();
}




Partition OS Nedir

PartitionOS Nedir
PartitionOS bir shared library'dir.
To conserve resources, PartitionOSs are located in a special kind of shared library called a system shared library.
PartitionOS Build System
The PartitionOS build process produces a system module (.sm) file for the shared library. This is an ELF file that can be included in a sytem image build.

PartitionOS Planning
Partition OS bir çok bileşeni içerebildiği için planlanması gerekir.
There are a number of components that can be added to a partition OS to provide added functionality. 

Bazı bileşenler binary (Makefile için ekleniyorlar) ve build sırasında linkleniyorlar. Bazı bileşenler ise XML ile tanımlı. Konuyla ilgili olarak VxWorks 653 Partition OS Bileşenleri başlıklı yazıya göz atabilirsiniz.