Skip to content

Commit 82c9305

Browse files
authored
Merge pull request #116 from Space-and-Satellite-Systems-UC-Davis/105-provide-support-for-critical-section-for-rtos-interrupts
105 provide support for critical section for rtos interrupts
2 parents 1c19d47 + b86b264 commit 82c9305

14 files changed

Lines changed: 133 additions & 53 deletions

File tree

ADCS.c

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,31 +18,44 @@
1818

1919
#include <stdbool.h>
2020

21+
adcs_main_status detumbleEX(vec3 needle, uint64_t minTime, uint64_t maxTime)
22+
{
23+
switch (detumble(needle, false, minTime, maxTime)) {
24+
case DETUMBLING_SUCCESS:
25+
return ADCS_MAIN_SUCCESS;
26+
case DETUMBLING_FAILURE_CURR_MILLIS:
27+
case DETUMBLING_FAILURE_MAGNETOMETER:
28+
case DETUMBLING_FAILURE_IMU:
29+
case DETUMBLING_FAILURE_CONTROL_COILS:
30+
case DETUMBLING_FAILURE_DELAY_MS:
31+
case DETUMBLING_HAS_RESTARTED:
32+
return ADCS_MAIN_DETUMBLE_ERR;
33+
}
34+
}
35+
2136
adcs_main_status ADCS_MAIN(adcs_mode mode)
2237
{
2338
switch (mode) {
39+
case ADCS_INITIAL_DETUMBLE:
40+
return detumbleEX((vec3){ 0, 0, 0 }, 3600, 36000);
41+
2442
case ADCS_DETUMBLE:
25-
switch (detumble((vec3){ 0, 0, 0 }, false, 0, 3600)) {
26-
case DETUMBLING_SUCCESS:
27-
break;
28-
case DETUMBLING_FAILURE_CURR_MILLIS:
29-
case DETUMBLING_FAILURE_MAGNETOMETER:
30-
case DETUMBLING_FAILURE_IMU:
31-
case DETUMBLING_FAILURE_CONTROL_COILS:
32-
case DETUMBLING_FAILURE_DELAY_MS:
33-
return ADCS_MAIN_DETUMBLE_ERR;
34-
}
35-
break;
43+
return detumbleEX((vec3){ 0, 0, 0 }, 0, 3600);
3644

45+
// SHOULD NEVER EVER EVER BE ENGAGED IN PRODUCTION (SPACE)
3746
case ADCS_COILS_TESTING:
3847
switch (detumble((vec3){ 0, 0, 0 }, true, 0, 3600)) {
3948
case DETUMBLING_SUCCESS:
4049
break;
4150
case DETUMBLING_FAILURE_CURR_MILLIS:
4251
case DETUMBLING_FAILURE_MAGNETOMETER:
4352
case DETUMBLING_FAILURE_IMU:
53+
// Do something
4454
case DETUMBLING_FAILURE_CONTROL_COILS:
55+
// Do something
4556
case DETUMBLING_FAILURE_DELAY_MS:
57+
// Do something
58+
case DETUMBLING_HAS_RESTARTED:
4659
return ADCS_MAIN_COILS_TESTING_ERR;
4760
}
4861
break;

ADCS.h

Lines changed: 19 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -10,33 +10,32 @@
1010
#ifndef ADCS_H
1111
#define ADCS_H
1212

13-
1413
typedef enum {
15-
ADCS_DETUMBLE,
16-
ADCS_HDD_EXP_ANGVEL,
17-
ADCS_HDD_EXP_TRIAD,
14+
ADCS_DETUMBLE,
15+
ADCS_INITIAL_DETUMBLE,
16+
ADCS_HDD_EXP_ANGVEL,
17+
ADCS_HDD_EXP_TRIAD,
1818
ADCS_HDD_EXP_RAMP,
1919
ADCS_TESTING,
2020
ADCS_COILS_TESTING,
2121
ADCS_HDD_TESTING,
2222
ADCS_ROTISSERIE
23-
} adcs_mode; //TODO: full list
23+
} adcs_mode; // TODO: full list
2424

2525
typedef enum {
26-
ADCS_MAIN_SUCCESS,
27-
ADCS_MAIN_UNKNOWN,
28-
ADCS_MAIN_ECLIPSE,
29-
ADCS_MAIN_HDD_ERR,
30-
ADCS_MAIN_IMU_ERR,
31-
ADCS_MAIN_DETUMBLE_ERR,
32-
ADCS_MAIN_COILS_TESTING_ERR,
33-
ADCS_ROTISSERIE_ERR
34-
} adcs_main_status; //TODO: full list
35-
26+
ADCS_MAIN_SUCCESS,
27+
ADCS_MAIN_UNKNOWN,
28+
ADCS_MAIN_ECLIPSE,
29+
ADCS_MAIN_HDD_ERR,
30+
ADCS_MAIN_IMU_ERR,
31+
ADCS_MAIN_DETUMBLE_ERR,
32+
ADCS_MAIN_COILS_TESTING_ERR,
33+
ADCS_ROTISSERIE_ERR
34+
} adcs_main_status; // TODO: full list
3635

3736
#ifdef __cplusplus
3837
extern "C" {
39-
#endif//__cplusplus
38+
#endif //__cplusplus
4039

4140
/**@brief Command ADCS to run a mode.
4241
*
@@ -46,20 +45,16 @@ extern "C" {
4645
*
4746
* @return The mode's status code.
4847
*/
49-
adcs_main_status
50-
ADCS_MAIN(adcs_mode mode);
51-
48+
adcs_main_status ADCS_MAIN(adcs_mode mode);
5249

5350
/**@brief Ask ADCS to recommend a mode to run.
5451
*
5552
* @return The recommended mode.
5653
*/
57-
adcs_mode
58-
ADCS_recommend_mode();
54+
adcs_mode ADCS_recommend_mode();
5955

6056
#ifdef __cplusplus
6157
}
62-
#endif//__cplusplus
63-
58+
#endif //__cplusplus
6459

65-
#endif//ADCS_H
60+
#endif // ADCS_H

config.mk

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ CFLAGS += -Wextra
77
CFLAGS += -Wno-unused-variable
88
CFLAGS += -Wno-unused-value
99
CFLAGS += -Wno-unused-but-set-variable
10+
CFLAGS += -Wswitch-enum
1011

1112
ifneq ($(V), 1)
1213
Q = @

control/detumble/detumble.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "control/detumble/bdot_control.h"
1313
#include "control/detumble/detumble_util.h"
1414
#include "virtual_intellisat.h"
15+
#include "virtual_ros.h"
1516

1617
#include <math.h>
1718

@@ -46,6 +47,12 @@ detumble_status detumble(vec3 needle, bool isTesting, uint64_t maxTime,
4647
startTime = curr_millis;
4748

4849
do {
50+
vi_enter_critical();
51+
52+
if (vi_task_has_restarted()) {
53+
// Return to Schedulers to restart Detumbling
54+
return DETUMBLING_HAS_RESTARTED;
55+
}
4956

5057
// Perform delay for the coil magnetic field decay
5158
if (vi_control_coil(0, 0, 0))
@@ -85,6 +92,8 @@ detumble_status detumble(vec3 needle, bool isTesting, uint64_t maxTime,
8592

8693
keepDetumbling = isTooSoon || (!isTimeOut && isTooFast);
8794

95+
vi_exit_critical();
96+
8897
} while (isTesting || keepDetumbling);
8998

9099
// Increment generation on successful execution

control/detumble/detumble.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ typedef enum detumble {
3030
DETUMBLING_FAILURE_CONTROL_COILS,
3131
DETUMBLING_FAILURE_IMU,
3232
DETUMBLING_FAILURE_DELAY_MS,
33+
DETUMBLING_HAS_RESTARTED
3334

3435
} detumble_status;
3536

control/experiment/PID_experiment.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "control/experiment/PID_experiment.h"
22
#include "adcs_math/sensors.h"
33
#include "virtual_intellisat.h"
4+
#include "virtual_ros.h"
45

56
#include <math.h>
67
#include <stdint.h>
@@ -46,6 +47,12 @@ PID_status PID_experiment(double target, int infinite)
4647
// Run a while loop
4748
while (infinite || (fabs(target - angVel_curr.z) > 0.1)) {
4849

50+
vi_enter_critical();
51+
if (vi_task_has_restarted()) {
52+
// Return to Schedulers to restart Detumbling
53+
return PID_EXPERIMENT_HAS_RESTARTED;
54+
}
55+
4956
if (getIMU(imu, angVel_prev, &angVel_curr))
5057
return PID_EXPERIMENT_ANGVEL_FAILURE;
5158
// Get the current time (Virtual Intellisat)
@@ -72,6 +79,8 @@ PID_status PID_experiment(double target, int infinite)
7279
return PID_EXPERIMENT_COMMAND_FAILURE;
7380

7481
angVel_prev = angVel_curr;
82+
83+
vi_exit_critical();
7584
}
7685

7786
// Increment generation on successful execution

control/experiment/PID_experiment.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@
55
#include "control/PID/PID.h"
66
#include "virtual_intellisat.h"
77

8-
typedef enum PID_experiment{
8+
typedef enum PID_experiment {
99
PID_EXPERIMENT_SUCCESS,
1010
PID_EXPERIMENT_ANGVEL_FAILURE,
1111
PID_EXPERIMENT_MILLIS_FAILURE,
12-
PID_EXPERIMENT_COMMAND_FAILURE
12+
PID_EXPERIMENT_COMMAND_FAILURE,
13+
PID_EXPERIMENT_HAS_RESTARTED
1314
} PID_status;
1415

1516
/**@brief Performs an experiement for the PID function.
@@ -18,5 +19,4 @@ typedef enum PID_experiment{
1819
*/
1920
PID_status PID_experiment(double target, int infinite);
2021

21-
22-
#endif//PID_EXPERIMENT_H
22+
#endif // PID_EXPERIMENT_H

control/experiment/determination_experiment.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,13 @@ determination_exp_status determination_experiment()
4141
// Run a while loop
4242
while (fabs(target - angvel_z) > 0.1) {
4343
vi_delay_ms(100);
44+
45+
vi_enter_critical();
46+
if (vi_task_has_restarted()) {
47+
// Return to Schedulers to restart Detumbling
48+
return DETERMINATION_EXPERIMENT_HAS_RESTARTED;
49+
}
50+
4451

4552
// default values for now, waiting for sun sensors to implement get_sun
4653
sun.x = 0;
@@ -68,6 +75,8 @@ determination_exp_status determination_experiment()
6875
return DETERMINATION_EXPERIMENT_HDD_COMMAND_FAILURE;
6976
prevAttitude = currAttitude;
7077
prev_millis = curr_millis;
78+
79+
vi_exit_critical();
7180
}
7281

7382
// Increment generation on successful execution

control/experiment/determination_experiment.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,22 @@
44
#include "adcs_math/vector.h"
55
#include "control/PID/PID.h"
66
#include "virtual_intellisat.h"
7+
#include "virtual_ros.h"
78

8-
9-
typedef enum determination_experiment{
9+
typedef enum determination_experiment {
1010
DETERMINATION_EXPERIMENT_SUCCESS,
1111
DETERMINATION_EXPERIMENT_MILLIS_FAILURE,
12-
DETERMINATION_EXPERIMENT_HDD_COMMAND_FAILURE
13-
}determination_exp_status;
12+
DETERMINATION_EXPERIMENT_HDD_COMMAND_FAILURE,
13+
DETERMINATION_EXPERIMENT_HAS_RESTARTED
14+
} determination_exp_status;
1415

1516
/*
1617
* @brief Performs an experiement using the function.
17-
* Uses determination to calculate the angular velocity
18+
* Uses determination to calculate the angular velocity
1819
* instead of the IMU
1920
*
2021
* @return PID_status A return code.
2122
*/
2223
determination_exp_status determination_experiment();
2324

24-
25-
#endif//DETERMINATION_EXPERIMENT_H
25+
#endif // DETERMINATION_EXPERIMENT_H

control/experiment/ramp_experiment.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#include "adcs_math/calibration.h"
33
#include "adcs_math/sensors.h"
44
#include "virtual_intellisat.h"
5+
#include "virtual_ros.h"
56

67
// TODO: HDD alternation?
78
#define HDD_CHOICE VI_HDD1
@@ -31,12 +32,20 @@ run_ramp_experiment_status ramp_experiment()
3132
return RUN_RAMP_EXPERIMENT_MILLIS_FAILURE;
3233
}
3334

35+
vi_enter_critical();
36+
if (vi_task_has_restarted()) {
37+
// Return to Schedulers to restart ramp_experiment
38+
return RUN_RAMP_EXPERIMENT_HAS_RESTARTED;
39+
}
40+
3441
double command = linear_ramp_command(ti, &controller);
3542

3643
command_status = vi_hdd_command(Hdd, command);
3744
if (command_status == HDD_COMMAND_FAILURE) {
3845
return RUN_RAMP_EXPERIMENT_COMMAND_FAILURE;
3946
}
47+
48+
vi_exit_critical();
4049
}
4150

4251
return RUN_RAMP_EXPERIMENT_SUCCESS;

0 commit comments

Comments
 (0)