jtag: add jtag_flush_queue_sleep debug command
it can be useful to throttle performance: test differences in behavior, test performance effect of long roundtrips. Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
This commit is contained in:
parent
630fc86ee3
commit
803351ec59
|
@ -46,6 +46,9 @@
|
||||||
/// The number of JTAG queue flushes (for profiling and debugging purposes).
|
/// The number of JTAG queue flushes (for profiling and debugging purposes).
|
||||||
static int jtag_flush_queue_count;
|
static int jtag_flush_queue_count;
|
||||||
|
|
||||||
|
// Sleep this # of ms after flushing the queue
|
||||||
|
static int jtag_flush_queue_sleep = 0;
|
||||||
|
|
||||||
static void jtag_add_scan_check(struct jtag_tap *active,
|
static void jtag_add_scan_check(struct jtag_tap *active,
|
||||||
void (*jtag_add_scan)(struct jtag_tap *active, int in_num_fields, const struct scan_field *in_fields, tap_state_t state),
|
void (*jtag_add_scan)(struct jtag_tap *active, int in_num_fields, const struct scan_field *in_fields, tap_state_t state),
|
||||||
int in_num_fields, struct scan_field *in_fields, tap_state_t state);
|
int in_num_fields, struct scan_field *in_fields, tap_state_t state);
|
||||||
|
@ -129,6 +132,11 @@ static struct jtag_interface *jtag = NULL;
|
||||||
/* configuration */
|
/* configuration */
|
||||||
struct jtag_interface *jtag_interface = NULL;
|
struct jtag_interface *jtag_interface = NULL;
|
||||||
|
|
||||||
|
void jtag_set_flush_queue_sleep(int ms)
|
||||||
|
{
|
||||||
|
jtag_flush_queue_sleep = ms;
|
||||||
|
}
|
||||||
|
|
||||||
void jtag_set_error(int error)
|
void jtag_set_error(int error)
|
||||||
{
|
{
|
||||||
if ((error == ERROR_OK) || (jtag_error != ERROR_OK))
|
if ((error == ERROR_OK) || (jtag_error != ERROR_OK))
|
||||||
|
@ -826,6 +834,15 @@ void jtag_execute_queue_noclear(void)
|
||||||
{
|
{
|
||||||
jtag_flush_queue_count++;
|
jtag_flush_queue_count++;
|
||||||
jtag_set_error(interface_jtag_execute_queue());
|
jtag_set_error(interface_jtag_execute_queue());
|
||||||
|
|
||||||
|
if (jtag_flush_queue_sleep > 0)
|
||||||
|
{
|
||||||
|
/* For debug purposes it can be useful to test performance
|
||||||
|
* or behavior when delaying after flushing the queue,
|
||||||
|
* e.g. to simulate long roundtrip times.
|
||||||
|
*/
|
||||||
|
usleep(jtag_flush_queue_sleep * 1000);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int jtag_get_flush_queue_count(void)
|
int jtag_get_flush_queue_count(void)
|
||||||
|
|
|
@ -311,6 +311,10 @@ int adapter_init(struct command_context* cmd_ctx);
|
||||||
/// Shutdown the debug adapter upon program exit.
|
/// Shutdown the debug adapter upon program exit.
|
||||||
int adapter_quit(void);
|
int adapter_quit(void);
|
||||||
|
|
||||||
|
/// Set ms to sleep after jtag_execute_queue() flushes queue. Debug
|
||||||
|
/// purposes.
|
||||||
|
void jtag_set_flush_queue_sleep(int ms);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize JTAG chain using only a RESET reset. If init fails,
|
* Initialize JTAG chain using only a RESET reset. If init fails,
|
||||||
* try reset + init.
|
* try reset + init.
|
||||||
|
|
|
@ -1248,7 +1248,31 @@ COMMAND_HANDLER(handle_tms_sequence_command)
|
||||||
return ERROR_OK;
|
return ERROR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
COMMAND_HANDLER(handle_jtag_flush_queue_sleep)
|
||||||
|
{
|
||||||
|
if (CMD_ARGC != 1)
|
||||||
|
return ERROR_COMMAND_SYNTAX_ERROR;
|
||||||
|
|
||||||
|
int sleep_ms;
|
||||||
|
COMMAND_PARSE_NUMBER(int, CMD_ARGV[0], sleep_ms);
|
||||||
|
|
||||||
|
jtag_set_flush_queue_sleep(sleep_ms);
|
||||||
|
|
||||||
|
return ERROR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static const struct command_registration jtag_command_handlers[] = {
|
static const struct command_registration jtag_command_handlers[] = {
|
||||||
|
|
||||||
|
{
|
||||||
|
.name = "jtag_flush_queue_sleep",
|
||||||
|
.handler = handle_jtag_flush_queue_sleep,
|
||||||
|
.mode = COMMAND_ANY,
|
||||||
|
.help = "For debug purposes(simulate long delays of interface) "
|
||||||
|
"to test performance or change in behavior. Default 0ms.",
|
||||||
|
.usage = "[sleep in ms]",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.name = "jtag_rclk",
|
.name = "jtag_rclk",
|
||||||
.handler = handle_jtag_rclk_command,
|
.handler = handle_jtag_rclk_command,
|
||||||
|
|
Loading…
Reference in New Issue