--- c/src/lib/libbsp/i386/virtualpok/Makefile.am | 18 +- c/src/lib/libbsp/i386/virtualpok/arinc653_readme | 72 +++++++ .../lib/libbsp/i386/virtualpok/startup/bspstart.c | 4 +- testsuites/samples/hello/init.c | 210 ++++++++++++++++++++- 4 files changed, 297 insertions(+), 7 deletions(-) create mode 100644 c/src/lib/libbsp/i386/virtualpok/arinc653_readme
diff --git a/c/src/lib/libbsp/i386/virtualpok/Makefile.am b/c/src/lib/libbsp/i386/virtualpok/Makefile.am index c65a002..c2e0b18 100644 --- a/c/src/lib/libbsp/i386/virtualpok/Makefile.am +++ b/c/src/lib/libbsp/i386/virtualpok/Makefile.am @@ -6,6 +6,7 @@ include $(top_srcdir)/../../../../automake/compile.am include $(top_srcdir)/../../bsp.am include_bspdir = $(includedir)/bsp +include_arinc653dir = $(includedir)/arinc653 dist_project_lib_DATA = bsp_specs @@ -19,6 +20,19 @@ nodist_include_bsp_HEADERS = ../../shared/include/bootcard.h DISTCLEANFILES = include/bspopts.h noinst_PROGRAMS = +include_arinc653_HEADERS = $(POK_PATH)/libpok/include/arinc653/types.h +include_arinc653_HEADERS += $(POK_PATH)/libpok/include/arinc653/process.h +include_arinc653_HEADERS += $(POK_PATH)/libpok/include/arinc653/partition.h +include_arinc653_HEADERS += $(POK_PATH)/libpok/include/arinc653/blackboard.h +include_arinc653_HEADERS += $(POK_PATH)/libpok/include/arinc653/time.h +include_arinc653_HEADERS += $(POK_PATH)/libpok/include/arinc653/process.h +include_arinc653_HEADERS += $(POK_PATH)/libpok/include/arinc653/buffer.h +include_arinc653_HEADERS += $(POK_PATH)/libpok/include/arinc653/error.h +include_arinc653_HEADERS += $(POK_PATH)/libpok/include/arinc653/event.h +include_arinc653_HEADERS += $(POK_PATH)/libpok/include/arinc653/queueing.h +include_arinc653_HEADERS += $(POK_PATH)/libpok/include/arinc653/sampling.h +include_arinc653_HEADERS += $(POK_PATH)/libpok/include/arinc653/semaphore.h + include_bsp_HEADERS = irq/irq.h include_bsp_HEADERS += ../../shared/include/irq-generic.h #include_bsp_HEADERS += @@ -70,8 +84,10 @@ libpokpart.a : ar t libpart.a > libpart.list sed -e "s/\.lo/\.o/g" libpart.list > libpart.o.list ar x libpart.a - rename .lo .o `cat libpart.list` +# rename .lo .o `cat libpart.list` + cat libpart.list | rename 's/.lo/.o/g' ar q libbsp.a `cat libpart.o.list` + sed -i '/#include <types.h>/d' ../../../../../../virtualpok/lib/include/arinc653/types.h # ar cru libpokpart.a `cat libpart.o.list` # rm `cat libpart.o.list` is optional as all files get overwritten with new # ones by 'ar x'. But I think it's bad style to remove object files during diff --git a/c/src/lib/libbsp/i386/virtualpok/arinc653_readme b/c/src/lib/libbsp/i386/virtualpok/arinc653_readme new file mode 100644 index 0000000..ac82873 --- /dev/null +++ b/c/src/lib/libbsp/i386/virtualpok/arinc653_readme @@ -0,0 +1,72 @@ +Guide to get POK's arinc653 calls working on RTEMS. + +This guide will go through the steps that are necessary to get arinc653 calls +from POK working on an RTEMS partition and to be able to run an example project +that goes through at least one arinc653 call of each arinc653 subset (buffer, +blackboard, partition, time etc.). As this guide won't go into detail +please refer to either the arinc653 wiki on RTEMS wiki +(http://www.rtems.org/wiki/index.php/Main_Page) or to justjnk.blogspot.nl for +more details. + +Note: Make sure your environment can at least run the default "hello world" for +RTEMS on POK (i.e. the patches for virtualpok are applied to your RTEMS +directory). + +1. Apply the patch arinc653 patch to your rtems environment and the +pok patches to your pok environment. + +2. Go to $POK and make sure the POK_PATH environment variable is set to the folder +of your $POK directory. + +3. Go to $POK/examples/rtems-guest and use the command 'make'. A new folder +named generated-code/ should either be added (if it wasn't there yet). Add the +following macros to $POK/examples/rtems-guest/generated-code/cpu/part1/deployment.h +Note: Compilation will most likely fail due to an error with 'C_dispatch_isr'. This +is okay, you can continue the steps of this guide. + +#define POK_CONFIG_NB_BLACKBOARDS 2 +#define POK_CONFIG_NB_BUFFERS 2 +#define POK_CONFIG_ARINC653_NB_SEMAPHORES 2 +#define POK_CONFIG_NB_EVENTS 2 +#define POK_CONFIG_ARINC653_NB_EVENTS 2 +#define POK_NEEDS_BLACKBOARDS 1 +#define POK_NEEDS_ARINC653_BLACKBOARD 1 +#define POK_NEEDS_BUFFER 1 +#define POK_NEEDS_ARINC653_BUFFER 1 +#define POK_NEEDS_ARINC653_EVENT 1 +#define POK_NEEDS_ARINC653_ERROR 1 +#define POK_NEEDS_ARINC653_QUEUEING 1 +#define POK_NEEDS_ARINC653_SAMPLING 1 +#define POK_NEEDS_ARINC653_SEMAPHORE 1 + +4. Go to $POK/examples/rtems-guest/generated-code and run the command 'make all' +Note: Similar to step 3, this will throw an error about 'C_dispatch_isr'. You can +continue the steps in this guide. + +5. Copy-paste $POK/examples/rtems-guest/generated-code/cpu/part1/libpart.a to +$RTEMS/c/src/lib/libbsp/i386/virtualpok. + +6. Use './bootstrap -p' at your rtems directory's root. + +7. Build RTEMS with the following configuration line: + +--target=i386-rtems4.11 --enable-rtemsbsp=virtualpok --enable-paravirt +--disable-cxx --disable-networking --disable-posix --enable-maintainter-mode +--enable-tests --disable-multiprocessing USE_COM1_AS_CONSOLE=1 +BSP_PRESS_KEY_FOR_RESET=0 + +For example: +mkdir pc386_arinc653 +cd pc386_arinc653 +$RTEMS/configure --target=i386-rtems4.11 --enable-rtemsbsp=virtualpok + --enable-paravirt --disable-cxx --disable-networking --disable-posix + --enable-maintainter-mode --enable-tests --disable-multiprocessing + USE_COM1_AS_CONSOLE=1 BSP_PRESS_KEY_FOR_RESET=0 + +8. Copy-paste <build_dir>/i386-rtems4.11/c/virtualpok/testsuites/samples/hello/hello.exe +to $POK/examples/rtems-guest + +9. go to $POK/examples/rtems-guest and run "./copy_rebuild_kernel.sh hello.exe" + +10. If everything went well you can now run "make run" in $POK/examples/rtems-guest +and the arinc653 calls example will run. diff --git a/c/src/lib/libbsp/i386/virtualpok/startup/bspstart.c b/c/src/lib/libbsp/i386/virtualpok/startup/bspstart.c index 3464ee0..6b0686e 100644 --- a/c/src/lib/libbsp/i386/virtualpok/startup/bspstart.c +++ b/c/src/lib/libbsp/i386/virtualpok/startup/bspstart.c @@ -34,8 +34,8 @@ void bsp_start( void ) _BSP_Virtual_Char_write( "Hello RTEMS World\n" ); // Initialize IRQ management - rtems_irq_mngt_init(); + //rtems_irq_mngt_init(); // Register clock driver - Clock_driver_install_handler(); + //Clock_driver_install_handler(); } diff --git a/testsuites/samples/hello/init.c b/testsuites/samples/hello/init.c index d8fe450..de9329d 100644 --- a/testsuites/samples/hello/init.c +++ b/testsuites/samples/hello/init.c @@ -11,15 +11,47 @@ #include "config.h" #endif +#define POK_NEEDS_ARINC653_PARTITION 1 +#define POK_NEEDS_ARINC653_PROCESS 1 +#define POK_NEEDS_ARINC653_TIME 1 +#define POK_NEEDS_ARINC653_ERROR 1 +#define POK_NEEDS_ARINC653_BLACKBOARD 1 +#define POK_NEEDS_ARINC653_BUFFER 1 +#define POK_NEEDS_ARINC653_EVENT 1 +#define POK_NEEDS_ARINC653_SEMAPHORE 1 +#define POK_NEEDS_ARINC653_SAMPLING 1 +#define POK_NEEDS_ARINC653_QUEUEING 1 + #include <rtems/test.h> #include <bsp.h> /* for device driver prototypes */ #include <stdio.h> #include <stdlib.h> +#include <arinc653/types.h> +#include <arinc653/partition.h> +#include <arinc653/process.h> +#include <arinc653/time.h> +#include <arinc653/error.h> +#include <arinc653/blackboard.h> +#include <arinc653/buffer.h> +#include <arinc653/event.h> +#include <arinc653/semaphore.h> +#include <arinc653/sampling.h> +#include <arinc653/queueing.h> /* forward declarations to avoid warnings */ rtems_task Init(rtems_task_argument argument); +void arinc653_test_partition(void); +void arinc653_test_process(void); +void arinc653_test_time(void); +void arinc653_test_error(void); +void arinc653_test_blackboard(void); +void arinc653_test_buffer(void); +void arinc653_test_event(void); +void arinc653_test_semaphore(void); +void arinc653_test_sampling(void); +void arinc653_test_queueing(void); const char rtems_test_name[] = "HELLO WORLD"; @@ -27,12 +59,182 @@ rtems_task Init( rtems_task_argument ignored ) { - rtems_test_begin(); - printf( "Hello World\n" ); - rtems_test_end(); - exit( 0 ); + arinc653_test_partition(); + arinc653_test_process(); + arinc653_test_time(); + arinc653_test_error(); + arinc653_test_blackboard(); + arinc653_test_buffer(); + arinc653_test_event(); + arinc653_test_semaphore(); + arinc653_test_sampling(); + arinc653_test_queueing(); + exit( 0 ); +} + +void arinc653_test_partition() +{ + printf("arinc653_test_partition start\n"); + PARTITION_STATUS_TYPE partition_status; + RETURN_CODE_TYPE ret; + + GET_PARTITION_STATUS(&partition_status, &ret); + + printf("OPERATING_MODE_TYPE after GET_PARTITION_STATUS: %d\n", (int)partition_status.OPERATING_MODE); + printf("Return after GET_PARTITION_STATUS: %d\n", (int)ret); + printf("arinc653_test_partition stop\n\n"); +} + +void arinc653_test_process() +{ + printf("arinc653_test_process start\n"); + PROCESS_ID_TYPE PROCESS_ID; + RETURN_CODE_TYPE RETURN_CODE; + + GET_MY_ID ( + /*out*/ &PROCESS_ID, + /*out*/ &RETURN_CODE ); + + printf("PROCESS_ID after GET_MY_ID: %d\n", (int)PROCESS_ID); + printf("RETURN_CODE after GET_MY_ID: %d\n", (int)RETURN_CODE); + printf("arinc653_test_process stop\n\n"); +} + +void arinc653_test_time() +{ + printf("arinc653_test_time start\n"); + RETURN_CODE_TYPE return_code; + + PERIODIC_WAIT ( + /*out*/ &return_code ); + + printf("return_code after PERIODIC_WAIT: %d\n", (int)return_code); + printf("arinc653_test_time stop\n\n"); +} + +void arinc653_test_error() +{ + printf("arinc653_test_error start\n"); + ERROR_STATUS_TYPE ERROR_STATUS; + RETURN_CODE_TYPE RETURN_CODE; + + GET_ERROR_STATUS (&ERROR_STATUS, + &RETURN_CODE); + + printf("ERROR_STATUS.ERROR_CODE after GET_ERROR_STATUS: %d\n", (int)ERROR_STATUS.ERROR_CODE); + printf("RETURN_CODE after GET_ERROR_STATUS: %d\n", (int)RETURN_CODE); + printf("arinc653_test_error stop\n\n"); } +void arinc653_test_blackboard() +{ + printf("arinc653_test_blackboard start\n"); + BLACKBOARD_ID_TYPE BLACKBOARD_ID; + RETURN_CODE_TYPE RETURN_CODE; + + CREATE_BLACKBOARD ( + /*in */ "RTEMS_arinc_blackboard", + /*in */ 5, + /*out*/ &BLACKBOARD_ID, + /*out*/ &RETURN_CODE ); + + printf("BLACKBOARD_ID after CREATE_BLACKBOARD: %d\n", (int)BLACKBOARD_ID); + printf("RETURN_CODE after CREATE_BLACKBOARD: %d\n", (int)RETURN_CODE); + printf("arinc653_test_blackboard stop\n\n"); +} + +void arinc653_test_buffer() +{ + printf("arinc653_test_buffer start\n"); + BUFFER_ID_TYPE BUFFER_ID; + RETURN_CODE_TYPE RETURN_CODE; + + CREATE_BUFFER ( + /*in */ "RTEMS_arinc_buffer", + /*in */ 5, + /*in */ 4, + /*in */ FIFO, + /*out*/ &BUFFER_ID, + /*out*/ &RETURN_CODE ); + + printf("BUFFER_ID after CREATE_BUFFER: %d\n", (int)BUFFER_ID); + printf("RETURN_CODE after CREATE_BUFFER: %d\n", (int)RETURN_CODE); + printf("arinc653_test_buffer stop\n\n"); +} + +void arinc653_test_event() +{ + printf("arinc653_test_event start\n"); + EVENT_ID_TYPE EVENT_ID; + RETURN_CODE_TYPE RETURN_CODE; + + CREATE_EVENT ( + /*IN */ "RTEMS_arinc_event", + /*OUT*/ &EVENT_ID, + /*OUT*/ &RETURN_CODE ); + + printf("EVENT_ID after CREATE_EVENT: %d\n", (int)EVENT_ID); + printf("RETURN_CODE after CREATE_EVENT: %d\n", (int)RETURN_CODE); + printf("arinc653_test_event stop\n\n"); +} + +void arinc653_test_semaphore() +{ + printf("arinc653_test_semaphore start\n"); + SEMAPHORE_ID_TYPE SEMAPHORE_ID; + RETURN_CODE_TYPE RETURN_CODE; + + CREATE_SEMAPHORE ( + /*IN */ "RTEMS_arinc_sem", + /*IN */ 1, + /*IN */ 4, + /*IN */ FIFO, + /*OUT*/ &SEMAPHORE_ID, + /*OUT*/ &RETURN_CODE ); + + printf("SEMAPHORE_ID after CREATE_SEMAPHORE: %d\n", (int)SEMAPHORE_ID); + printf("RETURN_CODE after CREATE_SEMAPHORE: %d\n", (int)RETURN_CODE); + printf("arinc653_test_semaphore stop\n\n"); +} + +void arinc653_test_sampling() +{ + printf("arinc653_test_sampling start\n"); + SAMPLING_PORT_ID_TYPE SAMPLING_PORT_ID; + RETURN_CODE_TYPE RETURN_CODE; + + CREATE_SAMPLING_PORT ( + /*in */ "RTEMS_arinc_sampling", + /*in */ 5, + /*in */ SOURCE, + /*in */ 5000, + /*out*/ &SAMPLING_PORT_ID, + /*out*/ &RETURN_CODE ); + + printf("SAMPLING_PORT_ID after CREATE_SAMPLING_PORT: %d\n", (int)SAMPLING_PORT_ID); + printf("RETURN_CODE after CREATE_SAMPLING_PORT: %d\n", (int)RETURN_CODE); + printf("arinc653_test_sampling stop\n\n"); +} + +void arinc653_test_queueing() +{ + printf("arinc653_test_queueing start\n"); + QUEUING_PORT_ID_TYPE QUEUING_PORT_ID; + RETURN_CODE_TYPE RETURN_CODE; + + CREATE_QUEUING_PORT ( + /*in */ "RTEMS_arinc_queueing", + /*in */ 5, + /*in */ 3, + /*in */ SOURCE, + /*in */ FIFO, + /*out*/ &QUEUING_PORT_ID, + /*out*/ &RETURN_CODE ); + + printf("QUEUING_PORT_ID after CREATE_QUEUING_PORT: %d\n", (int)QUEUING_PORT_ID); + printf("RETURN_CODE after CREATE_QUEUING_PORT: %d\n", (int)RETURN_CODE); + printf("arinc653_test_queueing stop\n\n"); +} /* NOTICE: the clock driver is explicitly disabled */ #define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER -- 1.9.1 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel