1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
/*
*
* mur.sat
*
* Somewhen in the year 2012, mur.at will have a nano satellite launched
* into a low earth orbit (310 km above the surface of our planet). The
* satellite itself is a TubeSat personal satellite kit, developed and
* launched by interorbital systems. mur.sat is a joint venture of mur.at,
* ESC im Labor and realraum.
*
* Please visit the project hompage at sat.mur.at for further information.
*
*
* Copyright (C) 2013 Christian Pointner <equinox@mur.at>
*
* This file is part of mur.sat.
*
* mur.sat is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* mur.sat is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with mur.sat. If not, see <http://www.gnu.org/licenses/>.
*
*/
#include "ch.h"
#include "hal.h"
#include "heartbeat.h"
#include "usb-cdc-shell.h"
#include "ihu.h"
static void sysInit(void)
{
/*
* System initializations.
* - HAL initialization, this also initializes the configured device drivers
* and performs the board-specific initializations.
* - Kernel initialization, the main() function becomes a thread and the
* RTOS is active.
*/
halInit();
chSysInit();
}
static void subsystemsInit(void)
{
/* call init functions of all subsystems which should spawn threads for their task */
heartbeatInit();
ihuInit();
}
static void subsystemsStop(void)
{
/* Safely stop critical threads, aka call shutdown functions of all subsystems */
/* -> invoke the xxxStop() method on all the active device drivers */
ihuStop();
}
static void sysShutdown(void)
{
chSysDisable();
/* Stop the system timer whose service routine invokes chSysTimerHandlerI(). */
SysTick->CTRL &= ~(SysTick_CTRL_ENABLE_Msk);
/* Disable any other interrupt source that may invoke OS APIs */
/* nothing here. */
/* Perform any application related de-initialization. */
/* nothing here. */
chSysEnable();
}
static void reboot(void)
{
NVIC_SystemReset();
}
static void reset2bootloader(void)
{
NVIC_SystemReset();
/* TODO: not just reset but go to bootloader */
}
/*
* Application entry point.
*/
int main(void)
{
sysInit(); /* the base os is ready now */
subsystemsInit();
int8_t ret = usbCDCShellRun();
/* the debug shell returned - we have to halt, reboot or goto bootloader */
subsystemsStop();
sysShutdown();
/* the OS is stopped now */
switch(ret) {
case MPU_BOOTLOADER: reset2bootloader(); break;
case MPU_REBOOT: reboot(); break;
}
for(;;); /* halting system, aka loop endlessly */
}
|