Architecture
High level structure
The session and connection to the target and all aspects of the target are representated in pyOCD with a graph of objects constructed at runtime. The diagram below shows an overview of this object graph, focusing on objects that a user of the Python API will interact with.
The connections in the diagram represent composition.
The root of the runtime object graph is a Session
object. This object holds references to the debug probe and the board. Through the board object, the entire object graph is accessible. It is also responsible for managing per-session options that control various features and settings.
As shown in the diagram, the object graph mirrors the physical structure: board, SoC, and cores. There are many more objects connected with the ones shown here. The Arm ADI debug port (DP) and access ports (APs), other CoreSight components, the memory map, and so on.
Top level objects
Session
- In
pyocd.core.session
. - Represents a target connection through a debug probe.
- Root of object graph.
- Owns the
Board
instance, and through that theSoCTarget
instance. - Manages session options, user script, and project file access.
DebugProbe
- In
pyocd.probe.DebugProbe
. - Manages connection to probe.
- Abstracts target control actions.
- Concrete subclasses implement a debug probe’s protocol.
- Returns available instances of a debug probe type. For instance, for listing available probes.
- Can be used alone (without
Target
) for some use cases. - Each subclass is a plug-in.
- Concrete classes include
CMSISDAPProbe
STLinkProbe
- and more
Target
- In
pyocd.core.target
. - Defines the abstract API primarily used by scripts.
- Superclass for both SoC and core classes.
- Functionality includes
- Memory transfers
- Core register access
- Reset
- Run control (halt/step/resume)
- Breakpoints/watchpoints
- Misc status
- Defines some enumerations used in many places, such as
Target.ResetType
andTarget.State
. - Concrete classes include
CoreSightTarget
CortexM
Target classes
These classes are all either direct or indirect subclasses of Target
.
SoCTarget
- In
pyocd.core.soc_target
. - Abstract class for the SoC.
- Runs init sequence created by subclass.
- Owns all cores, accessible through the
.cores
dict property. - Has a notion of a selected core.
- Proxies Target methods to the selected core, which makes single-core MCUs transparent.
CoreTarget
- In
pyocd.core.core_target
. - Abstract class for a processor core.
- Used as a common, architecture-independent superclass for core target classes.
- Doesn’t provide much additional functionality on its own.
CoreSightTarget
- In
pyocd.coresight.coresight_target
. - Concrete SoC class for Arm CoreSight based devices (subclass of
SoCTarget
). - Used for generic Arm targets such as the
cortex_m
target type. - Integrates CoreSight discovery into init sequence.
- Owns the DP and APs.
CortexM
- In
pyocd.coresight.cortex_m
. - Concrete CPU-level target for Arm M-profile cores, subclass of
CoreTarget
. - Implements most of the
Target
methods. - Determines CPU type and supported extensions (FPU, etc) by reading ID registers.