* Remove prvSelectHighestPriorityTask call in vTaskSuspend
* Every core starts with an idle task in SMP implementation and
taskTASK_IS_RUNNING only return ture when the task is idle task before
scheduler started. So prvSelectHighestPriorityTask won't be called in
vTaskSuspend before scheduler started.
* Update prvSelectHighestPriorityTask to ensure that this function is
called only when scheduler started.
* Fix kernel checker error
* Add support for retrieving a task's uxCoreAffinityMask with the vTaskGetInfo() API
This commit adds support for retrieving the task's core affinity mask
when SMP is used for more than 1 cores and configUSE_CORE_AFFINITY is
enabled.
Signed-off-by: Sudeep Mohanty <sudp.mohanty@gmail.com>
* Apply suggestions from code review
Co-authored-by: Gaurav-Aggarwal-AWS <33462878+aggarg@users.noreply.github.com>
Signed-off-by: Sudeep Mohanty <sudp.mohanty@gmail.com>
Co-authored-by: Gaurav-Aggarwal-AWS <33462878+aggarg@users.noreply.github.com>
When configNUM_CORES is 1, prvYieldCore() generates an array subscript
outofbound error (-Warray-bounds) when compiled with GCC with space
optimization enabled (-Os).
This commit updates the code flow in prvYieldCore() to compile out
the part where yield is needed on the other core which is unnecessary
for single-core targets.
Previously, newlib's _impure_ptr was updated on every context switch
to point to the current task's _reent structure.
However, this behavior is no longer valid on multi-core systems due
to the fact that multiple cores can switch contexts at the same time,
thus leading to the corruption of the _impure_ptr.
However, Newlib can be compiled with __DYNAMIC_REENT__ enabled which
will cause newlib functions to call __getreent() instead in order to
obtain the required reent struct.
This commit adds dynamic reentrancy support to FreeRTOS:
- Added a configNEWLIB_REENTRANT_IS_DYNAMIC to enable dynamic reentrancy support
- _impure_ptr is no longer updated with reentrancy is dynamic
- Port must provide their own __getreent() that returns the current task's reent struct
This commit adds the functions listed below. These functions allow
tasks to be created with their core affinity already set.
- xTaskCreateAffinitySet()
- xTaskCreateStaticAffinitySet()
- xTaskCreateRestrictedAffinitySet()
- xTaskCreateRestrictedStaticAffinitySet()
* Bugfix for race condition on RP2040 in vPortEnableInterrupts()
RP2040 SMP port: Since spin_unlock() re-enables interrupts, pxYieldSpinLock has to be updated first to avoid a possible race condition.
* Bugfix for invalid sanity checks on RP2040
RP2040 SMP port: Testing pxYieldSpinLock for NULL does not work reliable in these places, because another/new lock might already be set when configASSERT() is executed.
The kernel code that runs within RTOS ISRs requires that DP and CP not
be changed from their initial values. If a task changes them and is
interrupted while they are changed, then they must be restored for the
ISR. This commit implements this.
This relies on a corresponding change to the xcore lib_rtos_support.