121 lines
3.9 KiB
Markdown
121 lines
3.9 KiB
Markdown
|
FreeRTOS-GDB
|
||
|
============
|
||
|
|
||
|
Python API Library for inspecting FreeRTOS Objects in GDB
|
||
|
|
||
|
Basically, the FreeRTOS internal state is kind of hard to inspect
|
||
|
when working with GDB. This project provides some scripts for GDB's
|
||
|
Python API that make accessing some of these internals a little easier
|
||
|
to inspect.
|
||
|
|
||
|
##Requirements:
|
||
|
|
||
|
1. You need to have the python API enabled in your version of GDB. This is a
|
||
|
compile time option when building GDB. You should be able to do something
|
||
|
like this:
|
||
|
```
|
||
|
gdb> python print "Hello World"
|
||
|
```
|
||
|
|
||
|
and get predictable results. If it throws an error - then you don't have
|
||
|
python compiled in your version of GDB.
|
||
|
|
||
|
2. Need to be using FreeRTOS 8.0+. This code could probably be used with FreeRTOS
|
||
|
version 7.0 or previous versions, but the current code doesn't support it.
|
||
|
|
||
|
3. You need to use the Handle Registry for Queue info to be any use.
|
||
|
Note that this only works for Queue based objects and not
|
||
|
for EventGroups
|
||
|
|
||
|
4. You need to put the FreeRTOS-GDB/src directory on your python path:
|
||
|
```
|
||
|
$> export PYTHONPATH=~/src/FreeRTOS-GDB/src/
|
||
|
```
|
||
|
|
||
|
How To Use:
|
||
|
```
|
||
|
$> gdb ./bin/program.elf
|
||
|
(gdb) c
|
||
|
Program runs on embedded device, sets up tasks, and queues
|
||
|
<Break>
|
||
|
(gdb) source ~/FreeRTOS-GDB/src/FreeRTOS.py
|
||
|
(gdb) show Task-List
|
||
|
Name PRI STCK
|
||
|
Ready List {0}: Num Tasks: 1
|
||
|
IDLE 0 107
|
||
|
Blocked List: Num Tasks: 11
|
||
|
EMAC Task 1 239
|
||
|
AFEC0 Task 1 295
|
||
|
LDSENS Task 1 195
|
||
|
AFEC1 Task 1 295
|
||
|
LineSample Task 1 281
|
||
|
DMAUART0 1 225
|
||
|
Log Task 1 273
|
||
|
BAT Task 1 169
|
||
|
Rx Task 1 421
|
||
|
Mng Task 2 551
|
||
|
Cell Task 1 275
|
||
|
Delayed {1}: Num Tasks: 5
|
||
|
Tmr Svc 3 355 62254
|
||
|
WLAN Task 1 205 13817
|
||
|
Init Task 1 445 10015
|
||
|
LED Task 1 179 7105
|
||
|
DMACOM1 1 265 7065
|
||
|
Delayed {2}: Num Tasks: 0
|
||
|
|
||
|
(gdb) show Queue-Info mutex
|
||
|
Num Queues: 6
|
||
|
NAME CNT SEND RECEIVE
|
||
|
LOG:LOCK 1 NONE NONE
|
||
|
STREAM:LOCK 1 NONE NONE
|
||
|
TWI:MUTEX 1 NONE NONE
|
||
|
CC3000:LOCK 1 NONE NONE
|
||
|
WLAN:LOCK 0 NONE NONE
|
||
|
SPI:LOCK 1 NONE NONE
|
||
|
|
||
|
(gdb) show Queue-Info queue
|
||
|
Num Queues: 14
|
||
|
NAME CNT SEND RECEIVE
|
||
|
TmrQ 0 Tmr Svc
|
||
|
LOG:MSGPOOL 12 NONE NONE
|
||
|
LOG:MSGQ 0 Log Task
|
||
|
TWI:QUEUE 0 NONE NONE
|
||
|
SPI:QUEUE 0 NONE NONE
|
||
|
DMAAFEC:POOL 1 NONE NONE
|
||
|
DMAAFEC:QUEUE 0 AFEC0 Task
|
||
|
DMAAFEC:POOL 1 NONE NONE
|
||
|
DMAAFEC:QUEUE 0 AFEC1 Task
|
||
|
COM:TXPOOL 3 NONE NONE
|
||
|
COM:TXQ 0 NONE NONE
|
||
|
COM:RXPOOL 5 NONE NONE
|
||
|
COM:RXQ 0 NONE NONE
|
||
|
FATFS:MUTEX 0 NONE NONE
|
||
|
|
||
|
```
|
||
|
|
||
|
@note - the NONE's above may just be empty strings.
|
||
|
|
||
|
This code adds the following custom GDB commands:
|
||
|
|
||
|
* show List-Handle (symbol|address) [CastType]
|
||
|
CastType is an optional argument that will cast all of the
|
||
|
handles in a list to a particular type.
|
||
|
* show Task-List
|
||
|
* show Handle-Registry
|
||
|
* show Handle-Name (symbole|address)
|
||
|
* show Queue-Info [filter]
|
||
|
filter can be "queue","mutex","semaphore", "counting", "recursive"
|
||
|
|
||
|
|
||
|
|
||
|
@TODO
|
||
|
=====
|
||
|
|
||
|
* With GDB's Python API - it doesn't seem to handle code is separate
|
||
|
files very well.
|
||
|
|
||
|
* Currently, the EventGroup objects don't have an inspector.
|
||
|
Work in progress - ideal solution would likely modify the struct
|
||
|
of the Event Group to provide a similar piece of info that the
|
||
|
Queue handle does so that we could use the same registry.
|