7#ifndef TASKMANAGERIO_PLATFORMDETERMINATION_H
8#define TASKMANAGERIO_PLATFORMDETERMINATION_H
20#if defined __has_include
21# if __has_include ("zio_local_definitions.h")
22# include "zio_local_definitions.h"
27#if defined(BUILD_FOR_PICO_CMAKE)
28#include <pico/stdlib.h>
30#elif !defined(__MBED__)
34#if defined(__MBED__) && !defined(ARDUINO_PICO_REVISION)
36#if defined(TM_ENABLE_CAPTURED_LAMBDAS)
37#define TM_ALLOW_CAPTURED_LAMBDA
43#if defined(ARDUINO_NANO_RP2040_CONNECT) || \
44 defined(ARDUINO_ARDUINO_NANO33BLE) || \
45 defined(ARDUINO_RASPBERRY_PI_PICO) || \
46 defined(ARDUINO_PORTENTA_H7_M7) || \
47 defined(ARDUINO_PORTENTA_H7_M4) || \
48 defined(ARDUINO_EDGE_CONTROL) || \
49 defined(ARDUINO_NICLA) || \
50 defined(ARDUINO_NICLA_VISION) || \
51 defined(TMIOA_FORCE_ARDUINO_MBED) || \
52 defined(ARDUINO_ARCH_MBED)
53# define IOA_USE_ARDUINO
54# define ARDUINO_MBED_MODE
56# define IOA_MULTITHREADED
58inline void* getCurrentThreadId() {
return rtos::ThisThread::get_id(); }
62# define IOA_MULTITHREADED
63inline void* getCurrentThreadId() {
return ThisThread::get_id(); }
65# if !defined(PIO_NEEDS_RTOS_WORKAROUND)
70#include <mbed_atomic.h>
71typedef uint32_t pintype_t;
73namespace tm_internal {
74 typedef TimerTask*
volatile TimerTaskAtomicPtr;
75 typedef volatile bool TmAtomicBool;
84 inline bool atomicSwapBool(
volatile bool *ptr,
bool expected,
bool newValue) {
85 return core_util_atomic_cas_bool(ptr, &expected, newValue);
121#elif defined(ESP8266) || defined(ESP32) || defined(ARDUINO_PICO_REVISION)
122typedef uint8_t pintype_t;
123# define IOA_USE_ARDUINO
124#if defined(TM_ENABLE_CAPTURED_LAMBDAS)
125# define TM_ALLOW_CAPTURED_LAMBDA
128#if defined(ESP8266) || defined(ARDUINO_PICO_REVISION)
130namespace tm_internal {
132 typedef std::atomic<TimerTask *> TimerTaskAtomicPtr;
134 typedef std::atomic<uint32_t> TmAtomicBool;
143 inline bool atomicSwapBool(TmAtomicBool *ptr,
bool expected,
bool newValue) {
147 if(ptr->load() == expected) {
148 ptr->store(newValue);
190 inline void atomicWritePtr(TimerTaskAtomicPtr *pPtr, TimerTask *newValue) {
191 pPtr->store(newValue);
195# define IOA_MULTITHREADED
196inline void* getCurrentThreadId() {
return xTaskGetCurrentTaskHandle() ; }
198namespace tm_internal {
200 typedef TimerTask*
volatile TimerTaskAtomicPtr;
201 typedef volatile uint32_t TmAtomicBool;
206#if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 0, 0)
207 inline bool atomicSwapBool(TmAtomicBool *ptr,
bool expected,
bool newValue) {
208 uint32_t exp32 = expected;
209 uint32_t new32 = newValue;
210 uxPortCompareSet(ptr, exp32, &new32);
211 return new32 == expected;
214 inline bool atomicSwapBool(TmAtomicBool *ptr,
bool expected,
bool newValue) {
216 return esp_cpu_compare_and_set(ptr, expected, newValue);
255 inline void atomicWritePtr(TimerTaskAtomicPtr *pPtr, TimerTask *newValue) {
260#elif defined(BUILD_FOR_PICO_CMAKE)
261#include <pico/critical_section.h>
262#if defined(TM_ENABLE_CAPTURED_LAMBDAS)
263#define TM_ALLOW_CAPTURED_LAMBDA
265typedef uint8_t pintype_t;
266namespace tm_internal {
267 typedef TimerTask *
volatile TimerTaskAtomicPtr;
268 typedef volatile bool TmAtomicBool;
269 extern critical_section_t* tmLock;
270 void initPicoTmLock();
272 static bool atomicSwapBool(
volatile bool *ptr,
bool expected,
bool newValue) {
274 critical_section_enter_blocking(tmLock);
275 if(*ptr == expected) {
279 critical_section_exit(tmLock);
284 critical_section_enter_blocking(tmLock);
286 critical_section_exit(tmLock);
291 critical_section_enter_blocking(tmLock);
293 critical_section_exit(tmLock);
297 inline void atomicWritePtr(TimerTaskAtomicPtr *ptr, TimerTask *newVal) {
308# define IOA_USE_ARDUINO
310typedef uint8_t pintype_t;
312namespace tm_internal {
313typedef TimerTask *
volatile TimerTaskAtomicPtr;
314typedef volatile bool TmAtomicBool;
316 static bool atomicSwapBool(
volatile bool* ptr,
bool expected,
bool newValue) {
319 if(*ptr == expected) {
336 inline void atomicWritePtr(TimerTaskAtomicPtr* pPtr, TimerTask* newValue) {
350inline void atomicWritePtr(TimerTaskAtomicPtr* pPtr, TimerTask* newValue) {
363#if defined(TM_ENABLE_CAPTURED_LAMBDAS) && defined(ARDUINO_ARCH_SAMD)
364# define TM_ALLOW_CAPTURED_LAMBDA
374#if defined(TM_FORCE_16BIT_SCHEDULER)
375typedef uint16_t sched_t;
377typedef uint32_t sched_t;
386#ifndef DEFAULT_TASK_SIZE
387#ifdef __AVR_ATmega2560__
388# define DEFAULT_TASK_SIZE 12
389# define DEFAULT_TASK_BLOCKS 8
390#elif defined(__AVR__)
391# define DEFAULT_TASK_SIZE 6
392# define DEFAULT_TASK_BLOCKS 4
394# define DEFAULT_TASK_SIZE 16
395# define DEFAULT_TASK_BLOCKS 16
398#ifndef DEFAULT_TASK_BLOCKS
399#define DEFAULT_TASK_BLOCKS 8
408#if defined(ESP8266) || defined(ESP32)
409# define ISR_ATTR IRAM_ATTR
418# if !defined(TM_ALLOW_CAPTURED_LAMBDA) && defined(TM_ENABLE_CAPTURED_LAMBDAS) && __GNUC__ >= 5
419#if __has_include(<functional>)
420# define TM_ALLOW_CAPTURED_LAMBDA
425#define internal_min(a, b) ((a) > (b) ? (b) : (a))
429#define internal_max(a, b) ((a) < (b) ? (b) : (a));
Definition TaskTypes.h:163