From 6ff228c2ff810a8068610e54612b77c0d94e5584 Mon Sep 17 00:00:00 2001 From: romain <romain.chiap@gmail.com> Date: Thu, 7 Mar 2019 15:28:33 -0500 Subject: [PATCH] sih module implemented with hrt_call_every and semaphore_wait --- .../init.d/airframes/1100_rc_quad_x_sih.hil | 2 + src/modules/sih/CMakeLists.txt | 2 +- src/modules/sih/sih.cpp | 49 +++++++++++-------- src/modules/sih/sih.hpp | 13 +++-- 4 files changed, 41 insertions(+), 25 deletions(-) diff --git a/ROMFS/px4fmu_common/init.d/airframes/1100_rc_quad_x_sih.hil b/ROMFS/px4fmu_common/init.d/airframes/1100_rc_quad_x_sih.hil index 63fea2122b..03c3f2d5a7 100644 --- a/ROMFS/px4fmu_common/init.d/airframes/1100_rc_quad_x_sih.hil +++ b/ROMFS/px4fmu_common/init.d/airframes/1100_rc_quad_x_sih.hil @@ -17,3 +17,5 @@ set PWM_OUT 1234 param set SYS_HITL 1 param set SYS_SIH 1 + +param set BAT_N_CELLS 4 diff --git a/src/modules/sih/CMakeLists.txt b/src/modules/sih/CMakeLists.txt index ab77255e28..74c6d273d8 100644 --- a/src/modules/sih/CMakeLists.txt +++ b/src/modules/sih/CMakeLists.txt @@ -35,7 +35,7 @@ px4_add_module( MODULE modules__sih MAIN sih STACK_MAIN 1200 - STACK_MAX 3500 + STACK_MAX 1024 COMPILE_FLAGS SRCS sih.cpp diff --git a/src/modules/sih/sih.cpp b/src/modules/sih/sih.cpp index b8d5a598f4..5aa3ba174a 100644 --- a/src/modules/sih/sih.cpp +++ b/src/modules/sih/sih.cpp @@ -44,7 +44,6 @@ #include <px4_getopt.h> #include <px4_log.h> -#include <px4_posix.h> #include <drivers/drv_pwm_output.h> // to get PWM flags #include <uORB/topics/vehicle_status.h> // to get the HIL status @@ -86,7 +85,7 @@ Most of the variables are declared global in the .hpp file to avoid stack overfl PRINT_MODULE_USAGE_NAME("sih", "sih"); PRINT_MODULE_USAGE_COMMAND("start"); PRINT_MODULE_USAGE_PARAM_FLAG('f', "Optional example flag", true); - PRINT_MODULE_USAGE_PARAM_INT('p', 0, 0, 4096, "Optional example parameter", true); + PRINT_MODULE_USAGE_PARAM_INT('p', 0, 0, 1024, "Optional example parameter", true); PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); return 0; @@ -124,7 +123,7 @@ int Sih::task_spawn(int argc, char *argv[]) _task_id = px4_task_spawn_cmd("sih", SCHED_DEFAULT, SCHED_PRIORITY_MAX, //SCHED_PRIORITY_DEFAULT - 4096, + 1024, (px4_main_t)&run_trampoline, (char *const *)argv); @@ -182,7 +181,9 @@ Sih *Sih::instantiate(int argc, char *argv[]) } Sih::Sih(int example_param, bool example_flag) - : ModuleParams(nullptr) + : ModuleParams(nullptr), + _loop_perf(perf_alloc(PC_ELAPSED, "sih_execution")), + _sampling_perf(perf_alloc(PC_ELAPSED, "sih_sampling")) { } @@ -206,29 +207,40 @@ void Sih::run() _gps_time = task_start; _serial_time = task_start; - // hrt_call_every(&_timer_call, LOOP_INTERVAL, LOOP_INTERVAL, timer_callback, this); + px4_sem_init(&_data_semaphore, 0, 0); - while (!should_exit()) - { - inner_loop(); - - usleep(1000); - } + hrt_call_every(&_timer_call, LOOP_INTERVAL, LOOP_INTERVAL, timer_callback, &_data_semaphore); + + perf_begin(_sampling_perf); + + while (!should_exit()) + { + px4_sem_wait(&_data_semaphore); // periodic real time wakeup + + perf_end(_sampling_perf); + perf_begin(_sampling_perf); + + perf_begin(_loop_perf); + + inner_loop(); // main execution function + + perf_end(_loop_perf); + } - // hrt_cancel(&_timer_call); // close the periodic timer interruption + hrt_cancel(&_timer_call); // close the periodic timer interruption orb_unsubscribe(_actuator_out_sub); orb_unsubscribe(_parameter_update_sub); // close(serial_fd); } -// timer_callback() is used as a trampoline to inner_loop() -void Sih::timer_callback(void *arg) +// timer_callback() is used as a real time callback to post the semaphore +void Sih::timer_callback(void *sem) { - (reinterpret_cast<Sih *>(arg))->inner_loop(); + px4_sem_post((px4_sem_t *)sem); } -// This is the main execution called periodically by the timer callback +// this is the main execution waken up periodically by the semaphore void Sih::inner_loop() { _now = hrt_absolute_time(); @@ -262,11 +274,6 @@ void Sih::inner_loop() parameters_update_poll(); // update the parameters if needed } - // else if (loop_count==5) - // { - // tcflush(serial_fd, TCOFLUSH); // flush output data - // tcdrain(serial_fd); - // } _sih.te_us=hrt_absolute_time()-_now; // execution time (without delay) diff --git a/src/modules/sih/sih.hpp b/src/modules/sih/sih.hpp index 55b08f1f09..8fcd770735 100644 --- a/src/modules/sih/sih.hpp +++ b/src/modules/sih/sih.hpp @@ -35,12 +35,13 @@ #include <px4_module.h> #include <px4_module_params.h> +#include <px4_posix.h> #include <matrix/matrix/math.hpp> // matrix, vectors, dcm, quaterions #include <conversion/rotation.h> // math::radians, #include <ecl/geo/geo.h> // to get the physical constants #include <drivers/drv_hrt.h> // to get the real time -// #include <mathlib/math/filter/LowPassFilter2p.hpp> +#include <perf/perf_counter.h> #include <uORB/topics/parameter_update.h> #include <uORB/topics/actuator_outputs.h> @@ -87,7 +88,8 @@ public: // generate white Gaussian noise sample as a 3D vector with specified std static Vector3f noiseGauss3f(float stdx, float stdy, float stdz); - static void timer_callback(void *arg); + // timer called periodically to post the semaphore + static void timer_callback(void *sem); // static int pack_float(char* uart_msg, int index, void *value); // pack a float to a IEEE754 private: @@ -134,7 +136,7 @@ private: static constexpr float T1_K = T1_C - CONSTANTS_ABSOLUTE_NULL_CELSIUS; // ground temperature in Kelvin static constexpr float TEMP_GRADIENT = -6.5f / 1000.0f; // temperature gradient in degrees per metre static constexpr uint32_t BAUDS_RATE = 57600; // bauds rate of the serial port - static constexpr hrt_abstime LOOP_INTERVAL = 10000; // 250 Hz real time + static constexpr hrt_abstime LOOP_INTERVAL = 4000; // 4ms => 250 Hz real-time void init_variables(); void init_sensors(); @@ -149,6 +151,11 @@ private: void send_serial_msg(int serial_fd, int64_t t_ms); void inner_loop(); + perf_counter_t _loop_perf; + perf_counter_t _sampling_perf; + + px4_sem_t _data_semaphore; + int32_t _counter = 0; hrt_call _timer_call; hrt_abstime _last_run; -- GitLab