Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ARMv7M: Adjust implemented priority bit assertions #665

Merged
merged 1 commit into from
Apr 20, 2023

Conversation

paulbartell
Copy link
Contributor

@paulbartell paulbartell commented Apr 19, 2023

Description

Adjust assertions related to the CMSIS __NVIC_PRIO_BITS and FreeRTOS configPRIO_BITS configuration macros such that these macros specify the minimum number of implemented priority bits supported by a config build rather than the exact number of implemented priority bits.

Test Steps

Run the kernel in qemu with the mps2-an385 target with __NVIC_PRIO_BITS and configPRIO_BITS set to all valid values: 3,4,5,6,7,8.

Checklist:

  • I have tested my changes. No regression in existing tests.
  • [ N/A ] I have modified and/or added unit-tests to cover the code changes in this Pull Request.

Related Issue

Related to Qemu issue #1122. See related discussion on the qemu mailing list.

By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.

Adjust assertions related to the CMSIS __NVIC_PRIO_BITS and FreeRTOS
configPRIO_BITS configuration macros such that these macros specify the
minimum number of implemented priority bits supported by a config
build rather than the exact number of implemented priority bits.

Related to Qemu issue FreeRTOS#1122
@paulbartell paulbartell requested a review from a team as a code owner April 19, 2023 20:44
@codecov
Copy link

codecov bot commented Apr 19, 2023

Codecov Report

Patch and project coverage have no change.

Comparison is base (1b8a424) 94.46% compared to head (8f19fa0) 94.46%.

Additional details and impacted files
@@           Coverage Diff           @@
##             main     #665   +/-   ##
=======================================
  Coverage   94.46%   94.46%           
=======================================
  Files           6        6           
  Lines        2422     2422           
  Branches      594      594           
=======================================
  Hits         2288     2288           
  Misses         85       85           
  Partials       49       49           
Flag Coverage Δ
unittests 94.46% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

☔ View full report in Codecov by Sentry.
📢 Do you have feedback about the report comment? Let us know in this issue.

@jefftenney
Copy link
Contributor

Does this PR eliminate the requirement that __NVIC_PRIO_BITS == configPRIO_BITS when both are defined?

@aggarg aggarg merged commit 686b6e6 into FreeRTOS:main Apr 20, 2023
@aggarg
Copy link
Member

aggarg commented Apr 20, 2023

Does this PR eliminate the requirement that __NVIC_PRIO_BITS == configPRIO_BITS when both are defined?

Yes, seems so.

@jefftenney
Copy link
Contributor

OK. It seems that part was unintentional, and probably not a good thing. Otherwise this is a great change for qemu.

@urutva
Copy link
Contributor

urutva commented Apr 20, 2023

I second the opinion of @jefftenney. First hit on the search for configPRIO_BITS on FreeRTOS repo resulted in https://github.com/FreeRTOS/FreeRTOS/blob/391c79958f635ee5476dcf2774dab59e2b151eff/FreeRTOS/Demo/CORTEX_STM32L152_IAR/FreeRTOSConfig.h#L84 where configPRIO_BITS is used to set configKERNEL_INTERRUPT_PRIORITY and configMAX_SYSCALL_INTERRUPT_PRIORITY and is set to 4 when __NVIC_PRIO_BITS isn't defined. Imagine a scenario where the number of implemented priority bits is higher than the configPRIO_BITS then configKERNEL_INTERRUPT_PRIORITY and configMAX_SYSCALL_INTERRUPT_PRIORITY would be set incorrectly, but the configASSERT wouldn't catch it.

I was thinking, would it make sense to create something like portqemu.h, similar to portmacro.h to handle qemu related changes.

@jefftenney
Copy link
Contributor

@urutva Sorry I think was too brief in my comment. My concern is a little different than the one you mention. I think we should restore the requirement configPRIO_BITS == __NVIC_PRIO_BITS (when both are defined). That requirement was in place prior to this PR, and I think that requirement should remain in place. It prevents confusion.

Consider a developer trying to use fewer bits than are implemented in the hardware. They set configPRIO_BITS to 3, but their CMSIS implementation sets __NVIC_PRIO_BITS to 4 because that's how many bits are actually implemented. Their calls to NVIC_SetPriority() will set "wrong" priorities because that function takes unshifted priorities and then shifts them based on __NVIC_PRIO_BITS (not based on configPRIO_BITS). The configASSERT() statements in port.c would still catch any violations of configMAX_SYSCALL_INTERRUPT_PRIORITY, but the developer might struggle to understand why the assert is failing.

@RichardBarry
Copy link
Contributor

RichardBarry commented Apr 20, 2023

The configPRIO_BITS == __NVIC_PRIO_BITS assert provides immediate feedback to users that have an incorrect configuration, maybe because they re-used a FreeRTOSConfig.h without realising the consequence. These asserts get into the code in response to the most common errors we observe users making.

@paulbartell
Copy link
Contributor Author

I will open a PR with an additional assertion as such.

Really though, configPRIO_BITS should probably be something like configMINIMUM_PRIO_BITS.
The whole configuration for interrupt priority is needlessly confusing to users. I wish we just had some a sane default like in the ARMv8M ports.

@paulbartell
Copy link
Contributor Author

paulbartell commented Apr 20, 2023

@jefftenney
On second though, perhaps the assertion should be that

configPRIO_BITS <= __NVIC_PRIO_BITS 

rather than

configPRIO_BITS == __NVIC_PRIO_BITS

Does that seem reasonable to you?

To do this, I would add the following to each portmacro.h:

#if ( defined( configPRIO_BITS ) && defined( __NVIC_PRIO_BITS ) )
    #if ( configPRIO_BITS > __NVIC_PRIO_BITS )
        #error configPRIO_BITS must be <= __NVIC_PRIO_BITS when both are declared. \
            Refer to https://www.freertos.org/RTOS-Cortex-M3-M4.html for more details.
    #endif
#endif /* configPRIO_BITS && __NVIC_PRIO_BITS */

Alternatively,

#if ( defined( configPRIO_BITS ) && defined( __NVIC_PRIO_BITS ) )
    #if ( configPRIO_BITS != __NVIC_PRIO_BITS )
        #error configPRIO_BITS must equal __NVIC_PRIO_BITS when both are declared. \
            Refer to https://www.freertos.org/RTOS-Cortex-M3-M4.html for more details.
    #endif
#endif /* configPRIO_BITS && __NVIC_PRIO_BITS */

@paulbartell paulbartell deleted the adjust_priority_bit_assertions branch April 20, 2023 21:44
@RichardBarry
Copy link
Contributor

Why are we changing this? When does it makes sense for configPRIOR_BITS to not be equal to __NVIC_PRIO_BITS? Experience shows the kernel code should never have a dependency on a third party library. Originally there was only configPRIOR_BITS, the assert with __NVIC_PRIO_BITS is a way of checking that setting is correct IF __NVIC_PRIO_BITS is defined. Currently it's possible to have only __NVIC_PRIO_BITS, which, in a way, doesn't comply with the "no dependency on third party code" rule - although in this case it is ok as there is a work around that doesn't involve changing the code if it isn't defined.

(for a long time a vendor, who shall remain nameless, shipped a header file with __NVIC_PRIO_BITS set incorrectly, which was found by an assert in FreeRTOS that checked the actual number of bits defined. As it's possible to programmatically check the number of bits we could create code that doesn't define configPRIOR_BIT or __NVIC_PRIO_BITS - but we don't do that because it would mean defining the max syscall interrupt priority as a non-const variable rather than a constant, which has an execution time impact).

@paulbartell
Copy link
Contributor Author

@RichardBarry : Qemu models of the ARM MPS boards implement more priority bits than the actual ARM MPS boards.

It's quite common for a single codebase might target multiple SoCs. In this case, it would make sure to share a FreeRTOSConfig.h with the same configPRIO_BITS value even if one of the target SoCs supports more priority bits in hardware (and thus __NVIC_PRIO_BITS would differ).

@jefftenney
Copy link
Contributor

@paulbartell Prior this PR, a codebase that targets multiple SoCs would recompile for the different targets' values of __NVIC_PRIO_BITS. And configPRIO_BITS would always match __NVIC_PRIO_BITS. And those values would all match the hardware for that build. That codebase would be written for the minimum number of implemented priority bits among all target SoCs, so it would work properly on all systems. All of that is prior this PR. Accomplished in part by this typical code in FreeRTOSConfig.h:

/* Cortex-M specific definitions. */
#ifdef __NVIC_PRIO_BITS
   /* __NVIC_PRIO_BITS will be specified when CMSIS is being used; its value is MCU-specific. */
   #define configPRIO_BITS             __NVIC_PRIO_BITS

If the minimum SoC has only 3 implemented bits, then the codebase uses only priorities 0 through 7. If another of the SoCs has 4 implemented bits, the codebase still uses priorities 0 through 7, leaving priorities 8 through 15 unused (except for FreeRTOS automatically using priority 15 for the kernel).

The above is also true when QEMU is one of the targets, as long as __NVIC_PRIO_BITS is set to 8 -- the correct value for QEMU. Only a small concession might be required related to the developer's choice of configMAX_SYSCALL_INTERRUPT_PRIORITY. With QEMU, priorities 8 through 255 would be unused (except for FreeRTOS automatically using priority 255 for the kernel). And again, all of this is true prior to this PR.

So, I don't clearly see the motivation for this PR. Maybe it makes all targets use the same (upper) bits in the priority registers? For QEMU I see that it avoids the awkward bit 0 in the priority registers which cannot be configured as a preemption-priority bit. Are there other benefits?

@jefftenney
Copy link
Contributor

jefftenney commented Apr 21, 2023

@paulbartell On the question of configPRIO_BITS < __NVIC_PRIO_BITS. If someone is purposely using fewer priority bits than are actually implemented, and if they set configPRIO_BITS to the number of bits they want to actually use, they still would not want configPRIO_BITS < __NVIC_PRIO_BITS. That's because CMSIS functions like NVIC_SetPriority() treat interrupt priorities as unshifted values, and internally those functions shift the values based on __NVIC_PRIO_BITS, not based on configPRIO_BITS. The developer would need to reduce the value of __NVIC_PRIO_BITS in the CMSIS implementation provided by the silicon vendor to match configPRIO_BITS. Then calls to NVIC_SetPriority() would configure priorities as expected.

But again, maybe the preferred approach would be to leave them both set to the number actually implemented in the hardware, and limit the range of priority values used (as described in the previous post).

@RichardBarry
Copy link
Contributor

I just tried V10.4.6 in QEMU without __NVIC_PRIORITY_BITS or configPRIO_BITS defined and, as far as I can determine in a few minutes, is working as expected. configASSERT() is defined.

V10.4.6 has neither of the last two changes to this part of the code applied. https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/V10.4.6/portable/GCC/ARM_CM3/port.c#L303

ulMaxPRIORGroup underflows here https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/V10.4.6/portable/GCC/ARM_CM3/port.c#L299 because the loop doesn't expect all the priority bits defined (invalid on real hardware), but is ANDed with a mask here https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/V10.4.6/portable/GCC/ARM_CM3/port.c#L324

@paulbartell
Copy link
Contributor Author

paulbartell commented Apr 24, 2023

@jefftenney and @urutva Given that cmsis priorities are unshifted, I see the reasoning to check that the values are the same.

Thus I'll open a PR with the following in each portmacro.h:

#if ( defined( configPRIO_BITS ) && defined( __NVIC_PRIO_BITS ) )
    #if ( configPRIO_BITS != __NVIC_PRIO_BITS )
        #error configPRIO_BITS must equal __NVIC_PRIO_BITS when both are declared. \
            Refer to https://www.freertos.org/RTOS-Cortex-M3-M4.html for more details.
    #endif
#endif /* configPRIO_BITS && __NVIC_PRIO_BITS */

Does that address your concerns?

@paulbartell
Copy link
Contributor Author

@jefftenney

So, I don't clearly see the motivation for this PR. Maybe it makes all targets use the same (upper) bits in the priority registers? For QEMU I see that it avoids the awkward bit 0 in the priority registers which cannot be configured as a preemption-priority bit. Are there other benefits?

The objective of this PR was to be able to run binaries compiled for a particular mps2 board including the official cmsis headers on it's corresponding qemu target without an assertion failure each and every time.

@jefftenney
Copy link
Contributor

Does that address your concerns?

Yes.

he objective of this PR was to be able to run binaries compiled for a particular mps2 board including the official cmsis headers on it's corresponding qemu target

Then this is perfect.

aggarg added a commit to chinglee-iot/FreeRTOS-Kernel that referenced this pull request Apr 25, 2023
* Fix array-bounds compiler warning on gcc11+ in list.h (FreeRTOS#580)

listGET_OWNER_OF_NEXT_ENTRY computes `( pxConstList )->pxIndex->pxNext` after
verifying that `( pxConstList )->pxIndex` points to `xListEnd`, which due to
being a MiniListItem_t, can be shorter than a ListItem_t. Thus,
`( pxConstList )->pxIndex` is a `ListItem_t *` that extends past the end of the
`List_t` whose `xListEnd` it points to. This is fixed by accessing `pxNext`
through a `MiniListItem_t` instead.

* move the prototype for vApplicationIdleHook to task.h. (FreeRTOS#600)

Co-authored-by: pluess <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* Update equal priority task preemption (FreeRTOS#603)

* vTaskResume and vTaskPrioritySet don't preempt equal priority task

* Update vTaskResumeAll not to preempt task with equal priority

* Fix in xTaskResumeFromISR

* Update FreeRTOS/FreeRTOS build checks (FreeRTOS#613)

This is needed to be compatible with the refactoring done in this
PR - FreeRTOS/FreeRTOS#889

Signed-off-by: Gaurav Aggarwal <[email protected]>

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Add ulTaskGetRunTimeCounter and ulTaskGetRunTimePercent (FreeRTOS#611)

Allow ulTaskGetIdleRunTimeCounter and ulTaskGetIdleRunTimePercent to be
used whenever configGENERATE_RUN_TIME_STATS is enabled, as this is the
only requirement for these functions to work.

* Fix some CMake documentation typos (FreeRTOS#616)

The quick start instructions for CMake mention the "master"
git branch which has been replaced by "main" in the current
repo.

The main CMakeLists.txt documents how to integrate a
custom port. Fix a typo in the suggested CMake code.

* Added support of 64bit events. (FreeRTOS#597)

* Added support of 64bit even

Signed-off-by: Cervenka Dusan <[email protected]>

* Added missing brackets

Signed-off-by: Cervenka Dusan <[email protected]>

* Made proper name for tick macro.

Signed-off-by: Cervenka Dusan <[email protected]>

* Improved macro evaluation

Signed-off-by: Cervenka Dusan <[email protected]>

* Fixed missed port files  + documentation

Signed-off-by: Cervenka Dusan <[email protected]>

* Changes made on PR

Signed-off-by: Cervenka Dusan <[email protected]>

* Fix macro definition.

Signed-off-by: Cervenka Dusan <[email protected]>

* Formatted code with uncrustify

Signed-off-by: Cervenka Dusan <[email protected]>

---------

Signed-off-by: Cervenka Dusan <[email protected]>

* Introduce portMEMORY_BARRIER for Microblaze port. (FreeRTOS#621)

The introduction of `portMEMORY_BARRIER` will ensure
the places in the kernel use a barrier will work.
For example, `xTaskResumeAll` has a memory barrier
to ensure its correctness when compiled with optimization
enabled. Without the barrier `xTaskResumeAll` can fail
(e.g. start reading and writing to address 0 and/or
infinite looping) when `xPendingReadyList` contains more
than one task to restore.

In `xTaskResumeAll` the compiler chooses to cache the
`pxTCB` the first time through the loop for use
in every subsequent loop. This is incorrect as the
removal of `pxTCB->xEventListItem` will actually
change the value of `pxTCB` if it was read again
at the top of the loop. The barrier forces the compiler
to read `pxTCB` again at the top of the loop.

The compiler is operating correctly. The removal
`pxTCB->xEventListItem` executes on a `List_t *`
and `ListItem_t *`.  This means that the compiler
can assume that any `MiniListItem_t` values are
unchanged by the loop (i.e. "strict-aliasing").
This allows the compiler to cache `pxTCB` as it
is obtained via a `MiniListItem_t`. This is incorrect
in this case because it is possible for a `ListItem_t *`
to actually alias a `MiniListItem_t`. This is technically
a "violation of aliasing rules" so we use the the barrier
to disable the strict-aliasing optimization in this loop.

* Do not call exit() on MSVC Port when calling vPortEndScheduler (FreeRTOS#624)

* make port exitable

* correctly set xPortRunning to False

* add suggestions from Review

Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* add suggestions from Review

Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

---------

Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* Update PR template to include checkbox for Unit Test related changes (FreeRTOS#627)

* Fix build failure introduced in PR FreeRTOS#597 (FreeRTOS#629)

The PR FreeRTOS#597 introduced a new config option configTICK_TYPE_WIDTH_IN_BITS
which can be defined to one of the following:
* TICK_TYPE_WIDTH_16_BITS - Tick type is 16 bit wide.
* TICK_TYPE_WIDTH_32_BITS - Tick type is 32 bit wide.
* TICK_TYPE_WIDTH_64_BITS - Tick type is 64 bit wide.

Earlier we supported 16 and 32 bit width for tick type which was
controlled using the config option configUSE_16_BIT_TICKS. The PR
tried to maintain backward compatibility by honoring
configUSE_16_BIT_TICKS. The backward compatibility did not work as
expected though, as the macro configTICK_TYPE_WIDTH_IN_BITS was used
before it was defined. This PR addresses it by ensuring that the macro
configTICK_TYPE_WIDTH_IN_BITS is defined before it is used.

Testing
1. configUSE_16_BIT_TICKS is defined to 0.

Source (function xTaskIncrementTick in tasks.c):
```
const TickType_t xConstTickCount = xTickCount + ( TickType_t ) 1;
```

Assembly:
```
109e:       4b50            ldr     r3, [pc, FreeRTOS#320]  ; (11e0 <xTaskIncrementTick+0x150>)
10a0:       f8d3 4134       ldr.w   r4, [r3, FreeRTOS#308]  ; 0x134
10a4:       3401            adds    r4, #1
10a6:       f8c3 4134       str.w   r4, [r3, FreeRTOS#308]  ; 0x134
```

It is clear from assembly that the tick type is 32 bit.

2. configUSE_16_BIT_TICKS is defined to 1.

Source (function xTaskIncrementTick in tasks.c):
```
const TickType_t xConstTickCount = xTickCount + ( TickType_t ) 1;
```

Assembly:
```
10e2:       4b53            ldr     r3, [pc, FreeRTOS#332]  ; (1230 <xTaskIncrementTick+0x15c>)
10e4:       f8b3 4134       ldrh.w  r4, [r3, FreeRTOS#308]  ; 0x134
10e8:       b2a4            uxth    r4, r4
10ea:       3401            adds    r4, #1
10ec:       b2a4            uxth    r4, r4
10ee:       f8a3 4134       strh.w  r4, [r3, FreeRTOS#308]  ; 0x134
```

It is clear from assembly that the tick type is 16 bit.

3. configTICK_TYPE_WIDTH_IN_BITS is defined to TICK_TYPE_WIDTH_16_BITS.

Source (function xTaskIncrementTick in tasks.c):
```
const TickType_t xConstTickCount = xTickCount + ( TickType_t ) 1;
```

Assembly:
```
10e2:       4b53            ldr     r3, [pc, FreeRTOS#332]  ; (1230 <xTaskIncrementTick+0x15c>)
10e4:       f8b3 4134       ldrh.w  r4, [r3, FreeRTOS#308]  ; 0x134
10e8:       b2a4            uxth    r4, r4
10ea:       3401            adds    r4, #1
10ec:       b2a4            uxth    r4, r4
10ee:       f8a3 4134       strh.w  r4, [r3, FreeRTOS#308]  ; 0x134
```

It is clear from assembly that the tick type is 16 bit.

4. configTICK_TYPE_WIDTH_IN_BITS is defined to TICK_TYPE_WIDTH_32_BITS.

Source (function xTaskIncrementTick in tasks.c):
```
const TickType_t xConstTickCount = xTickCount + ( TickType_t ) 1;
```

Assembly:
```
109e:       4b50            ldr     r3, [pc, FreeRTOS#320]  ; (11e0 <xTaskIncrementTick+0x150>)
10a0:       f8d3 4134       ldr.w   r4, [r3, FreeRTOS#308]  ; 0x134
10a4:       3401            adds    r4, #1
10a6:       f8c3 4134       str.w   r4, [r3, FreeRTOS#308]  ; 0x134
```

It is clear from assembly that the tick type is 32 bit.

5. configTICK_TYPE_WIDTH_IN_BITS is defined to TICK_TYPE_WIDTH_64_BITS.

```
 #error configTICK_TYPE_WIDTH_IN_BITS set to unsupported tick type width.
```

The testing was done for GCC/ARM_CM3 port which does not support 64 bit
tick type.

6. Neither configUSE_16_BIT_TICKS nor configTICK_TYPE_WIDTH_IN_BITS
defined.

```
 #error Missing definition:  One of configUSE_16_BIT_TICKS and
 configTICK_TYPE_WIDTH_IN_BITS must be defined in FreeRTOSConfig.h.
 See the Configuration section of the FreeRTOS API documentation for
 details.
```

7. Both configUSE_16_BIT_TICKS and configTICK_TYPE_WIDTH_IN_BITS defined.

```
 #error Only one of configUSE_16_BIT_TICKS and
 configTICK_TYPE_WIDTH_IN_BITS must be defined in FreeRTOSConfig.h.
 See the Configuration section of the FreeRTOS API documentation for
 details.
```

Related issue - FreeRTOS#628

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Feature/fixing clang gnu compiler warnings (FreeRTOS#620)

* Adding in ability to support a library for freertos_config and a custom freertos_kernel_port (FreeRTOS#558)

* Using single name definition for libraries everywhere. (FreeRTOS#558)

* Supporting backwards compatibility with FREERTOS_CONFIG_FILE_DIRECTORY (FreeRTOS#571)

* Removing compiler warnings for GNU and Clang. (FreeRTOS#571)

* Added in documentation on how to consume from a main project. Added default PORT selection for native POSIX and MINGW platforms.

* Only adding freertos_config if it exists. Removing auto generation of it from a FREERTOS_CONFIG_FILE_DIRECTORY.

* Fixing clang and gnu compiler warnings.

* Adding in project information and how to compile for GNU/clang

* Fixing compiler issue with unused variable - no need to declare variable.

* Adding in compile warnings for linux builds that kernel is okay with using.

* Fixing more extra-semi-stmt clang warnings.

* Moving definition of hooks into header files if features are enabled.

* Fixing formatting with uncrustify.

* Fixing merge conflicts with main merge.

* Fixing compiler errors due to merge issues and formatting.

* Fixing Line feeds.

* Adding 'portNORETURN' into portmacros.h. Other Updates based on PR request

* Further clean-up of clang and clang-tidy issues.

* Removing compiler specific pragmas from common c files.

* Fixing missing lexicon entry and uncrustify formatting changes.

* Resolving merge issue multiple defnitions of proto for prvIdleTask

* Fixing formatting issues that are not covered by uncrustify. Use clang-tidy instead if you want this level of control.

* More uncrustify formatting issues.

* Fixing extra bracket in #if statement.

---------

Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* POSIX port fixes (FreeRTOS#626)

* Fix types in POSIX port

Use TaskFunction_t and StackType_t as other ports do.

* Fix portTICK_RATE_MICROSECONDS in POSIX port

---------

Co-authored-by: Jacques GUILLOU <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* Cortex-M35P: Add Cortex-M35P port (FreeRTOS#631)

* Cortex-M35P: Add Cortex-M35P port

The Cortex-M35P support added to kernel. The port hasn't been
validated yet with TF-M. Hence TF-M support is not included in this
port.

Signed-off-by: Devaraj Ranganna <[email protected]>

* Add portNORETURN to the newly added portmacro.h

Signed-off-by: Gaurav Aggarwal <[email protected]>

---------

Signed-off-by: Devaraj Ranganna <[email protected]>
Signed-off-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>
Co-authored-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: kar-rahul-aws <[email protected]>

* Introduced Github Status Badge for Unit Tests (FreeRTOS#634)

* Introduced Github Status Badge for Unit Tests

* Github status badge to point to latest run

* Github status badge UT points to latest results

* Fixed URL for Github Status badge

---------

Co-authored-by: kar-rahul-aws <[email protected]>

* Remove C99 requirement from CMake file (FreeRTOS#633)

* Remove C99 requirement from CMake file

The kernel source is C89 compliant and does not need C99.

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Explicitly set C89 requirement for kernel

Signed-off-by: Gaurav Aggarwal <[email protected]>

---------

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Add Thread Local Storage (TLS) support using Picolibc functions (FreeRTOS#343)

* Pass top of stack to configINIT_TLS_BLOCK

Picolibc wants to allocate the per-task TLS block within the stack
segment, so it will need to modify the top of stack value. Pass the
pxTopOfStack variable to make this explicit.

Signed-off-by: Keith Packard <[email protected]>

* Move newlib-specific definitions to separate file

This reduces the clutter in FreeRTOS.h caused by having newlib-specific
macros present there.

Signed-off-by: Keith Packard <[email protected]>

* Make TLS code depend only on configUSE_C_RUNTIME_TLS_SUPPORT

Remove reference to configUSE_NEWLIB_REENTRANT as that only works
when using newlib. configUSE_C_RUNTIME_TLS_SUPPORT is always
set when configUSE_NEWLIB_REENTRANT is set, so using both was
redundant in that case.

Signed-off-by: Keith Packard <[email protected]>

* portable-ARC: Adapt ARC support to use generalized TLS support

With generalized thread local storage (TLS) support present in the
core, the two ARC ports need to have the changes to the TCB mirrored
to them.

Signed-off-by: Keith Packard <[email protected]>

* Add Thread Local Storage (TLS) support using Picolibc functions

This patch provides definitions of the general TLS support macros in
terms of the Picolibc TLS support functions.

Picolibc is normally configured to use TLS internally for all
variables that are intended to be task-local, so these changes are
necessary for picolibc to work correctly with FreeRTOS.

The picolibc helper functions rely on elements within the linker
script to arrange the TLS data in memory and define some symbols.
Applications wanting to use this mechanism will need changes in their
linker script when migrating to picolibc.

Signed-off-by: Keith Packard <[email protected]>

---------

Signed-off-by: Keith Packard <[email protected]>
Co-authored-by: Keith Packard <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* Interrupt priority assert improvements for CM3/4/7 (FreeRTOS#602)

* Interrupt priority assert improvements for CM3/4/7

In the ARM_CM3, ARM_CM4, and ARM_CM7 ports, change the assertion that
`configMAX_SYSCALL_INTERRUPT_PRIORITY` is nonzero to account for the
number of priority bits implemented by the hardware.

Change these ports to also use the lowest priority for PendSV and
SysTick, ignoring `configKERNEL_INTERRUPT_PRIORITY`.

* Remove not needed configKERNEL_INTERRUPT_PRIORITY define

Signed-off-by: Gaurav Aggarwal <[email protected]>

---------

Signed-off-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>
Co-authored-by: Gaurav Aggarwal <[email protected]>

* Introduced code coverage status badge (FreeRTOS#635)

* Introduced code coverage status badge

* Trying to fix the URL checker issue

* Fix URL check

Signed-off-by: Gaurav Aggarwal <[email protected]>

---------

Signed-off-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* added portPOINTER_SIZE_TYPE and SIZE_MAX definition to PIC24/dsPIC port (FreeRTOS#636)

* added portPOINTER_SIZE_TYPE definition to PIC24/dsPIC port

* Added SIZE_MAX definition to PIC24/dsPIC33

* Fix TLS and stack alignment when using picolibc (FreeRTOS#637)

Both the TLS block and stack must be correctly aligned when using
picolibc. The architecture stack alignment is represented by the
portBYTE_ALIGNMENT_MASK and the TLS block alignment is provided by the
Picolibc _tls_align() inline function for Picolibc version 1.8 and
above. For older versions of Picolibc, we'll assume that the TLS block
requires the same alignment as the stack.

For downward growing stacks, this requires aligning the start of the
TLS block to the maximum of the stack alignment and the TLS
alignment. With this, both the TLS block and stack will now be
correctly aligned.

For upward growing stacks, the two areas must be aligned
independently; the TLS block is aligned from the start of the stack,
then the tls space is allocated, and then the stack is aligned above
that.

It's probably useful to know here that the linker ensures that
variables within the TLS block are assigned offsets that match their
alignment requirements. If the TLS block itself is correctly aligned,
then everything within will also be.

I have only tested the downward growing stack branch of this patch.

Signed-off-by: Keith Packard <[email protected]>
Co-authored-by: Keith Packard <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* Enable building the GCC Cortex-R5 port without an FPU (FreeRTOS#586)

* Ensure configUSE_TASK_FPU_SUPPORT option is set correctly

If one does enable the FPU of the Cortex-R5 processor, then the GCC
compiler will define the macro __ARM_FP. This can be used to ensure,
that the configUSE_TASK_FPU_SUPPORT is set accordingly.

* Enable the implementation of vPortTaskUsesFPU only if configUSE_TASK_FPU_SUPPORT is set to 1

* Remove error case in pxPortInitialiseStack

The case of configUSE_TASK_FPU_SUPPORT is 0 is now handled

* Enable access to FPU registers only if FPU is enabled

* Make minor formating changes

* Format ARM Cortex-R5 port

* Address review comments from @ChristosZosi

* Minor code review suggestions

Signed-off-by: Gaurav Aggarwal <[email protected]>

---------

Signed-off-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: Christos Zosimidis <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>
Co-authored-by: Gaurav Aggarwal <[email protected]>

* Fix freertos_kernel cmake property, Posix Port (FreeRTOS#640)

* Fix freertos_kernel cmake property, Posix Port

* Moves the `set_property()` call below the target definition in top level CMakeLists file
* Corrects billion value from `ULL` suffix (not C90 compliant) to `UL` suffix with cast to uint64_t

* Add blank line to CMakeLists.txt

* Add missing FreeRTOS+ defines

* Run kernel demos and unit tests for PR changes (FreeRTOS#645)

* Run kernel demos and unit tests for PR changes

Kernel demos check builds multiple demos from FreeRTOS/FreeRTOS and
unit tests check runs unit tests in FreeRTOS/FreeRTOS. Both of these
checks currently use main branch of FreeRTOS-Kernel. This commits
updates these checks to use the changes in the PR.

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Do not specify PR SHA explicitly as that is default

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Remove explicit PR SHA from kernel checks

Signed-off-by: Gaurav Aggarwal <[email protected]>

---------

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Add functions to get the buffers of statically created objects (FreeRTOS#641)

Added various ...GetStaticBuffer() functions to get the buffers of statically
created objects.
---------
Co-authored-by: Paul Bartell <[email protected]>
Co-authored-by: Nikhil Kamath <[email protected]>
Co-authored-by: Gaurav Aggarwal <[email protected]>

* Cortex-M Assert when NVIC implements 8 PRIO bits (FreeRTOS#639)

* Cortex-M Assert when NVIC implements 8 PRIO bits

* Fix CM3 ports

* Fix ARM_CM3_MPU

* Fix ARM CM3

* Fix ARM_CM4_MPU

* Fix ARM_CM4

* Fix GCC ARM_CM7

* Fix IAR ARM ports

* Uncrustify changes

* Fix MikroC_ARM_CM4F port

* Fix MikroC_ARM_CM4F port-(2)

* Fix RVDS ARM ports

* Revert changes for Tasking/ARM_CM4F port

* Revert changes for Tasking/ARM_CM4F port-(2)

* Update port.c

Fix GCC/ARM_CM4F port

* Update port.c

* update GCC\ARM_CM4F port

* update port.c

* Assert to check configMAX_SYSCALL_INTERRUPT_PRIORITY is set to higher priority

* Fix merge error: remove duplicate code

* Fix typos

---------

Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>
Co-authored-by: Ubuntu <[email protected]>

* Remove C90 requirement from CMakeLists (FreeRTOS#649)

This is needed as it is breaking projects - https://forums.freertos.org/t/freertos-gcc-cmake/16984

We will re-evaluate and accordingly add this later.

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Only add alignment padding when needed (FreeRTOS#650)

Heap 4 and Heap 5 add some padding to ensure that the allocated blocks
are always aligned to portBYTE_ALIGNMENT bytes. The code until now was
adding padding always even if the resulting block was already aligned.
This commits updates the code to only add padding if the resulting block
is not aligned.

Signed-off-by: Gaurav Aggarwal <[email protected]>

* add a missing comma (FreeRTOS#651)

* fix conversion warning (FreeRTOS#658)

FreeRTOS-Kernel/portable/GCC/ARM_CM4F/port.c:399:41: error: conversion from 'uint32_t' {aka 'long unsigned int'} to 'uint8_t' {aka 'unsigned char'} may change value [-Werror=conversion]

Signed-off-by: Vo Trung Chi <[email protected]>

* ARMv7M: Adjust implemented priority bit assertions (FreeRTOS#665)

Adjust assertions related to the CMSIS __NVIC_PRIO_BITS and FreeRTOS
configPRIO_BITS configuration macros such that these macros specify the
minimum number of implemented priority bits supported by a config
build rather than the exact number of implemented priority bits.

Related to Qemu issue FreeRTOS#1122

* Format portmacro.h in arm CM0 ports

* portable/ARM_CM0: Add xPortIsInsideInterrupt

Add missing xPortIsInsideInterrupt function to Cortex-M0 port.

---------

Signed-off-by: Gaurav Aggarwal <[email protected]>
Signed-off-by: Cervenka Dusan <[email protected]>
Signed-off-by: Devaraj Ranganna <[email protected]>
Signed-off-by: Keith Packard <[email protected]>
Signed-off-by: Vo Trung Chi <[email protected]>
Co-authored-by: Archit Gupta <[email protected]>
Co-authored-by: tcpluess <[email protected]>
Co-authored-by: pluess <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>
Co-authored-by: Chris Copeland <[email protected]>
Co-authored-by: David J. Fiddes <[email protected]>
Co-authored-by: Dusan Cervenka <[email protected]>
Co-authored-by: bbain <[email protected]>
Co-authored-by: Ju1He1 <[email protected]>
Co-authored-by: Aniruddha Kanhere <[email protected]>
Co-authored-by: phelter <[email protected]>
Co-authored-by: jacky309 <[email protected]>
Co-authored-by: Jacques GUILLOU <[email protected]>
Co-authored-by: Devaraj Ranganna <[email protected]>
Co-authored-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: kar-rahul-aws <[email protected]>
Co-authored-by: Nikhil Kamath <[email protected]>
Co-authored-by: Keith Packard <[email protected]>
Co-authored-by: Keith Packard <[email protected]>
Co-authored-by: Joseph Julicher <[email protected]>
Co-authored-by: Paul Bartell <[email protected]>
Co-authored-by: Christos Zosimidis <[email protected]>
Co-authored-by: Kody Stribrny <[email protected]>
Co-authored-by: Holden <holden-zenithaerotech.com>
Co-authored-by: Darian <[email protected]>
Co-authored-by: Ubuntu <[email protected]>
Co-authored-by: Nicolas <[email protected]>
Co-authored-by: Vo Trung Chi <[email protected]>
ActoryOu pushed a commit to ActoryOu/FreeRTOS-Kernel that referenced this pull request Apr 25, 2023
* Update XMOS AICORE conflict (chinglee-iot#77)

* Define portBASE_TYPE in XMOS AICORE porting

* Update enter critical from ISR API

* Fix run time stats for SMP (chinglee-iot#76)

* Update get idle tasks stats

* Fix get task stats

* Fix missing configNUM_CORES

* Update the uxSchedulerSuspended after prvCheckForRunStateChange (chinglee-iot#62)

* Update the uxSchedulerSuspended after the prvCheckForRunStateChange to
  prevent race condition in fromISR APIs

* Fix SMP dev branch CI errors (chinglee-iot#79)

* Fix uncrustify

* Update lexicon

* Remove tailing space

* Ignore XMOS AICORE header check

* Fix ulTotalRunTime and ulTaskSwitchedInTime (chinglee-iot#80)

* SMP has multiple ulTotalRunTime and ulTaskSwitchedInTime

* Smp dev compelete merge main 20230424 (chinglee-iot#78)

* Fix array-bounds compiler warning on gcc11+ in list.h (FreeRTOS#580)

listGET_OWNER_OF_NEXT_ENTRY computes `( pxConstList )->pxIndex->pxNext` after
verifying that `( pxConstList )->pxIndex` points to `xListEnd`, which due to
being a MiniListItem_t, can be shorter than a ListItem_t. Thus,
`( pxConstList )->pxIndex` is a `ListItem_t *` that extends past the end of the
`List_t` whose `xListEnd` it points to. This is fixed by accessing `pxNext`
through a `MiniListItem_t` instead.

* move the prototype for vApplicationIdleHook to task.h. (FreeRTOS#600)

Co-authored-by: pluess <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* Update equal priority task preemption (FreeRTOS#603)

* vTaskResume and vTaskPrioritySet don't preempt equal priority task

* Update vTaskResumeAll not to preempt task with equal priority

* Fix in xTaskResumeFromISR

* Update FreeRTOS/FreeRTOS build checks (FreeRTOS#613)

This is needed to be compatible with the refactoring done in this
PR - FreeRTOS/FreeRTOS#889

Signed-off-by: Gaurav Aggarwal <[email protected]>

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Add ulTaskGetRunTimeCounter and ulTaskGetRunTimePercent (FreeRTOS#611)

Allow ulTaskGetIdleRunTimeCounter and ulTaskGetIdleRunTimePercent to be
used whenever configGENERATE_RUN_TIME_STATS is enabled, as this is the
only requirement for these functions to work.

* Fix some CMake documentation typos (FreeRTOS#616)

The quick start instructions for CMake mention the "master"
git branch which has been replaced by "main" in the current
repo.

The main CMakeLists.txt documents how to integrate a
custom port. Fix a typo in the suggested CMake code.

* Added support of 64bit events. (FreeRTOS#597)

* Added support of 64bit even

Signed-off-by: Cervenka Dusan <[email protected]>

* Added missing brackets

Signed-off-by: Cervenka Dusan <[email protected]>

* Made proper name for tick macro.

Signed-off-by: Cervenka Dusan <[email protected]>

* Improved macro evaluation

Signed-off-by: Cervenka Dusan <[email protected]>

* Fixed missed port files  + documentation

Signed-off-by: Cervenka Dusan <[email protected]>

* Changes made on PR

Signed-off-by: Cervenka Dusan <[email protected]>

* Fix macro definition.

Signed-off-by: Cervenka Dusan <[email protected]>

* Formatted code with uncrustify

Signed-off-by: Cervenka Dusan <[email protected]>

---------

Signed-off-by: Cervenka Dusan <[email protected]>

* Introduce portMEMORY_BARRIER for Microblaze port. (FreeRTOS#621)

The introduction of `portMEMORY_BARRIER` will ensure
the places in the kernel use a barrier will work.
For example, `xTaskResumeAll` has a memory barrier
to ensure its correctness when compiled with optimization
enabled. Without the barrier `xTaskResumeAll` can fail
(e.g. start reading and writing to address 0 and/or
infinite looping) when `xPendingReadyList` contains more
than one task to restore.

In `xTaskResumeAll` the compiler chooses to cache the
`pxTCB` the first time through the loop for use
in every subsequent loop. This is incorrect as the
removal of `pxTCB->xEventListItem` will actually
change the value of `pxTCB` if it was read again
at the top of the loop. The barrier forces the compiler
to read `pxTCB` again at the top of the loop.

The compiler is operating correctly. The removal
`pxTCB->xEventListItem` executes on a `List_t *`
and `ListItem_t *`.  This means that the compiler
can assume that any `MiniListItem_t` values are
unchanged by the loop (i.e. "strict-aliasing").
This allows the compiler to cache `pxTCB` as it
is obtained via a `MiniListItem_t`. This is incorrect
in this case because it is possible for a `ListItem_t *`
to actually alias a `MiniListItem_t`. This is technically
a "violation of aliasing rules" so we use the the barrier
to disable the strict-aliasing optimization in this loop.

* Do not call exit() on MSVC Port when calling vPortEndScheduler (FreeRTOS#624)

* make port exitable

* correctly set xPortRunning to False

* add suggestions from Review

Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* add suggestions from Review

Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

---------

Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* Update PR template to include checkbox for Unit Test related changes (FreeRTOS#627)

* Fix build failure introduced in PR FreeRTOS#597 (FreeRTOS#629)

The PR FreeRTOS#597 introduced a new config option configTICK_TYPE_WIDTH_IN_BITS
which can be defined to one of the following:
* TICK_TYPE_WIDTH_16_BITS - Tick type is 16 bit wide.
* TICK_TYPE_WIDTH_32_BITS - Tick type is 32 bit wide.
* TICK_TYPE_WIDTH_64_BITS - Tick type is 64 bit wide.

Earlier we supported 16 and 32 bit width for tick type which was
controlled using the config option configUSE_16_BIT_TICKS. The PR
tried to maintain backward compatibility by honoring
configUSE_16_BIT_TICKS. The backward compatibility did not work as
expected though, as the macro configTICK_TYPE_WIDTH_IN_BITS was used
before it was defined. This PR addresses it by ensuring that the macro
configTICK_TYPE_WIDTH_IN_BITS is defined before it is used.

Testing
1. configUSE_16_BIT_TICKS is defined to 0.

Source (function xTaskIncrementTick in tasks.c):
```
const TickType_t xConstTickCount = xTickCount + ( TickType_t ) 1;
```

Assembly:
```
109e:       4b50            ldr     r3, [pc, FreeRTOS#320]  ; (11e0 <xTaskIncrementTick+0x150>)
10a0:       f8d3 4134       ldr.w   r4, [r3, FreeRTOS#308]  ; 0x134
10a4:       3401            adds    r4, #1
10a6:       f8c3 4134       str.w   r4, [r3, FreeRTOS#308]  ; 0x134
```

It is clear from assembly that the tick type is 32 bit.

2. configUSE_16_BIT_TICKS is defined to 1.

Source (function xTaskIncrementTick in tasks.c):
```
const TickType_t xConstTickCount = xTickCount + ( TickType_t ) 1;
```

Assembly:
```
10e2:       4b53            ldr     r3, [pc, FreeRTOS#332]  ; (1230 <xTaskIncrementTick+0x15c>)
10e4:       f8b3 4134       ldrh.w  r4, [r3, FreeRTOS#308]  ; 0x134
10e8:       b2a4            uxth    r4, r4
10ea:       3401            adds    r4, #1
10ec:       b2a4            uxth    r4, r4
10ee:       f8a3 4134       strh.w  r4, [r3, FreeRTOS#308]  ; 0x134
```

It is clear from assembly that the tick type is 16 bit.

3. configTICK_TYPE_WIDTH_IN_BITS is defined to TICK_TYPE_WIDTH_16_BITS.

Source (function xTaskIncrementTick in tasks.c):
```
const TickType_t xConstTickCount = xTickCount + ( TickType_t ) 1;
```

Assembly:
```
10e2:       4b53            ldr     r3, [pc, FreeRTOS#332]  ; (1230 <xTaskIncrementTick+0x15c>)
10e4:       f8b3 4134       ldrh.w  r4, [r3, FreeRTOS#308]  ; 0x134
10e8:       b2a4            uxth    r4, r4
10ea:       3401            adds    r4, #1
10ec:       b2a4            uxth    r4, r4
10ee:       f8a3 4134       strh.w  r4, [r3, FreeRTOS#308]  ; 0x134
```

It is clear from assembly that the tick type is 16 bit.

4. configTICK_TYPE_WIDTH_IN_BITS is defined to TICK_TYPE_WIDTH_32_BITS.

Source (function xTaskIncrementTick in tasks.c):
```
const TickType_t xConstTickCount = xTickCount + ( TickType_t ) 1;
```

Assembly:
```
109e:       4b50            ldr     r3, [pc, FreeRTOS#320]  ; (11e0 <xTaskIncrementTick+0x150>)
10a0:       f8d3 4134       ldr.w   r4, [r3, FreeRTOS#308]  ; 0x134
10a4:       3401            adds    r4, #1
10a6:       f8c3 4134       str.w   r4, [r3, FreeRTOS#308]  ; 0x134
```

It is clear from assembly that the tick type is 32 bit.

5. configTICK_TYPE_WIDTH_IN_BITS is defined to TICK_TYPE_WIDTH_64_BITS.

```
 #error configTICK_TYPE_WIDTH_IN_BITS set to unsupported tick type width.
```

The testing was done for GCC/ARM_CM3 port which does not support 64 bit
tick type.

6. Neither configUSE_16_BIT_TICKS nor configTICK_TYPE_WIDTH_IN_BITS
defined.

```
 #error Missing definition:  One of configUSE_16_BIT_TICKS and
 configTICK_TYPE_WIDTH_IN_BITS must be defined in FreeRTOSConfig.h.
 See the Configuration section of the FreeRTOS API documentation for
 details.
```

7. Both configUSE_16_BIT_TICKS and configTICK_TYPE_WIDTH_IN_BITS defined.

```
 #error Only one of configUSE_16_BIT_TICKS and
 configTICK_TYPE_WIDTH_IN_BITS must be defined in FreeRTOSConfig.h.
 See the Configuration section of the FreeRTOS API documentation for
 details.
```

Related issue - FreeRTOS#628

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Feature/fixing clang gnu compiler warnings (FreeRTOS#620)

* Adding in ability to support a library for freertos_config and a custom freertos_kernel_port (FreeRTOS#558)

* Using single name definition for libraries everywhere. (FreeRTOS#558)

* Supporting backwards compatibility with FREERTOS_CONFIG_FILE_DIRECTORY (FreeRTOS#571)

* Removing compiler warnings for GNU and Clang. (FreeRTOS#571)

* Added in documentation on how to consume from a main project. Added default PORT selection for native POSIX and MINGW platforms.

* Only adding freertos_config if it exists. Removing auto generation of it from a FREERTOS_CONFIG_FILE_DIRECTORY.

* Fixing clang and gnu compiler warnings.

* Adding in project information and how to compile for GNU/clang

* Fixing compiler issue with unused variable - no need to declare variable.

* Adding in compile warnings for linux builds that kernel is okay with using.

* Fixing more extra-semi-stmt clang warnings.

* Moving definition of hooks into header files if features are enabled.

* Fixing formatting with uncrustify.

* Fixing merge conflicts with main merge.

* Fixing compiler errors due to merge issues and formatting.

* Fixing Line feeds.

* Adding 'portNORETURN' into portmacros.h. Other Updates based on PR request

* Further clean-up of clang and clang-tidy issues.

* Removing compiler specific pragmas from common c files.

* Fixing missing lexicon entry and uncrustify formatting changes.

* Resolving merge issue multiple defnitions of proto for prvIdleTask

* Fixing formatting issues that are not covered by uncrustify. Use clang-tidy instead if you want this level of control.

* More uncrustify formatting issues.

* Fixing extra bracket in #if statement.

---------

Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* POSIX port fixes (FreeRTOS#626)

* Fix types in POSIX port

Use TaskFunction_t and StackType_t as other ports do.

* Fix portTICK_RATE_MICROSECONDS in POSIX port

---------

Co-authored-by: Jacques GUILLOU <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* Cortex-M35P: Add Cortex-M35P port (FreeRTOS#631)

* Cortex-M35P: Add Cortex-M35P port

The Cortex-M35P support added to kernel. The port hasn't been
validated yet with TF-M. Hence TF-M support is not included in this
port.

Signed-off-by: Devaraj Ranganna <[email protected]>

* Add portNORETURN to the newly added portmacro.h

Signed-off-by: Gaurav Aggarwal <[email protected]>

---------

Signed-off-by: Devaraj Ranganna <[email protected]>
Signed-off-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>
Co-authored-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: kar-rahul-aws <[email protected]>

* Introduced Github Status Badge for Unit Tests (FreeRTOS#634)

* Introduced Github Status Badge for Unit Tests

* Github status badge to point to latest run

* Github status badge UT points to latest results

* Fixed URL for Github Status badge

---------

Co-authored-by: kar-rahul-aws <[email protected]>

* Remove C99 requirement from CMake file (FreeRTOS#633)

* Remove C99 requirement from CMake file

The kernel source is C89 compliant and does not need C99.

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Explicitly set C89 requirement for kernel

Signed-off-by: Gaurav Aggarwal <[email protected]>

---------

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Add Thread Local Storage (TLS) support using Picolibc functions (FreeRTOS#343)

* Pass top of stack to configINIT_TLS_BLOCK

Picolibc wants to allocate the per-task TLS block within the stack
segment, so it will need to modify the top of stack value. Pass the
pxTopOfStack variable to make this explicit.

Signed-off-by: Keith Packard <[email protected]>

* Move newlib-specific definitions to separate file

This reduces the clutter in FreeRTOS.h caused by having newlib-specific
macros present there.

Signed-off-by: Keith Packard <[email protected]>

* Make TLS code depend only on configUSE_C_RUNTIME_TLS_SUPPORT

Remove reference to configUSE_NEWLIB_REENTRANT as that only works
when using newlib. configUSE_C_RUNTIME_TLS_SUPPORT is always
set when configUSE_NEWLIB_REENTRANT is set, so using both was
redundant in that case.

Signed-off-by: Keith Packard <[email protected]>

* portable-ARC: Adapt ARC support to use generalized TLS support

With generalized thread local storage (TLS) support present in the
core, the two ARC ports need to have the changes to the TCB mirrored
to them.

Signed-off-by: Keith Packard <[email protected]>

* Add Thread Local Storage (TLS) support using Picolibc functions

This patch provides definitions of the general TLS support macros in
terms of the Picolibc TLS support functions.

Picolibc is normally configured to use TLS internally for all
variables that are intended to be task-local, so these changes are
necessary for picolibc to work correctly with FreeRTOS.

The picolibc helper functions rely on elements within the linker
script to arrange the TLS data in memory and define some symbols.
Applications wanting to use this mechanism will need changes in their
linker script when migrating to picolibc.

Signed-off-by: Keith Packard <[email protected]>

---------

Signed-off-by: Keith Packard <[email protected]>
Co-authored-by: Keith Packard <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* Interrupt priority assert improvements for CM3/4/7 (FreeRTOS#602)

* Interrupt priority assert improvements for CM3/4/7

In the ARM_CM3, ARM_CM4, and ARM_CM7 ports, change the assertion that
`configMAX_SYSCALL_INTERRUPT_PRIORITY` is nonzero to account for the
number of priority bits implemented by the hardware.

Change these ports to also use the lowest priority for PendSV and
SysTick, ignoring `configKERNEL_INTERRUPT_PRIORITY`.

* Remove not needed configKERNEL_INTERRUPT_PRIORITY define

Signed-off-by: Gaurav Aggarwal <[email protected]>

---------

Signed-off-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>
Co-authored-by: Gaurav Aggarwal <[email protected]>

* Introduced code coverage status badge (FreeRTOS#635)

* Introduced code coverage status badge

* Trying to fix the URL checker issue

* Fix URL check

Signed-off-by: Gaurav Aggarwal <[email protected]>

---------

Signed-off-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* added portPOINTER_SIZE_TYPE and SIZE_MAX definition to PIC24/dsPIC port (FreeRTOS#636)

* added portPOINTER_SIZE_TYPE definition to PIC24/dsPIC port

* Added SIZE_MAX definition to PIC24/dsPIC33

* Fix TLS and stack alignment when using picolibc (FreeRTOS#637)

Both the TLS block and stack must be correctly aligned when using
picolibc. The architecture stack alignment is represented by the
portBYTE_ALIGNMENT_MASK and the TLS block alignment is provided by the
Picolibc _tls_align() inline function for Picolibc version 1.8 and
above. For older versions of Picolibc, we'll assume that the TLS block
requires the same alignment as the stack.

For downward growing stacks, this requires aligning the start of the
TLS block to the maximum of the stack alignment and the TLS
alignment. With this, both the TLS block and stack will now be
correctly aligned.

For upward growing stacks, the two areas must be aligned
independently; the TLS block is aligned from the start of the stack,
then the tls space is allocated, and then the stack is aligned above
that.

It's probably useful to know here that the linker ensures that
variables within the TLS block are assigned offsets that match their
alignment requirements. If the TLS block itself is correctly aligned,
then everything within will also be.

I have only tested the downward growing stack branch of this patch.

Signed-off-by: Keith Packard <[email protected]>
Co-authored-by: Keith Packard <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* Enable building the GCC Cortex-R5 port without an FPU (FreeRTOS#586)

* Ensure configUSE_TASK_FPU_SUPPORT option is set correctly

If one does enable the FPU of the Cortex-R5 processor, then the GCC
compiler will define the macro __ARM_FP. This can be used to ensure,
that the configUSE_TASK_FPU_SUPPORT is set accordingly.

* Enable the implementation of vPortTaskUsesFPU only if configUSE_TASK_FPU_SUPPORT is set to 1

* Remove error case in pxPortInitialiseStack

The case of configUSE_TASK_FPU_SUPPORT is 0 is now handled

* Enable access to FPU registers only if FPU is enabled

* Make minor formating changes

* Format ARM Cortex-R5 port

* Address review comments from @ChristosZosi

* Minor code review suggestions

Signed-off-by: Gaurav Aggarwal <[email protected]>

---------

Signed-off-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: Christos Zosimidis <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>
Co-authored-by: Gaurav Aggarwal <[email protected]>

* Fix freertos_kernel cmake property, Posix Port (FreeRTOS#640)

* Fix freertos_kernel cmake property, Posix Port

* Moves the `set_property()` call below the target definition in top level CMakeLists file
* Corrects billion value from `ULL` suffix (not C90 compliant) to `UL` suffix with cast to uint64_t

* Add blank line to CMakeLists.txt

* Add missing FreeRTOS+ defines

* Run kernel demos and unit tests for PR changes (FreeRTOS#645)

* Run kernel demos and unit tests for PR changes

Kernel demos check builds multiple demos from FreeRTOS/FreeRTOS and
unit tests check runs unit tests in FreeRTOS/FreeRTOS. Both of these
checks currently use main branch of FreeRTOS-Kernel. This commits
updates these checks to use the changes in the PR.

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Do not specify PR SHA explicitly as that is default

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Remove explicit PR SHA from kernel checks

Signed-off-by: Gaurav Aggarwal <[email protected]>

---------

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Add functions to get the buffers of statically created objects (FreeRTOS#641)

Added various ...GetStaticBuffer() functions to get the buffers of statically
created objects.
---------
Co-authored-by: Paul Bartell <[email protected]>
Co-authored-by: Nikhil Kamath <[email protected]>
Co-authored-by: Gaurav Aggarwal <[email protected]>

* Cortex-M Assert when NVIC implements 8 PRIO bits (FreeRTOS#639)

* Cortex-M Assert when NVIC implements 8 PRIO bits

* Fix CM3 ports

* Fix ARM_CM3_MPU

* Fix ARM CM3

* Fix ARM_CM4_MPU

* Fix ARM_CM4

* Fix GCC ARM_CM7

* Fix IAR ARM ports

* Uncrustify changes

* Fix MikroC_ARM_CM4F port

* Fix MikroC_ARM_CM4F port-(2)

* Fix RVDS ARM ports

* Revert changes for Tasking/ARM_CM4F port

* Revert changes for Tasking/ARM_CM4F port-(2)

* Update port.c

Fix GCC/ARM_CM4F port

* Update port.c

* update GCC\ARM_CM4F port

* update port.c

* Assert to check configMAX_SYSCALL_INTERRUPT_PRIORITY is set to higher priority

* Fix merge error: remove duplicate code

* Fix typos

---------

Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>
Co-authored-by: Ubuntu <[email protected]>

* Remove C90 requirement from CMakeLists (FreeRTOS#649)

This is needed as it is breaking projects - https://forums.freertos.org/t/freertos-gcc-cmake/16984

We will re-evaluate and accordingly add this later.

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Only add alignment padding when needed (FreeRTOS#650)

Heap 4 and Heap 5 add some padding to ensure that the allocated blocks
are always aligned to portBYTE_ALIGNMENT bytes. The code until now was
adding padding always even if the resulting block was already aligned.
This commits updates the code to only add padding if the resulting block
is not aligned.

Signed-off-by: Gaurav Aggarwal <[email protected]>

* add a missing comma (FreeRTOS#651)

* fix conversion warning (FreeRTOS#658)

FreeRTOS-Kernel/portable/GCC/ARM_CM4F/port.c:399:41: error: conversion from 'uint32_t' {aka 'long unsigned int'} to 'uint8_t' {aka 'unsigned char'} may change value [-Werror=conversion]

Signed-off-by: Vo Trung Chi <[email protected]>

* ARMv7M: Adjust implemented priority bit assertions (FreeRTOS#665)

Adjust assertions related to the CMSIS __NVIC_PRIO_BITS and FreeRTOS
configPRIO_BITS configuration macros such that these macros specify the
minimum number of implemented priority bits supported by a config
build rather than the exact number of implemented priority bits.

Related to Qemu issue FreeRTOS#1122

* Format portmacro.h in arm CM0 ports

* portable/ARM_CM0: Add xPortIsInsideInterrupt

Add missing xPortIsInsideInterrupt function to Cortex-M0 port.

---------

Signed-off-by: Gaurav Aggarwal <[email protected]>
Signed-off-by: Cervenka Dusan <[email protected]>
Signed-off-by: Devaraj Ranganna <[email protected]>
Signed-off-by: Keith Packard <[email protected]>
Signed-off-by: Vo Trung Chi <[email protected]>
Co-authored-by: Archit Gupta <[email protected]>
Co-authored-by: tcpluess <[email protected]>
Co-authored-by: pluess <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>
Co-authored-by: Chris Copeland <[email protected]>
Co-authored-by: David J. Fiddes <[email protected]>
Co-authored-by: Dusan Cervenka <[email protected]>
Co-authored-by: bbain <[email protected]>
Co-authored-by: Ju1He1 <[email protected]>
Co-authored-by: Aniruddha Kanhere <[email protected]>
Co-authored-by: phelter <[email protected]>
Co-authored-by: jacky309 <[email protected]>
Co-authored-by: Jacques GUILLOU <[email protected]>
Co-authored-by: Devaraj Ranganna <[email protected]>
Co-authored-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: kar-rahul-aws <[email protected]>
Co-authored-by: Nikhil Kamath <[email protected]>
Co-authored-by: Keith Packard <[email protected]>
Co-authored-by: Keith Packard <[email protected]>
Co-authored-by: Joseph Julicher <[email protected]>
Co-authored-by: Paul Bartell <[email protected]>
Co-authored-by: Christos Zosimidis <[email protected]>
Co-authored-by: Kody Stribrny <[email protected]>
Co-authored-by: Holden <holden-zenithaerotech.com>
Co-authored-by: Darian <[email protected]>
Co-authored-by: Ubuntu <[email protected]>
Co-authored-by: Nicolas <[email protected]>
Co-authored-by: Vo Trung Chi <[email protected]>

* Fix for c90 compiler

---------

Signed-off-by: Gaurav Aggarwal <[email protected]>
Signed-off-by: Cervenka Dusan <[email protected]>
Signed-off-by: Devaraj Ranganna <[email protected]>
Signed-off-by: Keith Packard <[email protected]>
Signed-off-by: Vo Trung Chi <[email protected]>
Co-authored-by: Archit Gupta <[email protected]>
Co-authored-by: tcpluess <[email protected]>
Co-authored-by: pluess <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>
Co-authored-by: Chris Copeland <[email protected]>
Co-authored-by: David J. Fiddes <[email protected]>
Co-authored-by: Dusan Cervenka <[email protected]>
Co-authored-by: bbain <[email protected]>
Co-authored-by: Ju1He1 <[email protected]>
Co-authored-by: Aniruddha Kanhere <[email protected]>
Co-authored-by: phelter <[email protected]>
Co-authored-by: jacky309 <[email protected]>
Co-authored-by: Jacques GUILLOU <[email protected]>
Co-authored-by: Devaraj Ranganna <[email protected]>
Co-authored-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: kar-rahul-aws <[email protected]>
Co-authored-by: Nikhil Kamath <[email protected]>
Co-authored-by: Keith Packard <[email protected]>
Co-authored-by: Keith Packard <[email protected]>
Co-authored-by: Joseph Julicher <[email protected]>
Co-authored-by: Paul Bartell <[email protected]>
Co-authored-by: Christos Zosimidis <[email protected]>
Co-authored-by: Kody Stribrny <[email protected]>
Co-authored-by: Darian <[email protected]>
Co-authored-by: Ubuntu <[email protected]>
Co-authored-by: Nicolas <[email protected]>
Co-authored-by: Vo Trung Chi <[email protected]>
@RichardBarry
Copy link
Contributor

RichardBarry commented Apr 25, 2023

I just downloaded FreeRTOSv202212.00 and ran this MPS2 QEMU demo https://github.com/FreeRTOS/FreeRTOS/tree/202212.00/FreeRTOS/Demo/CORTEX_MPS2_QEMU_IAR_GCC, which executed as expected (not sure if it matches the actual MPS2 FPGA model). There is a second (incorrectly named) MPS2 project that I didn't try. That second project includes the CMSIS library, so __NVIC_PRIO_BITS may be defined, and that may cause an assert. I recommend deleting the second demo as it isn't referenced in the QEMU documentation on FreeRTOS.org.

The asserts in 202212.00 are as they were prior to PRs updating that code sequence, are simpler than after the updates, and work as intended outside of QEMU. After the PRs the asserts don't work as intended.

@jefftenney
Copy link
Contributor

After the PRs the asserts don't work as intended.

Specifically, the new asserts have lost the ability to catch a vendor's setting __NVIC_PRIO_BITS lower than the number actually implemented in the hardware. Note that the application still works correctly with __NVIC_PRIO_BITS set too low. The developer ends up using fewer bits than are available, but no harm done. The application works as designed. Still, losing the ability to catch that specific vendor mistake deserves some consideration.

ran this MPS2 QEMU ... which executed as expected

In v202212.00, this assert didn't work in QEMU. It couldn't catch configuration errors because the port code set ulMaxPRIGROUPValue incorrectly. That issue was fixed in a recent commit.

@jefftenney
Copy link
Contributor

Note that the application still works correctly with __NVIC_PRIO_BITS set too low. The developer ends up using fewer bits than are available, but no harm done.

That is only true if the developer configures interrupt priorities based on the definition of __NVIC_PRIO_BITS. But consider this example:

The developer sets all the project's interrupt priorities based on the documentation for the hardware (Reference Manual, data sheet, etc) which says 4 bits are implemented. So the developer uses priorities 0 through 15 in CMSIS calls. The developer doesn't notice the vendor's mistaken setting of __NVIC_PRIO_BITS to 3. The CMSIS calls would shift priorities by 5 (not by 4 as the developer expects), quietly dropping the most-significant bit of the developer's 4-bit values. I don't see any compile-time warnings or runtime asserts (or even return codes) that would indicate the problem. But the interrupts would have wrong priorities and even the wrong order of priorities. Prior to this PR, there would have been a runtime assert about __NVIC_PRIO_BITS.

I have not tested this but it deserves some consideration.

chinglee-iot added a commit to chinglee-iot/FreeRTOS-Kernel that referenced this pull request May 17, 2023
* Fix array-bounds compiler warning on gcc11+ in list.h (FreeRTOS#580)

listGET_OWNER_OF_NEXT_ENTRY computes `( pxConstList )->pxIndex->pxNext` after
verifying that `( pxConstList )->pxIndex` points to `xListEnd`, which due to
being a MiniListItem_t, can be shorter than a ListItem_t. Thus,
`( pxConstList )->pxIndex` is a `ListItem_t *` that extends past the end of the
`List_t` whose `xListEnd` it points to. This is fixed by accessing `pxNext`
through a `MiniListItem_t` instead.

* move the prototype for vApplicationIdleHook to task.h. (FreeRTOS#600)

Co-authored-by: pluess <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* Update equal priority task preemption (FreeRTOS#603)

* vTaskResume and vTaskPrioritySet don't preempt equal priority task

* Update vTaskResumeAll not to preempt task with equal priority

* Fix in xTaskResumeFromISR

* Update FreeRTOS/FreeRTOS build checks (FreeRTOS#613)

This is needed to be compatible with the refactoring done in this
PR - FreeRTOS/FreeRTOS#889

Signed-off-by: Gaurav Aggarwal <[email protected]>

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Add ulTaskGetRunTimeCounter and ulTaskGetRunTimePercent (FreeRTOS#611)

Allow ulTaskGetIdleRunTimeCounter and ulTaskGetIdleRunTimePercent to be
used whenever configGENERATE_RUN_TIME_STATS is enabled, as this is the
only requirement for these functions to work.

* Fix some CMake documentation typos (FreeRTOS#616)

The quick start instructions for CMake mention the "master"
git branch which has been replaced by "main" in the current
repo.

The main CMakeLists.txt documents how to integrate a
custom port. Fix a typo in the suggested CMake code.

* Added support of 64bit events. (FreeRTOS#597)

* Added support of 64bit even

Signed-off-by: Cervenka Dusan <[email protected]>

* Added missing brackets

Signed-off-by: Cervenka Dusan <[email protected]>

* Made proper name for tick macro.

Signed-off-by: Cervenka Dusan <[email protected]>

* Improved macro evaluation

Signed-off-by: Cervenka Dusan <[email protected]>

* Fixed missed port files  + documentation

Signed-off-by: Cervenka Dusan <[email protected]>

* Changes made on PR

Signed-off-by: Cervenka Dusan <[email protected]>

* Fix macro definition.

Signed-off-by: Cervenka Dusan <[email protected]>

* Formatted code with uncrustify

Signed-off-by: Cervenka Dusan <[email protected]>

---------

Signed-off-by: Cervenka Dusan <[email protected]>

* Introduce portMEMORY_BARRIER for Microblaze port. (FreeRTOS#621)

The introduction of `portMEMORY_BARRIER` will ensure
the places in the kernel use a barrier will work.
For example, `xTaskResumeAll` has a memory barrier
to ensure its correctness when compiled with optimization
enabled. Without the barrier `xTaskResumeAll` can fail
(e.g. start reading and writing to address 0 and/or
infinite looping) when `xPendingReadyList` contains more
than one task to restore.

In `xTaskResumeAll` the compiler chooses to cache the
`pxTCB` the first time through the loop for use
in every subsequent loop. This is incorrect as the
removal of `pxTCB->xEventListItem` will actually
change the value of `pxTCB` if it was read again
at the top of the loop. The barrier forces the compiler
to read `pxTCB` again at the top of the loop.

The compiler is operating correctly. The removal
`pxTCB->xEventListItem` executes on a `List_t *`
and `ListItem_t *`.  This means that the compiler
can assume that any `MiniListItem_t` values are
unchanged by the loop (i.e. "strict-aliasing").
This allows the compiler to cache `pxTCB` as it
is obtained via a `MiniListItem_t`. This is incorrect
in this case because it is possible for a `ListItem_t *`
to actually alias a `MiniListItem_t`. This is technically
a "violation of aliasing rules" so we use the the barrier
to disable the strict-aliasing optimization in this loop.

* Do not call exit() on MSVC Port when calling vPortEndScheduler (FreeRTOS#624)

* make port exitable

* correctly set xPortRunning to False

* add suggestions from Review

Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* add suggestions from Review

Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

---------

Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* Update PR template to include checkbox for Unit Test related changes (FreeRTOS#627)

* Fix build failure introduced in PR FreeRTOS#597 (FreeRTOS#629)

The PR FreeRTOS#597 introduced a new config option configTICK_TYPE_WIDTH_IN_BITS
which can be defined to one of the following:
* TICK_TYPE_WIDTH_16_BITS - Tick type is 16 bit wide.
* TICK_TYPE_WIDTH_32_BITS - Tick type is 32 bit wide.
* TICK_TYPE_WIDTH_64_BITS - Tick type is 64 bit wide.

Earlier we supported 16 and 32 bit width for tick type which was
controlled using the config option configUSE_16_BIT_TICKS. The PR
tried to maintain backward compatibility by honoring
configUSE_16_BIT_TICKS. The backward compatibility did not work as
expected though, as the macro configTICK_TYPE_WIDTH_IN_BITS was used
before it was defined. This PR addresses it by ensuring that the macro
configTICK_TYPE_WIDTH_IN_BITS is defined before it is used.

Testing
1. configUSE_16_BIT_TICKS is defined to 0.

Source (function xTaskIncrementTick in tasks.c):
```
const TickType_t xConstTickCount = xTickCount + ( TickType_t ) 1;
```

Assembly:
```
109e:       4b50            ldr     r3, [pc, FreeRTOS#320]  ; (11e0 <xTaskIncrementTick+0x150>)
10a0:       f8d3 4134       ldr.w   r4, [r3, FreeRTOS#308]  ; 0x134
10a4:       3401            adds    r4, #1
10a6:       f8c3 4134       str.w   r4, [r3, FreeRTOS#308]  ; 0x134
```

It is clear from assembly that the tick type is 32 bit.

2. configUSE_16_BIT_TICKS is defined to 1.

Source (function xTaskIncrementTick in tasks.c):
```
const TickType_t xConstTickCount = xTickCount + ( TickType_t ) 1;
```

Assembly:
```
10e2:       4b53            ldr     r3, [pc, FreeRTOS#332]  ; (1230 <xTaskIncrementTick+0x15c>)
10e4:       f8b3 4134       ldrh.w  r4, [r3, FreeRTOS#308]  ; 0x134
10e8:       b2a4            uxth    r4, r4
10ea:       3401            adds    r4, #1
10ec:       b2a4            uxth    r4, r4
10ee:       f8a3 4134       strh.w  r4, [r3, FreeRTOS#308]  ; 0x134
```

It is clear from assembly that the tick type is 16 bit.

3. configTICK_TYPE_WIDTH_IN_BITS is defined to TICK_TYPE_WIDTH_16_BITS.

Source (function xTaskIncrementTick in tasks.c):
```
const TickType_t xConstTickCount = xTickCount + ( TickType_t ) 1;
```

Assembly:
```
10e2:       4b53            ldr     r3, [pc, FreeRTOS#332]  ; (1230 <xTaskIncrementTick+0x15c>)
10e4:       f8b3 4134       ldrh.w  r4, [r3, FreeRTOS#308]  ; 0x134
10e8:       b2a4            uxth    r4, r4
10ea:       3401            adds    r4, #1
10ec:       b2a4            uxth    r4, r4
10ee:       f8a3 4134       strh.w  r4, [r3, FreeRTOS#308]  ; 0x134
```

It is clear from assembly that the tick type is 16 bit.

4. configTICK_TYPE_WIDTH_IN_BITS is defined to TICK_TYPE_WIDTH_32_BITS.

Source (function xTaskIncrementTick in tasks.c):
```
const TickType_t xConstTickCount = xTickCount + ( TickType_t ) 1;
```

Assembly:
```
109e:       4b50            ldr     r3, [pc, FreeRTOS#320]  ; (11e0 <xTaskIncrementTick+0x150>)
10a0:       f8d3 4134       ldr.w   r4, [r3, FreeRTOS#308]  ; 0x134
10a4:       3401            adds    r4, #1
10a6:       f8c3 4134       str.w   r4, [r3, FreeRTOS#308]  ; 0x134
```

It is clear from assembly that the tick type is 32 bit.

5. configTICK_TYPE_WIDTH_IN_BITS is defined to TICK_TYPE_WIDTH_64_BITS.

```
 #error configTICK_TYPE_WIDTH_IN_BITS set to unsupported tick type width.
```

The testing was done for GCC/ARM_CM3 port which does not support 64 bit
tick type.

6. Neither configUSE_16_BIT_TICKS nor configTICK_TYPE_WIDTH_IN_BITS
defined.

```
 #error Missing definition:  One of configUSE_16_BIT_TICKS and
 configTICK_TYPE_WIDTH_IN_BITS must be defined in FreeRTOSConfig.h.
 See the Configuration section of the FreeRTOS API documentation for
 details.
```

7. Both configUSE_16_BIT_TICKS and configTICK_TYPE_WIDTH_IN_BITS defined.

```
 #error Only one of configUSE_16_BIT_TICKS and
 configTICK_TYPE_WIDTH_IN_BITS must be defined in FreeRTOSConfig.h.
 See the Configuration section of the FreeRTOS API documentation for
 details.
```

Related issue - FreeRTOS#628

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Feature/fixing clang gnu compiler warnings (FreeRTOS#620)

* Adding in ability to support a library for freertos_config and a custom freertos_kernel_port (FreeRTOS#558)

* Using single name definition for libraries everywhere. (FreeRTOS#558)

* Supporting backwards compatibility with FREERTOS_CONFIG_FILE_DIRECTORY (FreeRTOS#571)

* Removing compiler warnings for GNU and Clang. (FreeRTOS#571)

* Added in documentation on how to consume from a main project. Added default PORT selection for native POSIX and MINGW platforms.

* Only adding freertos_config if it exists. Removing auto generation of it from a FREERTOS_CONFIG_FILE_DIRECTORY.

* Fixing clang and gnu compiler warnings.

* Adding in project information and how to compile for GNU/clang

* Fixing compiler issue with unused variable - no need to declare variable.

* Adding in compile warnings for linux builds that kernel is okay with using.

* Fixing more extra-semi-stmt clang warnings.

* Moving definition of hooks into header files if features are enabled.

* Fixing formatting with uncrustify.

* Fixing merge conflicts with main merge.

* Fixing compiler errors due to merge issues and formatting.

* Fixing Line feeds.

* Adding 'portNORETURN' into portmacros.h. Other Updates based on PR request

* Further clean-up of clang and clang-tidy issues.

* Removing compiler specific pragmas from common c files.

* Fixing missing lexicon entry and uncrustify formatting changes.

* Resolving merge issue multiple defnitions of proto for prvIdleTask

* Fixing formatting issues that are not covered by uncrustify. Use clang-tidy instead if you want this level of control.

* More uncrustify formatting issues.

* Fixing extra bracket in #if statement.

---------

Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* POSIX port fixes (FreeRTOS#626)

* Fix types in POSIX port

Use TaskFunction_t and StackType_t as other ports do.

* Fix portTICK_RATE_MICROSECONDS in POSIX port

---------

Co-authored-by: Jacques GUILLOU <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* Cortex-M35P: Add Cortex-M35P port (FreeRTOS#631)

* Cortex-M35P: Add Cortex-M35P port

The Cortex-M35P support added to kernel. The port hasn't been
validated yet with TF-M. Hence TF-M support is not included in this
port.

Signed-off-by: Devaraj Ranganna <[email protected]>

* Add portNORETURN to the newly added portmacro.h

Signed-off-by: Gaurav Aggarwal <[email protected]>

---------

Signed-off-by: Devaraj Ranganna <[email protected]>
Signed-off-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>
Co-authored-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: kar-rahul-aws <[email protected]>

* Introduced Github Status Badge for Unit Tests (FreeRTOS#634)

* Introduced Github Status Badge for Unit Tests

* Github status badge to point to latest run

* Github status badge UT points to latest results

* Fixed URL for Github Status badge

---------

Co-authored-by: kar-rahul-aws <[email protected]>

* Remove C99 requirement from CMake file (FreeRTOS#633)

* Remove C99 requirement from CMake file

The kernel source is C89 compliant and does not need C99.

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Explicitly set C89 requirement for kernel

Signed-off-by: Gaurav Aggarwal <[email protected]>

---------

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Add Thread Local Storage (TLS) support using Picolibc functions (FreeRTOS#343)

* Pass top of stack to configINIT_TLS_BLOCK

Picolibc wants to allocate the per-task TLS block within the stack
segment, so it will need to modify the top of stack value. Pass the
pxTopOfStack variable to make this explicit.

Signed-off-by: Keith Packard <[email protected]>

* Move newlib-specific definitions to separate file

This reduces the clutter in FreeRTOS.h caused by having newlib-specific
macros present there.

Signed-off-by: Keith Packard <[email protected]>

* Make TLS code depend only on configUSE_C_RUNTIME_TLS_SUPPORT

Remove reference to configUSE_NEWLIB_REENTRANT as that only works
when using newlib. configUSE_C_RUNTIME_TLS_SUPPORT is always
set when configUSE_NEWLIB_REENTRANT is set, so using both was
redundant in that case.

Signed-off-by: Keith Packard <[email protected]>

* portable-ARC: Adapt ARC support to use generalized TLS support

With generalized thread local storage (TLS) support present in the
core, the two ARC ports need to have the changes to the TCB mirrored
to them.

Signed-off-by: Keith Packard <[email protected]>

* Add Thread Local Storage (TLS) support using Picolibc functions

This patch provides definitions of the general TLS support macros in
terms of the Picolibc TLS support functions.

Picolibc is normally configured to use TLS internally for all
variables that are intended to be task-local, so these changes are
necessary for picolibc to work correctly with FreeRTOS.

The picolibc helper functions rely on elements within the linker
script to arrange the TLS data in memory and define some symbols.
Applications wanting to use this mechanism will need changes in their
linker script when migrating to picolibc.

Signed-off-by: Keith Packard <[email protected]>

---------

Signed-off-by: Keith Packard <[email protected]>
Co-authored-by: Keith Packard <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* Interrupt priority assert improvements for CM3/4/7 (FreeRTOS#602)

* Interrupt priority assert improvements for CM3/4/7

In the ARM_CM3, ARM_CM4, and ARM_CM7 ports, change the assertion that
`configMAX_SYSCALL_INTERRUPT_PRIORITY` is nonzero to account for the
number of priority bits implemented by the hardware.

Change these ports to also use the lowest priority for PendSV and
SysTick, ignoring `configKERNEL_INTERRUPT_PRIORITY`.

* Remove not needed configKERNEL_INTERRUPT_PRIORITY define

Signed-off-by: Gaurav Aggarwal <[email protected]>

---------

Signed-off-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>
Co-authored-by: Gaurav Aggarwal <[email protected]>

* Introduced code coverage status badge (FreeRTOS#635)

* Introduced code coverage status badge

* Trying to fix the URL checker issue

* Fix URL check

Signed-off-by: Gaurav Aggarwal <[email protected]>

---------

Signed-off-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* added portPOINTER_SIZE_TYPE and SIZE_MAX definition to PIC24/dsPIC port (FreeRTOS#636)

* added portPOINTER_SIZE_TYPE definition to PIC24/dsPIC port

* Added SIZE_MAX definition to PIC24/dsPIC33

* Fix TLS and stack alignment when using picolibc (FreeRTOS#637)

Both the TLS block and stack must be correctly aligned when using
picolibc. The architecture stack alignment is represented by the
portBYTE_ALIGNMENT_MASK and the TLS block alignment is provided by the
Picolibc _tls_align() inline function for Picolibc version 1.8 and
above. For older versions of Picolibc, we'll assume that the TLS block
requires the same alignment as the stack.

For downward growing stacks, this requires aligning the start of the
TLS block to the maximum of the stack alignment and the TLS
alignment. With this, both the TLS block and stack will now be
correctly aligned.

For upward growing stacks, the two areas must be aligned
independently; the TLS block is aligned from the start of the stack,
then the tls space is allocated, and then the stack is aligned above
that.

It's probably useful to know here that the linker ensures that
variables within the TLS block are assigned offsets that match their
alignment requirements. If the TLS block itself is correctly aligned,
then everything within will also be.

I have only tested the downward growing stack branch of this patch.

Signed-off-by: Keith Packard <[email protected]>
Co-authored-by: Keith Packard <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* Enable building the GCC Cortex-R5 port without an FPU (FreeRTOS#586)

* Ensure configUSE_TASK_FPU_SUPPORT option is set correctly

If one does enable the FPU of the Cortex-R5 processor, then the GCC
compiler will define the macro __ARM_FP. This can be used to ensure,
that the configUSE_TASK_FPU_SUPPORT is set accordingly.

* Enable the implementation of vPortTaskUsesFPU only if configUSE_TASK_FPU_SUPPORT is set to 1

* Remove error case in pxPortInitialiseStack

The case of configUSE_TASK_FPU_SUPPORT is 0 is now handled

* Enable access to FPU registers only if FPU is enabled

* Make minor formating changes

* Format ARM Cortex-R5 port

* Address review comments from @ChristosZosi

* Minor code review suggestions

Signed-off-by: Gaurav Aggarwal <[email protected]>

---------

Signed-off-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: Christos Zosimidis <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>
Co-authored-by: Gaurav Aggarwal <[email protected]>

* Fix freertos_kernel cmake property, Posix Port (FreeRTOS#640)

* Fix freertos_kernel cmake property, Posix Port

* Moves the `set_property()` call below the target definition in top level CMakeLists file
* Corrects billion value from `ULL` suffix (not C90 compliant) to `UL` suffix with cast to uint64_t

* Add blank line to CMakeLists.txt

* Add missing FreeRTOS+ defines

* Run kernel demos and unit tests for PR changes (FreeRTOS#645)

* Run kernel demos and unit tests for PR changes

Kernel demos check builds multiple demos from FreeRTOS/FreeRTOS and
unit tests check runs unit tests in FreeRTOS/FreeRTOS. Both of these
checks currently use main branch of FreeRTOS-Kernel. This commits
updates these checks to use the changes in the PR.

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Do not specify PR SHA explicitly as that is default

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Remove explicit PR SHA from kernel checks

Signed-off-by: Gaurav Aggarwal <[email protected]>

---------

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Add functions to get the buffers of statically created objects (FreeRTOS#641)

Added various ...GetStaticBuffer() functions to get the buffers of statically
created objects.
---------
Co-authored-by: Paul Bartell <[email protected]>
Co-authored-by: Nikhil Kamath <[email protected]>
Co-authored-by: Gaurav Aggarwal <[email protected]>

* Cortex-M Assert when NVIC implements 8 PRIO bits (FreeRTOS#639)

* Cortex-M Assert when NVIC implements 8 PRIO bits

* Fix CM3 ports

* Fix ARM_CM3_MPU

* Fix ARM CM3

* Fix ARM_CM4_MPU

* Fix ARM_CM4

* Fix GCC ARM_CM7

* Fix IAR ARM ports

* Uncrustify changes

* Fix MikroC_ARM_CM4F port

* Fix MikroC_ARM_CM4F port-(2)

* Fix RVDS ARM ports

* Revert changes for Tasking/ARM_CM4F port

* Revert changes for Tasking/ARM_CM4F port-(2)

* Update port.c

Fix GCC/ARM_CM4F port

* Update port.c

* update GCC\ARM_CM4F port

* update port.c

* Assert to check configMAX_SYSCALL_INTERRUPT_PRIORITY is set to higher priority

* Fix merge error: remove duplicate code

* Fix typos

---------

Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>
Co-authored-by: Ubuntu <[email protected]>

* Remove C90 requirement from CMakeLists (FreeRTOS#649)

This is needed as it is breaking projects - https://forums.freertos.org/t/freertos-gcc-cmake/16984

We will re-evaluate and accordingly add this later.

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Only add alignment padding when needed (FreeRTOS#650)

Heap 4 and Heap 5 add some padding to ensure that the allocated blocks
are always aligned to portBYTE_ALIGNMENT bytes. The code until now was
adding padding always even if the resulting block was already aligned.
This commits updates the code to only add padding if the resulting block
is not aligned.

Signed-off-by: Gaurav Aggarwal <[email protected]>

* add a missing comma (FreeRTOS#651)

* fix conversion warning (FreeRTOS#658)

FreeRTOS-Kernel/portable/GCC/ARM_CM4F/port.c:399:41: error: conversion from 'uint32_t' {aka 'long unsigned int'} to 'uint8_t' {aka 'unsigned char'} may change value [-Werror=conversion]

Signed-off-by: Vo Trung Chi <[email protected]>

* ARMv7M: Adjust implemented priority bit assertions (FreeRTOS#665)

Adjust assertions related to the CMSIS __NVIC_PRIO_BITS and FreeRTOS
configPRIO_BITS configuration macros such that these macros specify the
minimum number of implemented priority bits supported by a config
build rather than the exact number of implemented priority bits.

Related to Qemu issue FreeRTOS#1122

* Format portmacro.h in arm CM0 ports

* portable/ARM_CM0: Add xPortIsInsideInterrupt

Add missing xPortIsInsideInterrupt function to Cortex-M0 port.

* tree-wide: Unify formatting of __cplusplus ifdefs

* Paranthesize expression-like macro (FreeRTOS#668)

* Updated tasks.c checks for scheduler suspension (FreeRTOS#670)

This commit updates the checks for the variable uxSchedulerSuspended in
tasks.c module to use a uniform format.

Signed-off-by: Sudeep Mohanty <[email protected]>

* Fix cast alignment warning (FreeRTOS#669)

* Fix cast alignment warning

Without this change, the code produces the following warning when
compiled with `-Wcast-align` flag:

```
cast increases required alignment of target type
```

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Align StackSize and StackAddress for macOS (FreeRTOS#674)

* Armv8-M (except Cortex-M23) interrupt priority checking (FreeRTOS#673)

* Armv8-M: Formatting changes

Signed-off-by: Devaraj Ranganna <[email protected]>

* Armv8-M: Add support for interrupt priority check

FreeRTOS provides `FromISR` system calls which can be called directly
from interrupt service routines. It is crucial that the priority of
these ISRs is set to same or lower value (numerically higher) than that
of `configMAX_SYSCALL_INTERRUPT_PRIORITY`. For more information refer
to https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html.

Add a check to trigger an assert when an ISR with priority higher
(numerically lower) than `configMAX_SYSCALL_INTERRUPT_PRIORITY` calls
`FromISR` system calls if `configASSERT` macro is defined.

In addition, add a config option
`configQEMU_DISABLE_INTERRUPT_PRIO_BITS_CHECK` to disable interrupt
priority check while running on QEMU. Based on the discussion
https://gitlab.com/qemu-project/qemu/-/issues/1122, The interrupt
priority bits in QEMU do not match the real hardware. Therefore the
assert that checks the number of implemented bits and __NVIC_PRIO_BITS
will always fail. The config option
 `configQEMU_DISABLE_INTERRUPT_PRIO_BITS_CHECK` should be defined in the
`FreeRTOSConfig.h` for QEMU targets.

Signed-off-by: Devaraj Ranganna <[email protected]>

* Use SHPR2 for calculating interrupt priority bits

This removes the dependency on the secure software to mark the interrupt
as non-secure.

Signed-off-by: Gaurav Aggarwal <[email protected]>

---------

Signed-off-by: Devaraj Ranganna <[email protected]>
Signed-off-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* Use the extended movx instruction instead of mov (FreeRTOS#676)

The following is from the MSP430X instruction set -

```
MOVX.W Move source word to destination word.

The source operand is copied to the destination. The source operand is
not affected. Both operands may be located in the full address space.
```

The movx instruction allows both the operands to be located in the full
address space and therefore, works with large data model as well.

Signed-off-by: Gaurav Aggarwal <[email protected]>

---------

Signed-off-by: Gaurav Aggarwal <[email protected]>
Signed-off-by: Cervenka Dusan <[email protected]>
Signed-off-by: Devaraj Ranganna <[email protected]>
Signed-off-by: Keith Packard <[email protected]>
Signed-off-by: Vo Trung Chi <[email protected]>
Signed-off-by: Sudeep Mohanty <[email protected]>
Co-authored-by: Archit Gupta <[email protected]>
Co-authored-by: tcpluess <[email protected]>
Co-authored-by: pluess <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>
Co-authored-by: Chris Copeland <[email protected]>
Co-authored-by: David J. Fiddes <[email protected]>
Co-authored-by: Dusan Cervenka <[email protected]>
Co-authored-by: bbain <[email protected]>
Co-authored-by: Ju1He1 <[email protected]>
Co-authored-by: Aniruddha Kanhere <[email protected]>
Co-authored-by: phelter <[email protected]>
Co-authored-by: jacky309 <[email protected]>
Co-authored-by: Jacques GUILLOU <[email protected]>
Co-authored-by: Devaraj Ranganna <[email protected]>
Co-authored-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: kar-rahul-aws <[email protected]>
Co-authored-by: Nikhil Kamath <[email protected]>
Co-authored-by: Keith Packard <[email protected]>
Co-authored-by: Keith Packard <[email protected]>
Co-authored-by: Joseph Julicher <[email protected]>
Co-authored-by: Paul Bartell <[email protected]>
Co-authored-by: Christos Zosimidis <[email protected]>
Co-authored-by: Kody Stribrny <[email protected]>
Co-authored-by: Holden <holden-zenithaerotech.com>
Co-authored-by: Darian <[email protected]>
Co-authored-by: Ubuntu <[email protected]>
Co-authored-by: Nicolas <[email protected]>
Co-authored-by: Vo Trung Chi <[email protected]>
Co-authored-by: Sudeep Mohanty <[email protected]>
Co-authored-by: Monika Singh <[email protected]>
chinglee-iot added a commit to chinglee-iot/FreeRTOS-Kernel that referenced this pull request Jul 21, 2023
* Fix array-bounds compiler warning on gcc11+ in list.h (FreeRTOS#580)

listGET_OWNER_OF_NEXT_ENTRY computes `( pxConstList )->pxIndex->pxNext` after
verifying that `( pxConstList )->pxIndex` points to `xListEnd`, which due to
being a MiniListItem_t, can be shorter than a ListItem_t. Thus,
`( pxConstList )->pxIndex` is a `ListItem_t *` that extends past the end of the
`List_t` whose `xListEnd` it points to. This is fixed by accessing `pxNext`
through a `MiniListItem_t` instead.

* move the prototype for vApplicationIdleHook to task.h. (FreeRTOS#600)

Co-authored-by: pluess <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* Update equal priority task preemption (FreeRTOS#603)

* vTaskResume and vTaskPrioritySet don't preempt equal priority task

* Update vTaskResumeAll not to preempt task with equal priority

* Fix in xTaskResumeFromISR

* Update FreeRTOS/FreeRTOS build checks (FreeRTOS#613)

This is needed to be compatible with the refactoring done in this
PR - FreeRTOS/FreeRTOS#889

Signed-off-by: Gaurav Aggarwal <[email protected]>

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Add ulTaskGetRunTimeCounter and ulTaskGetRunTimePercent (FreeRTOS#611)

Allow ulTaskGetIdleRunTimeCounter and ulTaskGetIdleRunTimePercent to be
used whenever configGENERATE_RUN_TIME_STATS is enabled, as this is the
only requirement for these functions to work.

* Fix some CMake documentation typos (FreeRTOS#616)

The quick start instructions for CMake mention the "master"
git branch which has been replaced by "main" in the current
repo.

The main CMakeLists.txt documents how to integrate a
custom port. Fix a typo in the suggested CMake code.

* Added support of 64bit events. (FreeRTOS#597)

* Added support of 64bit even

Signed-off-by: Cervenka Dusan <[email protected]>

* Added missing brackets

Signed-off-by: Cervenka Dusan <[email protected]>

* Made proper name for tick macro.

Signed-off-by: Cervenka Dusan <[email protected]>

* Improved macro evaluation

Signed-off-by: Cervenka Dusan <[email protected]>

* Fixed missed port files  + documentation

Signed-off-by: Cervenka Dusan <[email protected]>

* Changes made on PR

Signed-off-by: Cervenka Dusan <[email protected]>

* Fix macro definition.

Signed-off-by: Cervenka Dusan <[email protected]>

* Formatted code with uncrustify

Signed-off-by: Cervenka Dusan <[email protected]>

---------

Signed-off-by: Cervenka Dusan <[email protected]>

* Introduce portMEMORY_BARRIER for Microblaze port. (FreeRTOS#621)

The introduction of `portMEMORY_BARRIER` will ensure
the places in the kernel use a barrier will work.
For example, `xTaskResumeAll` has a memory barrier
to ensure its correctness when compiled with optimization
enabled. Without the barrier `xTaskResumeAll` can fail
(e.g. start reading and writing to address 0 and/or
infinite looping) when `xPendingReadyList` contains more
than one task to restore.

In `xTaskResumeAll` the compiler chooses to cache the
`pxTCB` the first time through the loop for use
in every subsequent loop. This is incorrect as the
removal of `pxTCB->xEventListItem` will actually
change the value of `pxTCB` if it was read again
at the top of the loop. The barrier forces the compiler
to read `pxTCB` again at the top of the loop.

The compiler is operating correctly. The removal
`pxTCB->xEventListItem` executes on a `List_t *`
and `ListItem_t *`.  This means that the compiler
can assume that any `MiniListItem_t` values are
unchanged by the loop (i.e. "strict-aliasing").
This allows the compiler to cache `pxTCB` as it
is obtained via a `MiniListItem_t`. This is incorrect
in this case because it is possible for a `ListItem_t *`
to actually alias a `MiniListItem_t`. This is technically
a "violation of aliasing rules" so we use the the barrier
to disable the strict-aliasing optimization in this loop.

* Do not call exit() on MSVC Port when calling vPortEndScheduler (FreeRTOS#624)

* make port exitable

* correctly set xPortRunning to False

* add suggestions from Review

Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* add suggestions from Review

Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

---------

Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* Update PR template to include checkbox for Unit Test related changes (FreeRTOS#627)

* Fix build failure introduced in PR FreeRTOS#597 (FreeRTOS#629)

The PR FreeRTOS#597 introduced a new config option configTICK_TYPE_WIDTH_IN_BITS
which can be defined to one of the following:
* TICK_TYPE_WIDTH_16_BITS - Tick type is 16 bit wide.
* TICK_TYPE_WIDTH_32_BITS - Tick type is 32 bit wide.
* TICK_TYPE_WIDTH_64_BITS - Tick type is 64 bit wide.

Earlier we supported 16 and 32 bit width for tick type which was
controlled using the config option configUSE_16_BIT_TICKS. The PR
tried to maintain backward compatibility by honoring
configUSE_16_BIT_TICKS. The backward compatibility did not work as
expected though, as the macro configTICK_TYPE_WIDTH_IN_BITS was used
before it was defined. This PR addresses it by ensuring that the macro
configTICK_TYPE_WIDTH_IN_BITS is defined before it is used.

Testing
1. configUSE_16_BIT_TICKS is defined to 0.

Source (function xTaskIncrementTick in tasks.c):
```
const TickType_t xConstTickCount = xTickCount + ( TickType_t ) 1;
```

Assembly:
```
109e:       4b50            ldr     r3, [pc, FreeRTOS#320]  ; (11e0 <xTaskIncrementTick+0x150>)
10a0:       f8d3 4134       ldr.w   r4, [r3, FreeRTOS#308]  ; 0x134
10a4:       3401            adds    r4, #1
10a6:       f8c3 4134       str.w   r4, [r3, FreeRTOS#308]  ; 0x134
```

It is clear from assembly that the tick type is 32 bit.

2. configUSE_16_BIT_TICKS is defined to 1.

Source (function xTaskIncrementTick in tasks.c):
```
const TickType_t xConstTickCount = xTickCount + ( TickType_t ) 1;
```

Assembly:
```
10e2:       4b53            ldr     r3, [pc, FreeRTOS#332]  ; (1230 <xTaskIncrementTick+0x15c>)
10e4:       f8b3 4134       ldrh.w  r4, [r3, FreeRTOS#308]  ; 0x134
10e8:       b2a4            uxth    r4, r4
10ea:       3401            adds    r4, #1
10ec:       b2a4            uxth    r4, r4
10ee:       f8a3 4134       strh.w  r4, [r3, FreeRTOS#308]  ; 0x134
```

It is clear from assembly that the tick type is 16 bit.

3. configTICK_TYPE_WIDTH_IN_BITS is defined to TICK_TYPE_WIDTH_16_BITS.

Source (function xTaskIncrementTick in tasks.c):
```
const TickType_t xConstTickCount = xTickCount + ( TickType_t ) 1;
```

Assembly:
```
10e2:       4b53            ldr     r3, [pc, FreeRTOS#332]  ; (1230 <xTaskIncrementTick+0x15c>)
10e4:       f8b3 4134       ldrh.w  r4, [r3, FreeRTOS#308]  ; 0x134
10e8:       b2a4            uxth    r4, r4
10ea:       3401            adds    r4, #1
10ec:       b2a4            uxth    r4, r4
10ee:       f8a3 4134       strh.w  r4, [r3, FreeRTOS#308]  ; 0x134
```

It is clear from assembly that the tick type is 16 bit.

4. configTICK_TYPE_WIDTH_IN_BITS is defined to TICK_TYPE_WIDTH_32_BITS.

Source (function xTaskIncrementTick in tasks.c):
```
const TickType_t xConstTickCount = xTickCount + ( TickType_t ) 1;
```

Assembly:
```
109e:       4b50            ldr     r3, [pc, FreeRTOS#320]  ; (11e0 <xTaskIncrementTick+0x150>)
10a0:       f8d3 4134       ldr.w   r4, [r3, FreeRTOS#308]  ; 0x134
10a4:       3401            adds    r4, #1
10a6:       f8c3 4134       str.w   r4, [r3, FreeRTOS#308]  ; 0x134
```

It is clear from assembly that the tick type is 32 bit.

5. configTICK_TYPE_WIDTH_IN_BITS is defined to TICK_TYPE_WIDTH_64_BITS.

```
 #error configTICK_TYPE_WIDTH_IN_BITS set to unsupported tick type width.
```

The testing was done for GCC/ARM_CM3 port which does not support 64 bit
tick type.

6. Neither configUSE_16_BIT_TICKS nor configTICK_TYPE_WIDTH_IN_BITS
defined.

```
 #error Missing definition:  One of configUSE_16_BIT_TICKS and
 configTICK_TYPE_WIDTH_IN_BITS must be defined in FreeRTOSConfig.h.
 See the Configuration section of the FreeRTOS API documentation for
 details.
```

7. Both configUSE_16_BIT_TICKS and configTICK_TYPE_WIDTH_IN_BITS defined.

```
 #error Only one of configUSE_16_BIT_TICKS and
 configTICK_TYPE_WIDTH_IN_BITS must be defined in FreeRTOSConfig.h.
 See the Configuration section of the FreeRTOS API documentation for
 details.
```

Related issue - FreeRTOS#628

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Feature/fixing clang gnu compiler warnings (FreeRTOS#620)

* Adding in ability to support a library for freertos_config and a custom freertos_kernel_port (FreeRTOS#558)

* Using single name definition for libraries everywhere. (FreeRTOS#558)

* Supporting backwards compatibility with FREERTOS_CONFIG_FILE_DIRECTORY (FreeRTOS#571)

* Removing compiler warnings for GNU and Clang. (FreeRTOS#571)

* Added in documentation on how to consume from a main project. Added default PORT selection for native POSIX and MINGW platforms.

* Only adding freertos_config if it exists. Removing auto generation of it from a FREERTOS_CONFIG_FILE_DIRECTORY.

* Fixing clang and gnu compiler warnings.

* Adding in project information and how to compile for GNU/clang

* Fixing compiler issue with unused variable - no need to declare variable.

* Adding in compile warnings for linux builds that kernel is okay with using.

* Fixing more extra-semi-stmt clang warnings.

* Moving definition of hooks into header files if features are enabled.

* Fixing formatting with uncrustify.

* Fixing merge conflicts with main merge.

* Fixing compiler errors due to merge issues and formatting.

* Fixing Line feeds.

* Adding 'portNORETURN' into portmacros.h. Other Updates based on PR request

* Further clean-up of clang and clang-tidy issues.

* Removing compiler specific pragmas from common c files.

* Fixing missing lexicon entry and uncrustify formatting changes.

* Resolving merge issue multiple defnitions of proto for prvIdleTask

* Fixing formatting issues that are not covered by uncrustify. Use clang-tidy instead if you want this level of control.

* More uncrustify formatting issues.

* Fixing extra bracket in #if statement.

---------

Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* POSIX port fixes (FreeRTOS#626)

* Fix types in POSIX port

Use TaskFunction_t and StackType_t as other ports do.

* Fix portTICK_RATE_MICROSECONDS in POSIX port

---------

Co-authored-by: Jacques GUILLOU <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* Cortex-M35P: Add Cortex-M35P port (FreeRTOS#631)

* Cortex-M35P: Add Cortex-M35P port

The Cortex-M35P support added to kernel. The port hasn't been
validated yet with TF-M. Hence TF-M support is not included in this
port.

Signed-off-by: Devaraj Ranganna <[email protected]>

* Add portNORETURN to the newly added portmacro.h

Signed-off-by: Gaurav Aggarwal <[email protected]>

---------

Signed-off-by: Devaraj Ranganna <[email protected]>
Signed-off-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>
Co-authored-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: kar-rahul-aws <[email protected]>

* Introduced Github Status Badge for Unit Tests (FreeRTOS#634)

* Introduced Github Status Badge for Unit Tests

* Github status badge to point to latest run

* Github status badge UT points to latest results

* Fixed URL for Github Status badge

---------

Co-authored-by: kar-rahul-aws <[email protected]>

* Remove C99 requirement from CMake file (FreeRTOS#633)

* Remove C99 requirement from CMake file

The kernel source is C89 compliant and does not need C99.

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Explicitly set C89 requirement for kernel

Signed-off-by: Gaurav Aggarwal <[email protected]>

---------

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Add Thread Local Storage (TLS) support using Picolibc functions (FreeRTOS#343)

* Pass top of stack to configINIT_TLS_BLOCK

Picolibc wants to allocate the per-task TLS block within the stack
segment, so it will need to modify the top of stack value. Pass the
pxTopOfStack variable to make this explicit.

Signed-off-by: Keith Packard <[email protected]>

* Move newlib-specific definitions to separate file

This reduces the clutter in FreeRTOS.h caused by having newlib-specific
macros present there.

Signed-off-by: Keith Packard <[email protected]>

* Make TLS code depend only on configUSE_C_RUNTIME_TLS_SUPPORT

Remove reference to configUSE_NEWLIB_REENTRANT as that only works
when using newlib. configUSE_C_RUNTIME_TLS_SUPPORT is always
set when configUSE_NEWLIB_REENTRANT is set, so using both was
redundant in that case.

Signed-off-by: Keith Packard <[email protected]>

* portable-ARC: Adapt ARC support to use generalized TLS support

With generalized thread local storage (TLS) support present in the
core, the two ARC ports need to have the changes to the TCB mirrored
to them.

Signed-off-by: Keith Packard <[email protected]>

* Add Thread Local Storage (TLS) support using Picolibc functions

This patch provides definitions of the general TLS support macros in
terms of the Picolibc TLS support functions.

Picolibc is normally configured to use TLS internally for all
variables that are intended to be task-local, so these changes are
necessary for picolibc to work correctly with FreeRTOS.

The picolibc helper functions rely on elements within the linker
script to arrange the TLS data in memory and define some symbols.
Applications wanting to use this mechanism will need changes in their
linker script when migrating to picolibc.

Signed-off-by: Keith Packard <[email protected]>

---------

Signed-off-by: Keith Packard <[email protected]>
Co-authored-by: Keith Packard <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* Interrupt priority assert improvements for CM3/4/7 (FreeRTOS#602)

* Interrupt priority assert improvements for CM3/4/7

In the ARM_CM3, ARM_CM4, and ARM_CM7 ports, change the assertion that
`configMAX_SYSCALL_INTERRUPT_PRIORITY` is nonzero to account for the
number of priority bits implemented by the hardware.

Change these ports to also use the lowest priority for PendSV and
SysTick, ignoring `configKERNEL_INTERRUPT_PRIORITY`.

* Remove not needed configKERNEL_INTERRUPT_PRIORITY define

Signed-off-by: Gaurav Aggarwal <[email protected]>

---------

Signed-off-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>
Co-authored-by: Gaurav Aggarwal <[email protected]>

* Introduced code coverage status badge (FreeRTOS#635)

* Introduced code coverage status badge

* Trying to fix the URL checker issue

* Fix URL check

Signed-off-by: Gaurav Aggarwal <[email protected]>

---------

Signed-off-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* added portPOINTER_SIZE_TYPE and SIZE_MAX definition to PIC24/dsPIC port (FreeRTOS#636)

* added portPOINTER_SIZE_TYPE definition to PIC24/dsPIC port

* Added SIZE_MAX definition to PIC24/dsPIC33

* Fix TLS and stack alignment when using picolibc (FreeRTOS#637)

Both the TLS block and stack must be correctly aligned when using
picolibc. The architecture stack alignment is represented by the
portBYTE_ALIGNMENT_MASK and the TLS block alignment is provided by the
Picolibc _tls_align() inline function for Picolibc version 1.8 and
above. For older versions of Picolibc, we'll assume that the TLS block
requires the same alignment as the stack.

For downward growing stacks, this requires aligning the start of the
TLS block to the maximum of the stack alignment and the TLS
alignment. With this, both the TLS block and stack will now be
correctly aligned.

For upward growing stacks, the two areas must be aligned
independently; the TLS block is aligned from the start of the stack,
then the tls space is allocated, and then the stack is aligned above
that.

It's probably useful to know here that the linker ensures that
variables within the TLS block are assigned offsets that match their
alignment requirements. If the TLS block itself is correctly aligned,
then everything within will also be.

I have only tested the downward growing stack branch of this patch.

Signed-off-by: Keith Packard <[email protected]>
Co-authored-by: Keith Packard <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* Enable building the GCC Cortex-R5 port without an FPU (FreeRTOS#586)

* Ensure configUSE_TASK_FPU_SUPPORT option is set correctly

If one does enable the FPU of the Cortex-R5 processor, then the GCC
compiler will define the macro __ARM_FP. This can be used to ensure,
that the configUSE_TASK_FPU_SUPPORT is set accordingly.

* Enable the implementation of vPortTaskUsesFPU only if configUSE_TASK_FPU_SUPPORT is set to 1

* Remove error case in pxPortInitialiseStack

The case of configUSE_TASK_FPU_SUPPORT is 0 is now handled

* Enable access to FPU registers only if FPU is enabled

* Make minor formating changes

* Format ARM Cortex-R5 port

* Address review comments from @ChristosZosi

* Minor code review suggestions

Signed-off-by: Gaurav Aggarwal <[email protected]>

---------

Signed-off-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: Christos Zosimidis <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>
Co-authored-by: Gaurav Aggarwal <[email protected]>

* Fix freertos_kernel cmake property, Posix Port (FreeRTOS#640)

* Fix freertos_kernel cmake property, Posix Port

* Moves the `set_property()` call below the target definition in top level CMakeLists file
* Corrects billion value from `ULL` suffix (not C90 compliant) to `UL` suffix with cast to uint64_t

* Add blank line to CMakeLists.txt

* Add missing FreeRTOS+ defines

* Run kernel demos and unit tests for PR changes (FreeRTOS#645)

* Run kernel demos and unit tests for PR changes

Kernel demos check builds multiple demos from FreeRTOS/FreeRTOS and
unit tests check runs unit tests in FreeRTOS/FreeRTOS. Both of these
checks currently use main branch of FreeRTOS-Kernel. This commits
updates these checks to use the changes in the PR.

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Do not specify PR SHA explicitly as that is default

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Remove explicit PR SHA from kernel checks

Signed-off-by: Gaurav Aggarwal <[email protected]>

---------

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Add functions to get the buffers of statically created objects (FreeRTOS#641)

Added various ...GetStaticBuffer() functions to get the buffers of statically
created objects.
---------
Co-authored-by: Paul Bartell <[email protected]>
Co-authored-by: Nikhil Kamath <[email protected]>
Co-authored-by: Gaurav Aggarwal <[email protected]>

* Cortex-M Assert when NVIC implements 8 PRIO bits (FreeRTOS#639)

* Cortex-M Assert when NVIC implements 8 PRIO bits

* Fix CM3 ports

* Fix ARM_CM3_MPU

* Fix ARM CM3

* Fix ARM_CM4_MPU

* Fix ARM_CM4

* Fix GCC ARM_CM7

* Fix IAR ARM ports

* Uncrustify changes

* Fix MikroC_ARM_CM4F port

* Fix MikroC_ARM_CM4F port-(2)

* Fix RVDS ARM ports

* Revert changes for Tasking/ARM_CM4F port

* Revert changes for Tasking/ARM_CM4F port-(2)

* Update port.c

Fix GCC/ARM_CM4F port

* Update port.c

* update GCC\ARM_CM4F port

* update port.c

* Assert to check configMAX_SYSCALL_INTERRUPT_PRIORITY is set to higher priority

* Fix merge error: remove duplicate code

* Fix typos

---------

Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>
Co-authored-by: Ubuntu <[email protected]>

* Remove C90 requirement from CMakeLists (FreeRTOS#649)

This is needed as it is breaking projects - https://forums.freertos.org/t/freertos-gcc-cmake/16984

We will re-evaluate and accordingly add this later.

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Only add alignment padding when needed (FreeRTOS#650)

Heap 4 and Heap 5 add some padding to ensure that the allocated blocks
are always aligned to portBYTE_ALIGNMENT bytes. The code until now was
adding padding always even if the resulting block was already aligned.
This commits updates the code to only add padding if the resulting block
is not aligned.

Signed-off-by: Gaurav Aggarwal <[email protected]>

* add a missing comma (FreeRTOS#651)

* fix conversion warning (FreeRTOS#658)

FreeRTOS-Kernel/portable/GCC/ARM_CM4F/port.c:399:41: error: conversion from 'uint32_t' {aka 'long unsigned int'} to 'uint8_t' {aka 'unsigned char'} may change value [-Werror=conversion]

Signed-off-by: Vo Trung Chi <[email protected]>

* ARMv7M: Adjust implemented priority bit assertions (FreeRTOS#665)

Adjust assertions related to the CMSIS __NVIC_PRIO_BITS and FreeRTOS
configPRIO_BITS configuration macros such that these macros specify the
minimum number of implemented priority bits supported by a config
build rather than the exact number of implemented priority bits.

Related to Qemu issue FreeRTOS#1122

* Format portmacro.h in arm CM0 ports

* portable/ARM_CM0: Add xPortIsInsideInterrupt

Add missing xPortIsInsideInterrupt function to Cortex-M0 port.

* tree-wide: Unify formatting of __cplusplus ifdefs

* Paranthesize expression-like macro (FreeRTOS#668)

* Updated tasks.c checks for scheduler suspension (FreeRTOS#670)

This commit updates the checks for the variable uxSchedulerSuspended in
tasks.c module to use a uniform format.

Signed-off-by: Sudeep Mohanty <[email protected]>

* Fix cast alignment warning (FreeRTOS#669)

* Fix cast alignment warning

Without this change, the code produces the following warning when
compiled with `-Wcast-align` flag:

```
cast increases required alignment of target type
```

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Align StackSize and StackAddress for macOS (FreeRTOS#674)

* Armv8-M (except Cortex-M23) interrupt priority checking (FreeRTOS#673)

* Armv8-M: Formatting changes

Signed-off-by: Devaraj Ranganna <[email protected]>

* Armv8-M: Add support for interrupt priority check

FreeRTOS provides `FromISR` system calls which can be called directly
from interrupt service routines. It is crucial that the priority of
these ISRs is set to same or lower value (numerically higher) than that
of `configMAX_SYSCALL_INTERRUPT_PRIORITY`. For more information refer
to https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html.

Add a check to trigger an assert when an ISR with priority higher
(numerically lower) than `configMAX_SYSCALL_INTERRUPT_PRIORITY` calls
`FromISR` system calls if `configASSERT` macro is defined.

In addition, add a config option
`configQEMU_DISABLE_INTERRUPT_PRIO_BITS_CHECK` to disable interrupt
priority check while running on QEMU. Based on the discussion
https://gitlab.com/qemu-project/qemu/-/issues/1122, The interrupt
priority bits in QEMU do not match the real hardware. Therefore the
assert that checks the number of implemented bits and __NVIC_PRIO_BITS
will always fail. The config option
 `configQEMU_DISABLE_INTERRUPT_PRIO_BITS_CHECK` should be defined in the
`FreeRTOSConfig.h` for QEMU targets.

Signed-off-by: Devaraj Ranganna <[email protected]>

* Use SHPR2 for calculating interrupt priority bits

This removes the dependency on the secure software to mark the interrupt
as non-secure.

Signed-off-by: Gaurav Aggarwal <[email protected]>

---------

Signed-off-by: Devaraj Ranganna <[email protected]>
Signed-off-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* Use the extended movx instruction instead of mov (FreeRTOS#676)

The following is from the MSP430X instruction set -

```
MOVX.W Move source word to destination word.

The source operand is copied to the destination. The source operand is
not affected. Both operands may be located in the full address space.
```

The movx instruction allows both the operands to be located in the full
address space and therefore, works with large data model as well.

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Fix eTaskGetState for pending ready tasks (FreeRTOS#679)

This commit fixes eTaskGetState so that eReady is returned for pending ready
tasks.

Co-authored-by: Darian Leung <[email protected]>

* Generates SBOM after source files are updated with release tag (FreeRTOS#680)

* update source file with release version info before SBOM generation

* delete tag branch during cleanup

* Add back croutines by reverting PR#590 (FreeRTOS#685)

* Add croutines to the code base

* Add croutine changes to cmake, lexicon and readme

* Add croutine file to portable cmake file

* Add back more references from PR 591

* Remove __NVIC_PRIO_BITS and configPRIO_BITS check in port (FreeRTOS#683)

* Remove __NVIC_PRIO_BITS and configPRIO_BITS check in CM3, CM4 and ARMv8.
* Add hardware not implemented bits check. These bits should be zero.

---------

Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* Use UBaseType_t as interrupt mask (FreeRTOS#689)

* Use UBaseType_t as interrupt mask
* Update GCC posix port to use UBaseType_t as interrupt mask

* Fix clang warning in croutine and stream buffer (FreeRTOS#686)

* Fix document warning in croutine
* Fix cast-qual warning in stream buffer

* Use portTASK_FUNCTION_PROTO to replace portNORETURN (FreeRTOS#688)

* Use portTASK_FUNCTION_PROTO to replace portNORETURN

* Fix typo in check comment of configMAX_SYSCALL_INTERRUPT_PRIORITY (FreeRTOS#690)

* Add constant type for portMAX_DELAY in port (FreeRTOS#691)

Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* Update static stream buffer size check (FreeRTOS#693)

* Use volatile size instead of sizeof directly to prevent always
  true/false warning

* Fix typos in comments for the AT91SAM7S port (FreeRTOS#695)

Co-authored-by: RichardBarry <[email protected]>

* Fix FreeRTOS#697: Missing portPOINTER_SIZE_TYPE definition for ATmega port (FreeRTOS#698)

* Remove empty expression statement compiler warning (FreeRTOS#692)

* Add do while( 0 ) loop for empty expression statement compiler warning

* Update uxTaskGetSystemState for tasks in pending ready list (FreeRTOS#702)

* Update uxTaskGetSystemState to sync with eTaskGetState
* Update in vTaskGetInfo for tasks in pending ready list should be in
  ready state.

* Fix circular dependency in CMake project (FreeRTOS#700)

* Fix circular dependency in cmake project

Fix for FreeRTOS#687
In order for custom ports to also break the cycle, they must link
against freertos_kernel_include instead of freertos_kernel.

* Simplify include path

* Memory Protection Unit (MPU) Enhancements (FreeRTOS#705)

Memory Protection Unit (MPU) Enhancements

This commit introduces a new MPU wrapper that places additional
restrictions on unprivileged tasks. The following is the list of changes
introduced with the new MPU wrapper:

1. Opaque and indirectly verifiable integers for kernel object handles:
   All the kernel object handles (for example, queue handles) are now
   opaque integers. Previously object handles were raw pointers.

2. Saving the task context in Task Control Block (TCB): When a task is
   swapped out by the scheduler, the task's context is now saved in its
   TCB. Previously the task's context was saved on its stack.

3. Execute system calls on a separate privileged only stack: FreeRTOS
   system calls, which execute with elevated privilege, now use a
   separate privileged only stack. Previously system calls used the
   calling task's stack. The application writer can control the size of
   the system call stack using new configSYSTEM_CALL_STACK_SIZE config
   macro.

4. Memory bounds checks: FreeRTOS system calls which accept a pointer
   and de-reference it, now verify that the calling task has required
   permissions to access the memory location referenced by the pointer.

5. System call restrictions: The following system calls are no longer
   available to unprivileged tasks:
    - vQueueDelete
    - xQueueCreateMutex
    - xQueueCreateMutexStatic
    - xQueueCreateCountingSemaphore
    - xQueueCreateCountingSemaphoreStatic
    - xQueueGenericCreate
    - xQueueGenericCreateStatic
    - xQueueCreateSet
    - xQueueRemoveFromSet
    - xQueueGenericReset
    - xTaskCreate
    - xTaskCreateStatic
    - vTaskDelete
    - vTaskPrioritySet
    - vTaskSuspendAll
    - xTaskResumeAll
    - xTaskGetHandle
    - xTaskCallApplicationTaskHook
    - vTaskList
    - vTaskGetRunTimeStats
    - xTaskCatchUpTicks
    - xEventGroupCreate
    - xEventGroupCreateStatic
    - vEventGroupDelete
    - xStreamBufferGenericCreate
    - xStreamBufferGenericCreateStatic
    - vStreamBufferDelete
    - xStreamBufferReset
   Also, an unprivileged task can no longer use vTaskSuspend to suspend
   any task other than itself.

We thank the following people for their inputs in these enhancements:
- David Reiss of Meta Platforms, Inc.
- Lan Luo, Xinhui Shao, Yumeng Wei, Zixia Liu, Huaiyu Yan and Zhen Ling
  of School of Computer Science and Engineering, Southeast University,
  China.
- Xinwen Fu of Department of Computer Science, University of
  Massachusetts Lowell, USA.
- Yuequi Chen, Zicheng Wang, Minghao Lin of University of Colorado
  Boulder, USA.

* Update History for Version 10.6.0 (FreeRTOS#706)

Signed-off-by: kar-rahul-aws <[email protected]>

* Fixed compile options polluting project (FreeRTOS#694)

* Fixed compile options polluting project

Moved add_library higher

* Apply suggestions from code review

Co-authored-by: Paul Bartell <[email protected]>

* fixed cmakelists keeping in mind the suggestions

---------

Co-authored-by: Paul Bartell <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>
Co-authored-by: Aniruddha Kanhere <[email protected]>

* Fix the comments in the CM3 and CM4 MPU Ports about the MPU Region numbers being loaded (FreeRTOS#707)

Co-authored-by: Soren Ptak <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* Update xSemaphoreGetStaticBuffer prototype in comment (FreeRTOS#704)

Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* Correct the misspelled name (FreeRTOS#708)

Signed-off-by: Gaurav Aggarwal <[email protected]>

---------

Signed-off-by: Gaurav Aggarwal <[email protected]>
Signed-off-by: Cervenka Dusan <[email protected]>
Signed-off-by: Devaraj Ranganna <[email protected]>
Signed-off-by: Keith Packard <[email protected]>
Signed-off-by: Vo Trung Chi <[email protected]>
Signed-off-by: Sudeep Mohanty <[email protected]>
Signed-off-by: kar-rahul-aws <[email protected]>
Co-authored-by: Archit Gupta <[email protected]>
Co-authored-by: tcpluess <[email protected]>
Co-authored-by: pluess <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>
Co-authored-by: Chris Copeland <[email protected]>
Co-authored-by: David J. Fiddes <[email protected]>
Co-authored-by: Dusan Cervenka <[email protected]>
Co-authored-by: bbain <[email protected]>
Co-authored-by: Ju1He1 <[email protected]>
Co-authored-by: Aniruddha Kanhere <[email protected]>
Co-authored-by: phelter <[email protected]>
Co-authored-by: jacky309 <[email protected]>
Co-authored-by: Jacques GUILLOU <[email protected]>
Co-authored-by: Devaraj Ranganna <[email protected]>
Co-authored-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: kar-rahul-aws <[email protected]>
Co-authored-by: Nikhil Kamath <[email protected]>
Co-authored-by: Keith Packard <[email protected]>
Co-authored-by: Keith Packard <[email protected]>
Co-authored-by: Joseph Julicher <[email protected]>
Co-authored-by: Paul Bartell <[email protected]>
Co-authored-by: Christos Zosimidis <[email protected]>
Co-authored-by: Kody Stribrny <[email protected]>
Co-authored-by: Holden <holden-zenithaerotech.com>
Co-authored-by: Darian <[email protected]>
Co-authored-by: Ubuntu <[email protected]>
Co-authored-by: Nicolas <[email protected]>
Co-authored-by: Vo Trung Chi <[email protected]>
Co-authored-by: Sudeep Mohanty <[email protected]>
Co-authored-by: Monika Singh <[email protected]>
Co-authored-by: Darian Leung <[email protected]>
Co-authored-by: Tony Josi <[email protected]>
Co-authored-by: Evgeny Ermakov <[email protected]>
Co-authored-by: RichardBarry <[email protected]>
Co-authored-by: Joris Putcuyps <[email protected]>
Co-authored-by: Patrick Cook <[email protected]>
Co-authored-by: Mr. Jake <[email protected]>
Co-authored-by: Paul Bartell <[email protected]>
Co-authored-by: Soren Ptak <[email protected]>
Co-authored-by: Soren Ptak <[email protected]>
chinglee-iot added a commit to chinglee-iot/FreeRTOS-Kernel that referenced this pull request Jul 21, 2023
* Fix array-bounds compiler warning on gcc11+ in list.h (FreeRTOS#580)

listGET_OWNER_OF_NEXT_ENTRY computes `( pxConstList )->pxIndex->pxNext` after
verifying that `( pxConstList )->pxIndex` points to `xListEnd`, which due to
being a MiniListItem_t, can be shorter than a ListItem_t. Thus,
`( pxConstList )->pxIndex` is a `ListItem_t *` that extends past the end of the
`List_t` whose `xListEnd` it points to. This is fixed by accessing `pxNext`
through a `MiniListItem_t` instead.

* move the prototype for vApplicationIdleHook to task.h. (FreeRTOS#600)

Co-authored-by: pluess <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* Update equal priority task preemption (FreeRTOS#603)

* vTaskResume and vTaskPrioritySet don't preempt equal priority task

* Update vTaskResumeAll not to preempt task with equal priority

* Fix in xTaskResumeFromISR

* Update FreeRTOS/FreeRTOS build checks (FreeRTOS#613)

This is needed to be compatible with the refactoring done in this
PR - FreeRTOS/FreeRTOS#889

Signed-off-by: Gaurav Aggarwal <[email protected]>

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Add ulTaskGetRunTimeCounter and ulTaskGetRunTimePercent (FreeRTOS#611)

Allow ulTaskGetIdleRunTimeCounter and ulTaskGetIdleRunTimePercent to be
used whenever configGENERATE_RUN_TIME_STATS is enabled, as this is the
only requirement for these functions to work.

* Fix some CMake documentation typos (FreeRTOS#616)

The quick start instructions for CMake mention the "master"
git branch which has been replaced by "main" in the current
repo.

The main CMakeLists.txt documents how to integrate a
custom port. Fix a typo in the suggested CMake code.

* Added support of 64bit events. (FreeRTOS#597)

* Added support of 64bit even

Signed-off-by: Cervenka Dusan <[email protected]>

* Added missing brackets

Signed-off-by: Cervenka Dusan <[email protected]>

* Made proper name for tick macro.

Signed-off-by: Cervenka Dusan <[email protected]>

* Improved macro evaluation

Signed-off-by: Cervenka Dusan <[email protected]>

* Fixed missed port files  + documentation

Signed-off-by: Cervenka Dusan <[email protected]>

* Changes made on PR

Signed-off-by: Cervenka Dusan <[email protected]>

* Fix macro definition.

Signed-off-by: Cervenka Dusan <[email protected]>

* Formatted code with uncrustify

Signed-off-by: Cervenka Dusan <[email protected]>

---------

Signed-off-by: Cervenka Dusan <[email protected]>

* Introduce portMEMORY_BARRIER for Microblaze port. (FreeRTOS#621)

The introduction of `portMEMORY_BARRIER` will ensure
the places in the kernel use a barrier will work.
For example, `xTaskResumeAll` has a memory barrier
to ensure its correctness when compiled with optimization
enabled. Without the barrier `xTaskResumeAll` can fail
(e.g. start reading and writing to address 0 and/or
infinite looping) when `xPendingReadyList` contains more
than one task to restore.

In `xTaskResumeAll` the compiler chooses to cache the
`pxTCB` the first time through the loop for use
in every subsequent loop. This is incorrect as the
removal of `pxTCB->xEventListItem` will actually
change the value of `pxTCB` if it was read again
at the top of the loop. The barrier forces the compiler
to read `pxTCB` again at the top of the loop.

The compiler is operating correctly. The removal
`pxTCB->xEventListItem` executes on a `List_t *`
and `ListItem_t *`.  This means that the compiler
can assume that any `MiniListItem_t` values are
unchanged by the loop (i.e. "strict-aliasing").
This allows the compiler to cache `pxTCB` as it
is obtained via a `MiniListItem_t`. This is incorrect
in this case because it is possible for a `ListItem_t *`
to actually alias a `MiniListItem_t`. This is technically
a "violation of aliasing rules" so we use the the barrier
to disable the strict-aliasing optimization in this loop.

* Do not call exit() on MSVC Port when calling vPortEndScheduler (FreeRTOS#624)

* make port exitable

* correctly set xPortRunning to False

* add suggestions from Review

Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* add suggestions from Review

Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

---------

Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* Update PR template to include checkbox for Unit Test related changes (FreeRTOS#627)

* Fix build failure introduced in PR FreeRTOS#597 (FreeRTOS#629)

The PR FreeRTOS#597 introduced a new config option configTICK_TYPE_WIDTH_IN_BITS
which can be defined to one of the following:
* TICK_TYPE_WIDTH_16_BITS - Tick type is 16 bit wide.
* TICK_TYPE_WIDTH_32_BITS - Tick type is 32 bit wide.
* TICK_TYPE_WIDTH_64_BITS - Tick type is 64 bit wide.

Earlier we supported 16 and 32 bit width for tick type which was
controlled using the config option configUSE_16_BIT_TICKS. The PR
tried to maintain backward compatibility by honoring
configUSE_16_BIT_TICKS. The backward compatibility did not work as
expected though, as the macro configTICK_TYPE_WIDTH_IN_BITS was used
before it was defined. This PR addresses it by ensuring that the macro
configTICK_TYPE_WIDTH_IN_BITS is defined before it is used.

Testing
1. configUSE_16_BIT_TICKS is defined to 0.

Source (function xTaskIncrementTick in tasks.c):
```
const TickType_t xConstTickCount = xTickCount + ( TickType_t ) 1;
```

Assembly:
```
109e:       4b50            ldr     r3, [pc, FreeRTOS#320]  ; (11e0 <xTaskIncrementTick+0x150>)
10a0:       f8d3 4134       ldr.w   r4, [r3, FreeRTOS#308]  ; 0x134
10a4:       3401            adds    r4, #1
10a6:       f8c3 4134       str.w   r4, [r3, FreeRTOS#308]  ; 0x134
```

It is clear from assembly that the tick type is 32 bit.

2. configUSE_16_BIT_TICKS is defined to 1.

Source (function xTaskIncrementTick in tasks.c):
```
const TickType_t xConstTickCount = xTickCount + ( TickType_t ) 1;
```

Assembly:
```
10e2:       4b53            ldr     r3, [pc, FreeRTOS#332]  ; (1230 <xTaskIncrementTick+0x15c>)
10e4:       f8b3 4134       ldrh.w  r4, [r3, FreeRTOS#308]  ; 0x134
10e8:       b2a4            uxth    r4, r4
10ea:       3401            adds    r4, #1
10ec:       b2a4            uxth    r4, r4
10ee:       f8a3 4134       strh.w  r4, [r3, FreeRTOS#308]  ; 0x134
```

It is clear from assembly that the tick type is 16 bit.

3. configTICK_TYPE_WIDTH_IN_BITS is defined to TICK_TYPE_WIDTH_16_BITS.

Source (function xTaskIncrementTick in tasks.c):
```
const TickType_t xConstTickCount = xTickCount + ( TickType_t ) 1;
```

Assembly:
```
10e2:       4b53            ldr     r3, [pc, FreeRTOS#332]  ; (1230 <xTaskIncrementTick+0x15c>)
10e4:       f8b3 4134       ldrh.w  r4, [r3, FreeRTOS#308]  ; 0x134
10e8:       b2a4            uxth    r4, r4
10ea:       3401            adds    r4, #1
10ec:       b2a4            uxth    r4, r4
10ee:       f8a3 4134       strh.w  r4, [r3, FreeRTOS#308]  ; 0x134
```

It is clear from assembly that the tick type is 16 bit.

4. configTICK_TYPE_WIDTH_IN_BITS is defined to TICK_TYPE_WIDTH_32_BITS.

Source (function xTaskIncrementTick in tasks.c):
```
const TickType_t xConstTickCount = xTickCount + ( TickType_t ) 1;
```

Assembly:
```
109e:       4b50            ldr     r3, [pc, FreeRTOS#320]  ; (11e0 <xTaskIncrementTick+0x150>)
10a0:       f8d3 4134       ldr.w   r4, [r3, FreeRTOS#308]  ; 0x134
10a4:       3401            adds    r4, #1
10a6:       f8c3 4134       str.w   r4, [r3, FreeRTOS#308]  ; 0x134
```

It is clear from assembly that the tick type is 32 bit.

5. configTICK_TYPE_WIDTH_IN_BITS is defined to TICK_TYPE_WIDTH_64_BITS.

```
 #error configTICK_TYPE_WIDTH_IN_BITS set to unsupported tick type width.
```

The testing was done for GCC/ARM_CM3 port which does not support 64 bit
tick type.

6. Neither configUSE_16_BIT_TICKS nor configTICK_TYPE_WIDTH_IN_BITS
defined.

```
 #error Missing definition:  One of configUSE_16_BIT_TICKS and
 configTICK_TYPE_WIDTH_IN_BITS must be defined in FreeRTOSConfig.h.
 See the Configuration section of the FreeRTOS API documentation for
 details.
```

7. Both configUSE_16_BIT_TICKS and configTICK_TYPE_WIDTH_IN_BITS defined.

```
 #error Only one of configUSE_16_BIT_TICKS and
 configTICK_TYPE_WIDTH_IN_BITS must be defined in FreeRTOSConfig.h.
 See the Configuration section of the FreeRTOS API documentation for
 details.
```

Related issue - FreeRTOS#628

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Feature/fixing clang gnu compiler warnings (FreeRTOS#620)

* Adding in ability to support a library for freertos_config and a custom freertos_kernel_port (FreeRTOS#558)

* Using single name definition for libraries everywhere. (FreeRTOS#558)

* Supporting backwards compatibility with FREERTOS_CONFIG_FILE_DIRECTORY (FreeRTOS#571)

* Removing compiler warnings for GNU and Clang. (FreeRTOS#571)

* Added in documentation on how to consume from a main project. Added default PORT selection for native POSIX and MINGW platforms.

* Only adding freertos_config if it exists. Removing auto generation of it from a FREERTOS_CONFIG_FILE_DIRECTORY.

* Fixing clang and gnu compiler warnings.

* Adding in project information and how to compile for GNU/clang

* Fixing compiler issue with unused variable - no need to declare variable.

* Adding in compile warnings for linux builds that kernel is okay with using.

* Fixing more extra-semi-stmt clang warnings.

* Moving definition of hooks into header files if features are enabled.

* Fixing formatting with uncrustify.

* Fixing merge conflicts with main merge.

* Fixing compiler errors due to merge issues and formatting.

* Fixing Line feeds.

* Adding 'portNORETURN' into portmacros.h. Other Updates based on PR request

* Further clean-up of clang and clang-tidy issues.

* Removing compiler specific pragmas from common c files.

* Fixing missing lexicon entry and uncrustify formatting changes.

* Resolving merge issue multiple defnitions of proto for prvIdleTask

* Fixing formatting issues that are not covered by uncrustify. Use clang-tidy instead if you want this level of control.

* More uncrustify formatting issues.

* Fixing extra bracket in #if statement.

---------

Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* POSIX port fixes (FreeRTOS#626)

* Fix types in POSIX port

Use TaskFunction_t and StackType_t as other ports do.

* Fix portTICK_RATE_MICROSECONDS in POSIX port

---------

Co-authored-by: Jacques GUILLOU <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* Cortex-M35P: Add Cortex-M35P port (FreeRTOS#631)

* Cortex-M35P: Add Cortex-M35P port

The Cortex-M35P support added to kernel. The port hasn't been
validated yet with TF-M. Hence TF-M support is not included in this
port.

Signed-off-by: Devaraj Ranganna <[email protected]>

* Add portNORETURN to the newly added portmacro.h

Signed-off-by: Gaurav Aggarwal <[email protected]>

---------

Signed-off-by: Devaraj Ranganna <[email protected]>
Signed-off-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>
Co-authored-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: kar-rahul-aws <[email protected]>

* Introduced Github Status Badge for Unit Tests (FreeRTOS#634)

* Introduced Github Status Badge for Unit Tests

* Github status badge to point to latest run

* Github status badge UT points to latest results

* Fixed URL for Github Status badge

---------

Co-authored-by: kar-rahul-aws <[email protected]>

* Remove C99 requirement from CMake file (FreeRTOS#633)

* Remove C99 requirement from CMake file

The kernel source is C89 compliant and does not need C99.

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Explicitly set C89 requirement for kernel

Signed-off-by: Gaurav Aggarwal <[email protected]>

---------

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Add Thread Local Storage (TLS) support using Picolibc functions (FreeRTOS#343)

* Pass top of stack to configINIT_TLS_BLOCK

Picolibc wants to allocate the per-task TLS block within the stack
segment, so it will need to modify the top of stack value. Pass the
pxTopOfStack variable to make this explicit.

Signed-off-by: Keith Packard <[email protected]>

* Move newlib-specific definitions to separate file

This reduces the clutter in FreeRTOS.h caused by having newlib-specific
macros present there.

Signed-off-by: Keith Packard <[email protected]>

* Make TLS code depend only on configUSE_C_RUNTIME_TLS_SUPPORT

Remove reference to configUSE_NEWLIB_REENTRANT as that only works
when using newlib. configUSE_C_RUNTIME_TLS_SUPPORT is always
set when configUSE_NEWLIB_REENTRANT is set, so using both was
redundant in that case.

Signed-off-by: Keith Packard <[email protected]>

* portable-ARC: Adapt ARC support to use generalized TLS support

With generalized thread local storage (TLS) support present in the
core, the two ARC ports need to have the changes to the TCB mirrored
to them.

Signed-off-by: Keith Packard <[email protected]>

* Add Thread Local Storage (TLS) support using Picolibc functions

This patch provides definitions of the general TLS support macros in
terms of the Picolibc TLS support functions.

Picolibc is normally configured to use TLS internally for all
variables that are intended to be task-local, so these changes are
necessary for picolibc to work correctly with FreeRTOS.

The picolibc helper functions rely on elements within the linker
script to arrange the TLS data in memory and define some symbols.
Applications wanting to use this mechanism will need changes in their
linker script when migrating to picolibc.

Signed-off-by: Keith Packard <[email protected]>

---------

Signed-off-by: Keith Packard <[email protected]>
Co-authored-by: Keith Packard <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* Interrupt priority assert improvements for CM3/4/7 (FreeRTOS#602)

* Interrupt priority assert improvements for CM3/4/7

In the ARM_CM3, ARM_CM4, and ARM_CM7 ports, change the assertion that
`configMAX_SYSCALL_INTERRUPT_PRIORITY` is nonzero to account for the
number of priority bits implemented by the hardware.

Change these ports to also use the lowest priority for PendSV and
SysTick, ignoring `configKERNEL_INTERRUPT_PRIORITY`.

* Remove not needed configKERNEL_INTERRUPT_PRIORITY define

Signed-off-by: Gaurav Aggarwal <[email protected]>

---------

Signed-off-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>
Co-authored-by: Gaurav Aggarwal <[email protected]>

* Introduced code coverage status badge (FreeRTOS#635)

* Introduced code coverage status badge

* Trying to fix the URL checker issue

* Fix URL check

Signed-off-by: Gaurav Aggarwal <[email protected]>

---------

Signed-off-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* added portPOINTER_SIZE_TYPE and SIZE_MAX definition to PIC24/dsPIC port (FreeRTOS#636)

* added portPOINTER_SIZE_TYPE definition to PIC24/dsPIC port

* Added SIZE_MAX definition to PIC24/dsPIC33

* Fix TLS and stack alignment when using picolibc (FreeRTOS#637)

Both the TLS block and stack must be correctly aligned when using
picolibc. The architecture stack alignment is represented by the
portBYTE_ALIGNMENT_MASK and the TLS block alignment is provided by the
Picolibc _tls_align() inline function for Picolibc version 1.8 and
above. For older versions of Picolibc, we'll assume that the TLS block
requires the same alignment as the stack.

For downward growing stacks, this requires aligning the start of the
TLS block to the maximum of the stack alignment and the TLS
alignment. With this, both the TLS block and stack will now be
correctly aligned.

For upward growing stacks, the two areas must be aligned
independently; the TLS block is aligned from the start of the stack,
then the tls space is allocated, and then the stack is aligned above
that.

It's probably useful to know here that the linker ensures that
variables within the TLS block are assigned offsets that match their
alignment requirements. If the TLS block itself is correctly aligned,
then everything within will also be.

I have only tested the downward growing stack branch of this patch.

Signed-off-by: Keith Packard <[email protected]>
Co-authored-by: Keith Packard <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* Enable building the GCC Cortex-R5 port without an FPU (FreeRTOS#586)

* Ensure configUSE_TASK_FPU_SUPPORT option is set correctly

If one does enable the FPU of the Cortex-R5 processor, then the GCC
compiler will define the macro __ARM_FP. This can be used to ensure,
that the configUSE_TASK_FPU_SUPPORT is set accordingly.

* Enable the implementation of vPortTaskUsesFPU only if configUSE_TASK_FPU_SUPPORT is set to 1

* Remove error case in pxPortInitialiseStack

The case of configUSE_TASK_FPU_SUPPORT is 0 is now handled

* Enable access to FPU registers only if FPU is enabled

* Make minor formating changes

* Format ARM Cortex-R5 port

* Address review comments from @ChristosZosi

* Minor code review suggestions

Signed-off-by: Gaurav Aggarwal <[email protected]>

---------

Signed-off-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: Christos Zosimidis <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>
Co-authored-by: Gaurav Aggarwal <[email protected]>

* Fix freertos_kernel cmake property, Posix Port (FreeRTOS#640)

* Fix freertos_kernel cmake property, Posix Port

* Moves the `set_property()` call below the target definition in top level CMakeLists file
* Corrects billion value from `ULL` suffix (not C90 compliant) to `UL` suffix with cast to uint64_t

* Add blank line to CMakeLists.txt

* Add missing FreeRTOS+ defines

* Run kernel demos and unit tests for PR changes (FreeRTOS#645)

* Run kernel demos and unit tests for PR changes

Kernel demos check builds multiple demos from FreeRTOS/FreeRTOS and
unit tests check runs unit tests in FreeRTOS/FreeRTOS. Both of these
checks currently use main branch of FreeRTOS-Kernel. This commits
updates these checks to use the changes in the PR.

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Do not specify PR SHA explicitly as that is default

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Remove explicit PR SHA from kernel checks

Signed-off-by: Gaurav Aggarwal <[email protected]>

---------

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Add functions to get the buffers of statically created objects (FreeRTOS#641)

Added various ...GetStaticBuffer() functions to get the buffers of statically
created objects.
---------
Co-authored-by: Paul Bartell <[email protected]>
Co-authored-by: Nikhil Kamath <[email protected]>
Co-authored-by: Gaurav Aggarwal <[email protected]>

* Cortex-M Assert when NVIC implements 8 PRIO bits (FreeRTOS#639)

* Cortex-M Assert when NVIC implements 8 PRIO bits

* Fix CM3 ports

* Fix ARM_CM3_MPU

* Fix ARM CM3

* Fix ARM_CM4_MPU

* Fix ARM_CM4

* Fix GCC ARM_CM7

* Fix IAR ARM ports

* Uncrustify changes

* Fix MikroC_ARM_CM4F port

* Fix MikroC_ARM_CM4F port-(2)

* Fix RVDS ARM ports

* Revert changes for Tasking/ARM_CM4F port

* Revert changes for Tasking/ARM_CM4F port-(2)

* Update port.c

Fix GCC/ARM_CM4F port

* Update port.c

* update GCC\ARM_CM4F port

* update port.c

* Assert to check configMAX_SYSCALL_INTERRUPT_PRIORITY is set to higher priority

* Fix merge error: remove duplicate code

* Fix typos

---------

Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>
Co-authored-by: Ubuntu <[email protected]>

* Remove C90 requirement from CMakeLists (FreeRTOS#649)

This is needed as it is breaking projects - https://forums.freertos.org/t/freertos-gcc-cmake/16984

We will re-evaluate and accordingly add this later.

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Only add alignment padding when needed (FreeRTOS#650)

Heap 4 and Heap 5 add some padding to ensure that the allocated blocks
are always aligned to portBYTE_ALIGNMENT bytes. The code until now was
adding padding always even if the resulting block was already aligned.
This commits updates the code to only add padding if the resulting block
is not aligned.

Signed-off-by: Gaurav Aggarwal <[email protected]>

* add a missing comma (FreeRTOS#651)

* fix conversion warning (FreeRTOS#658)

FreeRTOS-Kernel/portable/GCC/ARM_CM4F/port.c:399:41: error: conversion from 'uint32_t' {aka 'long unsigned int'} to 'uint8_t' {aka 'unsigned char'} may change value [-Werror=conversion]

Signed-off-by: Vo Trung Chi <[email protected]>

* ARMv7M: Adjust implemented priority bit assertions (FreeRTOS#665)

Adjust assertions related to the CMSIS __NVIC_PRIO_BITS and FreeRTOS
configPRIO_BITS configuration macros such that these macros specify the
minimum number of implemented priority bits supported by a config
build rather than the exact number of implemented priority bits.

Related to Qemu issue FreeRTOS#1122

* Format portmacro.h in arm CM0 ports

* portable/ARM_CM0: Add xPortIsInsideInterrupt

Add missing xPortIsInsideInterrupt function to Cortex-M0 port.

* tree-wide: Unify formatting of __cplusplus ifdefs

* Paranthesize expression-like macro (FreeRTOS#668)

* Updated tasks.c checks for scheduler suspension (FreeRTOS#670)

This commit updates the checks for the variable uxSchedulerSuspended in
tasks.c module to use a uniform format.

Signed-off-by: Sudeep Mohanty <[email protected]>

* Fix cast alignment warning (FreeRTOS#669)

* Fix cast alignment warning

Without this change, the code produces the following warning when
compiled with `-Wcast-align` flag:

```
cast increases required alignment of target type
```

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Align StackSize and StackAddress for macOS (FreeRTOS#674)

* Armv8-M (except Cortex-M23) interrupt priority checking (FreeRTOS#673)

* Armv8-M: Formatting changes

Signed-off-by: Devaraj Ranganna <[email protected]>

* Armv8-M: Add support for interrupt priority check

FreeRTOS provides `FromISR` system calls which can be called directly
from interrupt service routines. It is crucial that the priority of
these ISRs is set to same or lower value (numerically higher) than that
of `configMAX_SYSCALL_INTERRUPT_PRIORITY`. For more information refer
to https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html.

Add a check to trigger an assert when an ISR with priority higher
(numerically lower) than `configMAX_SYSCALL_INTERRUPT_PRIORITY` calls
`FromISR` system calls if `configASSERT` macro is defined.

In addition, add a config option
`configQEMU_DISABLE_INTERRUPT_PRIO_BITS_CHECK` to disable interrupt
priority check while running on QEMU. Based on the discussion
https://gitlab.com/qemu-project/qemu/-/issues/1122, The interrupt
priority bits in QEMU do not match the real hardware. Therefore the
assert that checks the number of implemented bits and __NVIC_PRIO_BITS
will always fail. The config option
 `configQEMU_DISABLE_INTERRUPT_PRIO_BITS_CHECK` should be defined in the
`FreeRTOSConfig.h` for QEMU targets.

Signed-off-by: Devaraj Ranganna <[email protected]>

* Use SHPR2 for calculating interrupt priority bits

This removes the dependency on the secure software to mark the interrupt
as non-secure.

Signed-off-by: Gaurav Aggarwal <[email protected]>

---------

Signed-off-by: Devaraj Ranganna <[email protected]>
Signed-off-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* Use the extended movx instruction instead of mov (FreeRTOS#676)

The following is from the MSP430X instruction set -

```
MOVX.W Move source word to destination word.

The source operand is copied to the destination. The source operand is
not affected. Both operands may be located in the full address space.
```

The movx instruction allows both the operands to be located in the full
address space and therefore, works with large data model as well.

Signed-off-by: Gaurav Aggarwal <[email protected]>

* Fix eTaskGetState for pending ready tasks (FreeRTOS#679)

This commit fixes eTaskGetState so that eReady is returned for pending ready
tasks.

Co-authored-by: Darian Leung <[email protected]>

* Generates SBOM after source files are updated with release tag (FreeRTOS#680)

* update source file with release version info before SBOM generation

* delete tag branch during cleanup

* Add back croutines by reverting PR#590 (FreeRTOS#685)

* Add croutines to the code base

* Add croutine changes to cmake, lexicon and readme

* Add croutine file to portable cmake file

* Add back more references from PR 591

* Remove __NVIC_PRIO_BITS and configPRIO_BITS check in port (FreeRTOS#683)

* Remove __NVIC_PRIO_BITS and configPRIO_BITS check in CM3, CM4 and ARMv8.
* Add hardware not implemented bits check. These bits should be zero.

---------

Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* Use UBaseType_t as interrupt mask (FreeRTOS#689)

* Use UBaseType_t as interrupt mask
* Update GCC posix port to use UBaseType_t as interrupt mask

* Fix clang warning in croutine and stream buffer (FreeRTOS#686)

* Fix document warning in croutine
* Fix cast-qual warning in stream buffer

* Use portTASK_FUNCTION_PROTO to replace portNORETURN (FreeRTOS#688)

* Use portTASK_FUNCTION_PROTO to replace portNORETURN

* Fix typo in check comment of configMAX_SYSCALL_INTERRUPT_PRIORITY (FreeRTOS#690)

* Add constant type for portMAX_DELAY in port (FreeRTOS#691)

Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* Update static stream buffer size check (FreeRTOS#693)

* Use volatile size instead of sizeof directly to prevent always
  true/false warning

* Fix typos in comments for the AT91SAM7S port (FreeRTOS#695)

Co-authored-by: RichardBarry <[email protected]>

* Fix FreeRTOS#697: Missing portPOINTER_SIZE_TYPE definition for ATmega port (FreeRTOS#698)

* Remove empty expression statement compiler warning (FreeRTOS#692)

* Add do while( 0 ) loop for empty expression statement compiler warning

* Update uxTaskGetSystemState for tasks in pending ready list (FreeRTOS#702)

* Update uxTaskGetSystemState to sync with eTaskGetState
* Update in vTaskGetInfo for tasks in pending ready list should be in
  ready state.

* Fix circular dependency in CMake project (FreeRTOS#700)

* Fix circular dependency in cmake project

Fix for FreeRTOS#687
In order for custom ports to also break the cycle, they must link
against freertos_kernel_include instead of freertos_kernel.

* Simplify include path

* Memory Protection Unit (MPU) Enhancements (FreeRTOS#705)

Memory Protection Unit (MPU) Enhancements

This commit introduces a new MPU wrapper that places additional
restrictions on unprivileged tasks. The following is the list of changes
introduced with the new MPU wrapper:

1. Opaque and indirectly verifiable integers for kernel object handles:
   All the kernel object handles (for example, queue handles) are now
   opaque integers. Previously object handles were raw pointers.

2. Saving the task context in Task Control Block (TCB): When a task is
   swapped out by the scheduler, the task's context is now saved in its
   TCB. Previously the task's context was saved on its stack.

3. Execute system calls on a separate privileged only stack: FreeRTOS
   system calls, which execute with elevated privilege, now use a
   separate privileged only stack. Previously system calls used the
   calling task's stack. The application writer can control the size of
   the system call stack using new configSYSTEM_CALL_STACK_SIZE config
   macro.

4. Memory bounds checks: FreeRTOS system calls which accept a pointer
   and de-reference it, now verify that the calling task has required
   permissions to access the memory location referenced by the pointer.

5. System call restrictions: The following system calls are no longer
   available to unprivileged tasks:
    - vQueueDelete
    - xQueueCreateMutex
    - xQueueCreateMutexStatic
    - xQueueCreateCountingSemaphore
    - xQueueCreateCountingSemaphoreStatic
    - xQueueGenericCreate
    - xQueueGenericCreateStatic
    - xQueueCreateSet
    - xQueueRemoveFromSet
    - xQueueGenericReset
    - xTaskCreate
    - xTaskCreateStatic
    - vTaskDelete
    - vTaskPrioritySet
    - vTaskSuspendAll
    - xTaskResumeAll
    - xTaskGetHandle
    - xTaskCallApplicationTaskHook
    - vTaskList
    - vTaskGetRunTimeStats
    - xTaskCatchUpTicks
    - xEventGroupCreate
    - xEventGroupCreateStatic
    - vEventGroupDelete
    - xStreamBufferGenericCreate
    - xStreamBufferGenericCreateStatic
    - vStreamBufferDelete
    - xStreamBufferReset
   Also, an unprivileged task can no longer use vTaskSuspend to suspend
   any task other than itself.

We thank the following people for their inputs in these enhancements:
- David Reiss of Meta Platforms, Inc.
- Lan Luo, Xinhui Shao, Yumeng Wei, Zixia Liu, Huaiyu Yan and Zhen Ling
  of School of Computer Science and Engineering, Southeast University,
  China.
- Xinwen Fu of Department of Computer Science, University of
  Massachusetts Lowell, USA.
- Yuequi Chen, Zicheng Wang, Minghao Lin of University of Colorado
  Boulder, USA.

* Update History for Version 10.6.0 (FreeRTOS#706)

Signed-off-by: kar-rahul-aws <[email protected]>

* Fixed compile options polluting project (FreeRTOS#694)

* Fixed compile options polluting project

Moved add_library higher

* Apply suggestions from code review

Co-authored-by: Paul Bartell <[email protected]>

* fixed cmakelists keeping in mind the suggestions

---------

Co-authored-by: Paul Bartell <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>
Co-authored-by: Aniruddha Kanhere <[email protected]>

* Fix the comments in the CM3 and CM4 MPU Ports about the MPU Region numbers being loaded (FreeRTOS#707)

Co-authored-by: Soren Ptak <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* Update xSemaphoreGetStaticBuffer prototype in comment (FreeRTOS#704)

Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>

* Correct the misspelled name (FreeRTOS#708)

Signed-off-by: Gaurav Aggarwal <[email protected]>

---------

Signed-off-by: Gaurav Aggarwal <[email protected]>
Signed-off-by: Cervenka Dusan <[email protected]>
Signed-off-by: Devaraj Ranganna <[email protected]>
Signed-off-by: Keith Packard <[email protected]>
Signed-off-by: Vo Trung Chi <[email protected]>
Signed-off-by: Sudeep Mohanty <[email protected]>
Signed-off-by: kar-rahul-aws <[email protected]>
Co-authored-by: Archit Gupta <[email protected]>
Co-authored-by: tcpluess <[email protected]>
Co-authored-by: pluess <[email protected]>
Co-authored-by: Gaurav-Aggarwal-AWS <[email protected]>
Co-authored-by: Chris Copeland <[email protected]>
Co-authored-by: David J. Fiddes <[email protected]>
Co-authored-by: Dusan Cervenka <[email protected]>
Co-authored-by: bbain <[email protected]>
Co-authored-by: Ju1He1 <[email protected]>
Co-authored-by: Aniruddha Kanhere <[email protected]>
Co-authored-by: phelter <[email protected]>
Co-authored-by: jacky309 <[email protected]>
Co-authored-by: Jacques GUILLOU <[email protected]>
Co-authored-by: Devaraj Ranganna <[email protected]>
Co-authored-by: Gaurav Aggarwal <[email protected]>
Co-authored-by: kar-rahul-aws <[email protected]>
Co-authored-by: Nikhil Kamath <[email protected]>
Co-authored-by: Keith Packard <[email protected]>
Co-authored-by: Keith Packard <[email protected]>
Co-authored-by: Joseph Julicher <[email protected]>
Co-authored-by: Paul Bartell <[email protected]>
Co-authored-by: Christos Zosimidis <[email protected]>
Co-authored-by: Kody Stribrny <[email protected]>
Co-authored-by: Holden <holden-zenithaerotech.com>
Co-authored-by: Darian <[email protected]>
Co-authored-by: Ubuntu <[email protected]>
Co-authored-by: Nicolas <[email protected]>
Co-authored-by: Vo Trung Chi <[email protected]>
Co-authored-by: Sudeep Mohanty <[email protected]>
Co-authored-by: Monika Singh <[email protected]>
Co-authored-by: Darian Leung <[email protected]>
Co-authored-by: Tony Josi <[email protected]>
Co-authored-by: Evgeny Ermakov <[email protected]>
Co-authored-by: RichardBarry <[email protected]>
Co-authored-by: Joris Putcuyps <[email protected]>
Co-authored-by: Patrick Cook <[email protected]>
Co-authored-by: Mr. Jake <[email protected]>
Co-authored-by: Paul Bartell <[email protected]>
Co-authored-by: Soren Ptak <[email protected]>
Co-authored-by: Soren Ptak <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants