|
From: Alexander G. <de...@ma...> - 2021-03-05 07:07:52
|
The better way — is to fix jlink_clock_data interface. Unsigned type was a bad choice. Historically it was added to standart for unsigned arithmetics only(for rolling over max value to zero).
static void jlink_clock_data(const uint8_t *out, int out_offset,
const uint8_t *tms_out, int tms_offset,
uint8_t *in, int in_offset,
int length)
{
do {
int available_length = (JLINK_TAP_BUFFER_SIZE * 8) - tap_length;
if (available_length < length ||
(in && pending_scan_results_length == MAX_PENDING_SCAN_RESULTS)) {
if (jlink_flush() != ERROR_OK)
return;
available_length = JLINK_TAP_BUFFER_SIZE * 8;
}
struct pending_scan_result *pending_scan_result =
&pending_scan_results_buffer[pending_scan_results_length];
int scan_length = length > available_length ? available_length : length; ….
}
--
Alexander Gabitov
>Пятница, 5 марта 2021, 8:12 +03:00 от Alexander Gabitov via OpenOCD-devel <ope...@li...>:
>
>I’m working on API.
>
>By the way. I think there is a bug(jlink.c:2032):
> unsigned available_length = JLINK_TAP_BUFFER_SIZE - tap_length / 8;
> if (!available_length ||
> (in && pending_scan_results_length == MAX_PENDING_SCAN_RESULTS)) {
> if (jlink_flush() != ERROR_OK)
> return;
> available_length = JLINK_TAP_BUFFER_SIZE;
> }
> struct pending_scan_result *pending_scan_result =
> &pending_scan_results_buffer[pending_scan_results_length];
> unsigned scan_length = length > available_length ?
> available_length : length;
>
>Here length is amount of bits, but available_length is amount of bytes! So this expression seems to be wrong.
>
>Also during debug i found that first condition becomes true only when second clause is true — pending_scan_results_length == MAX_PENDING_SCAN_RESULTS.
>And more over condition "!available_length" — looks very strange due to formula which calculates it.
>
>I would correct it all like that:
> int available_length = (JLINK_TAP_BUFFER_SIZE * 8) - tap_length;
> if (available_length < length ||
> (in && pending_scan_results_length == MAX_PENDING_SCAN_RESULTS)) {
> if (jlink_flush() != ERROR_OK)
> return;
> available_length = JLINK_TAP_BUFFER_SIZE * 8;
> }
> struct pending_scan_result *pending_scan_result =
> &pending_scan_results_buffer[pending_scan_results_length];
> unsigned scan_length = length > available_length ?
> available_length : length;
>
>--
>Alexander Gabitov
>
>
>_______________________________________________
>OpenOCD-devel mailing list
>Ope...@li...
>https://lists.sourceforge.net/lists/listinfo/openocd-devel
|