Revert "rtos/FreeRTOS: Fix FreeRTOS thread list reading" 77/5577/3
authorTomas Vanek <vanekt@fbl.cz>
Sun, 5 Apr 2020 15:34:14 +0000 (17:34 +0200)
committerTomas Vanek <vanekt@fbl.cz>
Wed, 15 Apr 2020 11:40:31 +0000 (12:40 +0100)
This reverts commit 6568d29cc1d0d94daafec5bdb73de7d4f17da257.
The reverted change caused some tasks were missing in thread list.

While on it add a comment explaining the relation of uxTopUsedPriority
and configMAX_PRIORITIES, introduce config_max_priorities and
change types to unsigned.

Change-Id: I4371c8882470d13ee7360ef21b132c56ecb95af8
Signed-off-by: Tomas Vanek <vanekt@fbl.cz>
Reviewed-on: http://openocd.zylin.com/5577
Tested-by: jenkins
src/rtos/FreeRTOS.c

index 77c6e79d5414e99025d7cec073dcc8d4f80449ed..c45d9d645cdd833ae7884cbb98bc8014ade6f24b 100644 (file)
@@ -157,7 +157,6 @@ static const struct symbols FreeRTOS_symbol_list[] = {
 
 static int FreeRTOS_update_threads(struct rtos *rtos)
 {
-       int i = 0;
        int retval;
        int tasks_found = 0;
        const struct FreeRTOS_params *param;
@@ -245,32 +244,40 @@ static int FreeRTOS_update_threads(struct rtos *rtos)
                LOG_ERROR("FreeRTOS: uxTopUsedPriority is not defined, consult the OpenOCD manual for a work-around");
                return ERROR_FAIL;
        }
-       int64_t max_used_priority = 0;
+       uint64_t top_used_priority = 0;
+       /* FIXME: endianess error on almost all target_read_buffer(), see also
+        * other rtoses */
        retval = target_read_buffer(rtos->target,
                        rtos->symbols[FreeRTOS_VAL_uxTopUsedPriority].address,
                        param->pointer_width,
-                       (uint8_t *)&max_used_priority);
+                       (uint8_t *)&top_used_priority);
        if (retval != ERROR_OK)
                return retval;
-       LOG_DEBUG("FreeRTOS: Read uxTopUsedPriority at 0x%" PRIx64 ", value %" PRId64 "\r\n",
+       LOG_DEBUG("FreeRTOS: Read uxTopUsedPriority at 0x%" PRIx64 ", value %" PRIu64 "\r\n",
                                                                                rtos->symbols[FreeRTOS_VAL_uxTopUsedPriority].address,
-                                                                               max_used_priority);
-       if (max_used_priority > FREERTOS_MAX_PRIORITIES) {
-               LOG_ERROR("FreeRTOS maximum used priority is unreasonably big, not proceeding: %" PRId64 "",
-                       max_used_priority);
+                                                                               top_used_priority);
+       if (top_used_priority > FREERTOS_MAX_PRIORITIES) {
+               LOG_ERROR("FreeRTOS top used priority is unreasonably big, not proceeding: %" PRIu64,
+                       top_used_priority);
                return ERROR_FAIL;
        }
 
+       /* uxTopUsedPriority was defined as configMAX_PRIORITIES - 1
+        * in old FreeRTOS versions (before V7.5.3)
+        * Use contrib/rtos-helpers/FreeRTOS-openocd.c to get compatible symbol
+        * in newer FreeRTOS versions.
+        * Here we restore the original configMAX_PRIORITIES value */
+       unsigned int config_max_priorities = top_used_priority + 1;
+
        symbol_address_t *list_of_lists =
-               malloc(sizeof(symbol_address_t) *
-                       (max_used_priority + 5));
+               malloc(sizeof(symbol_address_t) * (config_max_priorities + 5));
        if (!list_of_lists) {
-               LOG_ERROR("Error allocating memory for %" PRId64 " priorities", max_used_priority);
+               LOG_ERROR("Error allocating memory for %u priorities", config_max_priorities);
                return ERROR_FAIL;
        }
 
-       int num_lists;
-       for (num_lists = 0; num_lists < max_used_priority; num_lists++)
+       unsigned int num_lists;
+       for (num_lists = 0; num_lists < config_max_priorities; num_lists++)
                list_of_lists[num_lists] = rtos->symbols[FreeRTOS_VAL_pxReadyTasksLists].address +
                        num_lists * param->list_width;
 
@@ -280,7 +287,7 @@ static int FreeRTOS_update_threads(struct rtos *rtos)
        list_of_lists[num_lists++] = rtos->symbols[FreeRTOS_VAL_xSuspendedTaskList].address;
        list_of_lists[num_lists++] = rtos->symbols[FreeRTOS_VAL_xTasksWaitingTermination].address;
 
-       for (i = 0; i < num_lists; i++) {
+       for (unsigned int i = 0; i < num_lists; i++) {
                if (list_of_lists[i] == 0)
                        continue;
 
@@ -295,7 +302,7 @@ static int FreeRTOS_update_threads(struct rtos *rtos)
                        free(list_of_lists);
                        return retval;
                }
-               LOG_DEBUG("FreeRTOS: Read thread count for list %d at 0x%" PRIx64 ", value %" PRId64 "\r\n",
+               LOG_DEBUG("FreeRTOS: Read thread count for list %u at 0x%" PRIx64 ", value %" PRId64 "\r\n",
                                                                                i, list_of_lists[i], list_thread_count);
 
                if (list_thread_count == 0)
@@ -313,7 +320,7 @@ static int FreeRTOS_update_threads(struct rtos *rtos)
                        free(list_of_lists);
                        return retval;
                }
-               LOG_DEBUG("FreeRTOS: Read first item for list %d at 0x%" PRIx64 ", value 0x%" PRIx64 "\r\n",
+               LOG_DEBUG("FreeRTOS: Read first item for list %u at 0x%" PRIx64 ", value 0x%" PRIx64 "\r\n",
                                                                                i, list_of_lists[i] + param->list_next_offset, list_elem_ptr);
 
                while ((list_thread_count > 0) && (list_elem_ptr != 0) &&

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)