diff --git a/FSW-qt/Makefile b/FSW-qt/Makefile --- a/FSW-qt/Makefile +++ b/FSW-qt/Makefile @@ -1,21 +1,21 @@ ############################################################################# # Makefile for building: bin/fsw -# Generated by qmake (2.01a) (Qt 4.8.5) on: Thu Nov 21 17:20:36 2013 +# Generated by qmake (2.01a) (Qt 4.8.5) on: Mon Jan 20 12:52:59 2014 # Project: fsw-qt.pro # Template: app -# Command: /usr/bin/qmake-qt4 -spec /usr/lib64/qt4/mkspecs/linux-g++ -o Makefile fsw-qt.pro +# Command: /usr/bin/qmake-qt4 -spec /usr/lib64/qt4/mkspecs/linux-g++ CONFIG+=debug -o Makefile fsw-qt.pro ############################################################################# ####### Compiler, tools and options CC = sparc-rtems-gcc CXX = sparc-rtems-g++ -DEFINES = -DSW_VERSION_N1=1 -DSW_VERSION_N2=0 -DSW_VERSION_N3=0 -DSW_VERSION_N4=1 -DPRINT_MESSAGES_ON_CONSOLE -CFLAGS = -pipe -O3 -Wall $(DEFINES) +DEFINES = -DSW_VERSION_N1=1 -DSW_VERSION_N2=0 -DSW_VERSION_N3=0 -DSW_VERSION_N4=1 -DPRINT_MESSAGES_ON_CONSOLE -DDEBUG_MESSAGES +CFLAGS = -pipe -g -O3 -Wall $(DEFINES) CXXFLAGS = -pipe -O3 -Wall $(DEFINES) INCPATH = -I/usr/lib64/qt4/mkspecs/linux-g++ -I. -I../src -I../header LINK = sparc-rtems-g++ -LFLAGS = +LFLAGS = -g LIBS = $(SUBLIBS) AR = sparc-rtems-ar rcs RANLIB = @@ -76,7 +76,7 @@ DIST = /usr/lib64/qt4/mkspecs/c /usr/lib64/qt4/mkspecs/features/exclusive_builds.prf \ /usr/lib64/qt4/mkspecs/features/default_pre.prf \ sparc.pri \ - /usr/lib64/qt4/mkspecs/features/release.prf \ + /usr/lib64/qt4/mkspecs/features/debug.prf \ /usr/lib64/qt4/mkspecs/features/default_post.prf \ /usr/lib64/qt4/mkspecs/features/shared.prf \ /usr/lib64/qt4/mkspecs/features/unix/gdb_dwarf_index.prf \ @@ -118,6 +118,7 @@ all: Makefile $(TARGET) $(TARGET): $(OBJECTS) @$(CHK_DIR_EXISTS) bin/ || $(MKDIR) bin/ $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS) + { test -n "$(DESTDIR)" && DESTDIR="$(DESTDIR)" || DESTDIR=.; } && test $$(gdb --version | sed -e 's,[^0-9]\+\([0-9]\)\.\([0-9]\).*,\1\2,;q') -gt 72 && gdb --nx --batch --quiet -ex 'set confirm off' -ex "save gdb-index $$DESTDIR" -ex quit '$(TARGET)' && test -f $(TARGET).gdb-index && sparc-rtems-objcopy --add-section '.gdb_index=$(TARGET).gdb-index' --set-section-flags '.gdb_index=readonly' '$(TARGET)' '$(TARGET)' && rm -f $(TARGET).gdb-index || true Makefile: fsw-qt.pro /usr/lib64/qt4/mkspecs/linux-g++/qmake.conf /usr/lib64/qt4/mkspecs/common/unix.conf \ /usr/lib64/qt4/mkspecs/common/linux.conf \ @@ -132,7 +133,7 @@ Makefile: fsw-qt.pro /usr/lib64/qt4/mks /usr/lib64/qt4/mkspecs/features/exclusive_builds.prf \ /usr/lib64/qt4/mkspecs/features/default_pre.prf \ sparc.pri \ - /usr/lib64/qt4/mkspecs/features/release.prf \ + /usr/lib64/qt4/mkspecs/features/debug.prf \ /usr/lib64/qt4/mkspecs/features/default_post.prf \ /usr/lib64/qt4/mkspecs/features/shared.prf \ /usr/lib64/qt4/mkspecs/features/unix/gdb_dwarf_index.prf \ @@ -142,7 +143,7 @@ Makefile: fsw-qt.pro /usr/lib64/qt4/mks /usr/lib64/qt4/mkspecs/features/yacc.prf \ /usr/lib64/qt4/mkspecs/features/lex.prf \ /usr/lib64/qt4/mkspecs/features/include_source_dir.prf - $(QMAKE) -spec /usr/lib64/qt4/mkspecs/linux-g++ -o Makefile fsw-qt.pro + $(QMAKE) -spec /usr/lib64/qt4/mkspecs/linux-g++ CONFIG+=debug -o Makefile fsw-qt.pro /usr/lib64/qt4/mkspecs/common/unix.conf: /usr/lib64/qt4/mkspecs/common/linux.conf: /usr/lib64/qt4/mkspecs/common/gcc-base.conf: @@ -156,7 +157,7 @@ Makefile: fsw-qt.pro /usr/lib64/qt4/mks /usr/lib64/qt4/mkspecs/features/exclusive_builds.prf: /usr/lib64/qt4/mkspecs/features/default_pre.prf: sparc.pri: -/usr/lib64/qt4/mkspecs/features/release.prf: +/usr/lib64/qt4/mkspecs/features/debug.prf: /usr/lib64/qt4/mkspecs/features/default_post.prf: /usr/lib64/qt4/mkspecs/features/shared.prf: /usr/lib64/qt4/mkspecs/features/unix/gdb_dwarf_index.prf: @@ -167,7 +168,7 @@ sparc.pri: /usr/lib64/qt4/mkspecs/features/lex.prf: /usr/lib64/qt4/mkspecs/features/include_source_dir.prf: qmake: FORCE - @$(QMAKE) -spec /usr/lib64/qt4/mkspecs/linux-g++ -o Makefile fsw-qt.pro + @$(QMAKE) -spec /usr/lib64/qt4/mkspecs/linux-g++ CONFIG+=debug -o Makefile fsw-qt.pro dist: @$(CHK_DIR_EXISTS) obj/fsw1.0.0 || $(MKDIR) obj/fsw1.0.0 diff --git a/FSW-qt/fsw-qt.pro b/FSW-qt/fsw-qt.pro --- a/FSW-qt/fsw-qt.pro +++ b/FSW-qt/fsw-qt.pro @@ -1,7 +1,7 @@ TEMPLATE = app # CONFIG += console v8 sim # CONFIG options = verbose *** boot_messages *** debug_messages *** cpu_usage_report *** stack_report *** gsa -CONFIG += console verbose +CONFIG += console verbose debug_messages CONFIG -= qt include(./sparc.pri) diff --git a/FSW-qt/fsw-qt.pro.user b/FSW-qt/fsw-qt.pro.user --- a/FSW-qt/fsw-qt.pro.user +++ b/FSW-qt/fsw-qt.pro.user @@ -1,6 +1,6 @@ - + ProjectExplorer.Project.ActiveTarget @@ -15,13 +15,13 @@ Cpp - CppGlobal + CppGlobal QmlJS - QmlJSGlobal + QmlJSGlobal 2 @@ -58,6 +58,7 @@ 0 0 + /opt/DEV_PLE/FSW-qt true @@ -112,11 +113,11 @@ Release Qt4ProjectManager.Qt4BuildConfiguration - 0 - /opt/DEV_PLE/FSW-qt + 2 false + /opt/DEV_PLE/FSW-qt true @@ -172,7 +173,6 @@ Qt4ProjectManager.Qt4BuildConfiguration 0 - /opt/DEV_PLE/FSW-qt false 2 @@ -191,7 +191,6 @@ 1 - true false false @@ -201,8 +200,12 @@ 0.01 10 true + 1 25 + 1 + true + false true valgrind @@ -239,141 +242,7 @@ false true - 1 - - - - ProjectExplorer.Project.Target.1 - - Desktop2 - Desktop2 - {e96c4de1-323d-4095-8746-d006ca3bd573} - 0 - 0 - 0 - - - - true - qmake - - QtProjectManager.QMakeBuildStep - false - false - - false - - - true - Make - - Qt4ProjectManager.MakeStep - - false - - - - 2 - Build - - ProjectExplorer.BuildSteps.Build - - - - true - Make - - Qt4ProjectManager.MakeStep - - true - clean - - - 1 - Clean - - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Release - - Qt4ProjectManager.Qt4BuildConfiguration - 0 - /opt/DEV_PLE/FSW-qt - false - - - - - true - qmake - - QtProjectManager.QMakeBuildStep - false - false - - false - - - true - Make - - Qt4ProjectManager.MakeStep - - false - - - - 2 - Build - - ProjectExplorer.BuildSteps.Build - - - - true - Make - - Qt4ProjectManager.MakeStep - - true - clean - - - 1 - Clean - - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Release2 - - Qt4ProjectManager.Qt4BuildConfiguration - 0 - /opt/DEV_PLE/FSW-qt - false - - 2 - - - 0 - Deploy - - ProjectExplorer.BuildSteps.Deploy - - 1 - Deploy locally - - ProjectExplorer.DefaultDeployConfiguration - - 1 - - - true + false false @@ -383,8 +252,12 @@ 0.01 10 true + 1 25 + 1 + true + false true valgrind @@ -404,16 +277,15 @@ 13 14 - 2 + -1 - fsw-qt + + grmon + false + %{buildDir} + Run grmon - Qt4ProjectManager.Qt4RunConfiguration:/opt/DEV_PLE/FSW-qt/fsw-qt.pro - - fsw-qt.pro - false - true - + ProjectExplorer.CustomExecutableRunConfiguration 3768 false true @@ -421,12 +293,12 @@ false true - 1 + 2 ProjectExplorer.Project.TargetCount - 2 + 1 ProjectExplorer.Project.Updater.EnvironmentId @@ -434,6 +306,6 @@ ProjectExplorer.Project.Updater.FileVersion - 14 + 15 diff --git a/header/fsw_params.h b/header/fsw_params.h --- a/header/fsw_params.h +++ b/header/fsw_params.h @@ -13,6 +13,16 @@ // flight software version // this parameters is handled by the Qt project options +#define NB_SAMPLES_PER_SNAPSHOT 2048 +#define TIME_OFFSET 2 +#define WAVEFORM_EXTENDED_HEADER_OFFSET 22 +#define NB_BYTES_SWF_BLK (2 * 6) +#define NB_WORDS_SWF_BLK 3 +#define NB_BYTES_CWF3_LIGHT_BLK 6 +#define WFRM_INDEX_OF_LAST_PACKET 6 // waveforms are transmitted in groups of 2048 blocks, 6 packets of 340 and 1 of 8 +#define NB_RING_NODES_F1 5 // AT LEAST 3 +#define NB_RING_NODES_F2 5 // AT LEAST 3 + //********** // LFR MODES #define LFR_MODE_STANDBY 0 @@ -36,7 +46,7 @@ #define DEFAULT_SY_LFR_COMMON1 0x10 // default value 0 0 0 1 0 0 0 0 // NORM #define SY_LFR_N_SWF_L 2048 // nb sample -#define SY_LFR_N_SWF_P 296 // sec +#define SY_LFR_N_SWF_P 20 // sec #define SY_LFR_N_ASM_P 3600 // sec #define SY_LFR_N_BP_P0 4 // sec #define SY_LFR_N_BP_P1 20 // sec @@ -126,30 +136,21 @@ #define TASK_PRIORITY_SPIQ 5 #define TASK_PRIORITY_SMIQ 10 -// #define TASK_PRIORITY_WTDG 20 -// #define TASK_PRIORITY_HOUS 30 -// #define TASK_PRIORITY_CWF1 35 // CWF1 and CWF2 are never running together #define TASK_PRIORITY_CWF2 35 // -// #define TASK_PRIORITY_WFRM 40 #define TASK_PRIORITY_CWF3 40 // there is a printf in this function, be careful with its priority wrt CWF1 -// #define TASK_PRIORITY_SEND 45 -// #define TASK_PRIORITY_RECV 50 #define TASK_PRIORITY_ACTN 50 -// #define TASK_PRIORITY_AVF0 60 #define TASK_PRIORITY_BPF0 60 #define TASK_PRIORITY_MATR 100 #define TASK_PRIORITY_STAT 200 #define TASK_PRIORITY_DUMB 200 -#define SEMQ_PRIORITY_CEILING 30 - #define ACTION_MSG_QUEUE_COUNT 10 #define ACTION_MSG_PKTS_COUNT 50 #define ACTION_MSG_PKTS_MAX_SIZE (PACKET_LENGTH_HK + CCSDS_TC_TM_PACKET_OFFSET + CCSDS_PROTOCOLE_EXTRA_BYTES) @@ -192,14 +193,6 @@ #define CPU_USAGE_REPORT_PERIOD 6 // * 10 s = period -#define NB_SAMPLES_PER_SNAPSHOT 2048 -#define TIME_OFFSET 2 -#define WAVEFORM_EXTENDED_HEADER_OFFSET 22 -#define NB_BYTES_SWF_BLK (2 * 6) -#define NB_WORDS_SWF_BLK 3 -#define NB_BYTES_CWF3_LIGHT_BLK 6 -#define WFRM_INDEX_OF_LAST_PACKET 6 // waveforms are transmitted in groups of 2048 blocks, 6 packets of 340 and 1 of 8 - struct param_local_str{ unsigned int local_sbm1_nb_cwf_sent; unsigned int local_sbm1_nb_cwf_max; diff --git a/header/wf_handler.h b/header/wf_handler.h --- a/header/wf_handler.h +++ b/header/wf_handler.h @@ -12,20 +12,29 @@ #define pi 3.1415 +typedef struct ring_node +{ + struct ring_node *previous; + int buffer_address; + struct ring_node *next; + unsigned int status; +} ring_node; + extern int fdSPW; + +//***************** +// waveform buffers +// F0 extern volatile int wf_snap_f0[ ]; -// -extern volatile int wf_snap_f1[ ]; -extern volatile int wf_snap_f1_bis[ ]; -extern volatile int wf_snap_f1_norm[ ]; -// -extern volatile int wf_snap_f2[ ]; -extern volatile int wf_snap_f2_bis[ ]; -extern volatile int wf_snap_f2_norm[ ]; -// +// F1 +extern volatile int wf_snap_f1[ ][ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ]; +// F2 +extern volatile int wf_snap_f2[ ][ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ]; +// F3 extern volatile int wf_cont_f3[ ]; extern volatile int wf_cont_f3_bis[ ]; extern char wf_cont_f3_light[ ]; + extern waveform_picker_regs_t *waveform_picker_regs; extern time_management_regs_t *time_management_regs; extern Packet_TM_LFR_HK_t housekeeping_packet; @@ -40,7 +49,6 @@ extern rtems_id Task_id[20]; extern unsigned char lfrCurrentMode; rtems_isr waveforms_isr( rtems_vector_number vector ); -rtems_isr waveforms_simulator_isr( rtems_vector_number vector ); rtems_task wfrm_task( rtems_task_argument argument ); rtems_task cwf3_task( rtems_task_argument argument ); rtems_task cwf2_task( rtems_task_argument argument ); @@ -49,13 +57,13 @@ rtems_task cwf1_task( rtems_task_argumen //****************** // general functions void init_waveforms( void ); +void init_waveform_rings( void ); +void reset_current_ring_nodes( void ); // int init_header_snapshot_wf_table( unsigned int sid, Header_TM_LFR_SCIENCE_SWF_t *headerSWF ); int init_header_continuous_wf_table( unsigned int sid, Header_TM_LFR_SCIENCE_CWF_t *headerCWF ); int init_header_continuous_wf3_light_table( Header_TM_LFR_SCIENCE_CWF_t *headerCWF ); // -void reset_waveforms( void ); -// int send_waveform_SWF( volatile int *waveform, unsigned int sid, Header_TM_LFR_SCIENCE_SWF_t *headerSWF, rtems_id queue_id ); int send_waveform_CWF( volatile int *waveform, unsigned int sid, Header_TM_LFR_SCIENCE_CWF_t *headerCWF, rtems_id queue_id ); int send_waveform_CWF3( volatile int *waveform, unsigned int sid, Header_TM_LFR_SCIENCE_CWF_t *headerCWF, rtems_id queue_id ); diff --git a/src/fsw_globals.c b/src/fsw_globals.c --- a/src/fsw_globals.c +++ b/src/fsw_globals.c @@ -31,25 +31,12 @@ int fdSPW = 0; int fdUART = 0; unsigned char lfrCurrentMode; -// APB CONFIGURATION REGISTERS -time_management_regs_t *time_management_regs = (time_management_regs_t*) REGS_ADDR_TIME_MANAGEMENT; -gptimer_regs_t *gptimer_regs = (gptimer_regs_t *) REGS_ADDR_GPTIMER; -#ifdef GSA -#else - waveform_picker_regs_t *waveform_picker_regs = (waveform_picker_regs_t*) REGS_ADDR_WAVEFORM_PICKER; -#endif -spectral_matrix_regs_t *spectral_matrix_regs = (spectral_matrix_regs_t*) REGS_ADDR_SPECTRAL_MATRIX; - // WAVEFORMS GLOBAL VARIABLES // 2048 * 3 * 4 + 2 * 4 = 24576 + 8 bytes volatile int wf_snap_f0[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ]; // -volatile int wf_snap_f1[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ]; -volatile int wf_snap_f1_bis[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ]; -volatile int wf_snap_f1_norm[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ]; +volatile int wf_snap_f1[NB_RING_NODES_F1][ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ]; // -volatile int wf_snap_f2[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ]; -volatile int wf_snap_f2_bis[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ]; -volatile int wf_snap_f2_norm[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ]; +volatile int wf_snap_f2[NB_RING_NODES_F2][ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ]; // volatile int wf_cont_f3[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ]; volatile int wf_cont_f3_bis[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ]; @@ -75,6 +62,15 @@ volatile int spec_mat_f1_bis[ SM_HEADER volatile int spec_mat_f2[ SM_HEADER + TOTAL_SIZE_SM ]; volatile int spec_mat_f2_bis[ SM_HEADER + TOTAL_SIZE_SM ]; +// APB CONFIGURATION REGISTERS +time_management_regs_t *time_management_regs = (time_management_regs_t*) REGS_ADDR_TIME_MANAGEMENT; +gptimer_regs_t *gptimer_regs = (gptimer_regs_t *) REGS_ADDR_GPTIMER; +#ifdef GSA +#else + waveform_picker_regs_t *waveform_picker_regs = (waveform_picker_regs_t*) REGS_ADDR_WAVEFORM_PICKER; +#endif +spectral_matrix_regs_t *spectral_matrix_regs = (spectral_matrix_regs_t*) REGS_ADDR_SPECTRAL_MATRIX; + // MODE PARAMETERS Packet_TM_LFR_PARAMETER_DUMP_t parameter_dump_packet; struct param_local_str param_local; diff --git a/src/fsw_init.c b/src/fsw_init.c --- a/src/fsw_init.c +++ b/src/fsw_init.c @@ -85,6 +85,7 @@ rtems_task Init( rtems_task_argument ign set_apbuart_scaler_reload_register(REGS_ADDR_APBUART, APBUART_SCALER_RELOAD_VALUE); reset_wfp_burst_enable(); // stop the waveform picker if it was running + init_waveform_rings(); // initialize the waveform rings init_parameter_dump(); init_local_mode_parameters(); diff --git a/src/tc_handler.c b/src/tc_handler.c --- a/src/tc_handler.c +++ b/src/tc_handler.c @@ -573,6 +573,9 @@ int enter_sbm1_mode() #ifdef GSA LEON_Unmask_interrupt( IRQ_SM ); #else + //**************** + // waveform picker + reset_current_ring_nodes(); reset_waveform_picker_regs(); set_wfp_burst_enable_register(LFR_MODE_SBM1); LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER ); @@ -605,6 +608,9 @@ int enter_sbm2_mode() #ifdef GSA LEON_Unmask_interrupt( IRQ_SM ); #else + //**************** + // waveform picker + reset_current_ring_nodes(); reset_waveform_picker_regs(); set_wfp_burst_enable_register(LFR_MODE_SBM2); LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER ); diff --git a/src/wf_handler.c b/src/wf_handler.c --- a/src/wf_handler.c +++ b/src/wf_handler.c @@ -9,6 +9,8 @@ #include "wf_handler.h" +//***************** +// waveform headers // SWF Header_TM_LFR_SCIENCE_SWF_t headerSWF_F0[7]; Header_TM_LFR_SCIENCE_SWF_t headerSWF_F1[7]; @@ -20,7 +22,17 @@ Header_TM_LFR_SCIENCE_CWF_t headerCWF_F2 Header_TM_LFR_SCIENCE_CWF_t headerCWF_F3[7]; Header_TM_LFR_SCIENCE_CWF_t headerCWF_F3_light[7]; -unsigned char doubleSendCWF1 = 0; +//************** +// waveform ring +ring_node waveform_ring_f1[NB_RING_NODES_F1]; +ring_node waveform_ring_f2[NB_RING_NODES_F2]; +ring_node *current_ring_node_f1; +ring_node *ring_node_to_send_swf_f1; +ring_node *ring_node_to_send_cwf_f1; +ring_node *current_ring_node_f2; +ring_node *ring_node_to_send_swf_f2; +ring_node *ring_node_to_send_cwf_f2; + unsigned char doubleSendCWF2 = 0; rtems_isr waveforms_isr( rtems_vector_number vector ) @@ -74,11 +86,20 @@ rtems_isr waveforms_isr( rtems_vector_nu else { if ( (waveform_picker_regs->status & 0x7) == 0x7 ){ // f2 f1 and f0 are full waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable & 0x08; + + ring_node_to_send_swf_f1 = current_ring_node_f1; + current_ring_node_f1 = current_ring_node_f1->next; + waveform_picker_regs->addr_data_f1 = current_ring_node_f1->buffer_address; + + ring_node_to_send_swf_f2 = current_ring_node_f2; + current_ring_node_f2 = current_ring_node_f2->next; + waveform_picker_regs->addr_data_f2 = current_ring_node_f2->buffer_address; + if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) { rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ); } -// waveform_picker_regs->status = waveform_picker_regs->status & 0x00; - waveform_picker_regs->status = waveform_picker_regs->status & 0xfffff888; + + waveform_picker_regs->status = waveform_picker_regs->status & 0xfffff888; // [1000 1000 1000] waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable | 0x07; // [0111] enable f2 f1 f0 } } @@ -91,19 +112,16 @@ rtems_isr waveforms_isr( rtems_vector_nu #ifdef GSA PRINTF("in waveform_isr *** unexpected waveform picker interruption\n") #else - if ((waveform_picker_regs->status & 0x04) == 0x04){ // [0100] check the f2 full bit + if ( (waveform_picker_regs->status & 0x04) == 0x04 ){ // [0100] check the f2 full bit // (1) change the receiving buffer for the waveform picker - if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) { - waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2_bis); - } - else { - waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2); - } + ring_node_to_send_cwf_f2 = current_ring_node_f2; + current_ring_node_f2 = current_ring_node_f2->next; + waveform_picker_regs->addr_data_f2 = current_ring_node_f2->buffer_address; // (2) send an event for the waveforms transmission - if (rtems_event_send( Task_id[TASKID_CWF2], RTEMS_EVENT_MODE_BURST ) != RTEMS_SUCCESSFUL) { + if (rtems_event_send( Task_id[TASKID_CWF1], RTEMS_EVENT_MODE_SBM2 ) != RTEMS_SUCCESSFUL) { rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ); } - waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffbbb; // [1111 1011 1011 1011] f2 bits = 0 + waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffbbb; // [1111 1011 1011 1011] f2 bit = 0 } #endif break; @@ -114,35 +132,25 @@ rtems_isr waveforms_isr( rtems_vector_nu #ifdef GSA PRINTF("in waveform_isr *** unexpected waveform picker interruption\n") #else - if ((waveform_picker_regs->status & 0x02) == 0x02){ // [0010] check the f1 full bit + if ( (waveform_picker_regs->status & 0x02) == 0x02 ) { // [0010] check the f1 full bit // (1) change the receiving buffer for the waveform picker - if ( param_local.local_sbm1_nb_cwf_sent == (param_local.local_sbm1_nb_cwf_max-1) ) - { - waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1_norm); - } - else if ( waveform_picker_regs->addr_data_f1 == (int) wf_snap_f1_norm ) - { - doubleSendCWF1 = 1; - waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1); - } - else if ( waveform_picker_regs->addr_data_f1 == (int) wf_snap_f1 ) { - waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1_bis); - } - else { - waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1); - } + ring_node_to_send_cwf_f1 = current_ring_node_f1; + current_ring_node_f1 = current_ring_node_f1->next; + waveform_picker_regs->addr_data_f1 = current_ring_node_f1->buffer_address; // (2) send an event for the waveforms transmission if (rtems_event_send( Task_id[TASKID_CWF1], RTEMS_EVENT_MODE_SBM1 ) != RTEMS_SUCCESSFUL) { rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ); } waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffddd; // [1111 1101 1101 1101] f1 bit = 0 } - if ( ( (waveform_picker_regs->status & 0x05) == 0x05 ) ) { // [0101] check the f2 and f0 full bit + if ( (waveform_picker_regs->status & 0x01) == 0x01 ) { // [0001] check the f0 full bit + ring_node_to_send_swf_f1 = current_ring_node_f1->previous; + } + if ( (waveform_picker_regs->status & 0x04) == 0x04 ) { // [0100] check the f2 full bit if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) { rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ); } waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffaaa; // [1111 1010 1010 1010] f2 and f0 bits = 0 - reset_local_sbm1_nb_cwf_sent(); } #endif @@ -154,38 +162,23 @@ rtems_isr waveforms_isr( rtems_vector_nu #ifdef GSA PRINTF("in waveform_isr *** unexpected waveform picker interruption\n") #else - if ((waveform_picker_regs->status & 0x04) == 0x04){ // [0100] check the f2 full bit + if ( (waveform_picker_regs->status & 0x04) == 0x04 ){ // [0100] check the f2 full bit // (1) change the receiving buffer for the waveform picker - if ( param_local.local_sbm2_nb_cwf_sent == (param_local.local_sbm2_nb_cwf_max-1) ) - { - waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2_norm); - } - else if ( waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2_norm ) { - waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2); - doubleSendCWF2 = 1; - if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_SBM2_WFRM ) != RTEMS_SUCCESSFUL) { - rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ); - } - reset_local_sbm2_nb_cwf_sent(); - } - else if ( waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2 ) { - waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2_bis); - } - else { - waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2); - } + ring_node_to_send_cwf_f2 = current_ring_node_f2; + current_ring_node_f2 = current_ring_node_f2->next; + waveform_picker_regs->addr_data_f2 = current_ring_node_f2->buffer_address; // (2) send an event for the waveforms transmission if (rtems_event_send( Task_id[TASKID_CWF2], RTEMS_EVENT_MODE_SBM2 ) != RTEMS_SUCCESSFUL) { rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ); } waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffbbb; // [1111 1011 1011 1011] f2 bit = 0 } - if ( ( (waveform_picker_regs->status & 0x03) == 0x03 ) ) { // [0011] f3 f2 f1 f0, f1 and f0 are full - if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_SBM2 ) != RTEMS_SUCCESSFUL) { - rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ); - } - waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffccc; // [1111 1100 1100 1100] f1, f0 bits = 0 - } +// if ( (waveform_picker_regs->status & 0x03) == 0x03 ) { // [0011] f3 f2 f1 f0, f1 and f0 are full +// if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_SBM2 ) != RTEMS_SUCCESSFUL) { +// rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ); +// } +// waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffccc; // [1111 1100 1100 1100] f1, f0 bits = 0 +// } #endif break; @@ -196,34 +189,6 @@ rtems_isr waveforms_isr( rtems_vector_nu } } -rtems_isr waveforms_simulator_isr( rtems_vector_number vector ) -{ - /** This is the interrupt sub routine called by the waveform picker simulator. - * - * This ISR is for debug purpose only. - * - */ - - unsigned char lfrMode; - lfrMode = (housekeeping_packet.lfr_status_word[0] & 0xf0) >> 4; - - switch(lfrMode) { - case (LFR_MODE_STANDBY): - break; - case (LFR_MODE_NORMAL): - if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) { - rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_5 ); - } - break; - case (LFR_MODE_BURST): - break; - case (LFR_MODE_SBM1): - break; - case (LFR_MODE_SBM2): - break; - } -} - rtems_task wfrm_task(rtems_task_argument argument) //used with the waveform picker VHDL IP { /** This RTEMS task is dedicated to the transmission of snapshots of the NORMAL mode. @@ -260,49 +225,17 @@ rtems_task wfrm_task(rtems_task_argument rtems_event_receive(RTEMS_EVENT_MODE_NORMAL | RTEMS_EVENT_MODE_SBM1 | RTEMS_EVENT_MODE_SBM2 | RTEMS_EVENT_MODE_SBM2_WFRM, RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out); - + DEBUG_PRINTF("in WFRM *** 2\n") if (event_out == RTEMS_EVENT_MODE_NORMAL) { send_waveform_SWF(wf_snap_f0, SID_NORM_SWF_F0, headerSWF_F0, queue_id); - send_waveform_SWF(wf_snap_f1, SID_NORM_SWF_F1, headerSWF_F1, queue_id); - send_waveform_SWF(wf_snap_f2, SID_NORM_SWF_F2, headerSWF_F2, queue_id); -#ifdef GSA - waveform_picker_regs->status = waveform_picker_regs->status & 0xf888; // [1111 1000 1000 1000] f2, f1, f0 bits =0 -#endif - } - else if (event_out == RTEMS_EVENT_MODE_SBM1) - { - send_waveform_SWF(wf_snap_f0, SID_NORM_SWF_F0, headerSWF_F0, queue_id); - send_waveform_SWF(wf_snap_f1_norm, SID_NORM_SWF_F1, headerSWF_F1, queue_id); - send_waveform_SWF(wf_snap_f2, SID_NORM_SWF_F2, headerSWF_F2, queue_id); -#ifdef GSA - waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffaaa; // [1111 1010 1010 1010] f2, f0 bits = 0 -#endif - } - else if (event_out == RTEMS_EVENT_MODE_SBM2) - { - send_waveform_SWF(wf_snap_f0, SID_NORM_SWF_F0, headerSWF_F0, queue_id); - send_waveform_SWF(wf_snap_f1, SID_NORM_SWF_F1, headerSWF_F1, queue_id); -#ifdef GSA - waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffccc; // [1111 1100 1100 1100] f1, f0 bits = 0 -#endif - } - else if (event_out == RTEMS_EVENT_MODE_SBM2_WFRM) - { - send_waveform_SWF(wf_snap_f2_norm, SID_NORM_SWF_F2, headerSWF_F2, queue_id); + send_waveform_SWF((volatile int*) ring_node_to_send_swf_f1->buffer_address, SID_NORM_SWF_F1, headerSWF_F1, queue_id); + send_waveform_SWF((volatile int*) ring_node_to_send_swf_f2->buffer_address, SID_NORM_SWF_F2, headerSWF_F2, queue_id); } else { PRINTF("in WFRM *** unexpected event") } - - -#ifdef GSA - // irq processed, reset the related register of the timer unit - gptimer_regs->timer[TIMER_WF_SIMULATOR].ctrl = gptimer_regs->timer[TIMER_WF_SIMULATOR].ctrl | 0x00000010; - // clear the interruption - LEON_Unmask_interrupt( IRQ_WF ); -#endif } } @@ -383,39 +316,11 @@ rtems_task cwf2_task(rtems_task_argument if (event_out == RTEMS_EVENT_MODE_BURST) { - // F2 -#ifdef GSA -#else - if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) { - send_waveform_CWF( wf_snap_f2_bis, SID_BURST_CWF_F2, headerCWF_F2_BURST, queue_id ); - } - else { - send_waveform_CWF( wf_snap_f2, SID_BURST_CWF_F2, headerCWF_F2_BURST, queue_id ); - } - #endif + send_waveform_CWF( (volatile int *) ring_node_to_send_cwf_f2, SID_BURST_CWF_F2, headerCWF_F2_BURST, queue_id ); } - - else if (event_out == RTEMS_EVENT_MODE_SBM2) + if (event_out == RTEMS_EVENT_MODE_SBM2) { -#ifdef GSA -#else - if (doubleSendCWF2 == 1) - { - doubleSendCWF2 = 0; - send_waveform_CWF( wf_snap_f2_norm, SID_SBM2_CWF_F2, headerCWF_F2_SBM2, queue_id ); - } - else if (waveform_picker_regs->addr_data_f2 == (int) wf_snap_f2) { - send_waveform_CWF( wf_snap_f2_bis, SID_SBM2_CWF_F2, headerCWF_F2_SBM2, queue_id ); - } - else { - send_waveform_CWF( wf_snap_f2, SID_SBM2_CWF_F2, headerCWF_F2_SBM2, queue_id ); - } - param_local.local_sbm2_nb_cwf_sent ++; -#endif - } - else - { - PRINTF1("in CWF2 *** ERR mode = %d\n", lfrCurrentMode) + send_waveform_CWF( (volatile int *) ring_node_to_send_cwf_f2, SID_BURST_CWF_F2, headerCWF_F2_BURST, queue_id ); } } } @@ -449,28 +354,7 @@ rtems_task cwf1_task(rtems_task_argument // wait for an RTEMS_EVENT rtems_event_receive( RTEMS_EVENT_MODE_SBM1, RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out); - if (event_out == RTEMS_EVENT_MODE_SBM1) - { -#ifdef GSA -#else - if (doubleSendCWF1 == 1) - { - doubleSendCWF1 = 0; - send_waveform_CWF( wf_snap_f1_norm, SID_SBM1_CWF_F1, headerCWF_F1, queue_id ); - } - else if (waveform_picker_regs->addr_data_f1 == (int) wf_snap_f1) { - send_waveform_CWF( wf_snap_f1_bis, SID_SBM1_CWF_F1, headerCWF_F1, queue_id ); - } - else { - send_waveform_CWF( wf_snap_f1, SID_SBM1_CWF_F1, headerCWF_F1, queue_id ); - } - param_local.local_sbm1_nb_cwf_sent ++; -#endif - } - else - { - PRINTF1("in CWF1 *** ERR mode = %d\n", lfrCurrentMode) - } + send_waveform_CWF((volatile int*) ring_node_to_send_cwf_f1->buffer_address, SID_SBM1_CWF_F1, headerCWF_F1, queue_id ); } } @@ -490,22 +374,74 @@ void init_waveforms( void ) //*** // F1 - wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET ] = 0x22221111; - wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET ] = 0x44443333; - wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET ] = 0xaaaa0000; +// wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET ] = 0x22221111; +// wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET ] = 0x44443333; +// wf_snap_f1[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET ] = 0xaaaa0000; //*** // F2 - wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET ] = 0x44443333; - wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET ] = 0x22221111; - wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET ] = 0xaaaa0000; +// wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 0 + TIME_OFFSET ] = 0x44443333; +// wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 1 + TIME_OFFSET ] = 0x22221111; +// wf_snap_f2[ (i* NB_WORDS_SWF_BLK) + 2 + TIME_OFFSET ] = 0xaaaa0000; //*** // F3 - //wf_cont_f3[ (i* NB_WORDS_SWF_BLK) + 0 ] = val1; - //wf_cont_f3[ (i* NB_WORDS_SWF_BLK) + 1 ] = val2; - //wf_cont_f3[ (i* NB_WORDS_SWF_BLK) + 2 ] = 0xaaaa0000; +// wf_cont_f3[ (i* NB_WORDS_SWF_BLK) + 0 ] = val1; +// wf_cont_f3[ (i* NB_WORDS_SWF_BLK) + 1 ] = val2; +// wf_cont_f3[ (i* NB_WORDS_SWF_BLK) + 2 ] = 0xaaaa0000; + } +} + +void init_waveform_rings( void ) +{ + unsigned char i; + + // F1 RING + waveform_ring_f1[0].next = (ring_node*) &waveform_ring_f1[1]; + waveform_ring_f1[0].previous = (ring_node*) &waveform_ring_f1[NB_RING_NODES_F1-1]; + waveform_ring_f1[0].buffer_address = (int) &wf_snap_f1[0][0]; + + waveform_ring_f1[NB_RING_NODES_F1-1].next = (ring_node*) &waveform_ring_f1[0]; + waveform_ring_f1[NB_RING_NODES_F1-1].previous = (ring_node*) &waveform_ring_f1[NB_RING_NODES_F1-2]; + waveform_ring_f1[NB_RING_NODES_F1-1].buffer_address = (int) &wf_snap_f1[NB_RING_NODES_F1-1][0]; + + for(i=1; iaddr_data_f0 = (int) (wf_snap_f0); // - waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1); // - waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2); // - waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3); // + waveform_picker_regs->addr_data_f0 = (int) (wf_snap_f0); + waveform_picker_regs->addr_data_f1 = current_ring_node_f1->buffer_address; + waveform_picker_regs->addr_data_f2 = current_ring_node_f2->buffer_address; + waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3); // set other parameters set_wfp_data_shaping(); set_wfp_delta_snapshot(); // time in seconds between two snapshots