.. _module-pw_thread_threadx: ================= pw_thread_threadx ================= This is a set of backends for pw_thread based on ThreadX. .. Warning:: This module is still under construction, the API is not yet stable. .. list-table:: * - :ref:`module-pw_thread` Facade - Backend Target - Description * - ``pw_thread:id`` - ``pw_thread_threadx:id`` - Thread identification. * - ``pw_thread:yield`` - ``pw_thread_threadx:yield`` - Thread scheduler yielding. * - ``pw_thread:sleep`` - ``pw_thread_threadx:sleep`` - Thread scheduler sleeping. * - ``pw_thread:thread`` - ``pw_thread_threadx:thread`` - Thread creation. --------- utilities --------- In cases where an operation must be performed for every thread, ``ForEachThread()`` can be used to iterate over all the created thread TCBs. Note that it's only safe to use this while the scheduler is disabled. An ``Aborted`` error status is returned if the provided callback returns ``false`` to request an early termination of thread iteration. Return values ============= * ``Aborted``: The callback requested an early-termination of thread iteration. * ``OkStatus``: The callback has been successfully run with every thread. -------------------- Snapshot integration -------------------- This ``pw_thread`` backend provides helper functions that capture ThreadX thread state to a ``pw::thread::Thread`` proto. SnapshotThread()/SnapshotThreads() ================================== ``SnapshotThread()`` captures the thread name, state, and stack information for the provided ThreadX TCB to a ``pw::thread::Thread`` protobuf encoder. To ensure the most up-to-date information is captured, the stack pointer for the currently running thread must be provided for cases where the running thread is being captured. For ARM Cortex-M CPUs, you can do something like this: .. Code:: cpp // Capture PSP. void* stack_ptr = 0; asm volatile("mrs %0, psp\n" : "=r"(stack_ptr)); pw::thread::ProcessThreadStackCallback cb = [](pw::thread::Thread::StreamEncoder& encoder, pw::ConstByteSpan stack) -> pw::Status { return encoder.WriteRawStack(stack); }; pw::thread::threadx::SnapshotThread(my_thread, stack_ptr, snapshot_encoder, cb); ``SnapshotThreads()`` wraps the singular thread capture to instead captures all created threads to a ``pw::thread::SnapshotThreadInfo`` message. This proto message overlays a snapshot, so it is safe to static cast a ``pw::snapshot::Snapshot::StreamEncoder`` to a ``pw::thread::SnapshotThreadInfo::StreamEncoder`` when calling this function.