aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Debug/Nuttx.py173
-rw-r--r--src/drivers/drv_tone_alarm.h2
-rw-r--r--src/drivers/px4io/px4io.cpp6
-rw-r--r--src/drivers/stm32/tone_alarm/tone_alarm.cpp10
-rw-r--r--src/modules/commander/commander_helper.cpp2
-rw-r--r--src/systemcmds/preflight_check/preflight_check.c2
-rw-r--r--src/systemcmds/tests/test_hrt.c4
7 files changed, 137 insertions, 62 deletions
diff --git a/Debug/Nuttx.py b/Debug/Nuttx.py
index b0864a229..093edd0e0 100644
--- a/Debug/Nuttx.py
+++ b/Debug/Nuttx.py
@@ -2,6 +2,106 @@
import gdb, gdb.types
+class NX_register_set(object):
+ """Copy of the registers for a given context"""
+
+ v7_regmap = {
+ 'R13': 0,
+ 'SP': 0,
+ 'PRIORITY': 1,
+ 'R4': 2,
+ 'R5': 3,
+ 'R6': 4,
+ 'R7': 5,
+ 'R8': 6,
+ 'R9': 7,
+ 'R10': 8,
+ 'R11': 9,
+ 'EXC_RETURN': 10,
+ 'R0': 11,
+ 'R1': 12,
+ 'R2': 13,
+ 'R3': 14,
+ 'R12': 15,
+ 'R14': 16,
+ 'LR': 16,
+ 'R15': 17,
+ 'PC': 17,
+ 'XPSR': 18,
+ }
+
+ v7em_regmap = {
+ 'R13': 0,
+ 'SP': 0,
+ 'PRIORITY': 1,
+ 'R4': 2,
+ 'R5': 3,
+ 'R6': 4,
+ 'R7': 5,
+ 'R8': 6,
+ 'R9': 7,
+ 'R10': 8,
+ 'R11': 9,
+ 'EXC_RETURN': 10,
+ 'R0': 27,
+ 'R1': 28,
+ 'R2': 29,
+ 'R3': 30,
+ 'R12': 31,
+ 'R14': 32,
+ 'LR': 32,
+ 'R15': 33,
+ 'PC': 33,
+ 'XPSR': 34,
+ }
+
+ regs = dict()
+
+ def __init__(self, xcpt_regs):
+ if xcpt_regs is None:
+ self.regs['R0'] = long(gdb.parse_and_eval('$r0'))
+ self.regs['R1'] = long(gdb.parse_and_eval('$r1'))
+ self.regs['R2'] = long(gdb.parse_and_eval('$r2'))
+ self.regs['R3'] = long(gdb.parse_and_eval('$r3'))
+ self.regs['R4'] = long(gdb.parse_and_eval('$r4'))
+ self.regs['R5'] = long(gdb.parse_and_eval('$r5'))
+ self.regs['R6'] = long(gdb.parse_and_eval('$r6'))
+ self.regs['R7'] = long(gdb.parse_and_eval('$r7'))
+ self.regs['R8'] = long(gdb.parse_and_eval('$r8'))
+ self.regs['R9'] = long(gdb.parse_and_eval('$r9'))
+ self.regs['R10'] = long(gdb.parse_and_eval('$r10'))
+ self.regs['R11'] = long(gdb.parse_and_eval('$r11'))
+ self.regs['R12'] = long(gdb.parse_and_eval('$r12'))
+ self.regs['R13'] = long(gdb.parse_and_eval('$r13'))
+ self.regs['SP'] = long(gdb.parse_and_eval('$sp'))
+ self.regs['R14'] = long(gdb.parse_and_eval('$r14'))
+ self.regs['LR'] = long(gdb.parse_and_eval('$lr'))
+ self.regs['R15'] = long(gdb.parse_and_eval('$r15'))
+ self.regs['PC'] = long(gdb.parse_and_eval('$pc'))
+ self.regs['XPSR'] = long(gdb.parse_and_eval('$xpsr'))
+ else:
+ for key in self.v7em_regmap.keys():
+ self.regs[key] = int(xcpt_regs[self.v7em_regmap[key]])
+
+
+ @classmethod
+ def with_xcpt_regs(cls, xcpt_regs):
+ return cls(xcpt_regs)
+
+ @classmethod
+ def for_current(cls):
+ return cls(None)
+
+ def __format__(self, format_spec):
+ return format_spec.format(
+ registers = self.registers
+ )
+
+ @property
+ def registers(self):
+ return self.regs
+
+
class NX_task(object):
"""Reference to a NuttX task and methods for introspecting it"""
@@ -139,56 +239,12 @@ class NX_task(object):
if 'registers' not in self.__dict__:
registers = dict()
if self._state_is('TSTATE_TASK_RUNNING'):
- # XXX need to fix this to handle interrupt context
- registers['R0'] = long(gdb.parse_and_eval('$r0'))
- registers['R1'] = long(gdb.parse_and_eval('$r1'))
- registers['R2'] = long(gdb.parse_and_eval('$r2'))
- registers['R3'] = long(gdb.parse_and_eval('$r3'))
- registers['R4'] = long(gdb.parse_and_eval('$r4'))
- registers['R5'] = long(gdb.parse_and_eval('$r5'))
- registers['R6'] = long(gdb.parse_and_eval('$r6'))
- registers['R7'] = long(gdb.parse_and_eval('$r7'))
- registers['R8'] = long(gdb.parse_and_eval('$r8'))
- registers['R9'] = long(gdb.parse_and_eval('$r9'))
- registers['R10'] = long(gdb.parse_and_eval('$r10'))
- registers['R11'] = long(gdb.parse_and_eval('$r11'))
- registers['R12'] = long(gdb.parse_and_eval('$r12'))
- registers['R13'] = long(gdb.parse_and_eval('$r13'))
- registers['SP'] = long(gdb.parse_and_eval('$sp'))
- registers['R14'] = long(gdb.parse_and_eval('$r14'))
- registers['LR'] = long(gdb.parse_and_eval('$lr'))
- registers['R15'] = long(gdb.parse_and_eval('$r15'))
- registers['PC'] = long(gdb.parse_and_eval('$pc'))
- registers['XPSR'] = long(gdb.parse_and_eval('$xpsr'))
- # this would only be valid if we were in an interrupt
- registers['EXC_RETURN'] = 0
- # we should be able to get this...
- registers['PRIMASK'] = 0
+ registers = NX_register_set.for_current().registers
else:
context = self._tcb['xcp']
regs = context['regs']
- registers['R0'] = long(regs[27])
- registers['R1'] = long(regs[28])
- registers['R2'] = long(regs[29])
- registers['R3'] = long(regs[30])
- registers['R4'] = long(regs[2])
- registers['R5'] = long(regs[3])
- registers['R6'] = long(regs[4])
- registers['R7'] = long(regs[5])
- registers['R8'] = long(regs[6])
- registers['R9'] = long(regs[7])
- registers['R10'] = long(regs[8])
- registers['R11'] = long(regs[9])
- registers['R12'] = long(regs[31])
- registers['R13'] = long(regs[0])
- registers['SP'] = long(regs[0])
- registers['R14'] = long(regs[32])
- registers['LR'] = long(regs[32])
- registers['R15'] = long(regs[33])
- registers['PC'] = long(regs[33])
- registers['XPSR'] = long(regs[34])
- registers['EXC_RETURN'] = long(regs[10])
- registers['PRIMASK'] = long(regs[1])
+ registers = NX_register_set.with_xcpt_regs(regs).registers
+
self.__dict__['registers'] = registers
return self.__dict__['registers']
@@ -267,8 +323,7 @@ class NX_show_heap (gdb.Command):
def _print_allocations(self, region_start, region_end):
if region_start >= region_end:
- print 'heap region {} corrupt'.format(hex(region_start))
- return
+ raise gdb.GdbError('heap region {} corrupt'.format(hex(region_start)))
nodecount = region_end - region_start
print 'heap {} - {}'.format(region_start, region_end)
cursor = 1
@@ -286,13 +341,31 @@ class NX_show_heap (gdb.Command):
nregions = heap['mm_nregions']
region_starts = heap['mm_heapstart']
region_ends = heap['mm_heapend']
- print "{} heap(s)".format(nregions)
+ print '{} heap(s)'.format(nregions)
# walk the heaps
for i in range(0, nregions):
self._print_allocations(region_starts[i], region_ends[i])
NX_show_heap()
+class NX_show_interrupted_thread (gdb.Command):
+ """(NuttX) prints the register state of an interrupted thread when in interrupt/exception context"""
+ def __init__(self):
+ super(NX_show_interrupted_thread, self).__init__('show interrupted-thread', gdb.COMMAND_USER)
+ def invoke(self, args, from_tty):
+ regs = gdb.lookup_global_symbol('current_regs').value()
+ if regs is 0:
+ raise gdb.GdbError('not in interrupt context')
+ else:
+ registers = NX_register_set.with_xcpt_regs(regs)
+ my_fmt = ''
+ my_fmt += ' R0 {registers[R0]:#010x} {registers[R1]:#010x} {registers[R2]:#010x} {registers[R3]:#010x}\n'
+ my_fmt += ' R4 {registers[R4]:#010x} {registers[R5]:#010x} {registers[R6]:#010x} {registers[R7]:#010x}\n'
+ my_fmt += ' R8 {registers[R8]:#010x} {registers[R9]:#010x} {registers[R10]:#010x} {registers[R11]:#010x}\n'
+ my_fmt += ' R12 {registers[PC]:#010x}\n'
+ my_fmt += ' SP {registers[SP]:#010x} LR {registers[LR]:#010x} PC {registers[PC]:#010x} XPSR {registers[XPSR]:#010x}\n'
+ print format(registers, my_fmt)
+NX_show_interrupted_thread()
diff --git a/src/drivers/drv_tone_alarm.h b/src/drivers/drv_tone_alarm.h
index f0b860620..caf2b0f6e 100644
--- a/src/drivers/drv_tone_alarm.h
+++ b/src/drivers/drv_tone_alarm.h
@@ -60,6 +60,8 @@
#include <sys/ioctl.h>
+#define TONEALARM_DEVICE_PATH "/dev/tone_alarm"
+
#define _TONE_ALARM_BASE 0x7400
#define TONE_SET_ALARM _IOC(_TONE_ALARM_BASE, 1)
diff --git a/src/drivers/px4io/px4io.cpp b/src/drivers/px4io/px4io.cpp
index 3e83fcad8..5fff1feac 100644
--- a/src/drivers/px4io/px4io.cpp
+++ b/src/drivers/px4io/px4io.cpp
@@ -853,9 +853,9 @@ PX4IO::task_main()
int32_t dsm_bind_val;
param_t dsm_bind_param;
- // See if bind parameter has been set, and reset it to 0
+ // See if bind parameter has been set, and reset it to -1
param_get(dsm_bind_param = param_find("RC_DSM_BIND"), &dsm_bind_val);
- if (dsm_bind_val) {
+ if (dsm_bind_val >= 0) {
dsm_bind_ioctl(dsm_bind_val);
dsm_bind_val = -1;
param_set(dsm_bind_param, &dsm_bind_val);
@@ -1167,7 +1167,7 @@ PX4IO::io_handle_status(uint16_t status)
void
PX4IO::dsm_bind_ioctl(int dsmMode)
{
- if (!(_status & PX4IO_P_STATUS_FLAGS_OUTPUTS_ARMED)) {
+ if (!(_status & PX4IO_P_STATUS_FLAGS_SAFETY_OFF)) {
/* 0: dsm2, 1:dsmx */
if ((dsmMode >= 0) && (dsmMode <= 1)) {
mavlink_log_info(_thread_mavlink_fd, "[IO] binding dsm%c rx", (dsmMode == 0) ? '2' : 'x');
diff --git a/src/drivers/stm32/tone_alarm/tone_alarm.cpp b/src/drivers/stm32/tone_alarm/tone_alarm.cpp
index a582ece17..930809036 100644
--- a/src/drivers/stm32/tone_alarm/tone_alarm.cpp
+++ b/src/drivers/stm32/tone_alarm/tone_alarm.cpp
@@ -317,7 +317,7 @@ extern "C" __EXPORT int tone_alarm_main(int argc, char *argv[]);
ToneAlarm::ToneAlarm() :
- CDev("tone_alarm", "/dev/tone_alarm"),
+ CDev("tone_alarm", TONEALARM_DEVICE_PATH),
_default_tune_number(0),
_user_tune(nullptr),
_tune(nullptr),
@@ -820,10 +820,10 @@ play_tune(unsigned tune)
{
int fd, ret;
- fd = open("/dev/tone_alarm", 0);
+ fd = open(TONEALARM_DEVICE_PATH, 0);
if (fd < 0)
- err(1, "/dev/tone_alarm");
+ err(1, TONEALARM_DEVICE_PATH);
ret = ioctl(fd, TONE_SET_ALARM, tune);
close(fd);
@@ -839,10 +839,10 @@ play_string(const char *str, bool free_buffer)
{
int fd, ret;
- fd = open("/dev/tone_alarm", O_WRONLY);
+ fd = open(TONEALARM_DEVICE_PATH, O_WRONLY);
if (fd < 0)
- err(1, "/dev/tone_alarm");
+ err(1, TONEALARM_DEVICE_PATH);
ret = write(fd, str, strlen(str) + 1);
close(fd);
diff --git a/src/modules/commander/commander_helper.cpp b/src/modules/commander/commander_helper.cpp
index 7feace2b4..017499cb5 100644
--- a/src/modules/commander/commander_helper.cpp
+++ b/src/modules/commander/commander_helper.cpp
@@ -82,7 +82,7 @@ static int buzzer;
int buzzer_init()
{
- buzzer = open("/dev/tone_alarm", O_WRONLY);
+ buzzer = open(TONEALARM_DEVICE_PATH, O_WRONLY);
if (buzzer < 0) {
warnx("Buzzer: open fail\n");
diff --git a/src/systemcmds/preflight_check/preflight_check.c b/src/systemcmds/preflight_check/preflight_check.c
index f5bd01ce8..e9c5f1a2c 100644
--- a/src/systemcmds/preflight_check/preflight_check.c
+++ b/src/systemcmds/preflight_check/preflight_check.c
@@ -163,7 +163,7 @@ system_eval:
warnx("PREFLIGHT CHECK ERROR! TRIGGERING ALARM");
fflush(stderr);
- int buzzer = open("/dev/tone_alarm", O_WRONLY);
+ int buzzer = open(TONEALARM_DEVICE_PATH, O_WRONLY);
int leds = open(LED_DEVICE_PATH, 0);
if (leds < 0) {
diff --git a/src/systemcmds/tests/test_hrt.c b/src/systemcmds/tests/test_hrt.c
index ba6b86adb..5690997a9 100644
--- a/src/systemcmds/tests/test_hrt.c
+++ b/src/systemcmds/tests/test_hrt.c
@@ -124,10 +124,10 @@ int test_tone(int argc, char *argv[])
int fd, result;
unsigned long tone;
- fd = open("/dev/tone_alarm", O_WRONLY);
+ fd = open(TONEALARM_DEVICE_PATH, O_WRONLY);
if (fd < 0) {
- printf("failed opening /dev/tone_alarm\n");
+ printf("failed opening " TONEALARM_DEVICE_PATH "\n");
goto out;
}