rtos: add instructions and helper code to make FreeRTOS work again
authorAndreas Fritiofson <andreas.fritiofson@gmail.com>
Thu, 16 Apr 2015 11:08:14 +0000 (13:08 +0200)
committerPaul Fertser <fercerpav@gmail.com>
Thu, 16 Apr 2015 19:23:46 +0000 (20:23 +0100)
Run-time tested with FreeRTOS V8.1.2 (current version).

For the time being I propose this way of dealing with RTOSes that do
not export necessary information on their own.

I also suggest implementing a similar scheme for ChibiOS, exporting
the necessary struct fields' offsets via an OpenOCD-specific helper.

Change-Id: Iacf8b88004d62206215fe80011fd7592438446a3
Signed-off-by: Paul Fertser <fercerpav@gmail.com>
Signed-off-by: Andreas Fritiofson <andreas.fritiofson@gmail.com>
Reviewed-on: http://openocd.zylin.com/2347
Tested-by: jenkins
contrib/rtos-helpers/FreeRTOS-openocd.c [new file with mode: 0644]
doc/openocd.texi
src/rtos/FreeRTOS.c

diff --git a/contrib/rtos-helpers/FreeRTOS-openocd.c b/contrib/rtos-helpers/FreeRTOS-openocd.c
new file mode 100644 (file)
index 0000000..567e710
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+ * Since at least FreeRTOS V7.5.3 uxTopUsedPriority is no longer
+ * present in the kernel, so it has to be supplied by other means for
+ * OpenOCD's threads awareness.
+ *
+ * Add this file to your project, and, if you're using --gc-sections,
+ * ``--undefined=uxTopUsedPriority'' (or
+ * ``-Wl,--undefined=uxTopUsedPriority'' when using gcc for final
+ * linking) to your LDFLAGS; same with all the other symbols you need.
+ */
+
+#include "FreeRTOS.h"
+
+#ifdef __GNUC__
+#define USED __attribute__((used))
+#else
+#define USED
+#endif
+
+const int USED uxTopUsedPriority = configMAX_PRIORITIES;
index 5a803d2c7b61a83101cfab3484763b78cd28fe9c..21a39fceb66d9d66becd6e24bd8f122b379ee122 100644 (file)
@@ -8617,7 +8617,7 @@ _tx_thread_current_ptr, _tx_thread_created_ptr, _tx_thread_created_count.
 @item FreeRTOS symbols
 pxCurrentTCB, pxReadyTasksLists, xDelayedTaskList1, xDelayedTaskList2,
 pxDelayedTaskList, pxOverflowDelayedTaskList, xPendingReadyList,
-xTasksWaitingTermination, xSuspendedTaskList, uxCurrentNumberOfTasks, uxTopUsedPriority.
+uxCurrentNumberOfTasks, uxTopUsedPriority.
 @item linux symbols
 init_task.
 @item ChibiOS symbols
@@ -8630,8 +8630,15 @@ _mqx_kernel_data, MQX_init_struct.
 @end table
 
 For most RTOS supported the above symbols will be exported by default. However for
-some, eg. FreeRTOS @option{xTasksWaitingTermination} is only exported
-if @option{INCLUDE_vTaskDelete} is defined during the build.
+some, eg. FreeRTOS, extra steps must be taken.
+
+These RTOSes may require additional OpenOCD-specific file to be linked
+along with the project:
+
+@table @code
+@item FreeRTOS
+contrib/rtos-helpers/FreeRTOS-openocd.c
+@end table
 
 @node Tcl Scripting API
 @chapter Tcl Scripting API
index e13cc4617bdca5688ed6f41f9b3571a18f6afc0c..1ce680724078f547482214cca2899c0aa517c8e7 100644 (file)
@@ -135,7 +135,7 @@ static const struct symbols FreeRTOS_symbol_list[] = {
        { "xTasksWaitingTermination", true }, /* Only if INCLUDE_vTaskDelete */
        { "xSuspendedTaskList", true }, /* Only if INCLUDE_vTaskSuspend */
        { "uxCurrentNumberOfTasks", false },
-       { "uxTopUsedPriority", false },
+       { "uxTopUsedPriority", true }, /* Unavailable since v7.5.3 */
        { NULL, false }
 };
 
@@ -231,6 +231,10 @@ static int FreeRTOS_update_threads(struct rtos *rtos)
        }
 
        /* Find out how many lists are needed to be read from pxReadyTasksLists, */
+       if (rtos->symbols[FreeRTOS_VAL_uxTopUsedPriority].address == 0) {
+               LOG_ERROR("FreeRTOS: uxTopUsedPriority is not defined, consult the OpenOCD manual for a work-around");
+               return ERROR_FAIL;
+       }
        int64_t max_used_priority = 0;
        retval = target_read_buffer(rtos->target,
                        rtos->symbols[FreeRTOS_VAL_uxTopUsedPriority].address,