Compare commits
167 Commits
v6.1.1_rel
...
v6.4.2_rel
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
06dabb0ad0 | ||
|
|
f0a44ad391 | ||
|
|
898d0ebfde | ||
|
|
880598c608 | ||
|
|
41bdb2c6ba | ||
|
|
376e26be29 | ||
|
|
e4d517efba | ||
|
|
98c9172d01 | ||
|
|
72ab369eb7 | ||
|
|
e657568041 | ||
|
|
6bef7c08f6 | ||
|
|
c805ac7ec0 | ||
|
|
af3c1e7245 | ||
|
|
bb4540f65a | ||
|
|
d24da0e2ea | ||
|
|
7add20186e | ||
|
|
485a02faec | ||
|
|
db5e0de743 | ||
|
|
d9957d803c | ||
|
|
0093df510b | ||
|
|
bbce1f326c | ||
|
|
7a29b8b463 | ||
|
|
9b3b2d1279 | ||
|
|
9cb204c138 | ||
|
|
d864013232 | ||
|
|
07eac30740 | ||
|
|
daea08d5a9 | ||
|
|
de311f995c | ||
|
|
3d62cbb2c0 | ||
|
|
27f0ce9ca2 | ||
|
|
9f527a31e5 | ||
|
|
039a346397 | ||
|
|
f8d677c04d | ||
|
|
c8d37f8e5f | ||
|
|
dca6d205aa | ||
|
|
4e358f45dc | ||
|
|
5a29fcad25 | ||
|
|
8313cd6557 | ||
|
|
0b6f59d693 | ||
|
|
38532b4ea9 | ||
|
|
91867c5dd5 | ||
|
|
faa8e6127d | ||
|
|
a98cc2be66 | ||
|
|
740515e95e | ||
|
|
1d7fe67017 | ||
|
|
35fba3cfb2 | ||
|
|
88033876b4 | ||
|
|
8603158143 | ||
|
|
78ab1fcf4b | ||
|
|
6760cfb620 | ||
|
|
85e686522e | ||
|
|
7472110d56 | ||
|
|
b6ca2cbe94 | ||
|
|
8693d918bf | ||
|
|
7d2e492e17 | ||
|
|
3e1da1f0b0 | ||
|
|
54a4378fc6 | ||
|
|
8276bcf711 | ||
|
|
a0632b8aa2 | ||
|
|
66954968b1 | ||
|
|
8cc988d35a | ||
|
|
ecce61c944 | ||
|
|
dff097f0f0 | ||
|
|
7cd02e81ef | ||
|
|
1047cd7261 | ||
|
|
39f3c86c61 | ||
|
|
9f3e35d3dc | ||
|
|
d9ffb0f97d | ||
|
|
e73843f6d4 | ||
|
|
dbfad5d126 | ||
|
|
23aa67c948 | ||
|
|
776ea213ce | ||
|
|
55673c2410 | ||
|
|
ebe373b1f3 | ||
|
|
a8e5d0946c | ||
|
|
cad6c42ecc | ||
|
|
e420e2fa02 | ||
|
|
5f9c713c48 | ||
|
|
11a7db22b4 | ||
|
|
d17d7bdcbd | ||
|
|
2362271d4b | ||
|
|
57c251cd39 | ||
|
|
cd87763dbd | ||
|
|
13b700fd3e | ||
|
|
9ee2738aec | ||
|
|
bc4bd804d5 | ||
|
|
d43cba10b2 | ||
|
|
a0a0ef9385 | ||
|
|
6aeefea8e6 | ||
|
|
cd9007712b | ||
|
|
bc8bed494d | ||
|
|
7fa087d061 | ||
|
|
1ffd7c2cde | ||
|
|
fd2bf7c19a | ||
|
|
8ff9910ddc | ||
|
|
08380caa77 | ||
|
|
1b2995cea8 | ||
|
|
25a8fa2362 | ||
|
|
71cc95eaed | ||
|
|
361590dc40 | ||
|
|
d66a519685 | ||
|
|
6b8ece0ff2 | ||
|
|
6d9f25fac9 | ||
|
|
e2a8334f96 | ||
|
|
7a3bb8311b | ||
|
|
b11d1be6ac | ||
|
|
390c5ce1b7 | ||
|
|
672c5e953e | ||
|
|
23680f5e5f | ||
|
|
d64ef2ab06 | ||
|
|
4c4547d5d5 | ||
|
|
0d308c7ae6 | ||
|
|
487ca45752 | ||
|
|
5f430f22e2 | ||
|
|
ebeb02b958 | ||
|
|
ac3b6b326c | ||
|
|
dac41f6015 | ||
|
|
f4d6b638de | ||
|
|
2aa19f3de0 | ||
|
|
745395d6a2 | ||
|
|
9bf9fbd86f | ||
|
|
37f6d0b39c | ||
|
|
4e62226eea | ||
|
|
b42c5acd8b | ||
|
|
35a301ad3b | ||
|
|
e23b09fe0b | ||
|
|
aea1a3d8f9 | ||
|
|
ee892502ec | ||
|
|
3e8e85cdc1 | ||
|
|
b871c33620 | ||
|
|
b6fb0b8e09 | ||
|
|
35cfbfbd58 | ||
|
|
8c3c08f108 | ||
|
|
54cda6ee9e | ||
|
|
83b57acde9 | ||
|
|
e11c166a40 | ||
|
|
408f9fa1b7 | ||
|
|
cef9cb22a5 | ||
|
|
f851772ce0 | ||
|
|
cd4e736a44 | ||
|
|
11303a0e1b | ||
|
|
db11aba063 | ||
|
|
fd403521e9 | ||
|
|
f7f0957188 | ||
|
|
b216ceb25e | ||
|
|
1af8404c54 | ||
|
|
215df45d4b | ||
|
|
06064828ef | ||
|
|
d0dab58250 | ||
|
|
244365fc6a | ||
|
|
a891c3f903 | ||
|
|
db7a3972a8 | ||
|
|
f5056f4923 | ||
|
|
d759e6bb9e | ||
|
|
b12bd44faa | ||
|
|
6ffaf848a0 | ||
|
|
c8ed70019e | ||
|
|
10a7932b9d | ||
|
|
32e3b3b25f | ||
|
|
f108ebdbaf | ||
|
|
b0e9b132b5 | ||
|
|
848e7d8169 | ||
|
|
69287b8bb4 | ||
|
|
1777796996 | ||
|
|
64b4d510ba | ||
|
|
609c75a2e5 | ||
|
|
9b050d00ed |
13
.devcontainer/devcontainer.json
Normal file
13
.devcontainer/devcontainer.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"image": "ghcr.io/tiejunms/azure_rtos_docker",
|
||||||
|
|
||||||
|
// Add the IDs of extensions you want installed when the container is created.
|
||||||
|
"extensions": [
|
||||||
|
"ms-vscode.cpptools",
|
||||||
|
"ms-vscode.cmake-tools"
|
||||||
|
],
|
||||||
|
|
||||||
|
"remoteUser": "vscode",
|
||||||
|
|
||||||
|
"runArgs": [ "--cap-add=NET_ADMIN"]
|
||||||
|
}
|
||||||
1
.github/CODEOWNERS
vendored
Normal file
1
.github/CODEOWNERS
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
@eclipse-threadx/admins
|
||||||
35
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
35
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
---
|
||||||
|
name: Bug report
|
||||||
|
about: Create a report to help us improve Eclipse ThreadX.
|
||||||
|
title: ''
|
||||||
|
labels: bug, hardware
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Describe the bug**
|
||||||
|
A clear and concise description of what the bug is.
|
||||||
|
|
||||||
|
Please also mention any information which could help others to understand
|
||||||
|
the problem you're facing:
|
||||||
|
- What target device are you using?
|
||||||
|
- Which version of Eclipse ThreadX?
|
||||||
|
- What toolchain and environment?
|
||||||
|
- What have you tried to diagnose or workaround this issue?
|
||||||
|
|
||||||
|
**To Reproduce**
|
||||||
|
Steps to reproduce the behavior:
|
||||||
|
1. Build my project in IAR Workbench.
|
||||||
|
1. See error
|
||||||
|
|
||||||
|
**Expected behavior**
|
||||||
|
A clear and concise description of what you expected to happen.
|
||||||
|
|
||||||
|
**Impact**
|
||||||
|
What impact does this issue have on your progress (e.g., annoyance, showstopper)
|
||||||
|
|
||||||
|
**Logs and console output**
|
||||||
|
If applicable, add console logs or other types of debug information like Wireshark capture as `.zip` file.
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context about the problem here.
|
||||||
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
name: Feature request
|
||||||
|
about: Suggest an idea or enhancement to existing feature for Eclipse ThreadX.
|
||||||
|
title: ''
|
||||||
|
labels: feature
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Is your feature request related to a problem? Please describe.**
|
||||||
|
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||||
|
|
||||||
|
**Describe the solution you'd like**
|
||||||
|
A clear and concise description of what you want to happen.
|
||||||
|
|
||||||
|
**Describe alternatives you've considered**
|
||||||
|
A clear and concise description of any alternative solutions or features you've considered.
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context or screenshots about the feature request here.
|
||||||
19
.github/ISSUE_TEMPLATE/hardware-or-architecture-support.md
vendored
Normal file
19
.github/ISSUE_TEMPLATE/hardware-or-architecture-support.md
vendored
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
---
|
||||||
|
name: Hardware or architecture support
|
||||||
|
about: Suggest adding hardware or new architecture support.
|
||||||
|
title: ''
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Is this request related to a particular hardware platform, SoC, board? Please describe.**
|
||||||
|
Describe in details the hardware support being requested and why this support benefits Eclipse ThreadX.
|
||||||
|
|
||||||
|
**Describe why you are asking for this support?**
|
||||||
|
Describe why you are asking for this support.
|
||||||
|
|
||||||
|
If this is a new board or SoC, please state whether you are willing to maintain the Eclipse ThreadX support together with you.
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context or graphics (drag-and-drop an image) about the hardware here.
|
||||||
5
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
5
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
## PR checklist
|
||||||
|
<!--- Put an `x` in all the boxes that apply. -->
|
||||||
|
- [ ] Updated function header with a short description and version number
|
||||||
|
- [ ] Added test case for bug fix or new feature
|
||||||
|
- [ ] Validated on real hardware <!-- hardware - toolchain -->
|
||||||
28
.github/workflows/cache-update.yml
vendored
28
.github/workflows/cache-update.yml
vendored
@@ -1,28 +0,0 @@
|
|||||||
name: cache-update
|
|
||||||
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: '0 0 */3 * *' # every 30m for testing
|
|
||||||
|
|
||||||
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
|
|
||||||
jobs:
|
|
||||||
# This workflow contains a single job called "build"
|
|
||||||
build:
|
|
||||||
# The type of runner that the job will run on
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
# Steps represent a sequence of tasks that will be executed as part of the job
|
|
||||||
steps: # Cache location for arm tools
|
|
||||||
- name: Cache arm-none-eabi-gcc tools
|
|
||||||
id: cache-arm-gcc
|
|
||||||
uses: actions/cache@v1
|
|
||||||
with:
|
|
||||||
path: $HOME/arm-none-eabi-gcc-9-2019-q4
|
|
||||||
key: ${{ runner.os }}-arm-gcc-9-2019-q4
|
|
||||||
|
|
||||||
# Get the arm-non-eabi-gcc toolchain
|
|
||||||
- name: Install arm-none-eabi-gcc
|
|
||||||
uses: fiam/arm-none-eabi-gcc@v1
|
|
||||||
with:
|
|
||||||
release: '9-2019-q4' # The arm-none-eabi-gcc release to use.
|
|
||||||
directory: $HOME/arm-none-eabi-gcc-9-2019-q4
|
|
||||||
77
.github/workflows/ci_cortex_m.yml
vendored
Normal file
77
.github/workflows/ci_cortex_m.yml
vendored
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
# This is a basic workflow to help you get started with Actions
|
||||||
|
|
||||||
|
name: cortex_m
|
||||||
|
|
||||||
|
# Controls when the action will run. Triggers the workflow on push or pull request
|
||||||
|
# events but only for the master branch
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ master ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ master ]
|
||||||
|
paths:
|
||||||
|
- ".github/workflows/ci_cortex_m.yml"
|
||||||
|
- 'common/**'
|
||||||
|
- 'utility/**'
|
||||||
|
- 'ports/cortex_m0/gnu/**'
|
||||||
|
- 'ports/cortex_m3/gnu/**'
|
||||||
|
- 'ports/cortex_m4/gnu/**'
|
||||||
|
- 'ports/cortex_m7/gnu/**'
|
||||||
|
|
||||||
|
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
|
||||||
|
jobs:
|
||||||
|
# This workflow contains a single job called "build"
|
||||||
|
build:
|
||||||
|
# The type of runner that the job will run on
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
port: [0, 3, 4, 7]
|
||||||
|
|
||||||
|
name: Cortex M${{ matrix.port }} build
|
||||||
|
|
||||||
|
# Steps represent a sequence of tasks that will be executed as part of the job
|
||||||
|
steps:
|
||||||
|
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
|
||||||
|
- name: Check out the repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
submodules: true
|
||||||
|
|
||||||
|
# Store the arm compilers in the cache to speed up builds
|
||||||
|
- name: Cache arm-none-eabi-gcc tools
|
||||||
|
id: cache-arm-gcc
|
||||||
|
uses: actions/cache@v1
|
||||||
|
with:
|
||||||
|
path: $HOME/arm-none-eabi-gcc-9-2019-q4
|
||||||
|
key: ${{ runner.os }}-arm-gcc-9-2019-q4
|
||||||
|
|
||||||
|
# Get the arm-non-eabi-gcc toolchain
|
||||||
|
- name: Install arm-none-eabi-gcc
|
||||||
|
uses: fiam/arm-none-eabi-gcc@v1
|
||||||
|
if: steps.cache-arm-gcc.outputs.cache-hit != 'true'
|
||||||
|
with:
|
||||||
|
release: '9-2019-q4' # The arm-none-eabi-gcc release to use.
|
||||||
|
directory: $HOME/arm-none-eabi-gcc-9-2019-q4
|
||||||
|
|
||||||
|
# Get CMake into the environment
|
||||||
|
- name: Install cmake 3.19.1
|
||||||
|
uses: lukka/get-cmake@v3.19.1
|
||||||
|
|
||||||
|
# Get Ninja into the environment
|
||||||
|
- name: Install ninja-build
|
||||||
|
uses: seanmiddleditch/gha-setup-ninja@v3
|
||||||
|
|
||||||
|
# Prepare the build system
|
||||||
|
- name: Prepare build system
|
||||||
|
run: cmake -Bbuild -DCMAKE_TOOLCHAIN_FILE=./cmake/cortex_m${{ matrix.port }}.cmake -GNinja .
|
||||||
|
env:
|
||||||
|
PATH: "$HOME/arm-none-eabi-gcc-9-2019-q4/bin:$PATH"
|
||||||
|
|
||||||
|
- name: Compile and link
|
||||||
|
run: cmake --build ./build
|
||||||
|
env:
|
||||||
|
PATH: "$HOME/arm-none-eabi-gcc-9-2019-q4/bin:$PATH"
|
||||||
|
|
||||||
|
|
||||||
64
.github/workflows/ci_cortex_m0.yml
vendored
64
.github/workflows/ci_cortex_m0.yml
vendored
@@ -1,64 +0,0 @@
|
|||||||
# This is a basic workflow to help you get started with Actions
|
|
||||||
|
|
||||||
name: cortex_m0
|
|
||||||
|
|
||||||
# Controls when the action will run. Triggers the workflow on push or pull request
|
|
||||||
# events but only for the master branch
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ master ]
|
|
||||||
pull_request:
|
|
||||||
branches: [ master ]
|
|
||||||
|
|
||||||
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
|
|
||||||
jobs:
|
|
||||||
# This workflow contains a single job called "build"
|
|
||||||
build:
|
|
||||||
# The type of runner that the job will run on
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
# Steps represent a sequence of tasks that will be executed as part of the job
|
|
||||||
steps:
|
|
||||||
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
|
|
||||||
- name: Checkout sources recursively
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
token: ${{ secrets.REPO_SCOPED_TOKEN }}
|
|
||||||
submodules: true
|
|
||||||
|
|
||||||
# Store the arm compilers in the cache to speed up builds
|
|
||||||
- name: Cache arm-none-eabi-gcc tools
|
|
||||||
id: cache-arm-gcc
|
|
||||||
uses: actions/cache@v1
|
|
||||||
with:
|
|
||||||
path: $HOME/arm-none-eabi-gcc-9-2019-q4
|
|
||||||
key: ${{ runner.os }}-arm-gcc-9-2019-q4
|
|
||||||
|
|
||||||
# Get the arm-non-eabi-gcc toolchain
|
|
||||||
- name: Install arm-none-eabi-gcc
|
|
||||||
uses: fiam/arm-none-eabi-gcc@v1
|
|
||||||
if: steps.cache-arm-gcc.outputs.cache-hit != 'true'
|
|
||||||
with:
|
|
||||||
release: '9-2019-q4' # The arm-none-eabi-gcc release to use.
|
|
||||||
directory: $HOME/arm-none-eabi-gcc-9-2019-q4
|
|
||||||
|
|
||||||
# Get CMake into the environment
|
|
||||||
- name: Install cmake 3.17.1
|
|
||||||
uses: lukka/get-cmake@v3.17.1
|
|
||||||
|
|
||||||
# Get Ninja into the environment
|
|
||||||
- name: Install ninja-build
|
|
||||||
uses: seanmiddleditch/gha-setup-ninja@v1
|
|
||||||
|
|
||||||
# Prepare the build system
|
|
||||||
- name: Prepare build system
|
|
||||||
run: cmake -Bbuild -DCMAKE_TOOLCHAIN_FILE=./cmake/cortex_m0.cmake -GNinja .
|
|
||||||
env:
|
|
||||||
PATH: "$HOME/arm-none-eabi-gcc-9-2019-q4/bin:$PATH"
|
|
||||||
|
|
||||||
- name: Compile and link
|
|
||||||
run: cmake --build ./build
|
|
||||||
env:
|
|
||||||
PATH: "$HOME/arm-none-eabi-gcc-9-2019-q4/bin:$PATH"
|
|
||||||
|
|
||||||
|
|
||||||
64
.github/workflows/ci_cortex_m3.yml
vendored
64
.github/workflows/ci_cortex_m3.yml
vendored
@@ -1,64 +0,0 @@
|
|||||||
# This is a basic workflow to help you get started with Actions
|
|
||||||
|
|
||||||
name: cortex_m3
|
|
||||||
|
|
||||||
# Controls when the action will run. Triggers the workflow on push or pull request
|
|
||||||
# events but only for the master branch
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ master ]
|
|
||||||
pull_request:
|
|
||||||
branches: [ master ]
|
|
||||||
|
|
||||||
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
|
|
||||||
jobs:
|
|
||||||
# This workflow contains a single job called "build"
|
|
||||||
build:
|
|
||||||
# The type of runner that the job will run on
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
# Steps represent a sequence of tasks that will be executed as part of the job
|
|
||||||
steps:
|
|
||||||
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
|
|
||||||
- name: Checkout sources recursively
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
token: ${{ secrets.REPO_SCOPED_TOKEN }}
|
|
||||||
submodules: true
|
|
||||||
|
|
||||||
# Store the arm compilers in the cache to speed up builds
|
|
||||||
- name: Cache arm-none-eabi-gcc tools
|
|
||||||
id: cache-arm-gcc
|
|
||||||
uses: actions/cache@v1
|
|
||||||
with:
|
|
||||||
path: $HOME/arm-none-eabi-gcc-9-2019-q4
|
|
||||||
key: ${{ runner.os }}-arm-gcc-9-2019-q4
|
|
||||||
|
|
||||||
# Get the arm-non-eabi-gcc toolchain
|
|
||||||
- name: Install arm-none-eabi-gcc
|
|
||||||
uses: fiam/arm-none-eabi-gcc@v1
|
|
||||||
if: steps.cache-arm-gcc.outputs.cache-hit != 'true'
|
|
||||||
with:
|
|
||||||
release: '9-2019-q4' # The arm-none-eabi-gcc release to use.
|
|
||||||
directory: $HOME/arm-none-eabi-gcc-9-2019-q4
|
|
||||||
|
|
||||||
# Get CMake into the environment
|
|
||||||
- name: Install cmake 3.17.1
|
|
||||||
uses: lukka/get-cmake@v3.17.1
|
|
||||||
|
|
||||||
# Get Ninja into the environment
|
|
||||||
- name: Install ninja-build
|
|
||||||
uses: seanmiddleditch/gha-setup-ninja@v1
|
|
||||||
|
|
||||||
# Prepare the build system
|
|
||||||
- name: Prepare build system
|
|
||||||
run: cmake -Bbuild -DCMAKE_TOOLCHAIN_FILE=./cmake/cortex_m3.cmake -GNinja .
|
|
||||||
env:
|
|
||||||
PATH: "$HOME/arm-none-eabi-gcc-9-2019-q4/bin:$PATH"
|
|
||||||
|
|
||||||
- name: Compile and link
|
|
||||||
run: cmake --build ./build
|
|
||||||
env:
|
|
||||||
PATH: "$HOME/arm-none-eabi-gcc-9-2019-q4/bin:$PATH"
|
|
||||||
|
|
||||||
|
|
||||||
64
.github/workflows/ci_cortex_m4.yml
vendored
64
.github/workflows/ci_cortex_m4.yml
vendored
@@ -1,64 +0,0 @@
|
|||||||
# This is a basic workflow to help you get started with Actions
|
|
||||||
|
|
||||||
name: cortex_m4
|
|
||||||
|
|
||||||
# Controls when the action will run. Triggers the workflow on push or pull request
|
|
||||||
# events but only for the master branch
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ master ]
|
|
||||||
pull_request:
|
|
||||||
branches: [ master ]
|
|
||||||
|
|
||||||
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
|
|
||||||
jobs:
|
|
||||||
# This workflow contains a single job called "build"
|
|
||||||
build:
|
|
||||||
# The type of runner that the job will run on
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
# Steps represent a sequence of tasks that will be executed as part of the job
|
|
||||||
steps:
|
|
||||||
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
|
|
||||||
- name: Checkout sources recursively
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
token: ${{ secrets.REPO_SCOPED_TOKEN }}
|
|
||||||
submodules: true
|
|
||||||
|
|
||||||
# Store the arm compilers in the cache to speed up builds
|
|
||||||
- name: Cache arm-none-eabi-gcc tools
|
|
||||||
id: cache-arm-gcc
|
|
||||||
uses: actions/cache@v1
|
|
||||||
with:
|
|
||||||
path: $HOME/arm-none-eabi-gcc-9-2019-q4
|
|
||||||
key: ${{ runner.os }}-arm-gcc-9-2019-q4
|
|
||||||
|
|
||||||
# Get the arm-non-eabi-gcc toolchain
|
|
||||||
- name: Install arm-none-eabi-gcc
|
|
||||||
uses: fiam/arm-none-eabi-gcc@v1
|
|
||||||
if: steps.cache-arm-gcc.outputs.cache-hit != 'true'
|
|
||||||
with:
|
|
||||||
release: '9-2019-q4' # The arm-none-eabi-gcc release to use.
|
|
||||||
directory: $HOME/arm-none-eabi-gcc-9-2019-q4
|
|
||||||
|
|
||||||
# Get CMake into the environment
|
|
||||||
- name: Install cmake 3.17.1
|
|
||||||
uses: lukka/get-cmake@v3.17.1
|
|
||||||
|
|
||||||
# Get Ninja into the environment
|
|
||||||
- name: Install ninja-build
|
|
||||||
uses: seanmiddleditch/gha-setup-ninja@v1
|
|
||||||
|
|
||||||
# Prepare the build system
|
|
||||||
- name: Prepare build system
|
|
||||||
run: cmake -Bbuild -DCMAKE_TOOLCHAIN_FILE=./cmake/cortex_m4.cmake -GNinja .
|
|
||||||
env:
|
|
||||||
PATH: "$HOME/arm-none-eabi-gcc-9-2019-q4/bin:$PATH"
|
|
||||||
|
|
||||||
- name: Compile and link
|
|
||||||
run: cmake --build ./build
|
|
||||||
env:
|
|
||||||
PATH: "$HOME/arm-none-eabi-gcc-9-2019-q4/bin:$PATH"
|
|
||||||
|
|
||||||
|
|
||||||
64
.github/workflows/ci_cortex_m7.yml
vendored
64
.github/workflows/ci_cortex_m7.yml
vendored
@@ -1,64 +0,0 @@
|
|||||||
# This is a basic workflow to help you get started with Actions
|
|
||||||
|
|
||||||
name: cortex_m7
|
|
||||||
|
|
||||||
# Controls when the action will run. Triggers the workflow on push or pull request
|
|
||||||
# events but only for the master branch
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ master ]
|
|
||||||
pull_request:
|
|
||||||
branches: [ master ]
|
|
||||||
|
|
||||||
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
|
|
||||||
jobs:
|
|
||||||
# This workflow contains a single job called "build"
|
|
||||||
build:
|
|
||||||
# The type of runner that the job will run on
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
# Steps represent a sequence of tasks that will be executed as part of the job
|
|
||||||
steps:
|
|
||||||
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
|
|
||||||
- name: Checkout sources recursively
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
token: ${{ secrets.REPO_SCOPED_TOKEN }}
|
|
||||||
submodules: true
|
|
||||||
|
|
||||||
# Store the arm compilers in the cache to speed up builds
|
|
||||||
- name: Cache arm-none-eabi-gcc tools
|
|
||||||
id: cache-arm-gcc
|
|
||||||
uses: actions/cache@v1
|
|
||||||
with:
|
|
||||||
path: $HOME/arm-none-eabi-gcc-9-2019-q4
|
|
||||||
key: ${{ runner.os }}-arm-gcc-9-2019-q4
|
|
||||||
|
|
||||||
# Get the arm-non-eabi-gcc toolchain
|
|
||||||
- name: Install arm-none-eabi-gcc
|
|
||||||
uses: fiam/arm-none-eabi-gcc@v1
|
|
||||||
if: steps.cache-arm-gcc.outputs.cache-hit != 'true'
|
|
||||||
with:
|
|
||||||
release: '9-2019-q4' # The arm-none-eabi-gcc release to use.
|
|
||||||
directory: $HOME/arm-none-eabi-gcc-9-2019-q4
|
|
||||||
|
|
||||||
# Get CMake into the environment
|
|
||||||
- name: Install cmake 3.17.1
|
|
||||||
uses: lukka/get-cmake@v3.17.1
|
|
||||||
|
|
||||||
# Get Ninja into the environment
|
|
||||||
- name: Install ninja-build
|
|
||||||
uses: seanmiddleditch/gha-setup-ninja@v1
|
|
||||||
|
|
||||||
# Prepare the build system
|
|
||||||
- name: Prepare build system
|
|
||||||
run: cmake -Bbuild -DCMAKE_TOOLCHAIN_FILE=./cmake/cortex_m7.cmake -GNinja .
|
|
||||||
env:
|
|
||||||
PATH: "$HOME/arm-none-eabi-gcc-9-2019-q4/bin:$PATH"
|
|
||||||
|
|
||||||
- name: Compile and link
|
|
||||||
run: cmake --build ./build
|
|
||||||
env:
|
|
||||||
PATH: "$HOME/arm-none-eabi-gcc-9-2019-q4/bin:$PATH"
|
|
||||||
|
|
||||||
|
|
||||||
73
.github/workflows/ports_arch_check.yml
vendored
Normal file
73
.github/workflows/ports_arch_check.yml
vendored
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
# This is a basic workflow to help you get started with Actions
|
||||||
|
|
||||||
|
name: ports_arch_check
|
||||||
|
|
||||||
|
# Controls when the action will run. Triggers the workflow on push or pull request
|
||||||
|
# events but only for the master branch
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
branches: [ master ]
|
||||||
|
paths:
|
||||||
|
- ".github/workflows/ports_arch_check.yml"
|
||||||
|
- 'common/**'
|
||||||
|
- 'common_modules/**'
|
||||||
|
- 'common_smp/**'
|
||||||
|
- 'ports/**'
|
||||||
|
- 'ports_modules/**'
|
||||||
|
- 'ports_smp/**'
|
||||||
|
- 'ports_arch/**'
|
||||||
|
|
||||||
|
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
|
||||||
|
jobs:
|
||||||
|
# Check ports for cortex-m
|
||||||
|
cortex-m:
|
||||||
|
# The type of runner that the job will run on
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
# Steps represent a sequence of tasks that will be executed as part of the job
|
||||||
|
steps:
|
||||||
|
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
|
||||||
|
- name: Checkout sources recursively
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.REPO_SCOPED_TOKEN }}
|
||||||
|
submodules: true
|
||||||
|
|
||||||
|
# Copy ports arch
|
||||||
|
- name: Copy ports arch
|
||||||
|
run: |
|
||||||
|
scripts/copy_armv7_m.sh && scripts/copy_armv8_m.sh && scripts/copy_module_armv7_m.sh
|
||||||
|
if [[ -n $(git status --porcelain -uno) ]]; then
|
||||||
|
echo "Ports for ARM architecture is not updated"
|
||||||
|
git status
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
cortex-a:
|
||||||
|
# Check ports for cortex-a
|
||||||
|
runs-on: windows-latest
|
||||||
|
|
||||||
|
# Steps represent a sequence of tasks that will be executed as part of the job
|
||||||
|
steps:
|
||||||
|
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
|
||||||
|
- name: Checkout sources recursively
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.REPO_SCOPED_TOKEN }}
|
||||||
|
submodules: true
|
||||||
|
|
||||||
|
# Copy ports arch
|
||||||
|
- name: Copy ports arch
|
||||||
|
run: |
|
||||||
|
cd ports_arch/ARMv7-A
|
||||||
|
pwsh -Command ./update.ps1 -PortSets tx -CopyCommonFiles -CopyPortFiles -CopyExample -PatchFiles
|
||||||
|
cd ../../ports_arch/ARMv8-A
|
||||||
|
pwsh -Command ./update.ps1 -PortSets tx,tx_smp -CopyCommonFiles -CopyPortFiles -CopyExample -PatchFiles
|
||||||
|
if ((git status --porcelain -uno) -ne $null) {
|
||||||
|
Write-Host "Ports for ARM architecture is not updated"
|
||||||
|
git status
|
||||||
|
Exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
197
.github/workflows/regression_template.yml
vendored
Normal file
197
.github/workflows/regression_template.yml
vendored
Normal file
@@ -0,0 +1,197 @@
|
|||||||
|
# This is a basic workflow that is manually triggered
|
||||||
|
|
||||||
|
name: regression_template
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
install_script:
|
||||||
|
default: './scripts/install.sh'
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
build_script:
|
||||||
|
default: './scripts/build.sh'
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
test_script:
|
||||||
|
default: './scripts/test.sh'
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
cmake_path:
|
||||||
|
default: './test/cmake'
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
skip_test:
|
||||||
|
default: false
|
||||||
|
required: false
|
||||||
|
type: boolean
|
||||||
|
skip_coverage:
|
||||||
|
default: false
|
||||||
|
required: false
|
||||||
|
type: boolean
|
||||||
|
coverage_name:
|
||||||
|
default: 'default_build_coverage'
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
skip_deploy:
|
||||||
|
default: false
|
||||||
|
required: false
|
||||||
|
type: boolean
|
||||||
|
deploy_list:
|
||||||
|
default: ''
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
result_affix:
|
||||||
|
default: ''
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
|
||||||
|
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
|
||||||
|
jobs:
|
||||||
|
# This workflow contains a single job called "linux_job"
|
||||||
|
run_tests:
|
||||||
|
if: ${{ !inputs.skip_test}}
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
issues: read
|
||||||
|
checks: write
|
||||||
|
pull-requests: write
|
||||||
|
|
||||||
|
# The type of runner that the job will run on
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
# Steps represent a sequence of tasks that will be executed as part of the job
|
||||||
|
steps:
|
||||||
|
- name: Check out the repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
submodules: true
|
||||||
|
|
||||||
|
- name: Install softwares
|
||||||
|
run: ${{ inputs.install_script }}
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: ${{ inputs.build_script }}
|
||||||
|
|
||||||
|
- name: Test
|
||||||
|
run: ${{ inputs.test_script }}
|
||||||
|
|
||||||
|
- name: Publish Test Results
|
||||||
|
uses: EnricoMi/publish-unit-test-result-action@v2.11.0
|
||||||
|
if: always()
|
||||||
|
with:
|
||||||
|
check_name: Test Results ${{ inputs.result_affix }}
|
||||||
|
files: |
|
||||||
|
${{ inputs.cmake_path }}/build/*/*.xml
|
||||||
|
|
||||||
|
- name: Upload Test Results
|
||||||
|
if: success() || failure()
|
||||||
|
uses: actions/upload-artifact@v4.6.0
|
||||||
|
with:
|
||||||
|
name: test_reports ${{ inputs.result_affix }}
|
||||||
|
path: |
|
||||||
|
${{ inputs.cmake_path }}/build/*.txt
|
||||||
|
${{ inputs.cmake_path }}/build/*/Testing/**/*.xml
|
||||||
|
${{ inputs.cmake_path }}/build/**/regression/output_files/*.bin
|
||||||
|
|
||||||
|
- name: Configure GitHub Pages
|
||||||
|
uses: actions/configure-pages@v3.0.6
|
||||||
|
|
||||||
|
- name: Generate Code Coverage Results Summary
|
||||||
|
if: (!inputs.skip_coverage)
|
||||||
|
uses: irongut/CodeCoverageSummary@v1.3.0
|
||||||
|
with:
|
||||||
|
filename: ${{ inputs.cmake_path }}/coverage_report/${{ inputs.coverage_name }}.xml
|
||||||
|
format: markdown
|
||||||
|
badge: true
|
||||||
|
hide_complexity: true
|
||||||
|
output: file
|
||||||
|
|
||||||
|
- name: Write Code Coverage Summary
|
||||||
|
if: (!inputs.skip_coverage)
|
||||||
|
run: |
|
||||||
|
echo "## Coverage Report ${{ inputs.result_affix }}" >> $GITHUB_STEP_SUMMARY
|
||||||
|
cat code-coverage-results.md >> $GITHUB_STEP_SUMMARY
|
||||||
|
|
||||||
|
- name: Create CheckRun for Code Coverage
|
||||||
|
if: ((github.event_name == 'push') || (github.event_name == 'workflow_dispatch') || (github.event.pull_request.head.repo.full_name == github.repository)) && (!inputs.skip_coverage)
|
||||||
|
uses: LouisBrunner/checks-action@v1.6.2
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
name: Code Coverage ${{ inputs.result_affix }}
|
||||||
|
conclusion: ${{ job.status }}
|
||||||
|
output: |
|
||||||
|
{"summary":"Coverage Report"}
|
||||||
|
output_text_description_file: code-coverage-results.md
|
||||||
|
|
||||||
|
- name: Add Code Coverage PR Comment
|
||||||
|
if: ((github.event_name == 'push') || (github.event.pull_request.head.repo.full_name == github.repository)) && (!inputs.skip_coverage)
|
||||||
|
uses: marocchino/sticky-pull-request-comment@v2
|
||||||
|
with:
|
||||||
|
header: Code Coverage ${{ inputs.result_affix }}
|
||||||
|
path: code-coverage-results.md
|
||||||
|
|
||||||
|
# Add sudo to move coverage folder created by root user
|
||||||
|
- name: Prepare Coverage GitHub Pages
|
||||||
|
if: (!inputs.skip_coverage)
|
||||||
|
run: >-
|
||||||
|
if [ "${{ inputs.result_affix }}" != "" ] && ${{ inputs.skip_deploy }}; then
|
||||||
|
sudo mv ${{ inputs.cmake_path }}/coverage_report/${{ inputs.coverage_name }} \
|
||||||
|
${{ inputs.cmake_path }}/coverage_report/${{ inputs.result_affix }}
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Upload Code Coverage Artifacts
|
||||||
|
uses: actions/upload-artifact@v4.6.0
|
||||||
|
if: (inputs.skip_deploy && !inputs.skip_coverage)
|
||||||
|
with:
|
||||||
|
name: coverage_report
|
||||||
|
path: ${{ inputs.cmake_path }}/coverage_report
|
||||||
|
retention-days: 1
|
||||||
|
|
||||||
|
- name: Upload Code Coverage Pages
|
||||||
|
uses: actions/upload-pages-artifact@v2.0.0
|
||||||
|
if: (!inputs.skip_deploy && !inputs.skip_coverage)
|
||||||
|
with:
|
||||||
|
path: ${{ inputs.cmake_path }}/coverage_report/${{ inputs.coverage_name }}
|
||||||
|
|
||||||
|
deploy_code_coverage:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: ((github.event_name == 'push') || (github.event_name == 'workflow_dispatch')) && !inputs.skip_coverage && !inputs.skip_deploy && !failure() && !cancelled()
|
||||||
|
needs: run_tests
|
||||||
|
environment:
|
||||||
|
name: github-pages
|
||||||
|
url: ${{ steps.deployment.outputs.page_url }}
|
||||||
|
permissions:
|
||||||
|
pages: write
|
||||||
|
id-token: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/download-artifact@v4.1.7
|
||||||
|
if: ${{ inputs.skip_test }}
|
||||||
|
with:
|
||||||
|
name: coverage_report
|
||||||
|
|
||||||
|
- name: Upload Code Coverage Pages
|
||||||
|
uses: actions/upload-pages-artifact@v2.0.0
|
||||||
|
if: ${{ inputs.skip_test }}
|
||||||
|
with:
|
||||||
|
path: .
|
||||||
|
|
||||||
|
- name: Delete Duplicate Code Coverage Artifact
|
||||||
|
uses: geekyeggo/delete-artifact@v2
|
||||||
|
with:
|
||||||
|
name: coverage_report
|
||||||
|
|
||||||
|
- name: Deploy GitHub Pages site
|
||||||
|
id: deployment
|
||||||
|
uses: actions/deploy-pages@v1.2.9
|
||||||
|
|
||||||
|
- name: Write Code Coverage Report URL
|
||||||
|
run: >-
|
||||||
|
if [ "${{ inputs.deploy_list }}" != "" ]; then
|
||||||
|
for i in ${{ inputs.deploy_list }}; do
|
||||||
|
echo 'Coverage report for ' $i ':${{ steps.deployment.outputs.page_url }}'$i >> $GITHUB_STEP_SUMMARY
|
||||||
|
done
|
||||||
|
else
|
||||||
|
echo 'Coverage report: ${{ steps.deployment.outputs.page_url }}' >> $GITHUB_STEP_SUMMARY
|
||||||
|
fi
|
||||||
35
.github/workflows/regression_test.yml
vendored
Normal file
35
.github/workflows/regression_test.yml
vendored
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
name: regression_test
|
||||||
|
|
||||||
|
# Controls when the action will run. Triggers the workflow on push or pull request
|
||||||
|
# events but only for the master branch
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
branches: [ master ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ master ]
|
||||||
|
|
||||||
|
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
|
||||||
|
jobs:
|
||||||
|
tx:
|
||||||
|
uses: ./.github/workflows/regression_template.yml
|
||||||
|
with:
|
||||||
|
build_script: ./scripts/build_tx.sh
|
||||||
|
test_script: ./scripts/test_tx.sh
|
||||||
|
cmake_path: ./test/tx/cmake
|
||||||
|
result_affix: ThreadX
|
||||||
|
skip_deploy: true
|
||||||
|
smp:
|
||||||
|
uses: ./.github/workflows/regression_template.yml
|
||||||
|
with:
|
||||||
|
build_script: ./scripts/build_smp.sh
|
||||||
|
test_script: ./scripts/test_smp.sh
|
||||||
|
cmake_path: ./test/smp/cmake
|
||||||
|
result_affix: SMP
|
||||||
|
skip_deploy: true
|
||||||
|
deploy:
|
||||||
|
needs: [tx, smp]
|
||||||
|
uses: ./.github/workflows/regression_template.yml
|
||||||
|
with:
|
||||||
|
skip_test: true
|
||||||
|
deploy_list: "ThreadX SMP"
|
||||||
9
.gitignore
vendored
9
.gitignore
vendored
@@ -1,6 +1,9 @@
|
|||||||
.vscode/
|
.vscode/
|
||||||
|
.settings/
|
||||||
|
.metadata/
|
||||||
_deps/
|
_deps/
|
||||||
build/
|
build/
|
||||||
|
Debug/
|
||||||
CMakeFiles/
|
CMakeFiles/
|
||||||
CMakeScripts/
|
CMakeScripts/
|
||||||
CMakeLists.txt.user
|
CMakeLists.txt.user
|
||||||
@@ -11,4 +14,10 @@ cmake_install.cmake
|
|||||||
install_manifest.txt
|
install_manifest.txt
|
||||||
compile_commands.json
|
compile_commands.json
|
||||||
CTestTestfile.cmake
|
CTestTestfile.cmake
|
||||||
|
*.dep
|
||||||
|
*.o
|
||||||
|
*.axf
|
||||||
|
*.map
|
||||||
|
*.a
|
||||||
|
*.htm
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
cmake_minimum_required(VERSION 3.0.0 FATAL_ERROR)
|
cmake_minimum_required(VERSION 3.13 FATAL_ERROR)
|
||||||
|
|
||||||
# Set up the project
|
# Set up the project
|
||||||
project(threadx
|
project(threadx
|
||||||
VERSION 6.0.0
|
|
||||||
LANGUAGES C ASM
|
LANGUAGES C ASM
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -12,6 +11,8 @@ endif()
|
|||||||
if(NOT DEFINED THREADX_TOOLCHAIN)
|
if(NOT DEFINED THREADX_TOOLCHAIN)
|
||||||
message(FATAL_ERROR "Error: THREADX_TOOLCHAIN not defined")
|
message(FATAL_ERROR "Error: THREADX_TOOLCHAIN not defined")
|
||||||
endif()
|
endif()
|
||||||
|
message(STATUS "THREADX_ARCH: ${THREADX_ARCH}")
|
||||||
|
message(STATUS "THREADX_TOOLCHAIN: ${THREADX_TOOLCHAIN}")
|
||||||
|
|
||||||
# Define our target library and an alias for consumers
|
# Define our target library and an alias for consumers
|
||||||
add_library(${PROJECT_NAME})
|
add_library(${PROJECT_NAME})
|
||||||
@@ -21,13 +22,26 @@ add_library("azrtos::${PROJECT_NAME}" ALIAS ${PROJECT_NAME})
|
|||||||
set(CUSTOM_INC_DIR ${CMAKE_CURRENT_BINARY_DIR}/custom_inc)
|
set(CUSTOM_INC_DIR ${CMAKE_CURRENT_BINARY_DIR}/custom_inc)
|
||||||
|
|
||||||
# Pick up the port specific variables and apply them
|
# Pick up the port specific variables and apply them
|
||||||
add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/ports/${THREADX_ARCH}/${THREADX_TOOLCHAIN})
|
if(DEFINED THREADX_CUSTOM_PORT)
|
||||||
|
add_subdirectory(${THREADX_CUSTOM_PORT} threadx_port)
|
||||||
|
else()
|
||||||
|
add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/ports/${THREADX_ARCH}/${THREADX_TOOLCHAIN})
|
||||||
|
endif()
|
||||||
|
|
||||||
# Pick up the common stuff
|
# Pick up the common stuff
|
||||||
add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/common)
|
add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/common)
|
||||||
|
|
||||||
|
# Define the FreeRTOS adaptation layer
|
||||||
|
add_library(freertos-threadx EXCLUDE_FROM_ALL)
|
||||||
|
target_include_directories(freertos-threadx
|
||||||
|
PUBLIC
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/utility/rtos_compatibility_layers/FreeRTOS
|
||||||
|
)
|
||||||
|
target_sources(freertos-threadx
|
||||||
|
PRIVATE
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/utility/rtos_compatibility_layers/FreeRTOS/tx_freertos.c
|
||||||
|
)
|
||||||
|
target_link_libraries(freertos-threadx PUBLIC threadx)
|
||||||
|
|
||||||
# If the user provided an override, copy it to the custom directory
|
# If the user provided an override, copy it to the custom directory
|
||||||
if (NOT TX_USER_FILE)
|
if (NOT TX_USER_FILE)
|
||||||
|
|||||||
@@ -1,14 +1,72 @@
|
|||||||
# Contributing
|
# Contributing to Eclipse ThreadX
|
||||||
|
|
||||||
This project welcomes contributions and suggestions. Most contributions require you to
|
Thanks for your interest in this project.
|
||||||
agree to a Contributor License Agreement (CLA) declaring that you have the right to,
|
|
||||||
and actually do, grant us the rights to use your contribution. For details, visit
|
|
||||||
https://cla.microsoft.com.
|
|
||||||
|
|
||||||
When you submit a pull request, a CLA-bot will automatically determine whether you need
|
## Project description
|
||||||
to provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the
|
|
||||||
instructions provided by the bot. You will only need to do this once across all repositories using our CLA.
|
|
||||||
|
|
||||||
This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).
|
Eclipse ThreadX provides a vendor-neutral, open source, safety certified OS for
|
||||||
For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)
|
real-time applications published on under a permissive license. The Eclipse
|
||||||
or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.
|
ThreadX suite encompasses:
|
||||||
|
* ThreadX - advanced real-time operating system (RTOS) designed specifically for deeply embedded applications
|
||||||
|
* NetX Duo - advanced, industrial-grade TCP/IP network stack designed specifically for deeply embedded real-time and IoT applications
|
||||||
|
* FileX - high-performance, FAT-compatible file system that’s fully integrated with ThreadX kernel
|
||||||
|
* GUIX - provides a complete, embedded graphical user interface (GUI) library
|
||||||
|
* USBX - high-performance USB host, device, and on-the-go (OTG) embedded stack, that is fully integrated with ThreadX kernel
|
||||||
|
* LevelX - Flash Wear Leveling for FileX and stand-alone purposes
|
||||||
|
* GuiX Studio - design environment, facilitating the creation and maintenance of all graphical elements for GUIX
|
||||||
|
* TraceX - analysis tool that provides a graphical view of real-time system events to better understand the behavior of real-time systems
|
||||||
|
|
||||||
|
Project site: https://projects.eclipse.org/projects/iot.threadx
|
||||||
|
|
||||||
|
## Terms of Use
|
||||||
|
|
||||||
|
This repository is subject to the Terms of Use of the Eclipse Foundation
|
||||||
|
https://www.eclipse.org/legal/termsofuse.php
|
||||||
|
|
||||||
|
## Developer resources
|
||||||
|
|
||||||
|
Information regarding source code management, builds, coding standards, and more.
|
||||||
|
https://projects.eclipse.org/projects/iot.threadx/developer
|
||||||
|
|
||||||
|
The project maintains the following source code repositories
|
||||||
|
|
||||||
|
* https://github.com/eclipse-threadx/.github
|
||||||
|
* https://github.com/eclipse-threadx/cmsis-packs
|
||||||
|
* https://github.com/eclipse-threadx/filex
|
||||||
|
* https://github.com/eclipse-threadx/getting-started
|
||||||
|
* https://github.com/eclipse-threadx/guix
|
||||||
|
* https://github.com/eclipse-threadx/levelx
|
||||||
|
* https://github.com/eclipse-threadx/netxduo
|
||||||
|
* https://github.com/eclipse-threadx/rtos-docs
|
||||||
|
* https://github.com/eclipse-threadx/samples
|
||||||
|
* https://github.com/eclipse-threadx/threadx
|
||||||
|
* https://github.com/eclipse-threadx/threadx-learn-samples
|
||||||
|
* https://github.com/eclipse-threadx/tracex
|
||||||
|
* https://github.com/eclipse-threadx/usbx
|
||||||
|
|
||||||
|
## Eclipse Development Process
|
||||||
|
|
||||||
|
This Eclipse Foundation open project is governed by the Eclipse Foundation
|
||||||
|
Development Process and operates under the terms of the Eclipse IP Policy.
|
||||||
|
|
||||||
|
* https://eclipse.org/projects/dev_process
|
||||||
|
* https://www.eclipse.org/org/documents/Eclipse_IP_Policy.pdf
|
||||||
|
|
||||||
|
## Eclipse Contributor Agreement
|
||||||
|
|
||||||
|
In order to be able to contribute to Eclipse Foundation projects you must electronically sign the Eclipse Contributor Agreement (ECA).
|
||||||
|
https://www.eclipse.org/legal/ECA.php
|
||||||
|
|
||||||
|
The ECA provides the Eclipse Foundation with a permanent record that you agree
|
||||||
|
that each of your contributions will comply with the commitments documented in
|
||||||
|
the Developer Certificate of Origin (DCO). Having an ECA on file associated with
|
||||||
|
the email address matching the "Author" field of your contribution's Git commits
|
||||||
|
fulfills the DCO's requirement that you sign-off on your contributions.
|
||||||
|
|
||||||
|
For more information, please see the Eclipse Committer Handbook:
|
||||||
|
https://www.eclipse.org/projects/handbook/#resources-commit
|
||||||
|
|
||||||
|
## Contact
|
||||||
|
|
||||||
|
Contact the project developers via the project's "dev" list.
|
||||||
|
https://accounts.eclipse.org/mailing-list/threadx-dev
|
||||||
|
|||||||
259
LICENSE.txt
259
LICENSE.txt
@@ -1,246 +1,21 @@
|
|||||||
MICROSOFT SOFTWARE LICENSE TERMS
|
MIT License
|
||||||
|
|
||||||
MICROSOFT AZURE RTOS
|
Copyright (c) 2024 - present Microsoft Corporation
|
||||||
|
|
||||||
Shape
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
These license terms are an agreement between you and Microsoft Corporation (or
|
The above copyright notice and this permission notice shall be included in all
|
||||||
one of its affiliates). They apply to the software named above and any Microsoft
|
copies or substantial portions of the Software.
|
||||||
services or software updates (except to the extent such services or updates are
|
|
||||||
accompanied by new or additional terms, in which case those different terms
|
|
||||||
apply prospectively and do not alter your or Microsoft’s rights relating to
|
|
||||||
pre-updated software or services). IF YOU COMPLY WITH THESE LICENSE TERMS, YOU
|
|
||||||
HAVE THE RIGHTS BELOW. BY USING THE SOFTWARE, YOU ACCEPT THESE TERMS.
|
|
||||||
|
|
||||||
1. INSTALLATION AND USE RIGHTS.
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
a) General. You may install and use the software and the included Microsoft
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
applications solely for internal development, testing and evaluation purposes.
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
Any distribution or production use requires a separate license as set forth in
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
Section 2.
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
b) Contributions. Microsoft welcomes contributions to this software. In the event
|
|
||||||
that you make a contribution to this software you will be required to agree to a
|
|
||||||
Contributor License Agreement (CLA) declaring that you have the right to, and
|
|
||||||
actually do, grant Microsoft the rights to use your contribution. For details,
|
|
||||||
visit https://cla.microsoft.com.
|
|
||||||
|
|
||||||
c) Included Microsoft Applications. The software includes other Microsoft
|
|
||||||
applications which are governed by the licenses embedded in or made available
|
|
||||||
with those applications.
|
|
||||||
|
|
||||||
d) Third Party Components. The software may include third party components with
|
|
||||||
separate legal notices or governed by other agreements, as may be described
|
|
||||||
within the software or in the ThirdPartyNotices file(s) accompanying the
|
|
||||||
software.
|
|
||||||
|
|
||||||
e) Competitive Benchmarking. If you are a direct competitor, and you access or use
|
|
||||||
the software for purposes of competitive benchmarking, analysis, or intelligence
|
|
||||||
gathering, you waive as against Microsoft, its subsidiaries, and its affiliated
|
|
||||||
companies (including prospectively) any competitive use, access, and
|
|
||||||
benchmarking test restrictions in the terms governing your software to the
|
|
||||||
extent your terms of use are, or purport to be, more restrictive than
|
|
||||||
Microsoft’s terms. If you do not waive any such purported restrictions in the
|
|
||||||
terms governing your software, you are not allowed to access or use this
|
|
||||||
software, and will not do so.
|
|
||||||
|
|
||||||
2. DISTRIBUTION AND PRODUCTION USE. If you have obtained and/or are developing on
|
|
||||||
microprocessor(s) and/or microcontroller(s) (“hardware”) listed in the file
|
|
||||||
named “LICENSED-HARDWARE.txt” included in the repository and/or distributed with
|
|
||||||
the software you have the following rights in and to the software solely when
|
|
||||||
used in combination with the hardware. In the event hardware is not listed in
|
|
||||||
the LICENSED-HARDWARE.txt file, you do not have the rights in this Section 2.
|
|
||||||
|
|
||||||
a) Distribution and Production Use Rights.
|
|
||||||
|
|
||||||
i. You may use the software in production (e.g. program the modified or unmodified
|
|
||||||
software to devices you own or control) and distribute (i.e. make available to
|
|
||||||
third parties) the modified or unmodified binary image produced from this code.
|
|
||||||
|
|
||||||
|
|
||||||
ii. You may permit your device distributors or developers to copy and distribute the
|
|
||||||
binary image as programmed or to be programmed to your devices.
|
|
||||||
|
|
||||||
iii. You may redistribute the unmodified or modified source to your device
|
|
||||||
distributors or developers. Modifications must be clearly marked. Any
|
|
||||||
redistribution in source code form must contain this license and any other
|
|
||||||
licenses that accompany the software.
|
|
||||||
|
|
||||||
b) Requirements. For any code you distribute, you must:
|
|
||||||
|
|
||||||
i. when distributed in binary form, except as embedded in a device, include with
|
|
||||||
such distribution the terms of this agreement;
|
|
||||||
|
|
||||||
ii. when distributed in source code form to distributors or developers of your
|
|
||||||
devices, include with such distribution the terms of this agreement; and
|
|
||||||
|
|
||||||
iii. indemnify, defend and hold harmless Microsoft from any claims, including
|
|
||||||
attorneys’ fees, related to the distribution or use of your devices, except to
|
|
||||||
the extent that any claim is based solely on the unmodified software.
|
|
||||||
|
|
||||||
c) Restrictions. You may not:
|
|
||||||
|
|
||||||
i. use or modify the software to create a competing real time operating system
|
|
||||||
software;
|
|
||||||
|
|
||||||
ii. remove any copyright notices or licenses contained in the software;
|
|
||||||
|
|
||||||
iii. use Microsoft’s trademarks or trade dress in your application in any way that
|
|
||||||
suggests your device or application comes from or is endorsed by Microsoft;
|
|
||||||
|
|
||||||
iv. transfer individual components, specific libraries, classes, functions or code
|
|
||||||
fragments of the software separately for purposes unrelated to the software; or
|
|
||||||
|
|
||||||
v. use or distribute the software in any way that would subject the software or
|
|
||||||
Microsoft’s intellectual property or technology to any other license terms.
|
|
||||||
|
|
||||||
3. SCOPE OF LICENSE. The software is licensed, not sold. Microsoft reserves all
|
|
||||||
other rights. Unless applicable law gives you more rights despite this
|
|
||||||
limitation, you will not (and have no right to):
|
|
||||||
|
|
||||||
a) remove, minimize, block, or modify any notices of Microsoft or its suppliers in
|
|
||||||
the software;
|
|
||||||
|
|
||||||
b) use the software in any way that is against the law or to create or propagate
|
|
||||||
malware; or
|
|
||||||
|
|
||||||
c) share, publish, distribute, or lease the software (except as permitted in
|
|
||||||
Section 2 above), or provide the software as a stand-alone offering for others
|
|
||||||
to use.
|
|
||||||
|
|
||||||
4. DATA. This software may interact with other Microsoft products that collect data
|
|
||||||
that is transmitted to Microsoft. To learn more about how Microsoft processes
|
|
||||||
personal data we collect, please see the Microsoft Privacy Statement at
|
|
||||||
https://go.microsoft.com/fwlink/?LinkId=248681.
|
|
||||||
|
|
||||||
5. EXPORT RESTRICTIONS. You must comply with all domestic and international export
|
|
||||||
laws and regulations that apply to the software, which include restrictions on
|
|
||||||
destinations, end users, and end use. For further information on export
|
|
||||||
restrictions, visit https://aka.ms/exporting.
|
|
||||||
|
|
||||||
6. SUPPORT SERVICES. Microsoft is not obligated under this agreement to provide any
|
|
||||||
support services for the software. Any support provided is “as is”, “with all
|
|
||||||
faults”, and without warranty of any kind.
|
|
||||||
|
|
||||||
7. UPDATES. Microsoft may periodically update the software. You may obtain updates
|
|
||||||
only from Microsoft or Microsoft-authorized sources. Updates may not include or
|
|
||||||
support all existing software features, services, or peripheral devices.
|
|
||||||
|
|
||||||
8. TERMINATION. Without prejudice to any other rights, Microsoft may terminate this
|
|
||||||
agreement if you fail to comply with any of its terms or conditions. In such
|
|
||||||
event, you must destroy all copies of the software and all of its component
|
|
||||||
parts.
|
|
||||||
|
|
||||||
9. ENTIRE AGREEMENT. This agreement, and any other terms Microsoft may provide for
|
|
||||||
supplements, updates, or third-party applications, is the entire agreement for
|
|
||||||
the software. To the extent you have entered into a separate agreement with
|
|
||||||
Microsoft relating specifically to the software, the terms in such agreement
|
|
||||||
shall control.
|
|
||||||
|
|
||||||
10. APPLICABLE LAW AND PLACE TO RESOLVE DISPUTES. If you acquired the software in
|
|
||||||
the United States or Canada, the laws of the state or province where you live
|
|
||||||
(or, if a business, where your principal place of business is located) govern
|
|
||||||
the interpretation of this agreement, claims for its breach, and all other
|
|
||||||
claims (including consumer protection, unfair competition, and tort claims),
|
|
||||||
regardless of conflict of laws principles. If you acquired the software in any
|
|
||||||
other country, its laws apply. If U.S. federal jurisdiction exists, you and
|
|
||||||
Microsoft consent to exclusive jurisdiction and venue in the federal court in
|
|
||||||
King County, Washington for all disputes heard in court. If not, you and
|
|
||||||
Microsoft consent to exclusive jurisdiction and venue in the Superior Court of
|
|
||||||
King County, Washington for all disputes heard in court.
|
|
||||||
|
|
||||||
11. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal
|
|
||||||
rights. You may have other rights, including consumer rights, under the laws of
|
|
||||||
your state or country. Separate and apart from your relationship with Microsoft,
|
|
||||||
you may also have rights with respect to the party from which you acquired the
|
|
||||||
software. This agreement does not change those other rights if the laws of your
|
|
||||||
state or country do not permit it to do so. For example, if you acquired the
|
|
||||||
software in one of the below regions, or mandatory country law applies, then the
|
|
||||||
following provisions apply to you:
|
|
||||||
|
|
||||||
a) Australia. You have statutory guarantees under the Australian Consumer Law and
|
|
||||||
nothing in this agreement is intended to affect those rights.
|
|
||||||
|
|
||||||
b) Germany and Austria.
|
|
||||||
|
|
||||||
i. Warranty. The properly licensed software will perform substantially as
|
|
||||||
described in any Microsoft materials that accompany the software. However,
|
|
||||||
Microsoft gives no contractual guarantee in relation to the licensed software.
|
|
||||||
|
|
||||||
ii. Limitation of Liability. In case of intentional conduct, gross negligence,
|
|
||||||
claims based on the Product Liability Act, as well as, in case of death or
|
|
||||||
personal or physical injury, Microsoft is liable according to the statutory law.
|
|
||||||
|
|
||||||
|
|
||||||
Subject to the foregoing clause ii., Microsoft will only be liable for slight
|
|
||||||
negligence if Microsoft is in breach of such material contractual obligations,
|
|
||||||
the fulfillment of which facilitate the due performance of this agreement, the
|
|
||||||
breach of which would endanger the purpose of this agreement and the compliance
|
|
||||||
with which a party may constantly trust in (so-called "cardinal obligations").
|
|
||||||
In other cases of slight negligence, Microsoft will not be liable for slight
|
|
||||||
negligence.
|
|
||||||
|
|
||||||
12. DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED “AS IS.” YOU BEAR THE RISK OF
|
|
||||||
USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES, OR CONDITIONS. TO
|
|
||||||
THE EXTENT PERMITTED UNDER APPLICABLE LAWS, MICROSOFT EXCLUDES ALL IMPLIED
|
|
||||||
WARRANTIES, INCLUDING MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND
|
|
||||||
NON-INFRINGEMENT.
|
|
||||||
|
|
||||||
13. LIMITATION ON AND EXCLUSION OF DAMAGES. IF YOU HAVE ANY BASIS FOR RECOVERING
|
|
||||||
DAMAGES DESPITE THE PRECEDING DISCLAIMER OF WARRANTY, YOU CAN RECOVER FROM
|
|
||||||
MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. $5.00. YOU CANNOT
|
|
||||||
RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, SPECIAL,
|
|
||||||
INDIRECT, OR INCIDENTAL DAMAGES.
|
|
||||||
|
|
||||||
This limitation applies to (a) anything related to the software, services,
|
|
||||||
content (including code) on third party Internet sites, or third party
|
|
||||||
applications; and (b) claims for breach of contract, warranty, guarantee, or
|
|
||||||
condition; strict liability, negligence, or other tort; or any other claim; in
|
|
||||||
each case to the extent permitted by applicable law.
|
|
||||||
|
|
||||||
It also applies even if Microsoft knew or should have known about the
|
|
||||||
possibility of the damages. The above limitation or exclusion may not apply to
|
|
||||||
you because your state, province, or country may not allow the exclusion or
|
|
||||||
limitation of incidental, consequential, or other damages.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Please note: As this software is distributed in Canada, some of the clauses in
|
|
||||||
this agreement are provided below in French.
|
|
||||||
|
|
||||||
Remarque: Ce logiciel étant distribué au Canada, certaines des clauses dans ce
|
|
||||||
contrat sont fournies ci-dessous en français.
|
|
||||||
|
|
||||||
EXONÉRATION DE GARANTIE. Le logiciel visé par une licence est offert « tel quel
|
|
||||||
». Toute utilisation de ce logiciel est à votre seule risque et péril. Microsoft
|
|
||||||
n’accorde aucune autre garantie expresse. Vous pouvez bénéficier de droits
|
|
||||||
additionnels en vertu du droit local sur la protection des consommateurs, que ce
|
|
||||||
contrat ne peut modifier. La ou elles sont permises par le droit locale, les
|
|
||||||
garanties implicites de qualité marchande, d’adéquation à un usage particulier
|
|
||||||
et d’absence de contrefaçon sont exclues.
|
|
||||||
|
|
||||||
LIMITATION DES DOMMAGES-INTÉRÊTS ET EXCLUSION DE RESPONSABILITÉ POUR LES
|
|
||||||
DOMMAGES. Vous pouvez obtenir de Microsoft et de ses fournisseurs une
|
|
||||||
indemnisation en cas de dommages directs uniquement à hauteur de 5,00 $ US. Vous
|
|
||||||
ne pouvez prétendre à aucune indemnisation pour les autres dommages, y compris
|
|
||||||
les dommages spéciaux, indirects ou accessoires et pertes de bénéfices.
|
|
||||||
|
|
||||||
Cette limitation concerne:
|
|
||||||
|
|
||||||
•tout ce qui est relié au logiciel, aux services ou au contenu (y compris le
|
|
||||||
code) figurant sur des sites Internet tiers ou dans des programmes tiers; et
|
|
||||||
|
|
||||||
•les réclamations au titre de violation de contrat ou de garantie, ou au titre
|
|
||||||
de responsabilité stricte, de négligence ou d’une autre faute dans la limite
|
|
||||||
autorisée par la loi en vigueur.
|
|
||||||
|
|
||||||
Elle s’applique également, même si Microsoft connaissait ou devrait connaître
|
|
||||||
l’éventualité d’un tel dommage. Si votre pays n’autorise pas l’exclusion ou la
|
|
||||||
limitation de responsabilité pour les dommages indirects, accessoires ou de
|
|
||||||
quelque nature que ce soit, il se peut que la limitation ou l’exclusion
|
|
||||||
ci-dessus ne s’appliquera pas à votre égard.
|
|
||||||
|
|
||||||
EFFET JURIDIQUE. Le présent contrat décrit certains droits juridiques. Vous
|
|
||||||
pourriez avoir d’autres droits prévus par les lois de votre pays. Le présent
|
|
||||||
contrat ne modifie pas les droits que vous confèrent les lois de votre pays si
|
|
||||||
celles-ci ne le permettent pas.
|
|
||||||
|
|||||||
@@ -1,31 +0,0 @@
|
|||||||
LICENSED HARDWARE LIST
|
|
||||||
|
|
||||||
Last Updated: 2020-10-15
|
|
||||||
|
|
||||||
Microsoft has entered into OEM Agreements with manufacturers of the following
|
|
||||||
microprocessors and microcontrollers (the “hardware”) to enable those
|
|
||||||
manufacturers to include and distribute Azure RTOS in certain hardware. If you
|
|
||||||
have obtained and/or are developing on microprocessor(s) and/or
|
|
||||||
microcontroller(s) (“hardware”) listed below you inherit the “Distribution and
|
|
||||||
Production Use” rights in Section 2 of the Microsoft Software License Terms for
|
|
||||||
Microsoft Azure RTOS. If hardware is not listed below, you do not have those
|
|
||||||
rights.
|
|
||||||
|
|
||||||
Microchip:
|
|
||||||
|
|
||||||
PIC 32-bit MCUs
|
|
||||||
SAM 32-bit MCUs
|
|
||||||
SAM 32-bit MPUs
|
|
||||||
|
|
||||||
NXP:
|
|
||||||
i.MX RT105x/6x cross over MCUs
|
|
||||||
|
|
||||||
Renesas:
|
|
||||||
|
|
||||||
Synergy Platform
|
|
||||||
RX Family of MCUs
|
|
||||||
RZ Family of MPUs
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
More coming soon. Please check back frequently for updates.
|
|
||||||
284
README.md
284
README.md
@@ -1,111 +1,225 @@
|
|||||||

|
# Eclipse ThreadX RTOS
|
||||||

|
|
||||||

|
|
||||||

|
|
||||||
|
|
||||||
# Azure RTOS ThreadX
|
This advanced real-time operating system (RTOS) is designed specifically for deeply embedded applications. Among the multiple benefits it provides are advanced scheduling facilities, message passing, interrupt management, and messaging services. Eclipse ThreadX RTOS has many advanced features, including picokernel architecture, preemption threshold, event chaining, and a rich set of system services.
|
||||||
|
|
||||||
This advanced real-time operating system (RTOS) is designed specifically for deeply embedded applications. Among the multiple benefits it provides are advanced scheduling facilities, message passing, interrupt management, and messaging services. Azure RTOS ThreadX has many advanced features, including picokernel architecture, preemption threshold, event chaining, and a rich set of system services.
|
Here are the key features and modules of ThreadX:
|
||||||
|
|
||||||
## Documentation
|

|
||||||
|
|
||||||
Documentation for this library can be found here: http://docs.microsoft.com/azure/rtos/threadx
|
## Getting Started
|
||||||
|
|
||||||
|
Eclipse ThreadX has been integrated to the semiconductor's SDKs and development environment. You can develop using the tools of choice from [STMicroelectronics](https://www.st.com/content/st_com/en/campaigns/x-cube-azrtos-azure-rtos-stm32.html), [NXP](https://www.nxp.com/design/software/embedded-software/azure-rtos-for-nxp-microcontrollers:AZURE-RTOS), [Renesas](https://github.com/renesas/azure-rtos) and [Microchip](https://mu.microchip.com/get-started-simplifying-your-iot-design-with-azure-rtos).
|
||||||
|
|
||||||
# Understanding inter-component dependencies
|
We also provide [getting started guide](https://github.com/eclipse-threadx/getting-started) and [samples](https://github.com/eclipse-threadx/samples) using development boards from semiconductors you can build and test with.
|
||||||
|
|
||||||
The main components of Azure RTOS are each provided in their own repository, but there are dependencies between them--shown in the following graph--that are important to understand when setting up your builds.
|
See [Overview of Eclipse ThreadX RTOS](https://github.com/eclipse-threadx/rtos-docs/blob/main/rtos-docs/threadx/overview-threadx.md) for the high-level overview.
|
||||||
|
|
||||||

|
## Repository Structure and Usage
|
||||||
|
### Directory layout
|
||||||
|
|
||||||
# Building and using the library
|
.
|
||||||
|
├── cmake # CMakelist files for building the project
|
||||||
|
├── common # Core ThreadX files
|
||||||
|
├── common_modules # Core ThreadX module files
|
||||||
|
├── common_smp # Core ThreadX SMP files
|
||||||
|
├── docs # Documentation supplements
|
||||||
|
├── ports # Architecture and compiler specific files. See below for directory breakdown
|
||||||
|
│ ├── cortex_m7
|
||||||
|
│ │ ├── iar # Example IAR compiler sample project
|
||||||
|
│ │ │ ├── example build # IAR workspace and sample project files
|
||||||
|
│ │ │ ├── inc # tx_port.h for this architecture
|
||||||
|
│ │ │ └── src # Source files for this architecture
|
||||||
|
│ │ ├── ac6 # Example ac6/Keil sample project
|
||||||
|
│ │ ├── gnu # Example gnu sample project
|
||||||
|
│ │ └── ...
|
||||||
|
│ └── ...
|
||||||
|
├── ports_modules # Architecture and compiler specific files for threadX modules
|
||||||
|
├── ports_smp # Architecture and compiler specific files for threadX SMP
|
||||||
|
├── samples # demo_threadx.c
|
||||||
|
└── utility # Test cases and utilities
|
||||||
|
|
||||||
## Prerequisites
|
|
||||||
|
|
||||||
Install the following tools:
|
|
||||||
|
|
||||||
* [CMake](https://cmake.org/download/) version 3.0 or later
|
|
||||||
* [GCC compilers for arm-none-eabi](https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads)
|
|
||||||
* [Ninja](https://ninja-build.org/)
|
|
||||||
|
|
||||||
## Cloning the repo
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ git clone https://github.com/azure-rtos/threadx.git
|
|
||||||
```
|
|
||||||
|
|
||||||
## Building as a static library
|
|
||||||
|
|
||||||
Each component of Azure RTOS comes with a composible CMake-based build system that supports many different MCUs and host systems. Integrating any of these components into your device app code is as simple as adding a git submodule and then including it in your build using the CMake command `add_subdirectory()`.
|
|
||||||
|
|
||||||
While the typical usage pattern is to include threadx into your device code source tree to be built & linked with your code, you can compile this project as a standalone static library to confirm your build is set up correctly.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ cmake -Bbuild -DCMAKE_TOOLCHAIN_FILE=cmake/cortex_m4.cmake -GNinja .
|
|
||||||
|
|
||||||
$ cmake --build ./build
|
|
||||||
```
|
|
||||||
|
|
||||||
NOTE: You will have to take the dependency graph above into account when building anything other than threadx itself.
|
|
||||||
|
|
||||||
# Repository Structure and Usage
|
|
||||||
|
|
||||||
## Branches & Releases
|
## Branches & Releases
|
||||||
|
|
||||||
The master branch has the most recent code with all new features and bug fixes. It does not represent the latest General Availability (GA) release of the library.
|
The master branch has the most recent code with all new features and bug fixes. It does not represent the latest General Availability (GA) release of the library. Each official release (preview or GA) will be tagged to mark the commit and push it into the Github releases tab, e.g. `v6.2-rel`.
|
||||||
|
|
||||||
## Releases
|
|
||||||
|
|
||||||
Each official release (preview or GA) will be tagged to mark the commit and push it into the Github releases tab, e.g. `v6.0-rel`.
|
|
||||||
|
|
||||||
## Directory layout
|
|
||||||
|
|
||||||
|
> When you see xx-xx-xxxx, 6.x or x.x in function header, this means the file is not officially released yet. They will be updated in the next release. See example below.
|
||||||
```
|
```
|
||||||
- cmake
|
/**************************************************************************/
|
||||||
- common
|
/* */
|
||||||
- inc
|
/* FUNCTION RELEASE */
|
||||||
- src
|
/* */
|
||||||
- ports
|
/* _tx_initialize_low_level Cortex-M23/GNU */
|
||||||
- cortex_m0/gnu
|
/* 6.x */
|
||||||
- inc
|
/* AUTHOR */
|
||||||
- src
|
/* */
|
||||||
- cortex_m3/gnu
|
/* Scott Larson, Microsoft Corporation */
|
||||||
- inc
|
/* */
|
||||||
- src
|
/* DESCRIPTION */
|
||||||
- cortex_m4/gnu
|
/* */
|
||||||
- inc
|
/* This function is responsible for any low-level processor */
|
||||||
- src
|
/* initialization, including setting up interrupt vectors, setting */
|
||||||
- cortex_m7/gnu
|
/* up a periodic timer interrupt source, saving the system stack */
|
||||||
- inc
|
/* pointer for use in ISR processing later, and finding the first */
|
||||||
- src
|
/* available RAM memory address for tx_application_define. */
|
||||||
- samples
|
/* */
|
||||||
|
/* INPUT */
|
||||||
|
/* */
|
||||||
|
/* None */
|
||||||
|
/* */
|
||||||
|
/* OUTPUT */
|
||||||
|
/* */
|
||||||
|
/* None */
|
||||||
|
/* */
|
||||||
|
/* CALLS */
|
||||||
|
/* */
|
||||||
|
/* None */
|
||||||
|
/* */
|
||||||
|
/* CALLED BY */
|
||||||
|
/* */
|
||||||
|
/* _tx_initialize_kernel_enter ThreadX entry function */
|
||||||
|
/* */
|
||||||
|
/* RELEASE HISTORY */
|
||||||
|
/* */
|
||||||
|
/* DATE NAME DESCRIPTION */
|
||||||
|
/* */
|
||||||
|
/* 09-30-2020 Scott Larson Initial Version 6.1 */
|
||||||
|
/* xx-xx-xxxx Scott Larson Include tx_user.h, */
|
||||||
|
/* resulting in version 6.x */
|
||||||
|
/* */
|
||||||
|
/**************************************************************************/
|
||||||
```
|
```
|
||||||
|
|
||||||
# Security
|
## Supported Architecture Ports
|
||||||
|
|
||||||
Azure RTOS provides OEMs with components to secure communication and to create code and data isolation using underlying MCU/MPU hardware protection mechanisms. It is ultimately the responsibility of the device builder to ensure the device fully meets the evolving security requirements associated with its specific use case.
|
### ThreadX
|
||||||
|
```
|
||||||
|
arc_em cortex_a12 cortex_m0 cortex_r4
|
||||||
|
arc_hs cortex_a15 cortex_m23 cortex_r5
|
||||||
|
arm11 cortex_a17 cortex_m3 cortex_r7
|
||||||
|
arm9 cortex_a34 cortex_m33
|
||||||
|
c667x cortex_a35 cortex_m4
|
||||||
|
linux cortex_a5 cortex_m55
|
||||||
|
risc-v32 cortex_a53 cortex_m7
|
||||||
|
rxv1 cortex_a55 cortex_m85
|
||||||
|
rxv2 cortex_a57
|
||||||
|
rxv3 cortex_a5x
|
||||||
|
win32 cortex_a65
|
||||||
|
xtensa cortex_a65ae
|
||||||
|
cortex_a7
|
||||||
|
cortex_a72
|
||||||
|
cortex_a73
|
||||||
|
cortex_a75
|
||||||
|
cortex_a76
|
||||||
|
cortex_a76ae
|
||||||
|
cortex_a77
|
||||||
|
cortex_a8
|
||||||
|
cortex_a9
|
||||||
|
```
|
||||||
|
|
||||||
# Licensing
|
### ThreadX Modules
|
||||||
|
[Eclipse ThreadX Modules](https://github.com/eclipse-threadx/rtos-docs/blob/main/rtos-docs/threadx-modules/chapter1.md) component provides an infrastructure for applications to dynamically load modules that are built separately from the resident portion of the application.
|
||||||
|
```
|
||||||
|
cortex_a35
|
||||||
|
cortex_a35_smp
|
||||||
|
cortex_a7
|
||||||
|
cortex_m0+
|
||||||
|
cortex_m23
|
||||||
|
cortex_m3
|
||||||
|
cortex_m33
|
||||||
|
cortex_m4
|
||||||
|
cortex_m7
|
||||||
|
cortex_r4
|
||||||
|
rxv2
|
||||||
|
```
|
||||||
|
|
||||||
License terms for using Azure RTOS are defined in the LICENSE.txt file of this repo. Please refer to this file for all definitive licensing information. No additional license fees are required for deploying Azure RTOS on hardware defined in the LICENSED-HARDWARE.txt file. If you are using hardware not defined in the LICENSED-HARDWARE.txt file or have licensing questions in general, please contact Microsoft directly at https://azure-rtos.ms-iot-contact.com/
|
### ThreadX SMP
|
||||||
|
[Eclipse ThreadX SMP](https://github.com/eclipse-threadx/rtos-docs/blob/main/rtos-docs/threadx/threadx-smp/chapter1.md) is a high-performance real-time SMP kernel designed specifically for embedded applications.
|
||||||
|
```
|
||||||
|
arc_hs_smp
|
||||||
|
cortex_a34_smp
|
||||||
|
cortex_a35_smp
|
||||||
|
cortex_a53_smp
|
||||||
|
cortex_a55_smp
|
||||||
|
cortex_a57_smp
|
||||||
|
cortex_a5x_smp
|
||||||
|
cortex_a5_smp
|
||||||
|
cortex_a65ae_smp
|
||||||
|
cortex_a65_smp
|
||||||
|
cortex_a72_smp
|
||||||
|
cortex_a73_smp
|
||||||
|
cortex_a75_smp
|
||||||
|
cortex_a76ae_smp
|
||||||
|
cortex_a76_smp
|
||||||
|
cortex_a77_smp
|
||||||
|
cortex_a78_smp
|
||||||
|
cortex_a7_smp
|
||||||
|
cortex_a9_smp
|
||||||
|
linux
|
||||||
|
```
|
||||||
|
|
||||||
# Contribution, feedback, issues, and professional support
|
## Adaptation layer for ThreadX
|
||||||
|
|
||||||
If you encounter any bugs, have suggestions for new features, or if you would like to become an active contributor to this project, please follow the instructions provided in the contribution guideline for the corresponding repo.
|
ThreadX is an advanced real-time operating system (RTOS) designed specifically for deeply embedded applications. To help ease application migration to ThreadX RTOS, Eclipse ThreadX provides [adaption layers](https://github.com/eclipse-threadx/threadx/tree/master/utility/rtos_compatibility_layers) for various legacy RTOS APIs (FreeRTOS, POSIX, OSEK, etc.).
|
||||||
|
|
||||||
For basic support, click Issues in the command bar or post a question to [Stack Overflow](http://stackoverflow.com/questions/tagged/azure-rtos+threadx) using the `threadx` and `azure-rtos` tags.
|
## Component dependencies
|
||||||
|
|
||||||
Professional support plans (https://azure.microsoft.com/en-us/support/options/) are available from Microsoft.
|
The main components of ThreadX RTOS are each provided in their own repository, but there are dependencies between them, as shown in the following graph. This is important to understand when setting up your builds.
|
||||||
|
|
||||||
# Additional Resources
|

|
||||||
|
|
||||||
The following are references to additional Azure RTOS and Azure IoT in general:
|
> You will have to take the dependency graph above into account when building anything other than ThreadX itself.
|
||||||
| | |
|
|
||||||
|---|---|
|
### Building and using the library
|
||||||
| TraceX Installer | https://aka.ms/azrtos-tracex-installer |
|
|
||||||
| Azure RTOS Documenation and Guides: | https://docs.microsoft.com/azure/rtos |
|
Instruction for building the ThreadX as static library using Arm GNU Toolchain and CMake. If you are using toolchain and IDE from semiconductor, you might follow its own instructions to use ThreadX RTOS components as explained in the [Getting Started](#getting-started) section.
|
||||||
| Azure RTOS Website: | https://azure.microsoft.com/services/rtos/ |
|
|
||||||
| Azure RTOS Sales Questions: | https://azure-rtos.ms-iot-contact.com/ |
|
1. Install the following tools:
|
||||||
| For technical questions check out Microsoft Q/A for Azure IoT: | https://aka.ms/QnA/azure-rtos |
|
|
||||||
| Internet of Things Show for latest announcements and online training: | https://aka.ms/iotshow |
|
* [CMake](https://cmake.org/download/) version 3.0 or later
|
||||||
| IoT Tech Community: | https://aka.ms/community/azure-rtos |
|
* [Arm GNU Toolchain for arm-none-eabi](https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads)
|
||||||
|
* [Ninja](https://ninja-build.org/)
|
||||||
|
|
||||||
|
1. Cloning the repo
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ git clone https://github.com/eclipse-threadx/threadx.git
|
||||||
|
```
|
||||||
|
|
||||||
|
1. Define the features and addons you need in `tx_user.h` and build together with the component source code. You can refer to [`tx_user_sample.h`](https://github.com/eclipse-threadx/threadx/blob/master/common/inc/tx_user_sample.h) as an example.
|
||||||
|
|
||||||
|
1. Building as a static library
|
||||||
|
|
||||||
|
Each component of ThreadX RTOS comes with a composable CMake-based build system that supports many different MCUs and host systems. Integrating any of these components into your device app code is as simple as adding a git submodule and then including it in your build using the CMake `add_subdirectory()`.
|
||||||
|
|
||||||
|
While the typical usage pattern is to include ThreadX into your device code source tree to be built & linked with your code, you can compile this project as a standalone static library to confirm your build is set up correctly.
|
||||||
|
|
||||||
|
An example of building the library for Cortex-M4:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ cmake -Bbuild -GNinja -DCMAKE_TOOLCHAIN_FILE=cmake/cortex_m4.cmake .
|
||||||
|
|
||||||
|
$ cmake --build ./build
|
||||||
|
```
|
||||||
|
|
||||||
|
## Licensing
|
||||||
|
|
||||||
|
License terms for using Eclipse ThreadX are defined in the LICENSE.txt file of this repo. Please refer to this file for all definitive licensing information for all content, incl. the history of this repo.
|
||||||
|
|
||||||
|
## Resources
|
||||||
|
|
||||||
|
The following are references to additional ThreadX RTOS resources:
|
||||||
|
|
||||||
|
- **Product introduction**: https://github.com/eclipse-threadx/rtos-docs
|
||||||
|
- **Product issues and bugs, or feature requests**: https://github.com/eclipse-threadx/threadx/issues
|
||||||
|
- **TraceX Installer**: https://aka.ms/azrtos-tracex-installer
|
||||||
|
|
||||||
|
You can also check [previous questions](https://stackoverflow.com/questions/tagged/threadx-rtos+threadx) or ask new ones on StackOverflow using the `threadx-rtos` and `threadx` tags.
|
||||||
|
|
||||||
|
## Security
|
||||||
|
|
||||||
|
Eclipse ThreadX provides OEMs with components to secure communication and to create code and data isolation using underlying MCU/MPU hardware protection mechanisms. It is ultimately the responsibility of the device builder to ensure the device fully meets the evolving security requirements associated with its specific use case.
|
||||||
|
|
||||||
|
## Contribution
|
||||||
|
|
||||||
|
Please follow the instructions provided in the [CONTRIBUTING.md](./CONTRIBUTING.md) for the corresponding repository.
|
||||||
|
|||||||
39
SECURITY.md
39
SECURITY.md
@@ -1,35 +1,20 @@
|
|||||||
## Security
|
# Security Policy
|
||||||
|
|
||||||
Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/).
|
## Supported Versions
|
||||||
|
|
||||||
If you believe you have found a security vulnerability in any Microsoft-owned repository that meets Microsoft's [Microsoft's definition of a security vulnerability](https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc751383(v=technet.10)), please report it to us as described below.
|
| Version | Supported |
|
||||||
|
| ------- | ------------------ |
|
||||||
|
| 6.4.x | :white_check_mark: |
|
||||||
|
|
||||||
## Reporting Security Issues
|
## Reporting a Vulnerability
|
||||||
|
|
||||||
**Please do not report security vulnerabilities through public GitHub issues.**
|
If you think you have found a vulnerability in <project> you can report it using one of the following ways:
|
||||||
|
|
||||||
Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://msrc.microsoft.com/create-report).
|
* Contact the [Eclipse Foundation Security Team](mailto:security@eclipse-foundation.org)
|
||||||
|
* [Report a Vulnerability](https://github.com/eclipse-threadx/threadx/security/advisories/new)
|
||||||
|
|
||||||
If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the the [Microsoft Security Response Center PGP Key page](https://www.microsoft.com/en-us/msrc/pgp-key-msrc).
|
You can find more information about reporting and disclosure at the [Eclipse Foundation Security page](https://www.eclipse.org/security/).
|
||||||
|
|
||||||
You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://www.microsoft.com/msrc).
|
## Security Policy
|
||||||
|
|
||||||
Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue:
|
This project follows [Eclipse Foundation Vulnerability Reporting Policy](https://www.eclipse.org/security/policy/).
|
||||||
|
|
||||||
* Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.)
|
|
||||||
* Full paths of source file(s) related to the manifestation of the issue
|
|
||||||
* The location of the affected source code (tag/branch/commit or direct URL)
|
|
||||||
* Any special configuration required to reproduce the issue
|
|
||||||
* Step-by-step instructions to reproduce the issue
|
|
||||||
* Proof-of-concept or exploit code (if possible)
|
|
||||||
* Impact of the issue, including how an attacker might exploit the issue
|
|
||||||
|
|
||||||
This information will help us triage your report more quickly.
|
|
||||||
|
|
||||||
## Preferred Languages
|
|
||||||
|
|
||||||
We prefer all communications to be in English.
|
|
||||||
|
|
||||||
## Policy
|
|
||||||
|
|
||||||
Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://www.microsoft.com/en-us/msrc/cvd).
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
|
|||||||
|
|
||||||
set(CMAKE_C_FLAGS "${MCPU_FLAGS} ${VFP_FLAGS} ${SPEC_FLAGS} -fdata-sections -ffunction-sections -mlong-calls" CACHE INTERNAL "c compiler flags")
|
set(CMAKE_C_FLAGS "${MCPU_FLAGS} ${VFP_FLAGS} ${SPEC_FLAGS} -fdata-sections -ffunction-sections -mlong-calls" CACHE INTERNAL "c compiler flags")
|
||||||
set(CMAKE_CXX_FLAGS "${MCPU_FLAGS} ${VFP_FLAGS} -fdata-sections -ffunction-sections -fno-rtti -fno-exceptions -mlong-calls" CACHE INTERNAL "cxx compiler flags")
|
set(CMAKE_CXX_FLAGS "${MCPU_FLAGS} ${VFP_FLAGS} -fdata-sections -ffunction-sections -fno-rtti -fno-exceptions -mlong-calls" CACHE INTERNAL "cxx compiler flags")
|
||||||
set(CMAKE_ASM_FLAGS "${MCPU_FLAGS} -x assembler-with-cpp" CACHE INTERNAL "asm compiler flags")
|
set(CMAKE_ASM_FLAGS "${MCPU_FLAGS} ${VFP_FLAGS} -x assembler-with-cpp" CACHE INTERNAL "asm compiler flags")
|
||||||
set(CMAKE_EXE_LINKER_FLAGS "${MCPU_FLAGS} ${LD_FLAGS} -Wl,--gc-sections" CACHE INTERNAL "exe link flags")
|
set(CMAKE_EXE_LINKER_FLAGS "${MCPU_FLAGS} ${LD_FLAGS} -Wl,--gc-sections" CACHE INTERNAL "exe link flags")
|
||||||
|
|
||||||
SET(CMAKE_C_FLAGS_DEBUG "-Og -g -ggdb3" CACHE INTERNAL "c debug compiler flags")
|
SET(CMAKE_C_FLAGS_DEBUG "-Og -g -ggdb3" CACHE INTERNAL "c debug compiler flags")
|
||||||
|
|||||||
29
cmake/riscv64-unknown-elf.cmake
Normal file
29
cmake/riscv64-unknown-elf.cmake
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
# Toolchain settings
|
||||||
|
set(CMAKE_C_COMPILER riscv64-unknown-elf-gcc)
|
||||||
|
set(CMAKE_CXX_COMPILER riscv64-unknown-elf-g++)
|
||||||
|
set(AS riscv64-unknown-elf-as)
|
||||||
|
set(AR riscv64-unknown-elf-ar)
|
||||||
|
set(OBJCOPY riscv64-unknown-elf-objcopy)
|
||||||
|
set(OBJDUMP riscv64-unknown-elf-objdump)
|
||||||
|
set(SIZE riscv64-unknown-elf-size)
|
||||||
|
|
||||||
|
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
||||||
|
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
||||||
|
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
||||||
|
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
|
||||||
|
|
||||||
|
# this makes the test compiles use static library option so that we don't need to pre-set linker flags and scripts
|
||||||
|
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
|
||||||
|
|
||||||
|
set(CMAKE_C_FLAGS "${CFLAGS}" CACHE INTERNAL "c compiler flags")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CXXFLAGS}" CACHE INTERNAL "cxx compiler flags")
|
||||||
|
set(CMAKE_ASM_FLAGS "${ASFLAGS} -D__ASSEMBLER__" CACHE INTERNAL "asm compiler flags")
|
||||||
|
set(CMAKE_EXE_LINKER_FLAGS "${LDFLAGS}" CACHE INTERNAL "exe link flags")
|
||||||
|
|
||||||
|
SET(CMAKE_C_FLAGS_DEBUG "-Og -g -ggdb3" CACHE INTERNAL "c debug compiler flags")
|
||||||
|
SET(CMAKE_CXX_FLAGS_DEBUG "-Og -g -ggdb3" CACHE INTERNAL "cxx debug compiler flags")
|
||||||
|
SET(CMAKE_ASM_FLAGS_DEBUG "-g -ggdb3" CACHE INTERNAL "asm debug compiler flags")
|
||||||
|
|
||||||
|
SET(CMAKE_C_FLAGS_RELEASE "-O3" CACHE INTERNAL "c release compiler flags")
|
||||||
|
SET(CMAKE_CXX_FLAGS_RELEASE "-O3" CACHE INTERNAL "cxx release compiler flags")
|
||||||
|
SET(CMAKE_ASM_FLAGS_RELEASE "" CACHE INTERNAL "asm release compiler flags")
|
||||||
12
cmake/riscv64_gnu.cmake
Normal file
12
cmake/riscv64_gnu.cmake
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
# Name of the target
|
||||||
|
set(CMAKE_SYSTEM_NAME Generic)
|
||||||
|
set(CMAKE_SYSTEM_PROCESSOR risc-v64)
|
||||||
|
|
||||||
|
set(THREADX_ARCH "risc-v64")
|
||||||
|
set(THREADX_TOOLCHAIN "gnu")
|
||||||
|
set(ARCH_FLAGS "-g -march=rv64gc -mabi=lp64d -mcmodel=medany")
|
||||||
|
set(CFLAGS "${ARCH_FLAGS}")
|
||||||
|
set(ASFLAGS "${ARCH_FLAGS}")
|
||||||
|
set(LDFLAGS "${ARCH_FLAGS}")
|
||||||
|
|
||||||
|
include(${CMAKE_CURRENT_LIST_DIR}/riscv64-unknown-elf.cmake)
|
||||||
@@ -202,6 +202,7 @@ target_sources(${PROJECT_NAME}
|
|||||||
|
|
||||||
# Add the Common/inc directory to the project include list
|
# Add the Common/inc directory to the project include list
|
||||||
target_include_directories(${PROJECT_NAME}
|
target_include_directories(${PROJECT_NAME}
|
||||||
|
SYSTEM
|
||||||
PUBLIC
|
PUBLIC
|
||||||
${CMAKE_CURRENT_LIST_DIR}/inc
|
${CMAKE_CURRENT_LIST_DIR}/inc
|
||||||
)
|
)
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -56,12 +55,12 @@
|
|||||||
#define TX_BLOCK_POOL_ID ((ULONG) 0x424C4F43)
|
#define TX_BLOCK_POOL_ID ((ULONG) 0x424C4F43)
|
||||||
|
|
||||||
|
|
||||||
/* Determine if in-line component initialization is supported by the
|
/* Determine if in-line component initialization is supported by the
|
||||||
caller. */
|
caller. */
|
||||||
|
|
||||||
#ifdef TX_INVOKE_INLINE_INITIALIZATION
|
#ifdef TX_INVOKE_INLINE_INITIALIZATION
|
||||||
|
|
||||||
/* Yes, in-line initialization is supported, remap the block memory pool
|
/* Yes, in-line initialization is supported, remap the block memory pool
|
||||||
initialization function. */
|
initialization function. */
|
||||||
|
|
||||||
#ifndef TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO
|
#ifndef TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -68,12 +67,12 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Determine if in-line component initialization is supported by the
|
/* Determine if in-line component initialization is supported by the
|
||||||
caller. */
|
caller. */
|
||||||
|
|
||||||
#ifdef TX_INVOKE_INLINE_INITIALIZATION
|
#ifdef TX_INVOKE_INLINE_INITIALIZATION
|
||||||
|
|
||||||
/* Yes, in-line initialization is supported, remap the byte memory pool
|
/* Yes, in-line initialization is supported, remap the byte memory pool
|
||||||
initialization function. */
|
initialization function. */
|
||||||
|
|
||||||
#ifndef TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO
|
#ifndef TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -58,11 +57,11 @@
|
|||||||
#define TX_EVENT_FLAGS_CLEAR_MASK ((UINT) 0x1)
|
#define TX_EVENT_FLAGS_CLEAR_MASK ((UINT) 0x1)
|
||||||
|
|
||||||
|
|
||||||
/* Determine if in-line component initialization is supported by the
|
/* Determine if in-line component initialization is supported by the
|
||||||
caller. */
|
caller. */
|
||||||
#ifdef TX_INVOKE_INLINE_INITIALIZATION
|
#ifdef TX_INVOKE_INLINE_INITIALIZATION
|
||||||
|
|
||||||
/* Yes, in-line initialization is supported, remap the event flag initialization
|
/* Yes, in-line initialization is supported, remap the event flag initialization
|
||||||
function. */
|
function. */
|
||||||
|
|
||||||
#ifndef TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO
|
#ifndef TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -67,15 +66,15 @@ VOID _tx_initialize_low_level(VOID);
|
|||||||
|
|
||||||
/* Define the macro for adding additional port-specific global data. This macro is defined
|
/* Define the macro for adding additional port-specific global data. This macro is defined
|
||||||
as white space, unless defined by tx_port.h. */
|
as white space, unless defined by tx_port.h. */
|
||||||
|
|
||||||
#ifndef TX_PORT_SPECIFIC_DATA
|
#ifndef TX_PORT_SPECIFIC_DATA
|
||||||
#define TX_PORT_SPECIFIC_DATA
|
#define TX_PORT_SPECIFIC_DATA
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Define the macro for adding additional port-specific pre and post initialization processing.
|
/* Define the macro for adding additional port-specific pre and post initialization processing.
|
||||||
These macros is defined as white space, unless defined by tx_port.h. */
|
These macros is defined as white space, unless defined by tx_port.h. */
|
||||||
|
|
||||||
#ifndef TX_PORT_SPECIFIC_PRE_INITIALIZATION
|
#ifndef TX_PORT_SPECIFIC_PRE_INITIALIZATION
|
||||||
#define TX_PORT_SPECIFIC_PRE_INITIALIZATION
|
#define TX_PORT_SPECIFIC_PRE_INITIALIZATION
|
||||||
#endif
|
#endif
|
||||||
@@ -102,9 +101,9 @@ VOID _tx_initialize_low_level(VOID);
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Define the unused memory pointer. The value of the first available
|
/* Define the unused memory pointer. The value of the first available
|
||||||
memory address is placed in this variable in the low-level
|
memory address is placed in this variable in the low-level
|
||||||
initialization function. The content of this variable is passed
|
initialization function. The content of this variable is passed
|
||||||
to the application's system definition function. */
|
to the application's system definition function. */
|
||||||
|
|
||||||
INITIALIZE_DECLARE VOID *_tx_initialize_unused_memory;
|
INITIALIZE_DECLARE VOID *_tx_initialize_unused_memory;
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -56,12 +55,12 @@
|
|||||||
#define TX_MUTEX_ID ((ULONG) 0x4D555445)
|
#define TX_MUTEX_ID ((ULONG) 0x4D555445)
|
||||||
|
|
||||||
|
|
||||||
/* Determine if in-line component initialization is supported by the
|
/* Determine if in-line component initialization is supported by the
|
||||||
caller. */
|
caller. */
|
||||||
|
|
||||||
#ifdef TX_INVOKE_INLINE_INITIALIZATION
|
#ifdef TX_INVOKE_INLINE_INITIALIZATION
|
||||||
|
|
||||||
/* Yes, in-line initialization is supported, remap the mutex initialization
|
/* Yes, in-line initialization is supported, remap the mutex initialization
|
||||||
function. */
|
function. */
|
||||||
|
|
||||||
#ifndef TX_MUTEX_ENABLE_PERFORMANCE_INFO
|
#ifndef TX_MUTEX_ENABLE_PERFORMANCE_INFO
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -56,11 +55,11 @@
|
|||||||
#define TX_QUEUE_ID ((ULONG) 0x51554555)
|
#define TX_QUEUE_ID ((ULONG) 0x51554555)
|
||||||
|
|
||||||
|
|
||||||
/* Determine if in-line component initialization is supported by the
|
/* Determine if in-line component initialization is supported by the
|
||||||
caller. */
|
caller. */
|
||||||
#ifdef TX_INVOKE_INLINE_INITIALIZATION
|
#ifdef TX_INVOKE_INLINE_INITIALIZATION
|
||||||
|
|
||||||
/* Yes, in-line initialization is supported, remap the queue initialization
|
/* Yes, in-line initialization is supported, remap the queue initialization
|
||||||
function. */
|
function. */
|
||||||
|
|
||||||
#ifndef TX_QUEUE_ENABLE_PERFORMANCE_INFO
|
#ifndef TX_QUEUE_ENABLE_PERFORMANCE_INFO
|
||||||
@@ -85,7 +84,7 @@ VOID _tx_queue_initialize(VOID);
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Define the message copy macro. Note that the source and destination
|
/* Define the message copy macro. Note that the source and destination
|
||||||
pointers must be modified since they are used subsequently. */
|
pointers must be modified since they are used subsequently. */
|
||||||
|
|
||||||
#ifndef TX_QUEUE_MESSAGE_COPY
|
#ifndef TX_QUEUE_MESSAGE_COPY
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -56,10 +55,10 @@
|
|||||||
#define TX_SEMAPHORE_ID ((ULONG) 0x53454D41)
|
#define TX_SEMAPHORE_ID ((ULONG) 0x53454D41)
|
||||||
|
|
||||||
|
|
||||||
/* Determine if in-line component initialization is supported by the
|
/* Determine if in-line component initialization is supported by the
|
||||||
caller. */
|
caller. */
|
||||||
#ifdef TX_INVOKE_INLINE_INITIALIZATION
|
#ifdef TX_INVOKE_INLINE_INITIALIZATION
|
||||||
/* Yes, in-line initialization is supported, remap the
|
/* Yes, in-line initialization is supported, remap the
|
||||||
semaphore initialization function. */
|
semaphore initialization function. */
|
||||||
#ifndef TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO
|
#ifndef TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO
|
||||||
#define _tx_semaphore_initialize() \
|
#define _tx_semaphore_initialize() \
|
||||||
@@ -76,7 +75,7 @@
|
|||||||
#endif
|
#endif
|
||||||
#define TX_SEMAPHORE_INIT
|
#define TX_SEMAPHORE_INIT
|
||||||
#else
|
#else
|
||||||
/* No in-line initialization is supported, use standard
|
/* No in-line initialization is supported, use standard
|
||||||
function call. */
|
function call. */
|
||||||
VOID _tx_semaphore_initialize(VOID);
|
VOID _tx_semaphore_initialize(VOID);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -26,7 +25,7 @@
|
|||||||
/* COMPONENT DEFINITION RELEASE */
|
/* COMPONENT DEFINITION RELEASE */
|
||||||
/* */
|
/* */
|
||||||
/* tx_thread.h PORTABLE C */
|
/* tx_thread.h PORTABLE C */
|
||||||
/* 6.1 */
|
/* 6.1.9 */
|
||||||
/* AUTHOR */
|
/* AUTHOR */
|
||||||
/* */
|
/* */
|
||||||
/* William E. Lamie, Microsoft Corporation */
|
/* William E. Lamie, Microsoft Corporation */
|
||||||
@@ -44,6 +43,13 @@
|
|||||||
/* 05-19-2020 William E. Lamie Initial Version 6.0 */
|
/* 05-19-2020 William E. Lamie Initial Version 6.0 */
|
||||||
/* 09-30-2020 Yuxin Zhou Modified comment(s), */
|
/* 09-30-2020 Yuxin Zhou Modified comment(s), */
|
||||||
/* resulting in version 6.1 */
|
/* resulting in version 6.1 */
|
||||||
|
/* 11-09-2020 Yuxin Zhou Modified comment(s), and */
|
||||||
|
/* moved TX_THREAD_GET_SYSTEM_ */
|
||||||
|
/* STATE to tx_api.h, */
|
||||||
|
/* resulting in version 6.1.2 */
|
||||||
|
/* 10-15-2021 Scott Larson Modified comment(s), improved */
|
||||||
|
/* stack check error handling, */
|
||||||
|
/* resulting in version 6.1.9 */
|
||||||
/* */
|
/* */
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
|
|
||||||
@@ -86,36 +92,37 @@
|
|||||||
|
|
||||||
/* Define state change macro that can be used by run-mode debug agents to keep track of thread
|
/* Define state change macro that can be used by run-mode debug agents to keep track of thread
|
||||||
state changes. By default, it is mapped to white space. */
|
state changes. By default, it is mapped to white space. */
|
||||||
|
|
||||||
#ifndef TX_THREAD_STATE_CHANGE
|
#ifndef TX_THREAD_STATE_CHANGE
|
||||||
#define TX_THREAD_STATE_CHANGE(a, b)
|
#define TX_THREAD_STATE_CHANGE(a, b)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Define the macro to get the current thread pointer. This is particularly useful in SMP
|
/* Define the macro to get the current thread pointer. This is particularly useful in SMP
|
||||||
versions of ThreadX to add additional processing. The default implementation is to simply
|
versions of ThreadX to add additional processing. The default implementation is to simply
|
||||||
access the global current thread pointer directly. */
|
access the global current thread pointer directly. */
|
||||||
|
|
||||||
#ifndef TX_THREAD_GET_CURRENT
|
#ifndef TX_THREAD_GET_CURRENT
|
||||||
#define TX_THREAD_GET_CURRENT(a) (a) = _tx_thread_current_ptr;
|
#define TX_THREAD_GET_CURRENT(a) (a) = _tx_thread_current_ptr;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Define the macro to set the current thread pointer. This is particularly useful in SMP
|
/* Define the macro to set the current thread pointer. This is particularly useful in SMP
|
||||||
versions of ThreadX to add additional processing. The default implementation is to simply
|
versions of ThreadX to add additional processing. The default implementation is to simply
|
||||||
access the global current thread pointer directly. */
|
access the global current thread pointer directly. */
|
||||||
|
|
||||||
#ifndef TX_THREAD_SET_CURRENT
|
#ifndef TX_THREAD_SET_CURRENT
|
||||||
#define TX_THREAD_SET_CURRENT(a) _tx_thread_current_ptr = (a);
|
#define TX_THREAD_SET_CURRENT(a) _tx_thread_current_ptr = (a);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Define the get system state macro. By default, it simply maps to the variable _tx_thread_system_state. */
|
/* Define the get system state macro. By default, it simply maps to the variable _tx_thread_system_state. */
|
||||||
|
/* This symbol is moved to tx_api.h. Therefore removed from this file.
|
||||||
#ifndef TX_THREAD_GET_SYSTEM_STATE
|
#ifndef TX_THREAD_GET_SYSTEM_STATE
|
||||||
#define TX_THREAD_GET_SYSTEM_STATE() _tx_thread_system_state
|
#define TX_THREAD_GET_SYSTEM_STATE() _tx_thread_system_state
|
||||||
#endif
|
#endif
|
||||||
|
*/
|
||||||
|
|
||||||
/* Define the check for whether or not to call the _tx_thread_system_return function. A non-zero value
|
/* Define the check for whether or not to call the _tx_thread_system_return function. A non-zero value
|
||||||
indicates that _tx_thread_system_return should not be called. */
|
indicates that _tx_thread_system_return should not be called. */
|
||||||
@@ -140,10 +147,10 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Define the lowest bit set macro. Note, that this may be overridden
|
/* Define the lowest bit set macro. Note, that this may be overridden
|
||||||
by a port specific definition if there is supporting assembly language
|
by a port specific definition if there is supporting assembly language
|
||||||
instructions in the architecture. */
|
instructions in the architecture. */
|
||||||
|
|
||||||
#ifndef TX_LOWEST_SET_BIT_CALCULATE
|
#ifndef TX_LOWEST_SET_BIT_CALCULATE
|
||||||
#define TX_LOWEST_SET_BIT_CALCULATE(m, b) \
|
#define TX_LOWEST_SET_BIT_CALCULATE(m, b) \
|
||||||
(b) = ((ULONG) 0); \
|
(b) = ((ULONG) 0); \
|
||||||
@@ -208,9 +215,9 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Define the default thread stack checking. This can be overridden by
|
/* Define the default thread stack checking. This can be overridden by
|
||||||
a particular port, which is necessary if the stack growth is from
|
a particular port, which is necessary if the stack growth is from
|
||||||
low address to high address (the default logic is for stacks that
|
low address to high address (the default logic is for stacks that
|
||||||
grow from high address to low address. */
|
grow from high address to low address. */
|
||||||
|
|
||||||
#ifndef TX_THREAD_STACK_CHECK
|
#ifndef TX_THREAD_STACK_CHECK
|
||||||
@@ -307,7 +314,7 @@ THREAD_DECLARE TX_THREAD * _tx_thread_current_ptr;
|
|||||||
|
|
||||||
|
|
||||||
/* Define the variable that holds the next thread to execute. It is important
|
/* Define the variable that holds the next thread to execute. It is important
|
||||||
to remember that this is not necessarily equal to the current thread
|
to remember that this is not necessarily equal to the current thread
|
||||||
pointer. */
|
pointer. */
|
||||||
|
|
||||||
THREAD_DECLARE TX_THREAD * _tx_thread_execute_ptr;
|
THREAD_DECLARE TX_THREAD * _tx_thread_execute_ptr;
|
||||||
@@ -324,7 +331,7 @@ THREAD_DECLARE ULONG _tx_thread_created_count;
|
|||||||
|
|
||||||
|
|
||||||
/* Define the current state variable. When this value is 0, a thread
|
/* Define the current state variable. When this value is 0, a thread
|
||||||
is executing or the system is idle. Other values indicate that
|
is executing or the system is idle. Other values indicate that
|
||||||
interrupt or initialization processing is active. This variable is
|
interrupt or initialization processing is active. This variable is
|
||||||
initialized to TX_INITIALIZE_IN_PROGRESS to indicate initialization is
|
initialized to TX_INITIALIZE_IN_PROGRESS to indicate initialization is
|
||||||
active. */
|
active. */
|
||||||
@@ -333,15 +340,15 @@ THREAD_DECLARE volatile ULONG _tx_thread_system_state;
|
|||||||
|
|
||||||
|
|
||||||
/* Define the 32-bit priority bit-maps. There is one priority bit map for each
|
/* Define the 32-bit priority bit-maps. There is one priority bit map for each
|
||||||
32 priority levels supported. If only 32 priorities are supported there is
|
32 priority levels supported. If only 32 priorities are supported there is
|
||||||
only one bit map. Each bit within a priority bit map represents that one
|
only one bit map. Each bit within a priority bit map represents that one
|
||||||
or more threads at the associated thread priority are ready. */
|
or more threads at the associated thread priority are ready. */
|
||||||
|
|
||||||
THREAD_DECLARE ULONG _tx_thread_priority_maps[TX_MAX_PRIORITIES/32];
|
THREAD_DECLARE ULONG _tx_thread_priority_maps[TX_MAX_PRIORITIES/32];
|
||||||
|
|
||||||
|
|
||||||
/* Define the priority map active bit map that specifies which of the previously
|
/* Define the priority map active bit map that specifies which of the previously
|
||||||
defined priority maps have something set. This is only necessary if more than
|
defined priority maps have something set. This is only necessary if more than
|
||||||
32 priorities are supported. */
|
32 priorities are supported. */
|
||||||
|
|
||||||
#if TX_MAX_PRIORITIES > 32
|
#if TX_MAX_PRIORITIES > 32
|
||||||
@@ -351,17 +358,17 @@ THREAD_DECLARE ULONG _tx_thread_priority_map_active;
|
|||||||
|
|
||||||
#ifndef TX_DISABLE_PREEMPTION_THRESHOLD
|
#ifndef TX_DISABLE_PREEMPTION_THRESHOLD
|
||||||
|
|
||||||
/* Define the 32-bit preempt priority bit maps. There is one preempt bit map
|
/* Define the 32-bit preempt priority bit maps. There is one preempt bit map
|
||||||
for each 32 priority levels supported. If only 32 priorities are supported
|
for each 32 priority levels supported. If only 32 priorities are supported
|
||||||
there is only one bit map. Each set set bit corresponds to a preempted priority
|
there is only one bit map. Each set set bit corresponds to a preempted priority
|
||||||
level that had preemption-threshold active to protect against preemption of a
|
level that had preemption-threshold active to protect against preemption of a
|
||||||
range of relatively higher priority threads. */
|
range of relatively higher priority threads. */
|
||||||
|
|
||||||
THREAD_DECLARE ULONG _tx_thread_preempted_maps[TX_MAX_PRIORITIES/32];
|
THREAD_DECLARE ULONG _tx_thread_preempted_maps[TX_MAX_PRIORITIES/32];
|
||||||
|
|
||||||
|
|
||||||
/* Define the preempt map active bit map that specifies which of the previously
|
/* Define the preempt map active bit map that specifies which of the previously
|
||||||
defined preempt maps have something set. This is only necessary if more than
|
defined preempt maps have something set. This is only necessary if more than
|
||||||
32 priorities are supported. */
|
32 priorities are supported. */
|
||||||
|
|
||||||
#if TX_MAX_PRIORITIES > 32
|
#if TX_MAX_PRIORITIES > 32
|
||||||
@@ -369,7 +376,7 @@ THREAD_DECLARE ULONG _tx_thread_preempted_map_active;
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Define the variable that holds the highest priority group ready for
|
/* Define the variable that holds the highest priority group ready for
|
||||||
execution. It is important to note that this is not necessarily the same
|
execution. It is important to note that this is not necessarily the same
|
||||||
as the priority of the thread pointed to by _tx_execute_thread. */
|
as the priority of the thread pointed to by _tx_execute_thread. */
|
||||||
|
|
||||||
@@ -385,13 +392,13 @@ THREAD_DECLARE TX_THREAD * _tx_thread_priority_list[TX_MAX_PRIORITIES];
|
|||||||
|
|
||||||
|
|
||||||
/* Define the global preempt disable variable. If this is non-zero, preemption is
|
/* Define the global preempt disable variable. If this is non-zero, preemption is
|
||||||
disabled. It is used internally by ThreadX to prevent preemption of a thread in
|
disabled. It is used internally by ThreadX to prevent preemption of a thread in
|
||||||
the middle of a service that is resuming or suspending another thread. */
|
the middle of a service that is resuming or suspending another thread. */
|
||||||
|
|
||||||
THREAD_DECLARE volatile UINT _tx_thread_preempt_disable;
|
THREAD_DECLARE volatile UINT _tx_thread_preempt_disable;
|
||||||
|
|
||||||
|
|
||||||
/* Define the global function pointer for mutex cleanup on thread completion or
|
/* Define the global function pointer for mutex cleanup on thread completion or
|
||||||
termination. This pointer is setup during mutex initialization. */
|
termination. This pointer is setup during mutex initialization. */
|
||||||
|
|
||||||
THREAD_DECLARE VOID (*_tx_thread_mutex_release)(TX_THREAD *thread_ptr);
|
THREAD_DECLARE VOID (*_tx_thread_mutex_release)(TX_THREAD *thread_ptr);
|
||||||
@@ -403,7 +410,7 @@ THREAD_DECLARE VOID (*_tx_thread_mutex_release)(TX_THREAD *thread_pt
|
|||||||
Bit(s) Meaning
|
Bit(s) Meaning
|
||||||
|
|
||||||
31 TX_NOT_INTERRUPTABLE defined
|
31 TX_NOT_INTERRUPTABLE defined
|
||||||
30 TX_INLINE_THREAD_RESUME_SUSPEND define
|
30 TX_INLINE_THREAD_RESUME_SUSPEND define
|
||||||
29-24 Priority groups 1 -> 32 priorities
|
29-24 Priority groups 1 -> 32 priorities
|
||||||
2 -> 64 priorities
|
2 -> 64 priorities
|
||||||
3 -> 96 priorities
|
3 -> 96 priorities
|
||||||
@@ -433,10 +440,10 @@ THREAD_DECLARE VOID (*_tx_thread_mutex_release)(TX_THREAD *thread_pt
|
|||||||
THREAD_DECLARE ULONG _tx_build_options;
|
THREAD_DECLARE ULONG _tx_build_options;
|
||||||
|
|
||||||
|
|
||||||
#ifdef TX_ENABLE_STACK_CHECKING
|
#if defined(TX_ENABLE_STACK_CHECKING) || defined(TX_PORT_THREAD_STACK_ERROR_HANDLING)
|
||||||
|
|
||||||
/* Define the global function pointer for stack error handling. If a stack error is
|
/* Define the global function pointer for stack error handling. If a stack error is
|
||||||
detected and the application has registered a stack error handler, it will be
|
detected and the application has registered a stack error handler, it will be
|
||||||
called via this function pointer. */
|
called via this function pointer. */
|
||||||
|
|
||||||
THREAD_DECLARE VOID (*_tx_thread_application_stack_error_handler)(TX_THREAD *thread_ptr);
|
THREAD_DECLARE VOID (*_tx_thread_application_stack_error_handler)(TX_THREAD *thread_ptr);
|
||||||
@@ -451,20 +458,20 @@ THREAD_DECLARE VOID (*_tx_thread_application_stack_error_handler)(TX
|
|||||||
THREAD_DECLARE ULONG _tx_thread_performance_resume_count;
|
THREAD_DECLARE ULONG _tx_thread_performance_resume_count;
|
||||||
|
|
||||||
|
|
||||||
/* Define the total number of thread suspensions. Each time a thread enters a
|
/* Define the total number of thread suspensions. Each time a thread enters a
|
||||||
suspended state this variable is incremented. */
|
suspended state this variable is incremented. */
|
||||||
|
|
||||||
THREAD_DECLARE ULONG _tx_thread_performance_suspend_count;
|
THREAD_DECLARE ULONG _tx_thread_performance_suspend_count;
|
||||||
|
|
||||||
|
|
||||||
/* Define the total number of solicited thread preemptions. Each time a thread is
|
/* Define the total number of solicited thread preemptions. Each time a thread is
|
||||||
preempted by directly calling a ThreadX service, this variable is incremented. */
|
preempted by directly calling a ThreadX service, this variable is incremented. */
|
||||||
|
|
||||||
THREAD_DECLARE ULONG _tx_thread_performance_solicited_preemption_count;
|
THREAD_DECLARE ULONG _tx_thread_performance_solicited_preemption_count;
|
||||||
|
|
||||||
|
|
||||||
/* Define the total number of interrupt thread preemptions. Each time a thread is
|
/* Define the total number of interrupt thread preemptions. Each time a thread is
|
||||||
preempted as a result of an ISR calling a ThreadX service, this variable is
|
preempted as a result of an ISR calling a ThreadX service, this variable is
|
||||||
incremented. */
|
incremented. */
|
||||||
|
|
||||||
THREAD_DECLARE ULONG _tx_thread_performance_interrupt_preemption_count;
|
THREAD_DECLARE ULONG _tx_thread_performance_interrupt_preemption_count;
|
||||||
@@ -476,45 +483,45 @@ THREAD_DECLARE ULONG _tx_thread_performance_interrupt_preemption_coun
|
|||||||
THREAD_DECLARE ULONG _tx_thread_performance_priority_inversion_count;
|
THREAD_DECLARE ULONG _tx_thread_performance_priority_inversion_count;
|
||||||
|
|
||||||
|
|
||||||
/* Define the total number of time-slices. Each time a time-slice operation is
|
/* Define the total number of time-slices. Each time a time-slice operation is
|
||||||
actually performed (another thread is setup for running) this variable is
|
actually performed (another thread is setup for running) this variable is
|
||||||
incremented. */
|
incremented. */
|
||||||
|
|
||||||
THREAD_DECLARE ULONG _tx_thread_performance_time_slice_count;
|
THREAD_DECLARE ULONG _tx_thread_performance_time_slice_count;
|
||||||
|
|
||||||
|
|
||||||
/* Define the total number of thread relinquish operations. Each time a thread
|
/* Define the total number of thread relinquish operations. Each time a thread
|
||||||
relinquish operation is actually performed (another thread is setup for running)
|
relinquish operation is actually performed (another thread is setup for running)
|
||||||
this variable is incremented. */
|
this variable is incremented. */
|
||||||
|
|
||||||
THREAD_DECLARE ULONG _tx_thread_performance_relinquish_count;
|
THREAD_DECLARE ULONG _tx_thread_performance_relinquish_count;
|
||||||
|
|
||||||
|
|
||||||
/* Define the total number of thread timeouts. Each time a thread has a
|
/* Define the total number of thread timeouts. Each time a thread has a
|
||||||
timeout this variable is incremented. */
|
timeout this variable is incremented. */
|
||||||
|
|
||||||
THREAD_DECLARE ULONG _tx_thread_performance_timeout_count;
|
THREAD_DECLARE ULONG _tx_thread_performance_timeout_count;
|
||||||
|
|
||||||
|
|
||||||
/* Define the total number of thread wait aborts. Each time a thread's suspension
|
/* Define the total number of thread wait aborts. Each time a thread's suspension
|
||||||
is lifted by the tx_thread_wait_abort call this variable is incremented. */
|
is lifted by the tx_thread_wait_abort call this variable is incremented. */
|
||||||
|
|
||||||
THREAD_DECLARE ULONG _tx_thread_performance_wait_abort_count;
|
THREAD_DECLARE ULONG _tx_thread_performance_wait_abort_count;
|
||||||
|
|
||||||
|
|
||||||
/* Define the total number of idle system thread returns. Each time a thread returns to
|
/* Define the total number of idle system thread returns. Each time a thread returns to
|
||||||
an idle system (no other thread is ready to run) this variable is incremented. */
|
an idle system (no other thread is ready to run) this variable is incremented. */
|
||||||
|
|
||||||
THREAD_DECLARE ULONG _tx_thread_performance_idle_return_count;
|
THREAD_DECLARE ULONG _tx_thread_performance_idle_return_count;
|
||||||
|
|
||||||
|
|
||||||
/* Define the total number of non-idle system thread returns. Each time a thread returns to
|
/* Define the total number of non-idle system thread returns. Each time a thread returns to
|
||||||
a non-idle system (another thread is ready to run) this variable is incremented. */
|
a non-idle system (another thread is ready to run) this variable is incremented. */
|
||||||
|
|
||||||
THREAD_DECLARE ULONG _tx_thread_performance_non_idle_return_count;
|
THREAD_DECLARE ULONG _tx_thread_performance_non_idle_return_count;
|
||||||
|
|
||||||
|
|
||||||
/* Define the last TX_THREAD_EXECUTE_LOG_SIZE threads scheduled in ThreadX. This
|
/* Define the last TX_THREAD_EXECUTE_LOG_SIZE threads scheduled in ThreadX. This
|
||||||
is a circular list, where the index points to the oldest entry. */
|
is a circular list, where the index points to the oldest entry. */
|
||||||
|
|
||||||
THREAD_DECLARE ULONG _tx_thread_performance__execute_log_index;
|
THREAD_DECLARE ULONG _tx_thread_performance__execute_log_index;
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -79,7 +78,7 @@ VOID _tx_timer_thread_entry(ULONG timer_thread_input);
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Define the system clock value that is continually incremented by the
|
/* Define the system clock value that is continually incremented by the
|
||||||
periodic timer interrupt processing. */
|
periodic timer interrupt processing. */
|
||||||
|
|
||||||
TIMER_DECLARE volatile ULONG _tx_timer_system_clock;
|
TIMER_DECLARE volatile ULONG _tx_timer_system_clock;
|
||||||
@@ -116,7 +115,7 @@ TIMER_DECLARE TX_TIMER_INTERNAL **_tx_timer_list_end;
|
|||||||
TIMER_DECLARE TX_TIMER_INTERNAL **_tx_timer_current_ptr;
|
TIMER_DECLARE TX_TIMER_INTERNAL **_tx_timer_current_ptr;
|
||||||
|
|
||||||
|
|
||||||
/* Define the timer expiration flag. This is used to indicate that a timer
|
/* Define the timer expiration flag. This is used to indicate that a timer
|
||||||
has expired. */
|
has expired. */
|
||||||
|
|
||||||
TIMER_DECLARE UINT _tx_timer_expired;
|
TIMER_DECLARE UINT _tx_timer_expired;
|
||||||
@@ -195,8 +194,8 @@ TIMER_DECLARE ULONG _tx_timer_performance_expiration_count;
|
|||||||
|
|
||||||
|
|
||||||
/* Define the total number of timer expiration adjustments. These are required
|
/* Define the total number of timer expiration adjustments. These are required
|
||||||
if the expiration time is greater than the size of the timer list. In such
|
if the expiration time is greater than the size of the timer list. In such
|
||||||
cases, the timer is placed at the end of the list and then reactivated
|
cases, the timer is placed at the end of the list and then reactivated
|
||||||
as many times as necessary to finally achieve the resulting timeout. */
|
as many times as necessary to finally achieve the resulting timeout. */
|
||||||
|
|
||||||
TIMER_DECLARE ULONG _tx_timer_performance__expiration_adjust_count;
|
TIMER_DECLARE ULONG _tx_timer_performance__expiration_adjust_count;
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -78,8 +77,8 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Define the default clock source for trace event entry time stamp. The following two item are port specific.
|
/* Define the default clock source for trace event entry time stamp. The following two item are port specific.
|
||||||
For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock
|
For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock
|
||||||
source constants would be:
|
source constants would be:
|
||||||
|
|
||||||
#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024)
|
#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024)
|
||||||
@@ -101,8 +100,8 @@
|
|||||||
|
|
||||||
|
|
||||||
/* ThreadX Trace Description. The ThreadX Trace feature is designed to capture
|
/* ThreadX Trace Description. The ThreadX Trace feature is designed to capture
|
||||||
events in real-time in a circular event buffer. This buffer may be analyzed by other
|
events in real-time in a circular event buffer. This buffer may be analyzed by other
|
||||||
tools. The high-level format of the Trace structure is:
|
tools. The high-level format of the Trace structure is:
|
||||||
|
|
||||||
[Trace Control Header ]
|
[Trace Control Header ]
|
||||||
[Trace Object Registry - Entry 0 ]
|
[Trace Object Registry - Entry 0 ]
|
||||||
@@ -115,23 +114,23 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
/* Trace Control Header. The Trace Control Header contains information that
|
/* Trace Control Header. The Trace Control Header contains information that
|
||||||
defines the format of the Trace Object Registry as well as the location and
|
defines the format of the Trace Object Registry as well as the location and
|
||||||
current entry of the Trace Buffer itself. The high-level format of the
|
current entry of the Trace Buffer itself. The high-level format of the
|
||||||
Trace Control Header is:
|
Trace Control Header is:
|
||||||
|
|
||||||
Entry Size Description
|
Entry Size Description
|
||||||
|
|
||||||
[Trace ID] 4 This 4-byte field contains the ThreadX Trace
|
[Trace ID] 4 This 4-byte field contains the ThreadX Trace
|
||||||
Identification. If the trace buffer is valid, the
|
Identification. If the trace buffer is valid, the
|
||||||
contents are 0x54585442 (TXTB). Since it is written as
|
contents are 0x54585442 (TXTB). Since it is written as
|
||||||
a 32-bit unsigned word, this value is also used to
|
a 32-bit unsigned word, this value is also used to
|
||||||
determine if the event trace information is in
|
determine if the event trace information is in
|
||||||
little or big endian format.
|
little or big endian format.
|
||||||
[Timer Valid Mask] 4 Mask of valid bits in the 32-bit time stamp. This
|
[Timer Valid Mask] 4 Mask of valid bits in the 32-bit time stamp. This
|
||||||
enables use of 32, 24, 16, or event 8-bit timers.
|
enables use of 32, 24, 16, or event 8-bit timers.
|
||||||
If the time source is 32-bits, the mask is
|
If the time source is 32-bits, the mask is
|
||||||
0xFFFFFFFF. If the time source is 16-bits, the
|
0xFFFFFFFF. If the time source is 16-bits, the
|
||||||
mask is 0x0000FFFF.
|
mask is 0x0000FFFF.
|
||||||
[Trace Base Address] 4 The base address for all trace pointer. Subtracting
|
[Trace Base Address] 4 The base address for all trace pointer. Subtracting
|
||||||
the pointer and this address will yield the proper
|
the pointer and this address will yield the proper
|
||||||
@@ -143,7 +142,7 @@
|
|||||||
[Trace Buffer Start Pointer] 4 Pointer to the start of the Trace Buffer Area
|
[Trace Buffer Start Pointer] 4 Pointer to the start of the Trace Buffer Area
|
||||||
[Trace Buffer End Pointer] 4 Pointer to the end of the Trace Buffer Area
|
[Trace Buffer End Pointer] 4 Pointer to the end of the Trace Buffer Area
|
||||||
[Trace Buffer Current Pointer] 4 Pointer to the oldest entry in the Trace Buffer.
|
[Trace Buffer Current Pointer] 4 Pointer to the oldest entry in the Trace Buffer.
|
||||||
This entry will be overwritten on the next event and
|
This entry will be overwritten on the next event and
|
||||||
incremented to the next event (wrapping to the top
|
incremented to the next event (wrapping to the top
|
||||||
if the buffer end pointer is exceeded).
|
if the buffer end pointer is exceeded).
|
||||||
[Reserved] 4 Reserved 4 bytes, should be 0xAAAAAAAA
|
[Reserved] 4 Reserved 4 bytes, should be 0xAAAAAAAA
|
||||||
@@ -173,7 +172,7 @@ typedef struct TX_TRACE_HEADER_STRUCT
|
|||||||
} TX_TRACE_HEADER;
|
} TX_TRACE_HEADER;
|
||||||
|
|
||||||
|
|
||||||
/* Trace Object Registry. The Trace Object Registry is used to map the object pointer in the trace buffer to
|
/* Trace Object Registry. The Trace Object Registry is used to map the object pointer in the trace buffer to
|
||||||
the application's name for the object (defined during object creation in ThreadX). */
|
the application's name for the object (defined during object creation in ThreadX). */
|
||||||
|
|
||||||
#ifndef TX_TRACE_OBJECT_REGISTRY_NAME
|
#ifndef TX_TRACE_OBJECT_REGISTRY_NAME
|
||||||
@@ -181,7 +180,7 @@ typedef struct TX_TRACE_HEADER_STRUCT
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Define the object name types as well as the contents of any additional parameters that might be useful in
|
/* Define the object name types as well as the contents of any additional parameters that might be useful in
|
||||||
trace analysis. */
|
trace analysis. */
|
||||||
|
|
||||||
#define TX_TRACE_OBJECT_TYPE_NOT_VALID ((UCHAR) 0) /* Object is not valid */
|
#define TX_TRACE_OBJECT_TYPE_NOT_VALID ((UCHAR) 0) /* Object is not valid */
|
||||||
@@ -214,27 +213,27 @@ typedef struct TX_TRACE_OBJECT_ENTRY_STRUCT
|
|||||||
|
|
||||||
Entry Size Description
|
Entry Size Description
|
||||||
|
|
||||||
[Thread Pointer] 4 This 4-byte field contains the pointer to the
|
[Thread Pointer] 4 This 4-byte field contains the pointer to the
|
||||||
ThreadX thread running that caused the event.
|
ThreadX thread running that caused the event.
|
||||||
If this field is NULL, the entry hasn't been used
|
If this field is NULL, the entry hasn't been used
|
||||||
yet. If this field is 0xFFFFFFFF, the event occurred
|
yet. If this field is 0xFFFFFFFF, the event occurred
|
||||||
from within an ISR. If this entry is 0xF0F0F0F0, the
|
from within an ISR. If this entry is 0xF0F0F0F0, the
|
||||||
event occurred during initialization.
|
event occurred during initialization.
|
||||||
[Thread Priority or 4 This 4-byte field contains the current thread pointer for interrupt
|
[Thread Priority or 4 This 4-byte field contains the current thread pointer for interrupt
|
||||||
Current Thread events or the thread preemption-threshold/priority for thread events.
|
Current Thread events or the thread preemption-threshold/priority for thread events.
|
||||||
Preemption-Threshold/
|
Preemption-Threshold/
|
||||||
Priority]
|
Priority]
|
||||||
[Event ID] 4 This 4-byte field contains the Event ID of the event. A value of
|
[Event ID] 4 This 4-byte field contains the Event ID of the event. A value of
|
||||||
0xFFFFFFFF indicates the event is invalid. All events are marked
|
0xFFFFFFFF indicates the event is invalid. All events are marked
|
||||||
as invalid during initialization.
|
as invalid during initialization.
|
||||||
[Time Stamp] 4 This 4-byte field contains the time stamp of the event.
|
[Time Stamp] 4 This 4-byte field contains the time stamp of the event.
|
||||||
[Information Field 1] 4 This 4-byte field contains the first 4-bytes of information
|
[Information Field 1] 4 This 4-byte field contains the first 4-bytes of information
|
||||||
specific to the event.
|
specific to the event.
|
||||||
[Information Field 2] 4 This 4-byte field contains the second 4-bytes of information
|
[Information Field 2] 4 This 4-byte field contains the second 4-bytes of information
|
||||||
specific to the event.
|
specific to the event.
|
||||||
[Information Field 3] 4 This 4-byte field contains the third 4-bytes of information
|
[Information Field 3] 4 This 4-byte field contains the third 4-bytes of information
|
||||||
specific to the event.
|
specific to the event.
|
||||||
[Information Field 4] 4 This 4-byte field contains the fourth 4-bytes of information
|
[Information Field 4] 4 This 4-byte field contains the fourth 4-bytes of information
|
||||||
specific to the event.
|
specific to the event.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -244,15 +243,15 @@ typedef struct TX_TRACE_OBJECT_ENTRY_STRUCT
|
|||||||
/* Define ThreadX Trace Events, along with a brief description of the additional information fields,
|
/* Define ThreadX Trace Events, along with a brief description of the additional information fields,
|
||||||
where I1 -> Information Field 1, I2 -> Information Field 2, etc. */
|
where I1 -> Information Field 1, I2 -> Information Field 2, etc. */
|
||||||
|
|
||||||
/* Event numbers 0 through 4095 are reserved by Azure RTOS. Specific event assignments are:
|
/* Event numbers 0 through 4095 are reserved by Azure RTOS. Specific event assignments are:
|
||||||
|
|
||||||
ThreadX events: 1-199
|
ThreadX events: 1-199
|
||||||
FileX events: 200-299
|
FileX events: 200-299
|
||||||
NetX events: 300-599
|
NetX events: 300-599
|
||||||
USBX events: 600-999
|
USBX events: 600-999
|
||||||
|
|
||||||
User-defined event numbers start at 4096 and continue through 65535, as defined by the constants
|
User-defined event numbers start at 4096 and continue through 65535, as defined by the constants
|
||||||
TX_TRACE_USER_EVENT_START and TX_TRACE_USER_EVENT_END, respectively. User events should be based
|
TX_TRACE_USER_EVENT_START and TX_TRACE_USER_EVENT_END, respectively. User events should be based
|
||||||
on these constants in case the user event number assignment is changed in future releases. */
|
on these constants in case the user event number assignment is changed in future releases. */
|
||||||
|
|
||||||
/* Define the basic ThreadX thread scheduling events first. */
|
/* Define the basic ThreadX thread scheduling events first. */
|
||||||
@@ -417,7 +416,7 @@ TRACE_DECLARE TX_TRACE_BUFFER_ENTRY *_tx_trace_buffer_end_ptr;
|
|||||||
TRACE_DECLARE TX_TRACE_BUFFER_ENTRY *_tx_trace_buffer_current_ptr;
|
TRACE_DECLARE TX_TRACE_BUFFER_ENTRY *_tx_trace_buffer_current_ptr;
|
||||||
|
|
||||||
|
|
||||||
/* Define the trace event enable bits, where each bit represents a type of event that can be enabled
|
/* Define the trace event enable bits, where each bit represents a type of event that can be enabled
|
||||||
or disabled dynamically by the application. */
|
or disabled dynamically by the application. */
|
||||||
|
|
||||||
TRACE_DECLARE ULONG _tx_trace_event_enable_bits;
|
TRACE_DECLARE ULONG _tx_trace_event_enable_bits;
|
||||||
@@ -429,9 +428,9 @@ TRACE_DECLARE ULONG _tx_trace_event_enable_bits;
|
|||||||
TRACE_DECLARE ULONG _tx_trace_simulated_time;
|
TRACE_DECLARE ULONG _tx_trace_simulated_time;
|
||||||
|
|
||||||
|
|
||||||
/* Define the function pointer used to call the application when the trace buffer wraps. If NULL,
|
/* Define the function pointer used to call the application when the trace buffer wraps. If NULL,
|
||||||
the application has not registered a callback function. */
|
the application has not registered a callback function. */
|
||||||
|
|
||||||
TRACE_DECLARE VOID (*_tx_trace_full_notify_function)(VOID *buffer);
|
TRACE_DECLARE VOID (*_tx_trace_full_notify_function)(VOID *buffer);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -26,7 +25,7 @@
|
|||||||
/* PORT SPECIFIC C INFORMATION RELEASE */
|
/* PORT SPECIFIC C INFORMATION RELEASE */
|
||||||
/* */
|
/* */
|
||||||
/* tx_user.h PORTABLE C */
|
/* tx_user.h PORTABLE C */
|
||||||
/* 6.1 */
|
/* 6.3.0 */
|
||||||
/* */
|
/* */
|
||||||
/* AUTHOR */
|
/* AUTHOR */
|
||||||
/* */
|
/* */
|
||||||
@@ -44,9 +43,28 @@
|
|||||||
/* */
|
/* */
|
||||||
/* DATE NAME DESCRIPTION */
|
/* DATE NAME DESCRIPTION */
|
||||||
/* */
|
/* */
|
||||||
/* 05-19-2020 William E. Lamie Initial Version 6.0 */
|
/* 05-19-2020 William E. Lamie Initial Version 6.0 */
|
||||||
/* 09-30-2020 Yuxin Zhou Modified comment(s), */
|
/* 09-30-2020 Yuxin Zhou Modified comment(s), */
|
||||||
/* resulting in version 6.1 */
|
/* resulting in version 6.1 */
|
||||||
|
/* 03-02-2021 Scott Larson Modified comment(s), */
|
||||||
|
/* added option to remove */
|
||||||
|
/* FileX pointer, */
|
||||||
|
/* resulting in version 6.1.5 */
|
||||||
|
/* 06-02-2021 Scott Larson Added options for multiple */
|
||||||
|
/* block pool search & delay, */
|
||||||
|
/* resulting in version 6.1.7 */
|
||||||
|
/* 10-15-2021 Yuxin Zhou Modified comment(s), added */
|
||||||
|
/* user-configurable symbol */
|
||||||
|
/* TX_TIMER_TICKS_PER_SECOND */
|
||||||
|
/* resulting in version 6.1.9 */
|
||||||
|
/* 04-25-2022 Wenhui Xie Modified comment(s), */
|
||||||
|
/* optimized the definition of */
|
||||||
|
/* TX_TIMER_TICKS_PER_SECOND, */
|
||||||
|
/* resulting in version 6.1.11 */
|
||||||
|
/* 10-31-2023 Xiuwen Cai Modified comment(s), */
|
||||||
|
/* added option for random */
|
||||||
|
/* number stack filling, */
|
||||||
|
/* resulting in version 6.3.0 */
|
||||||
/* */
|
/* */
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
|
|
||||||
@@ -55,9 +73,9 @@
|
|||||||
|
|
||||||
|
|
||||||
/* Define various build options for the ThreadX port. The application should either make changes
|
/* Define various build options for the ThreadX port. The application should either make changes
|
||||||
here by commenting or un-commenting the conditional compilation defined OR supply the defines
|
here by commenting or un-commenting the conditional compilation defined OR supply the defines
|
||||||
though the compiler's equivalent of the -D option.
|
though the compiler's equivalent of the -D option.
|
||||||
|
|
||||||
For maximum speed, the following should be defined:
|
For maximum speed, the following should be defined:
|
||||||
|
|
||||||
TX_MAX_PRIORITIES 32
|
TX_MAX_PRIORITIES 32
|
||||||
@@ -69,21 +87,22 @@
|
|||||||
TX_REACTIVATE_INLINE
|
TX_REACTIVATE_INLINE
|
||||||
TX_DISABLE_STACK_FILLING
|
TX_DISABLE_STACK_FILLING
|
||||||
TX_INLINE_THREAD_RESUME_SUSPEND
|
TX_INLINE_THREAD_RESUME_SUSPEND
|
||||||
|
|
||||||
For minimum size, the following should be defined:
|
For minimum size, the following should be defined:
|
||||||
|
|
||||||
TX_MAX_PRIORITIES 32
|
TX_MAX_PRIORITIES 32
|
||||||
TX_DISABLE_PREEMPTION_THRESHOLD
|
TX_DISABLE_PREEMPTION_THRESHOLD
|
||||||
TX_DISABLE_REDUNDANT_CLEARING
|
TX_DISABLE_REDUNDANT_CLEARING
|
||||||
TX_DISABLE_NOTIFY_CALLBACKS
|
TX_DISABLE_NOTIFY_CALLBACKS
|
||||||
|
TX_NO_FILEX_POINTER
|
||||||
TX_NOT_INTERRUPTABLE
|
TX_NOT_INTERRUPTABLE
|
||||||
TX_TIMER_PROCESS_IN_ISR
|
TX_TIMER_PROCESS_IN_ISR
|
||||||
|
|
||||||
Of course, many of these defines reduce functionality and/or change the behavior of the
|
Of course, many of these defines reduce functionality and/or change the behavior of the
|
||||||
system in ways that may not be worth the trade-off. For example, the TX_TIMER_PROCESS_IN_ISR
|
system in ways that may not be worth the trade-off. For example, the TX_TIMER_PROCESS_IN_ISR
|
||||||
results in faster and smaller code, however, it increases the amount of processing in the ISR.
|
results in faster and smaller code, however, it increases the amount of processing in the ISR.
|
||||||
In addition, some services that are available in timers are not available from ISRs and will
|
In addition, some services that are available in timers are not available from ISRs and will
|
||||||
therefore return an error if this option is used. This may or may not be desirable for a
|
therefore return an error if this option is used. This may or may not be desirable for a
|
||||||
given application. */
|
given application. */
|
||||||
|
|
||||||
|
|
||||||
@@ -98,9 +117,28 @@
|
|||||||
#define TX_TIMER_THREAD_PRIORITY ????
|
#define TX_TIMER_THREAD_PRIORITY ????
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Determine if timer expirations (application timers, timeouts, and tx_thread_sleep calls
|
/* Define the common timer tick reference for use by other middleware components. The default
|
||||||
should be processed within the a system timer thread or directly in the timer ISR.
|
value is 10ms (i.e. 100 ticks, defined in tx_api.h), but may be replaced by a port-specific
|
||||||
By default, the timer thread is used. When the following is defined, the timer expiration
|
version in tx_port.h or here.
|
||||||
|
Note: the actual hardware timer value may need to be changed (usually in tx_initialize_low_level). */
|
||||||
|
|
||||||
|
/*
|
||||||
|
#define TX_TIMER_TICKS_PER_SECOND (100UL)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Determine if there is a FileX pointer in the thread control block.
|
||||||
|
By default, the pointer is there for legacy/backwards compatibility.
|
||||||
|
The pointer must also be there for applications using FileX.
|
||||||
|
Define this to save space in the thread control block.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
#define TX_NO_FILEX_POINTER
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Determine if timer expirations (application timers, timeouts, and tx_thread_sleep calls
|
||||||
|
should be processed within the a system timer thread or directly in the timer ISR.
|
||||||
|
By default, the timer thread is used. When the following is defined, the timer expiration
|
||||||
processing is done directly from the timer ISR, thereby eliminating the timer thread control
|
processing is done directly from the timer ISR, thereby eliminating the timer thread control
|
||||||
block, stack, and context switching to activate it. */
|
block, stack, and context switching to activate it. */
|
||||||
|
|
||||||
@@ -125,7 +163,7 @@
|
|||||||
#define TX_DISABLE_STACK_FILLING
|
#define TX_DISABLE_STACK_FILLING
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is
|
/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is
|
||||||
disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack
|
disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack
|
||||||
checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING
|
checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING
|
||||||
define is negated, thereby forcing the stack fill which is necessary for the stack checking
|
define is negated, thereby forcing the stack fill which is necessary for the stack checking
|
||||||
@@ -135,7 +173,15 @@
|
|||||||
#define TX_ENABLE_STACK_CHECKING
|
#define TX_ENABLE_STACK_CHECKING
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Determine if preemption-threshold should be disabled. By default, preemption-threshold is
|
/* Determine if random number is used for stack filling. By default, ThreadX uses a fixed
|
||||||
|
pattern for stack filling. When the following is defined, ThreadX uses a random number
|
||||||
|
for stack filling. This is effective only when TX_ENABLE_STACK_CHECKING is defined. */
|
||||||
|
|
||||||
|
/*
|
||||||
|
#define TX_ENABLE_RANDOM_NUMBER_STACK_FILLING
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Determine if preemption-threshold should be disabled. By default, preemption-threshold is
|
||||||
enabled. If the application does not use preemption-threshold, it may be disabled to reduce
|
enabled. If the application does not use preemption-threshold, it may be disabled to reduce
|
||||||
code size and improve performance. */
|
code size and improve performance. */
|
||||||
|
|
||||||
@@ -143,7 +189,7 @@
|
|||||||
#define TX_DISABLE_PREEMPTION_THRESHOLD
|
#define TX_DISABLE_PREEMPTION_THRESHOLD
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Determine if global ThreadX variables should be cleared. If the compiler startup code clears
|
/* Determine if global ThreadX variables should be cleared. If the compiler startup code clears
|
||||||
the .bss section prior to ThreadX running, the define can be used to eliminate unnecessary
|
the .bss section prior to ThreadX running, the define can be used to eliminate unnecessary
|
||||||
clearing of ThreadX global variables. */
|
clearing of ThreadX global variables. */
|
||||||
|
|
||||||
@@ -151,9 +197,9 @@
|
|||||||
#define TX_DISABLE_REDUNDANT_CLEARING
|
#define TX_DISABLE_REDUNDANT_CLEARING
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Determine if no timer processing is required. This option will help eliminate the timer
|
/* Determine if no timer processing is required. This option will help eliminate the timer
|
||||||
processing when not needed. The user will also have to comment out the call to
|
processing when not needed. The user will also have to comment out the call to
|
||||||
tx_timer_interrupt, which is typically made from assembly language in
|
tx_timer_interrupt, which is typically made from assembly language in
|
||||||
tx_initialize_low_level. Note: if TX_NO_TIMER is used, the define TX_TIMER_PROCESS_IN_ISR
|
tx_initialize_low_level. Note: if TX_NO_TIMER is used, the define TX_TIMER_PROCESS_IN_ISR
|
||||||
must also be used and tx_timer_initialize must be removed from ThreadX library. */
|
must also be used and tx_timer_initialize must be removed from ThreadX library. */
|
||||||
|
|
||||||
@@ -173,8 +219,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
/* Determine if the tx_thread_resume and tx_thread_suspend services should have their internal
|
/* Determine if the tx_thread_resume and tx_thread_suspend services should have their internal
|
||||||
code in-line. This results in a larger image, but improves the performance of the thread
|
code in-line. This results in a larger image, but improves the performance of the thread
|
||||||
resume and suspend services. */
|
resume and suspend services. */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -182,7 +228,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
/* Determine if the internal ThreadX code is non-interruptable. This results in smaller code
|
/* Determine if the internal ThreadX code is non-interruptable. This results in smaller code
|
||||||
size and less processing overhead, but increases the interrupt lockout time. */
|
size and less processing overhead, but increases the interrupt lockout time. */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -190,8 +236,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
/* Determine if the trace event logging code should be enabled. This causes slight increases in
|
/* Determine if the trace event logging code should be enabled. This causes slight increases in
|
||||||
code size and overhead, but provides the ability to generate system trace information which
|
code size and overhead, but provides the ability to generate system trace information which
|
||||||
is available for viewing in TraceX. */
|
is available for viewing in TraceX. */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -255,5 +301,17 @@
|
|||||||
#define TX_TIMER_ENABLE_PERFORMANCE_INFO
|
#define TX_TIMER_ENABLE_PERFORMANCE_INFO
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* Override options for byte pool searches of multiple blocks. */
|
||||||
|
|
||||||
|
/*
|
||||||
|
#define TX_BYTE_POOL_MULTIPLE_BLOCK_SEARCH 20
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Override options for byte pool search delay to avoid thrashing. */
|
||||||
|
|
||||||
|
/*
|
||||||
|
#define TX_BYTE_POOL_DELAY_VALUE 3
|
||||||
|
*/
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -170,7 +169,7 @@ ULONG lower_tbu;
|
|||||||
/* Save the pool's address in the block for when it is released! */
|
/* Save the pool's address in the block for when it is released! */
|
||||||
temp_ptr = TX_BLOCK_POOL_TO_UCHAR_POINTER_CONVERT(pool_ptr);
|
temp_ptr = TX_BLOCK_POOL_TO_UCHAR_POINTER_CONVERT(pool_ptr);
|
||||||
*next_block_ptr = temp_ptr;
|
*next_block_ptr = temp_ptr;
|
||||||
|
|
||||||
#ifdef TX_ENABLE_EVENT_TRACE
|
#ifdef TX_ENABLE_EVENT_TRACE
|
||||||
|
|
||||||
/* Check that the event time stamp is unchanged. A different
|
/* Check that the event time stamp is unchanged. A different
|
||||||
@@ -182,7 +181,7 @@ ULONG lower_tbu;
|
|||||||
/* Is the time stamp the same? */
|
/* Is the time stamp the same? */
|
||||||
if (time_stamp == entry_ptr -> tx_trace_buffer_entry_time_stamp)
|
if (time_stamp == entry_ptr -> tx_trace_buffer_entry_time_stamp)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Timestamp is the same, update the entry with the address. */
|
/* Timestamp is the same, update the entry with the address. */
|
||||||
#ifdef TX_MISRA_ENABLE
|
#ifdef TX_MISRA_ENABLE
|
||||||
entry_ptr -> tx_trace_buffer_entry_info_2 = TX_POINTER_TO_ULONG_CONVERT(*block_ptr);
|
entry_ptr -> tx_trace_buffer_entry_info_2 = TX_POINTER_TO_ULONG_CONVERT(*block_ptr);
|
||||||
@@ -200,7 +199,7 @@ ULONG lower_tbu;
|
|||||||
|
|
||||||
/* Set status to success. */
|
/* Set status to success. */
|
||||||
status = TX_SUCCESS;
|
status = TX_SUCCESS;
|
||||||
|
|
||||||
/* Restore interrupts. */
|
/* Restore interrupts. */
|
||||||
TX_RESTORE
|
TX_RESTORE
|
||||||
}
|
}
|
||||||
@@ -229,7 +228,7 @@ ULONG lower_tbu;
|
|||||||
{
|
{
|
||||||
|
|
||||||
/* Prepare for suspension of this thread. */
|
/* Prepare for suspension of this thread. */
|
||||||
|
|
||||||
#ifdef TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO
|
#ifdef TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO
|
||||||
|
|
||||||
/* Increment the total suspensions counter. */
|
/* Increment the total suspensions counter. */
|
||||||
@@ -261,7 +260,7 @@ ULONG lower_tbu;
|
|||||||
|
|
||||||
/* Pickup the number of suspended threads. */
|
/* Pickup the number of suspended threads. */
|
||||||
suspended_count = (pool_ptr -> tx_block_pool_suspended_count);
|
suspended_count = (pool_ptr -> tx_block_pool_suspended_count);
|
||||||
|
|
||||||
/* Increment the number of suspended threads. */
|
/* Increment the number of suspended threads. */
|
||||||
(pool_ptr -> tx_block_pool_suspended_count)++;
|
(pool_ptr -> tx_block_pool_suspended_count)++;
|
||||||
|
|
||||||
@@ -322,11 +321,11 @@ ULONG lower_tbu;
|
|||||||
allocate event. In that case, do nothing here. */
|
allocate event. In that case, do nothing here. */
|
||||||
if (entry_ptr != TX_NULL)
|
if (entry_ptr != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Is the time-stamp the same? */
|
/* Is the time-stamp the same? */
|
||||||
if (time_stamp == entry_ptr -> tx_trace_buffer_entry_time_stamp)
|
if (time_stamp == entry_ptr -> tx_trace_buffer_entry_time_stamp)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Timestamp is the same, update the entry with the address. */
|
/* Timestamp is the same, update the entry with the address. */
|
||||||
#ifdef TX_MISRA_ENABLE
|
#ifdef TX_MISRA_ENABLE
|
||||||
entry_ptr -> tx_trace_buffer_entry_info_2 = TX_POINTER_TO_ULONG_CONVERT(*block_ptr);
|
entry_ptr -> tx_trace_buffer_entry_info_2 = TX_POINTER_TO_ULONG_CONVERT(*block_ptr);
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -87,7 +86,7 @@ UINT suspended_count;
|
|||||||
TX_THREAD *next_thread;
|
TX_THREAD *next_thread;
|
||||||
TX_THREAD *previous_thread;
|
TX_THREAD *previous_thread;
|
||||||
|
|
||||||
|
|
||||||
#ifndef TX_NOT_INTERRUPTABLE
|
#ifndef TX_NOT_INTERRUPTABLE
|
||||||
|
|
||||||
/* Disable interrupts to remove the suspended thread from the block pool. */
|
/* Disable interrupts to remove the suspended thread from the block pool. */
|
||||||
@@ -96,7 +95,7 @@ TX_THREAD *previous_thread;
|
|||||||
/* Determine if the cleanup is still required. */
|
/* Determine if the cleanup is still required. */
|
||||||
if (thread_ptr -> tx_thread_suspend_cleanup == &(_tx_block_pool_cleanup))
|
if (thread_ptr -> tx_thread_suspend_cleanup == &(_tx_block_pool_cleanup))
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Check for valid suspension sequence. */
|
/* Check for valid suspension sequence. */
|
||||||
if (suspension_sequence == thread_ptr -> tx_thread_suspension_sequence)
|
if (suspension_sequence == thread_ptr -> tx_thread_suspension_sequence)
|
||||||
{
|
{
|
||||||
@@ -107,7 +106,7 @@ TX_THREAD *previous_thread;
|
|||||||
/* Check for a NULL byte pool pointer. */
|
/* Check for a NULL byte pool pointer. */
|
||||||
if (pool_ptr != TX_NULL)
|
if (pool_ptr != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Check for valid pool ID. */
|
/* Check for valid pool ID. */
|
||||||
if (pool_ptr -> tx_block_pool_id == TX_BLOCK_POOL_ID)
|
if (pool_ptr -> tx_block_pool_id == TX_BLOCK_POOL_ID)
|
||||||
{
|
{
|
||||||
@@ -133,13 +132,13 @@ TX_THREAD *previous_thread;
|
|||||||
suspended_count = pool_ptr -> tx_block_pool_suspended_count;
|
suspended_count = pool_ptr -> tx_block_pool_suspended_count;
|
||||||
|
|
||||||
/* Remove the suspended thread from the list. */
|
/* Remove the suspended thread from the list. */
|
||||||
|
|
||||||
/* See if this is the only suspended thread on the list. */
|
/* See if this is the only suspended thread on the list. */
|
||||||
if (suspended_count == TX_NO_SUSPENSIONS)
|
if (suspended_count == TX_NO_SUSPENSIONS)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Yes, the only suspended thread. */
|
/* Yes, the only suspended thread. */
|
||||||
|
|
||||||
/* Update the head pointer. */
|
/* Update the head pointer. */
|
||||||
pool_ptr -> tx_block_pool_suspension_list = TX_NULL;
|
pool_ptr -> tx_block_pool_suspension_list = TX_NULL;
|
||||||
}
|
}
|
||||||
@@ -157,7 +156,7 @@ TX_THREAD *previous_thread;
|
|||||||
/* Determine if we need to update the head pointer. */
|
/* Determine if we need to update the head pointer. */
|
||||||
if (pool_ptr -> tx_block_pool_suspension_list == thread_ptr)
|
if (pool_ptr -> tx_block_pool_suspension_list == thread_ptr)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Update the list head pointer. */
|
/* Update the list head pointer. */
|
||||||
pool_ptr -> tx_block_pool_suspension_list = next_thread;
|
pool_ptr -> tx_block_pool_suspension_list = next_thread;
|
||||||
}
|
}
|
||||||
@@ -168,7 +167,7 @@ TX_THREAD *previous_thread;
|
|||||||
if (thread_ptr -> tx_thread_state == TX_BLOCK_MEMORY)
|
if (thread_ptr -> tx_thread_state == TX_BLOCK_MEMORY)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Timeout condition and the thread still suspended on the block pool.
|
/* Timeout condition and the thread still suspended on the block pool.
|
||||||
Setup return error status and resume the thread. */
|
Setup return error status and resume the thread. */
|
||||||
|
|
||||||
#ifdef TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO
|
#ifdef TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -97,7 +96,7 @@ TX_BLOCK_POOL *previous_pool;
|
|||||||
an ALIGN_TYPE (typically this is a 32-bit ULONG). This helps guarantee proper alignment. */
|
an ALIGN_TYPE (typically this is a 32-bit ULONG). This helps guarantee proper alignment. */
|
||||||
block_size = (((block_size + (sizeof(ALIGN_TYPE))) - ((ALIGN_TYPE) 1))/(sizeof(ALIGN_TYPE))) * (sizeof(ALIGN_TYPE));
|
block_size = (((block_size + (sizeof(ALIGN_TYPE))) - ((ALIGN_TYPE) 1))/(sizeof(ALIGN_TYPE))) * (sizeof(ALIGN_TYPE));
|
||||||
|
|
||||||
/* Round the pool size down to something that is evenly divisible by
|
/* Round the pool size down to something that is evenly divisible by
|
||||||
an ALIGN_TYPE (typically this is a 32-bit ULONG). */
|
an ALIGN_TYPE (typically this is a 32-bit ULONG). */
|
||||||
pool_size = (pool_size/(sizeof(ALIGN_TYPE))) * (sizeof(ALIGN_TYPE));
|
pool_size = (pool_size/(sizeof(ALIGN_TYPE))) * (sizeof(ALIGN_TYPE));
|
||||||
|
|
||||||
@@ -106,7 +105,7 @@ TX_BLOCK_POOL *previous_pool;
|
|||||||
pool_ptr -> tx_block_pool_start = TX_VOID_TO_UCHAR_POINTER_CONVERT(pool_start);
|
pool_ptr -> tx_block_pool_start = TX_VOID_TO_UCHAR_POINTER_CONVERT(pool_start);
|
||||||
pool_ptr -> tx_block_pool_size = pool_size;
|
pool_ptr -> tx_block_pool_size = pool_size;
|
||||||
pool_ptr -> tx_block_pool_block_size = (UINT) block_size;
|
pool_ptr -> tx_block_pool_block_size = (UINT) block_size;
|
||||||
|
|
||||||
/* Calculate the total number of blocks. */
|
/* Calculate the total number of blocks. */
|
||||||
total_blocks = pool_size/(block_size + (sizeof(UCHAR *)));
|
total_blocks = pool_size/(block_size + (sizeof(UCHAR *)));
|
||||||
|
|
||||||
@@ -145,7 +144,7 @@ TX_BLOCK_POOL *previous_pool;
|
|||||||
/* Set the last block's forward pointer to NULL. */
|
/* Set the last block's forward pointer to NULL. */
|
||||||
block_link_ptr = TX_UCHAR_TO_INDIRECT_UCHAR_POINTER_CONVERT(block_ptr);
|
block_link_ptr = TX_UCHAR_TO_INDIRECT_UCHAR_POINTER_CONVERT(block_ptr);
|
||||||
*block_link_ptr = TX_NULL;
|
*block_link_ptr = TX_NULL;
|
||||||
|
|
||||||
/* Setup the starting pool address. */
|
/* Setup the starting pool address. */
|
||||||
pool_ptr -> tx_block_pool_available_list = TX_VOID_TO_UCHAR_POINTER_CONVERT(pool_start);
|
pool_ptr -> tx_block_pool_available_list = TX_VOID_TO_UCHAR_POINTER_CONVERT(pool_start);
|
||||||
|
|
||||||
@@ -180,7 +179,7 @@ TX_BLOCK_POOL *previous_pool;
|
|||||||
pool_ptr -> tx_block_pool_created_previous = previous_pool;
|
pool_ptr -> tx_block_pool_created_previous = previous_pool;
|
||||||
pool_ptr -> tx_block_pool_created_next = next_pool;
|
pool_ptr -> tx_block_pool_created_next = next_pool;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Increment the created count. */
|
/* Increment the created count. */
|
||||||
_tx_block_pool_created_count++;
|
_tx_block_pool_created_count++;
|
||||||
|
|
||||||
@@ -208,7 +207,7 @@ TX_BLOCK_POOL *previous_pool;
|
|||||||
/* Not enough memory for one block, return appropriate error. */
|
/* Not enough memory for one block, return appropriate error. */
|
||||||
status = TX_SIZE_ERROR;
|
status = TX_SIZE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return completion status. */
|
/* Return completion status. */
|
||||||
return(status);
|
return(status);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -126,7 +125,7 @@ TX_BLOCK_POOL *previous_pool;
|
|||||||
/* See if we have to update the created list head pointer. */
|
/* See if we have to update the created list head pointer. */
|
||||||
if (_tx_block_pool_created_ptr == pool_ptr)
|
if (_tx_block_pool_created_ptr == pool_ptr)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Yes, move the head pointer to the next link. */
|
/* Yes, move the head pointer to the next link. */
|
||||||
_tx_block_pool_created_ptr = next_pool;
|
_tx_block_pool_created_ptr = next_pool;
|
||||||
}
|
}
|
||||||
@@ -148,14 +147,14 @@ TX_BLOCK_POOL *previous_pool;
|
|||||||
on this block pool. */
|
on this block pool. */
|
||||||
while (suspended_count != TX_NO_SUSPENSIONS)
|
while (suspended_count != TX_NO_SUSPENSIONS)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Decrement the suspension count. */
|
/* Decrement the suspension count. */
|
||||||
suspended_count--;
|
suspended_count--;
|
||||||
|
|
||||||
/* Lockout interrupts. */
|
/* Lockout interrupts. */
|
||||||
TX_DISABLE
|
TX_DISABLE
|
||||||
|
|
||||||
/* Clear the cleanup pointer, this prevents the timeout from doing
|
/* Clear the cleanup pointer, this prevents the timeout from doing
|
||||||
anything. */
|
anything. */
|
||||||
thread_ptr -> tx_thread_suspend_cleanup = TX_NULL;
|
thread_ptr -> tx_thread_suspend_cleanup = TX_NULL;
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -77,8 +76,8 @@
|
|||||||
/* resulting in version 6.1 */
|
/* resulting in version 6.1 */
|
||||||
/* */
|
/* */
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
UINT _tx_block_pool_info_get(TX_BLOCK_POOL *pool_ptr, CHAR **name, ULONG *available_blocks,
|
UINT _tx_block_pool_info_get(TX_BLOCK_POOL *pool_ptr, CHAR **name, ULONG *available_blocks,
|
||||||
ULONG *total_blocks, TX_THREAD **first_suspended,
|
ULONG *total_blocks, TX_THREAD **first_suspended,
|
||||||
ULONG *suspended_count, TX_BLOCK_POOL **next_pool)
|
ULONG *suspended_count, TX_BLOCK_POOL **next_pool)
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -100,42 +99,42 @@ TX_INTERRUPT_SAVE_AREA
|
|||||||
/* Retrieve the name of the block pool. */
|
/* Retrieve the name of the block pool. */
|
||||||
if (name != TX_NULL)
|
if (name != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*name = pool_ptr -> tx_block_pool_name;
|
*name = pool_ptr -> tx_block_pool_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the number of available blocks in the block pool. */
|
/* Retrieve the number of available blocks in the block pool. */
|
||||||
if (available_blocks != TX_NULL)
|
if (available_blocks != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*available_blocks = (ULONG) pool_ptr -> tx_block_pool_available;
|
*available_blocks = (ULONG) pool_ptr -> tx_block_pool_available;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the total number of blocks in the block pool. */
|
/* Retrieve the total number of blocks in the block pool. */
|
||||||
if (total_blocks != TX_NULL)
|
if (total_blocks != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*total_blocks = (ULONG) pool_ptr -> tx_block_pool_total;
|
*total_blocks = (ULONG) pool_ptr -> tx_block_pool_total;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the first thread suspended on this block pool. */
|
/* Retrieve the first thread suspended on this block pool. */
|
||||||
if (first_suspended != TX_NULL)
|
if (first_suspended != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*first_suspended = pool_ptr -> tx_block_pool_suspension_list;
|
*first_suspended = pool_ptr -> tx_block_pool_suspension_list;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the number of threads suspended on this block pool. */
|
/* Retrieve the number of threads suspended on this block pool. */
|
||||||
if (suspended_count != TX_NULL)
|
if (suspended_count != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*suspended_count = (ULONG) pool_ptr -> tx_block_pool_suspended_count;
|
*suspended_count = (ULONG) pool_ptr -> tx_block_pool_suspended_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the pointer to the next block pool created. */
|
/* Retrieve the pointer to the next block pool created. */
|
||||||
if (next_pool != TX_NULL)
|
if (next_pool != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*next_pool = pool_ptr -> tx_block_pool_created_next;
|
*next_pool = pool_ptr -> tx_block_pool_created_next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -93,7 +92,7 @@ UINT status;
|
|||||||
/* Determine if this is a legal request. */
|
/* Determine if this is a legal request. */
|
||||||
if (pool_ptr == TX_NULL)
|
if (pool_ptr == TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Block pool pointer is illegal, return error. */
|
/* Block pool pointer is illegal, return error. */
|
||||||
status = TX_PTR_ERROR;
|
status = TX_PTR_ERROR;
|
||||||
}
|
}
|
||||||
@@ -101,13 +100,13 @@ UINT status;
|
|||||||
/* Determine if the pool ID is invalid. */
|
/* Determine if the pool ID is invalid. */
|
||||||
else if (pool_ptr -> tx_block_pool_id != TX_BLOCK_POOL_ID)
|
else if (pool_ptr -> tx_block_pool_id != TX_BLOCK_POOL_ID)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Block pool pointer is illegal, return error. */
|
/* Block pool pointer is illegal, return error. */
|
||||||
status = TX_PTR_ERROR;
|
status = TX_PTR_ERROR;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Disable interrupts. */
|
/* Disable interrupts. */
|
||||||
TX_DISABLE
|
TX_DISABLE
|
||||||
|
|
||||||
@@ -123,28 +122,28 @@ UINT status;
|
|||||||
/* Retrieve the number of allocations from this block pool. */
|
/* Retrieve the number of allocations from this block pool. */
|
||||||
if (allocates != TX_NULL)
|
if (allocates != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*allocates = pool_ptr -> tx_block_pool_performance_allocate_count;
|
*allocates = pool_ptr -> tx_block_pool_performance_allocate_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the number of blocks released to this block pool. */
|
/* Retrieve the number of blocks released to this block pool. */
|
||||||
if (releases != TX_NULL)
|
if (releases != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*releases = pool_ptr -> tx_block_pool_performance_release_count;
|
*releases = pool_ptr -> tx_block_pool_performance_release_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the number of thread suspensions on this block pool. */
|
/* Retrieve the number of thread suspensions on this block pool. */
|
||||||
if (suspensions != TX_NULL)
|
if (suspensions != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*suspensions = pool_ptr -> tx_block_pool_performance_suspension_count;
|
*suspensions = pool_ptr -> tx_block_pool_performance_suspension_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the number of thread timeouts on this block pool. */
|
/* Retrieve the number of thread timeouts on this block pool. */
|
||||||
if (timeouts != TX_NULL)
|
if (timeouts != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*timeouts = pool_ptr -> tx_block_pool_performance_timeout_count;
|
*timeouts = pool_ptr -> tx_block_pool_performance_timeout_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -157,7 +156,7 @@ UINT status;
|
|||||||
#else
|
#else
|
||||||
UINT status;
|
UINT status;
|
||||||
|
|
||||||
|
|
||||||
/* Access input arguments just for the sake of lint, MISRA, etc. */
|
/* Access input arguments just for the sake of lint, MISRA, etc. */
|
||||||
if (pool_ptr != TX_NULL)
|
if (pool_ptr != TX_NULL)
|
||||||
{
|
{
|
||||||
@@ -191,7 +190,7 @@ UINT status;
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Not enabled, return error. */
|
/* Not enabled, return error. */
|
||||||
status = TX_FEATURE_NOT_ENABLED;
|
status = TX_FEATURE_NOT_ENABLED;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -100,28 +99,28 @@ TX_INTERRUPT_SAVE_AREA
|
|||||||
/* Retrieve the total number of block allocations. */
|
/* Retrieve the total number of block allocations. */
|
||||||
if (allocates != TX_NULL)
|
if (allocates != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*allocates = _tx_block_pool_performance_allocate_count;
|
*allocates = _tx_block_pool_performance_allocate_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the total number of blocks released. */
|
/* Retrieve the total number of blocks released. */
|
||||||
if (releases != TX_NULL)
|
if (releases != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*releases = _tx_block_pool_performance_release_count;
|
*releases = _tx_block_pool_performance_release_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the total number of block pool thread suspensions. */
|
/* Retrieve the total number of block pool thread suspensions. */
|
||||||
if (suspensions != TX_NULL)
|
if (suspensions != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*suspensions = _tx_block_pool_performance_suspension_count;
|
*suspensions = _tx_block_pool_performance_suspension_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the total number of block pool thread timeouts. */
|
/* Retrieve the total number of block pool thread timeouts. */
|
||||||
if (timeouts != TX_NULL)
|
if (timeouts != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*timeouts = _tx_block_pool_performance_timeout_count;
|
*timeouts = _tx_block_pool_performance_timeout_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -139,35 +138,35 @@ UINT status;
|
|||||||
/* Access input arguments just for the sake of lint, MISRA, etc. */
|
/* Access input arguments just for the sake of lint, MISRA, etc. */
|
||||||
if (allocates != TX_NULL)
|
if (allocates != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Not enabled, return error. */
|
/* Not enabled, return error. */
|
||||||
status = TX_FEATURE_NOT_ENABLED;
|
status = TX_FEATURE_NOT_ENABLED;
|
||||||
}
|
}
|
||||||
else if (releases != TX_NULL)
|
else if (releases != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Not enabled, return error. */
|
/* Not enabled, return error. */
|
||||||
status = TX_FEATURE_NOT_ENABLED;
|
status = TX_FEATURE_NOT_ENABLED;
|
||||||
}
|
}
|
||||||
else if (suspensions != TX_NULL)
|
else if (suspensions != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Not enabled, return error. */
|
/* Not enabled, return error. */
|
||||||
status = TX_FEATURE_NOT_ENABLED;
|
status = TX_FEATURE_NOT_ENABLED;
|
||||||
}
|
}
|
||||||
else if (timeouts != TX_NULL)
|
else if (timeouts != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Not enabled, return error. */
|
/* Not enabled, return error. */
|
||||||
status = TX_FEATURE_NOT_ENABLED;
|
status = TX_FEATURE_NOT_ENABLED;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Not enabled, return error. */
|
/* Not enabled, return error. */
|
||||||
status = TX_FEATURE_NOT_ENABLED;
|
status = TX_FEATURE_NOT_ENABLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return completion status. */
|
/* Return completion status. */
|
||||||
return(status);
|
return(status);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -130,7 +129,7 @@ UINT list_changed;
|
|||||||
|
|
||||||
/* Remember the suspension count and head pointer. */
|
/* Remember the suspension count and head pointer. */
|
||||||
head_ptr = pool_ptr -> tx_block_pool_suspension_list;
|
head_ptr = pool_ptr -> tx_block_pool_suspension_list;
|
||||||
|
|
||||||
/* Default the highest priority thread to the thread at the front of the list. */
|
/* Default the highest priority thread to the thread at the front of the list. */
|
||||||
priority_thread_ptr = head_ptr;
|
priority_thread_ptr = head_ptr;
|
||||||
|
|
||||||
@@ -142,7 +141,7 @@ UINT list_changed;
|
|||||||
|
|
||||||
/* Set the list changed flag to false. */
|
/* Set the list changed flag to false. */
|
||||||
list_changed = TX_FALSE;
|
list_changed = TX_FALSE;
|
||||||
|
|
||||||
/* Search through the list to find the highest priority thread. */
|
/* Search through the list to find the highest priority thread. */
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
@@ -160,33 +159,33 @@ UINT list_changed;
|
|||||||
|
|
||||||
/* Disable interrupts again. */
|
/* Disable interrupts again. */
|
||||||
TX_DISABLE
|
TX_DISABLE
|
||||||
|
|
||||||
/* Determine if any changes to the list have occurred while
|
/* Determine if any changes to the list have occurred while
|
||||||
interrupts were enabled. */
|
interrupts were enabled. */
|
||||||
|
|
||||||
/* Is the list head the same? */
|
/* Is the list head the same? */
|
||||||
if (head_ptr != pool_ptr -> tx_block_pool_suspension_list)
|
if (head_ptr != pool_ptr -> tx_block_pool_suspension_list)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* The list head has changed, set the list changed flag. */
|
/* The list head has changed, set the list changed flag. */
|
||||||
list_changed = TX_TRUE;
|
list_changed = TX_TRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Is the suspended count the same? */
|
/* Is the suspended count the same? */
|
||||||
if (suspended_count != pool_ptr -> tx_block_pool_suspended_count)
|
if (suspended_count != pool_ptr -> tx_block_pool_suspended_count)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* The list head has changed, set the list changed flag. */
|
/* The list head has changed, set the list changed flag. */
|
||||||
list_changed = TX_TRUE;
|
list_changed = TX_TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Determine if the list has changed. */
|
/* Determine if the list has changed. */
|
||||||
if (list_changed == TX_FALSE)
|
if (list_changed == TX_FALSE)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Move the thread pointer to the next thread. */
|
/* Move the thread pointer to the next thread. */
|
||||||
thread_ptr = thread_ptr -> tx_thread_suspended_next;
|
thread_ptr = thread_ptr -> tx_thread_suspended_next;
|
||||||
}
|
}
|
||||||
@@ -202,7 +201,7 @@ UINT list_changed;
|
|||||||
|
|
||||||
/* Setup search pointer. */
|
/* Setup search pointer. */
|
||||||
thread_ptr = priority_thread_ptr -> tx_thread_suspended_next;
|
thread_ptr = priority_thread_ptr -> tx_thread_suspended_next;
|
||||||
|
|
||||||
/* Reset the list changed flag. */
|
/* Reset the list changed flag. */
|
||||||
list_changed = TX_FALSE;
|
list_changed = TX_FALSE;
|
||||||
}
|
}
|
||||||
@@ -212,12 +211,12 @@ UINT list_changed;
|
|||||||
/* Release preemption. */
|
/* Release preemption. */
|
||||||
_tx_thread_preempt_disable--;
|
_tx_thread_preempt_disable--;
|
||||||
|
|
||||||
/* Now determine if the highest priority thread is at the front
|
/* Now determine if the highest priority thread is at the front
|
||||||
of the list. */
|
of the list. */
|
||||||
if (priority_thread_ptr != head_ptr)
|
if (priority_thread_ptr != head_ptr)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* No, we need to move the highest priority suspended thread to the
|
/* No, we need to move the highest priority suspended thread to the
|
||||||
front of the list. */
|
front of the list. */
|
||||||
|
|
||||||
/* First, remove the highest priority thread by updating the
|
/* First, remove the highest priority thread by updating the
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -90,7 +89,7 @@ TX_THREAD *previous_thread;
|
|||||||
/* Disable interrupts to put this block back in the pool. */
|
/* Disable interrupts to put this block back in the pool. */
|
||||||
TX_DISABLE
|
TX_DISABLE
|
||||||
|
|
||||||
/* Pickup the pool pointer which is just previous to the starting
|
/* Pickup the pool pointer which is just previous to the starting
|
||||||
address of the block that the caller sees. */
|
address of the block that the caller sees. */
|
||||||
work_ptr = TX_VOID_TO_UCHAR_POINTER_CONVERT(block_ptr);
|
work_ptr = TX_VOID_TO_UCHAR_POINTER_CONVERT(block_ptr);
|
||||||
work_ptr = TX_UCHAR_POINTER_SUB(work_ptr, (sizeof(UCHAR *)));
|
work_ptr = TX_UCHAR_POINTER_SUB(work_ptr, (sizeof(UCHAR *)));
|
||||||
@@ -121,7 +120,7 @@ TX_THREAD *previous_thread;
|
|||||||
|
|
||||||
/* Decrement the number of threads suspended. */
|
/* Decrement the number of threads suspended. */
|
||||||
(pool_ptr -> tx_block_pool_suspended_count)--;
|
(pool_ptr -> tx_block_pool_suspended_count)--;
|
||||||
|
|
||||||
/* Pickup the suspended count. */
|
/* Pickup the suspended count. */
|
||||||
suspended_count = (pool_ptr -> tx_block_pool_suspended_count);
|
suspended_count = (pool_ptr -> tx_block_pool_suspended_count);
|
||||||
|
|
||||||
@@ -148,7 +147,7 @@ TX_THREAD *previous_thread;
|
|||||||
next_thread -> tx_thread_suspended_previous = previous_thread;
|
next_thread -> tx_thread_suspended_previous = previous_thread;
|
||||||
previous_thread -> tx_thread_suspended_next = next_thread;
|
previous_thread -> tx_thread_suspended_next = next_thread;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Prepare for resumption of the first thread. */
|
/* Prepare for resumption of the first thread. */
|
||||||
|
|
||||||
/* Clear cleanup routine to avoid timeout. */
|
/* Clear cleanup routine to avoid timeout. */
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -181,17 +180,17 @@ ULONG lower_tbu;
|
|||||||
/* Determine if we are finished. */
|
/* Determine if we are finished. */
|
||||||
if (work_ptr != TX_NULL)
|
if (work_ptr != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Yes, we have found a block the search is finished. */
|
/* Yes, we have found a block the search is finished. */
|
||||||
finished = TX_TRUE;
|
finished = TX_TRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
/* No block was found, does this thread still own the pool? */
|
/* No block was found, does this thread still own the pool? */
|
||||||
if (pool_ptr -> tx_byte_pool_owner == thread_ptr)
|
if (pool_ptr -> tx_byte_pool_owner == thread_ptr)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Yes, then we have looked through the entire pool and haven't found the memory. */
|
/* Yes, then we have looked through the entire pool and haven't found the memory. */
|
||||||
finished = TX_TRUE;
|
finished = TX_TRUE;
|
||||||
}
|
}
|
||||||
@@ -217,7 +216,7 @@ ULONG lower_tbu;
|
|||||||
/* Is the timestamp the same? */
|
/* Is the timestamp the same? */
|
||||||
if (time_stamp == entry_ptr -> tx_trace_buffer_entry_time_stamp)
|
if (time_stamp == entry_ptr -> tx_trace_buffer_entry_time_stamp)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Timestamp is the same, update the entry with the address. */
|
/* Timestamp is the same, update the entry with the address. */
|
||||||
#ifdef TX_MISRA_ENABLE
|
#ifdef TX_MISRA_ENABLE
|
||||||
entry_ptr -> tx_trace_buffer_entry_info_2 = TX_POINTER_TO_ULONG_CONVERT(*memory_ptr);
|
entry_ptr -> tx_trace_buffer_entry_info_2 = TX_POINTER_TO_ULONG_CONVERT(*memory_ptr);
|
||||||
@@ -242,7 +241,7 @@ ULONG lower_tbu;
|
|||||||
|
|
||||||
/* Restore interrupts. */
|
/* Restore interrupts. */
|
||||||
TX_RESTORE
|
TX_RESTORE
|
||||||
|
|
||||||
/* Set the status to success. */
|
/* Set the status to success. */
|
||||||
status = TX_SUCCESS;
|
status = TX_SUCCESS;
|
||||||
}
|
}
|
||||||
@@ -304,7 +303,7 @@ ULONG lower_tbu;
|
|||||||
|
|
||||||
/* Increment the suspension count. */
|
/* Increment the suspension count. */
|
||||||
(pool_ptr -> tx_byte_pool_suspended_count)++;
|
(pool_ptr -> tx_byte_pool_suspended_count)++;
|
||||||
|
|
||||||
/* Setup suspension list. */
|
/* Setup suspension list. */
|
||||||
if (suspended_count == TX_NO_SUSPENSIONS)
|
if (suspended_count == TX_NO_SUSPENSIONS)
|
||||||
{
|
{
|
||||||
@@ -366,7 +365,7 @@ ULONG lower_tbu;
|
|||||||
/* Is the timestamp the same? */
|
/* Is the timestamp the same? */
|
||||||
if (time_stamp == entry_ptr -> tx_trace_buffer_entry_time_stamp)
|
if (time_stamp == entry_ptr -> tx_trace_buffer_entry_time_stamp)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Timestamp is the same, update the entry with the address. */
|
/* Timestamp is the same, update the entry with the address. */
|
||||||
#ifdef TX_MISRA_ENABLE
|
#ifdef TX_MISRA_ENABLE
|
||||||
entry_ptr -> tx_trace_buffer_entry_info_2 = TX_POINTER_TO_ULONG_CONVERT(*memory_ptr);
|
entry_ptr -> tx_trace_buffer_entry_info_2 = TX_POINTER_TO_ULONG_CONVERT(*memory_ptr);
|
||||||
@@ -396,7 +395,7 @@ ULONG lower_tbu;
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Restore interrupts. */
|
/* Restore interrupts. */
|
||||||
TX_RESTORE
|
TX_RESTORE
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -87,7 +86,7 @@ UINT suspended_count;
|
|||||||
TX_THREAD *next_thread;
|
TX_THREAD *next_thread;
|
||||||
TX_THREAD *previous_thread;
|
TX_THREAD *previous_thread;
|
||||||
|
|
||||||
|
|
||||||
#ifndef TX_NOT_INTERRUPTABLE
|
#ifndef TX_NOT_INTERRUPTABLE
|
||||||
|
|
||||||
/* Disable interrupts to remove the suspended thread from the byte pool. */
|
/* Disable interrupts to remove the suspended thread from the byte pool. */
|
||||||
@@ -96,7 +95,7 @@ TX_THREAD *previous_thread;
|
|||||||
/* Determine if the cleanup is still required. */
|
/* Determine if the cleanup is still required. */
|
||||||
if (thread_ptr -> tx_thread_suspend_cleanup == &(_tx_byte_pool_cleanup))
|
if (thread_ptr -> tx_thread_suspend_cleanup == &(_tx_byte_pool_cleanup))
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Check for valid suspension sequence. */
|
/* Check for valid suspension sequence. */
|
||||||
if (suspension_sequence == thread_ptr -> tx_thread_suspension_sequence)
|
if (suspension_sequence == thread_ptr -> tx_thread_suspension_sequence)
|
||||||
{
|
{
|
||||||
@@ -107,7 +106,7 @@ TX_THREAD *previous_thread;
|
|||||||
/* Check for a NULL byte pool pointer. */
|
/* Check for a NULL byte pool pointer. */
|
||||||
if (pool_ptr != TX_NULL)
|
if (pool_ptr != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Check for valid pool ID. */
|
/* Check for valid pool ID. */
|
||||||
if (pool_ptr -> tx_byte_pool_id == TX_BYTE_POOL_ID)
|
if (pool_ptr -> tx_byte_pool_id == TX_BYTE_POOL_ID)
|
||||||
{
|
{
|
||||||
@@ -126,18 +125,18 @@ TX_THREAD *previous_thread;
|
|||||||
|
|
||||||
/* Decrement the suspension count. */
|
/* Decrement the suspension count. */
|
||||||
pool_ptr -> tx_byte_pool_suspended_count--;
|
pool_ptr -> tx_byte_pool_suspended_count--;
|
||||||
|
|
||||||
/* Pickup the suspended count. */
|
/* Pickup the suspended count. */
|
||||||
suspended_count = pool_ptr -> tx_byte_pool_suspended_count;
|
suspended_count = pool_ptr -> tx_byte_pool_suspended_count;
|
||||||
|
|
||||||
/* Remove the suspended thread from the list. */
|
/* Remove the suspended thread from the list. */
|
||||||
|
|
||||||
/* See if this is the only suspended thread on the list. */
|
/* See if this is the only suspended thread on the list. */
|
||||||
if (suspended_count == TX_NO_SUSPENSIONS)
|
if (suspended_count == TX_NO_SUSPENSIONS)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Yes, the only suspended thread. */
|
/* Yes, the only suspended thread. */
|
||||||
|
|
||||||
/* Update the head pointer. */
|
/* Update the head pointer. */
|
||||||
pool_ptr -> tx_byte_pool_suspension_list = TX_NULL;
|
pool_ptr -> tx_byte_pool_suspension_list = TX_NULL;
|
||||||
}
|
}
|
||||||
@@ -155,7 +154,7 @@ TX_THREAD *previous_thread;
|
|||||||
/* Determine if we need to update the head pointer. */
|
/* Determine if we need to update the head pointer. */
|
||||||
if (pool_ptr -> tx_byte_pool_suspension_list == thread_ptr)
|
if (pool_ptr -> tx_byte_pool_suspension_list == thread_ptr)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Update the list head pointer. */
|
/* Update the list head pointer. */
|
||||||
pool_ptr -> tx_byte_pool_suspension_list = next_thread;
|
pool_ptr -> tx_byte_pool_suspension_list = next_thread;
|
||||||
}
|
}
|
||||||
@@ -166,7 +165,7 @@ TX_THREAD *previous_thread;
|
|||||||
if (thread_ptr -> tx_thread_state == TX_BYTE_MEMORY)
|
if (thread_ptr -> tx_thread_state == TX_BYTE_MEMORY)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Timeout condition and the thread still suspended on the byte pool.
|
/* Timeout condition and the thread still suspended on the byte pool.
|
||||||
Setup return error status and resume the thread. */
|
Setup return error status and resume the thread. */
|
||||||
|
|
||||||
#ifdef TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO
|
#ifdef TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -89,7 +88,7 @@ ALIGN_TYPE *free_ptr;
|
|||||||
/* Initialize the byte pool control block to all zeros. */
|
/* Initialize the byte pool control block to all zeros. */
|
||||||
TX_MEMSET(pool_ptr, 0, (sizeof(TX_BYTE_POOL)));
|
TX_MEMSET(pool_ptr, 0, (sizeof(TX_BYTE_POOL)));
|
||||||
|
|
||||||
/* Round the pool size down to something that is evenly divisible by
|
/* Round the pool size down to something that is evenly divisible by
|
||||||
an ULONG. */
|
an ULONG. */
|
||||||
pool_size = (pool_size/(sizeof(ALIGN_TYPE))) * (sizeof(ALIGN_TYPE));
|
pool_size = (pool_size/(sizeof(ALIGN_TYPE))) * (sizeof(ALIGN_TYPE));
|
||||||
|
|
||||||
@@ -104,17 +103,17 @@ ALIGN_TYPE *free_ptr;
|
|||||||
pool_ptr -> tx_byte_pool_list = TX_VOID_TO_UCHAR_POINTER_CONVERT(pool_start);
|
pool_ptr -> tx_byte_pool_list = TX_VOID_TO_UCHAR_POINTER_CONVERT(pool_start);
|
||||||
pool_ptr -> tx_byte_pool_search = TX_VOID_TO_UCHAR_POINTER_CONVERT(pool_start);
|
pool_ptr -> tx_byte_pool_search = TX_VOID_TO_UCHAR_POINTER_CONVERT(pool_start);
|
||||||
|
|
||||||
/* Initially, the pool will have two blocks. One large block at the
|
/* Initially, the pool will have two blocks. One large block at the
|
||||||
beginning that is available and a small allocated block at the end
|
beginning that is available and a small allocated block at the end
|
||||||
of the pool that is there just for the algorithm. Be sure to count
|
of the pool that is there just for the algorithm. Be sure to count
|
||||||
the available block's header in the available bytes count. */
|
the available block's header in the available bytes count. */
|
||||||
pool_ptr -> tx_byte_pool_available = pool_size - ((sizeof(VOID *)) + (sizeof(ALIGN_TYPE)));
|
pool_ptr -> tx_byte_pool_available = pool_size - ((sizeof(VOID *)) + (sizeof(ALIGN_TYPE)));
|
||||||
pool_ptr -> tx_byte_pool_fragments = ((UINT) 2);
|
pool_ptr -> tx_byte_pool_fragments = ((UINT) 2);
|
||||||
|
|
||||||
/* Each block contains a "next" pointer that points to the next block in the pool followed by a ALIGN_TYPE
|
/* Each block contains a "next" pointer that points to the next block in the pool followed by a ALIGN_TYPE
|
||||||
field that contains either the constant TX_BYTE_BLOCK_FREE (if the block is free) or a pointer to the
|
field that contains either the constant TX_BYTE_BLOCK_FREE (if the block is free) or a pointer to the
|
||||||
owning pool (if the block is allocated). */
|
owning pool (if the block is allocated). */
|
||||||
|
|
||||||
/* Calculate the end of the pool's memory area. */
|
/* Calculate the end of the pool's memory area. */
|
||||||
block_ptr = TX_VOID_TO_UCHAR_POINTER_CONVERT(pool_start);
|
block_ptr = TX_VOID_TO_UCHAR_POINTER_CONVERT(pool_start);
|
||||||
block_ptr = TX_UCHAR_POINTER_ADD(block_ptr, pool_size);
|
block_ptr = TX_UCHAR_POINTER_ADD(block_ptr, pool_size);
|
||||||
@@ -177,7 +176,7 @@ ALIGN_TYPE *free_ptr;
|
|||||||
|
|
||||||
/* Increment the number of created byte pools. */
|
/* Increment the number of created byte pools. */
|
||||||
_tx_byte_pool_created_count++;
|
_tx_byte_pool_created_count++;
|
||||||
|
|
||||||
/* Optional byte pool create extended processing. */
|
/* Optional byte pool create extended processing. */
|
||||||
TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr)
|
TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr)
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -110,7 +109,7 @@ TX_BYTE_POOL *previous_pool;
|
|||||||
|
|
||||||
/* Decrement the number of byte pools created. */
|
/* Decrement the number of byte pools created. */
|
||||||
_tx_byte_pool_created_count--;
|
_tx_byte_pool_created_count--;
|
||||||
|
|
||||||
/* See if the byte pool is the only one on the list. */
|
/* See if the byte pool is the only one on the list. */
|
||||||
if (_tx_byte_pool_created_count == TX_EMPTY)
|
if (_tx_byte_pool_created_count == TX_EMPTY)
|
||||||
{
|
{
|
||||||
@@ -130,7 +129,7 @@ TX_BYTE_POOL *previous_pool;
|
|||||||
/* See if we have to update the created list head pointer. */
|
/* See if we have to update the created list head pointer. */
|
||||||
if (_tx_byte_pool_created_ptr == pool_ptr)
|
if (_tx_byte_pool_created_ptr == pool_ptr)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Yes, move the head pointer to the next link. */
|
/* Yes, move the head pointer to the next link. */
|
||||||
_tx_byte_pool_created_ptr = next_pool;
|
_tx_byte_pool_created_ptr = next_pool;
|
||||||
}
|
}
|
||||||
@@ -144,7 +143,7 @@ TX_BYTE_POOL *previous_pool;
|
|||||||
pool_ptr -> tx_byte_pool_suspension_list = TX_NULL;
|
pool_ptr -> tx_byte_pool_suspension_list = TX_NULL;
|
||||||
suspended_count = pool_ptr -> tx_byte_pool_suspended_count;
|
suspended_count = pool_ptr -> tx_byte_pool_suspended_count;
|
||||||
pool_ptr -> tx_byte_pool_suspended_count = TX_NO_SUSPENSIONS;
|
pool_ptr -> tx_byte_pool_suspended_count = TX_NO_SUSPENSIONS;
|
||||||
|
|
||||||
/* Restore interrupts. */
|
/* Restore interrupts. */
|
||||||
TX_RESTORE
|
TX_RESTORE
|
||||||
|
|
||||||
@@ -152,14 +151,14 @@ TX_BYTE_POOL *previous_pool;
|
|||||||
on this byte pool. */
|
on this byte pool. */
|
||||||
while (suspended_count != TX_NO_SUSPENSIONS)
|
while (suspended_count != TX_NO_SUSPENSIONS)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Decrement the suspension count. */
|
/* Decrement the suspension count. */
|
||||||
suspended_count--;
|
suspended_count--;
|
||||||
|
|
||||||
/* Lockout interrupts. */
|
/* Lockout interrupts. */
|
||||||
TX_DISABLE
|
TX_DISABLE
|
||||||
|
|
||||||
/* Clear the cleanup pointer, this prevents the timeout from doing
|
/* Clear the cleanup pointer, this prevents the timeout from doing
|
||||||
anything. */
|
anything. */
|
||||||
thread_ptr -> tx_thread_suspend_cleanup = TX_NULL;
|
thread_ptr -> tx_thread_suspend_cleanup = TX_NULL;
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -77,8 +76,8 @@
|
|||||||
/* resulting in version 6.1 */
|
/* resulting in version 6.1 */
|
||||||
/* */
|
/* */
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
UINT _tx_byte_pool_info_get(TX_BYTE_POOL *pool_ptr, CHAR **name, ULONG *available_bytes,
|
UINT _tx_byte_pool_info_get(TX_BYTE_POOL *pool_ptr, CHAR **name, ULONG *available_bytes,
|
||||||
ULONG *fragments, TX_THREAD **first_suspended,
|
ULONG *fragments, TX_THREAD **first_suspended,
|
||||||
ULONG *suspended_count, TX_BYTE_POOL **next_pool)
|
ULONG *suspended_count, TX_BYTE_POOL **next_pool)
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -100,42 +99,42 @@ TX_INTERRUPT_SAVE_AREA
|
|||||||
/* Retrieve the name of the byte pool. */
|
/* Retrieve the name of the byte pool. */
|
||||||
if (name != TX_NULL)
|
if (name != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*name = pool_ptr -> tx_byte_pool_name;
|
*name = pool_ptr -> tx_byte_pool_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the number of available bytes in the byte pool. */
|
/* Retrieve the number of available bytes in the byte pool. */
|
||||||
if (available_bytes != TX_NULL)
|
if (available_bytes != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*available_bytes = pool_ptr -> tx_byte_pool_available;
|
*available_bytes = pool_ptr -> tx_byte_pool_available;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the total number of bytes in the byte pool. */
|
/* Retrieve the total number of bytes in the byte pool. */
|
||||||
if (fragments != TX_NULL)
|
if (fragments != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*fragments = (ULONG) pool_ptr -> tx_byte_pool_fragments;
|
*fragments = (ULONG) pool_ptr -> tx_byte_pool_fragments;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the first thread suspended on this byte pool. */
|
/* Retrieve the first thread suspended on this byte pool. */
|
||||||
if (first_suspended != TX_NULL)
|
if (first_suspended != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*first_suspended = pool_ptr -> tx_byte_pool_suspension_list;
|
*first_suspended = pool_ptr -> tx_byte_pool_suspension_list;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the number of threads suspended on this byte pool. */
|
/* Retrieve the number of threads suspended on this byte pool. */
|
||||||
if (suspended_count != TX_NULL)
|
if (suspended_count != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*suspended_count = (ULONG) pool_ptr -> tx_byte_pool_suspended_count;
|
*suspended_count = (ULONG) pool_ptr -> tx_byte_pool_suspended_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the pointer to the next byte pool created. */
|
/* Retrieve the pointer to the next byte pool created. */
|
||||||
if (next_pool != TX_NULL)
|
if (next_pool != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*next_pool = pool_ptr -> tx_byte_pool_created_next;
|
*next_pool = pool_ptr -> tx_byte_pool_created_next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -102,15 +101,15 @@ UINT status;
|
|||||||
/* Determine if this is a legal request. */
|
/* Determine if this is a legal request. */
|
||||||
if (pool_ptr == TX_NULL)
|
if (pool_ptr == TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Byte pool pointer is illegal, return error. */
|
/* Byte pool pointer is illegal, return error. */
|
||||||
status = TX_PTR_ERROR;
|
status = TX_PTR_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Determine if the pool ID is invalid. */
|
/* Determine if the pool ID is invalid. */
|
||||||
else if (pool_ptr -> tx_byte_pool_id != TX_BYTE_POOL_ID)
|
else if (pool_ptr -> tx_byte_pool_id != TX_BYTE_POOL_ID)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Byte pool pointer is illegal, return error. */
|
/* Byte pool pointer is illegal, return error. */
|
||||||
status = TX_PTR_ERROR;
|
status = TX_PTR_ERROR;
|
||||||
}
|
}
|
||||||
@@ -132,7 +131,7 @@ UINT status;
|
|||||||
/* Retrieve the number of allocates on this byte pool. */
|
/* Retrieve the number of allocates on this byte pool. */
|
||||||
if (allocates != TX_NULL)
|
if (allocates != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*allocates = pool_ptr -> tx_byte_pool_performance_allocate_count;
|
*allocates = pool_ptr -> tx_byte_pool_performance_allocate_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -146,35 +145,35 @@ UINT status;
|
|||||||
/* Retrieve the number of fragments searched in this byte pool. */
|
/* Retrieve the number of fragments searched in this byte pool. */
|
||||||
if (fragments_searched != TX_NULL)
|
if (fragments_searched != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*fragments_searched = pool_ptr -> tx_byte_pool_performance_search_count;
|
*fragments_searched = pool_ptr -> tx_byte_pool_performance_search_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the number of fragments merged on this byte pool. */
|
/* Retrieve the number of fragments merged on this byte pool. */
|
||||||
if (merges != TX_NULL)
|
if (merges != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*merges = pool_ptr -> tx_byte_pool_performance_merge_count;
|
*merges = pool_ptr -> tx_byte_pool_performance_merge_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the number of fragment splits on this byte pool. */
|
/* Retrieve the number of fragment splits on this byte pool. */
|
||||||
if (splits != TX_NULL)
|
if (splits != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*splits = pool_ptr -> tx_byte_pool_performance_split_count;
|
*splits = pool_ptr -> tx_byte_pool_performance_split_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the number of suspensions on this byte pool. */
|
/* Retrieve the number of suspensions on this byte pool. */
|
||||||
if (suspensions != TX_NULL)
|
if (suspensions != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*suspensions = pool_ptr -> tx_byte_pool_performance_suspension_count;
|
*suspensions = pool_ptr -> tx_byte_pool_performance_suspension_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the number of timeouts on this byte pool. */
|
/* Retrieve the number of timeouts on this byte pool. */
|
||||||
if (timeouts != TX_NULL)
|
if (timeouts != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*timeouts = pool_ptr -> tx_byte_pool_performance_timeout_count;
|
*timeouts = pool_ptr -> tx_byte_pool_performance_timeout_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -184,7 +183,7 @@ UINT status;
|
|||||||
/* Return completion status. */
|
/* Return completion status. */
|
||||||
status = TX_SUCCESS;
|
status = TX_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return completion status. */
|
/* Return completion status. */
|
||||||
return(status);
|
return(status);
|
||||||
#else
|
#else
|
||||||
@@ -195,55 +194,55 @@ UINT status;
|
|||||||
/* Access input arguments just for the sake of lint, MISRA, etc. */
|
/* Access input arguments just for the sake of lint, MISRA, etc. */
|
||||||
if (pool_ptr != TX_NULL)
|
if (pool_ptr != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Not enabled, return error. */
|
/* Not enabled, return error. */
|
||||||
status = TX_FEATURE_NOT_ENABLED;
|
status = TX_FEATURE_NOT_ENABLED;
|
||||||
}
|
}
|
||||||
else if (allocates != TX_NULL)
|
else if (allocates != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Not enabled, return error. */
|
/* Not enabled, return error. */
|
||||||
status = TX_FEATURE_NOT_ENABLED;
|
status = TX_FEATURE_NOT_ENABLED;
|
||||||
}
|
}
|
||||||
else if (releases != TX_NULL)
|
else if (releases != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Not enabled, return error. */
|
/* Not enabled, return error. */
|
||||||
status = TX_FEATURE_NOT_ENABLED;
|
status = TX_FEATURE_NOT_ENABLED;
|
||||||
}
|
}
|
||||||
else if (fragments_searched != TX_NULL)
|
else if (fragments_searched != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Not enabled, return error. */
|
/* Not enabled, return error. */
|
||||||
status = TX_FEATURE_NOT_ENABLED;
|
status = TX_FEATURE_NOT_ENABLED;
|
||||||
}
|
}
|
||||||
else if (merges != TX_NULL)
|
else if (merges != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Not enabled, return error. */
|
/* Not enabled, return error. */
|
||||||
status = TX_FEATURE_NOT_ENABLED;
|
status = TX_FEATURE_NOT_ENABLED;
|
||||||
}
|
}
|
||||||
else if (splits != TX_NULL)
|
else if (splits != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Not enabled, return error. */
|
/* Not enabled, return error. */
|
||||||
status = TX_FEATURE_NOT_ENABLED;
|
status = TX_FEATURE_NOT_ENABLED;
|
||||||
}
|
}
|
||||||
else if (suspensions != TX_NULL)
|
else if (suspensions != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Not enabled, return error. */
|
/* Not enabled, return error. */
|
||||||
status = TX_FEATURE_NOT_ENABLED;
|
status = TX_FEATURE_NOT_ENABLED;
|
||||||
}
|
}
|
||||||
else if (timeouts != TX_NULL)
|
else if (timeouts != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Not enabled, return error. */
|
/* Not enabled, return error. */
|
||||||
status = TX_FEATURE_NOT_ENABLED;
|
status = TX_FEATURE_NOT_ENABLED;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Not enabled, return error. */
|
/* Not enabled, return error. */
|
||||||
status = TX_FEATURE_NOT_ENABLED;
|
status = TX_FEATURE_NOT_ENABLED;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -109,58 +108,58 @@ TX_INTERRUPT_SAVE_AREA
|
|||||||
/* Retrieve the total number of byte pool allocates. */
|
/* Retrieve the total number of byte pool allocates. */
|
||||||
if (allocates != TX_NULL)
|
if (allocates != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*allocates = _tx_byte_pool_performance_allocate_count;
|
*allocates = _tx_byte_pool_performance_allocate_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the total number of byte pool releases. */
|
/* Retrieve the total number of byte pool releases. */
|
||||||
if (releases != TX_NULL)
|
if (releases != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*releases = _tx_byte_pool_performance_release_count;
|
*releases = _tx_byte_pool_performance_release_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the total number of byte pool fragments searched. */
|
/* Retrieve the total number of byte pool fragments searched. */
|
||||||
if (fragments_searched != TX_NULL)
|
if (fragments_searched != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*fragments_searched = _tx_byte_pool_performance_search_count;
|
*fragments_searched = _tx_byte_pool_performance_search_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the total number of byte pool fragments merged. */
|
/* Retrieve the total number of byte pool fragments merged. */
|
||||||
if (merges != TX_NULL)
|
if (merges != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*merges = _tx_byte_pool_performance_merge_count;
|
*merges = _tx_byte_pool_performance_merge_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the total number of byte pool fragment splits. */
|
/* Retrieve the total number of byte pool fragment splits. */
|
||||||
if (splits != TX_NULL)
|
if (splits != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*splits = _tx_byte_pool_performance_split_count;
|
*splits = _tx_byte_pool_performance_split_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the total number of byte pool suspensions. */
|
/* Retrieve the total number of byte pool suspensions. */
|
||||||
if (suspensions != TX_NULL)
|
if (suspensions != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*suspensions = _tx_byte_pool_performance_suspension_count;
|
*suspensions = _tx_byte_pool_performance_suspension_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the total number of byte pool timeouts. */
|
/* Retrieve the total number of byte pool timeouts. */
|
||||||
if (timeouts != TX_NULL)
|
if (timeouts != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*timeouts = _tx_byte_pool_performance_timeout_count;
|
*timeouts = _tx_byte_pool_performance_timeout_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Restore interrupts. */
|
/* Restore interrupts. */
|
||||||
TX_RESTORE
|
TX_RESTORE
|
||||||
|
|
||||||
/* Return completion status. */
|
/* Return completion status. */
|
||||||
return(TX_SUCCESS);
|
return(TX_SUCCESS);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
UINT status;
|
UINT status;
|
||||||
@@ -215,7 +214,7 @@ UINT status;
|
|||||||
/* Not enabled, return error. */
|
/* Not enabled, return error. */
|
||||||
status = TX_FEATURE_NOT_ENABLED;
|
status = TX_FEATURE_NOT_ENABLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return completion status. */
|
/* Return completion status. */
|
||||||
return(status);
|
return(status);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -161,19 +160,19 @@ UINT list_changed;
|
|||||||
/* Disable interrupts again. */
|
/* Disable interrupts again. */
|
||||||
TX_DISABLE
|
TX_DISABLE
|
||||||
|
|
||||||
/* Determine if any changes to the list have occurred while
|
/* Determine if any changes to the list have occurred while
|
||||||
interrupts were enabled. */
|
interrupts were enabled. */
|
||||||
|
|
||||||
/* Is the list head the same? */
|
/* Is the list head the same? */
|
||||||
if (head_ptr != pool_ptr -> tx_byte_pool_suspension_list)
|
if (head_ptr != pool_ptr -> tx_byte_pool_suspension_list)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* The list head has changed, set the list changed flag. */
|
/* The list head has changed, set the list changed flag. */
|
||||||
list_changed = TX_TRUE;
|
list_changed = TX_TRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Is the suspended count the same? */
|
/* Is the suspended count the same? */
|
||||||
if (suspended_count != pool_ptr -> tx_byte_pool_suspended_count)
|
if (suspended_count != pool_ptr -> tx_byte_pool_suspended_count)
|
||||||
{
|
{
|
||||||
@@ -212,12 +211,12 @@ UINT list_changed;
|
|||||||
/* Release preemption. */
|
/* Release preemption. */
|
||||||
_tx_thread_preempt_disable--;
|
_tx_thread_preempt_disable--;
|
||||||
|
|
||||||
/* Now determine if the highest priority thread is at the front
|
/* Now determine if the highest priority thread is at the front
|
||||||
of the list. */
|
of the list. */
|
||||||
if (priority_thread_ptr != head_ptr)
|
if (priority_thread_ptr != head_ptr)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* No, we need to move the highest priority suspended thread to the
|
/* No, we need to move the highest priority suspended thread to the
|
||||||
front of the list. */
|
front of the list. */
|
||||||
|
|
||||||
/* First, remove the highest priority thread by updating the
|
/* First, remove the highest priority thread by updating the
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -35,7 +34,7 @@
|
|||||||
/* FUNCTION RELEASE */
|
/* FUNCTION RELEASE */
|
||||||
/* */
|
/* */
|
||||||
/* _tx_byte_pool_search PORTABLE C */
|
/* _tx_byte_pool_search PORTABLE C */
|
||||||
/* 6.1 */
|
/* 6.1.7 */
|
||||||
/* AUTHOR */
|
/* AUTHOR */
|
||||||
/* */
|
/* */
|
||||||
/* William E. Lamie, Microsoft Corporation */
|
/* William E. Lamie, Microsoft Corporation */
|
||||||
@@ -76,9 +75,12 @@
|
|||||||
/* */
|
/* */
|
||||||
/* DATE NAME DESCRIPTION */
|
/* DATE NAME DESCRIPTION */
|
||||||
/* */
|
/* */
|
||||||
/* 05-19-2020 William E. Lamie Initial Version 6.0 */
|
/* 05-19-2020 William E. Lamie Initial Version 6.0 */
|
||||||
/* 09-30-2020 Yuxin Zhou Modified comment(s), */
|
/* 09-30-2020 Yuxin Zhou Modified comment(s), */
|
||||||
/* resulting in version 6.1 */
|
/* resulting in version 6.1 */
|
||||||
|
/* 06-02-2021 Scott Larson Improve possible free bytes */
|
||||||
|
/* calculation, */
|
||||||
|
/* resulting in version 6.1.7 */
|
||||||
/* */
|
/* */
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
UCHAR *_tx_byte_pool_search(TX_BYTE_POOL *pool_ptr, ULONG memory_size)
|
UCHAR *_tx_byte_pool_search(TX_BYTE_POOL *pool_ptr, ULONG memory_size)
|
||||||
@@ -96,13 +98,16 @@ UINT first_free_block_found = TX_FALSE;
|
|||||||
TX_THREAD *thread_ptr;
|
TX_THREAD *thread_ptr;
|
||||||
ALIGN_TYPE *free_ptr;
|
ALIGN_TYPE *free_ptr;
|
||||||
UCHAR *work_ptr;
|
UCHAR *work_ptr;
|
||||||
|
ULONG total_theoretical_available;
|
||||||
|
|
||||||
|
|
||||||
/* Disable interrupts. */
|
/* Disable interrupts. */
|
||||||
TX_DISABLE
|
TX_DISABLE
|
||||||
|
|
||||||
/* First, determine if there are enough bytes in the pool. */
|
/* First, determine if there are enough bytes in the pool. */
|
||||||
if (memory_size >= pool_ptr -> tx_byte_pool_available)
|
/* Theoretical bytes available = free bytes + ((fragments-2) * overhead of each block) */
|
||||||
|
total_theoretical_available = pool_ptr -> tx_byte_pool_available + ((pool_ptr -> tx_byte_pool_fragments - 2) * ((sizeof(UCHAR *)) + (sizeof(ALIGN_TYPE))));
|
||||||
|
if (memory_size >= total_theoretical_available)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Restore interrupts. */
|
/* Restore interrupts. */
|
||||||
@@ -146,10 +151,9 @@ UCHAR *work_ptr;
|
|||||||
/* Determine if this is the first free block. */
|
/* Determine if this is the first free block. */
|
||||||
if (first_free_block_found == TX_FALSE)
|
if (first_free_block_found == TX_FALSE)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* This is the first free block. */
|
/* This is the first free block. */
|
||||||
pool_ptr->tx_byte_pool_search = current_ptr;
|
pool_ptr->tx_byte_pool_search = current_ptr;
|
||||||
|
|
||||||
/* Set the flag to indicate we have found the first free
|
/* Set the flag to indicate we have found the first free
|
||||||
block. */
|
block. */
|
||||||
first_free_block_found = TX_TRUE;
|
first_free_block_found = TX_TRUE;
|
||||||
@@ -178,7 +182,7 @@ UCHAR *work_ptr;
|
|||||||
/* Clear the available bytes variable. */
|
/* Clear the available bytes variable. */
|
||||||
available_bytes = ((ULONG) 0);
|
available_bytes = ((ULONG) 0);
|
||||||
|
|
||||||
/* Not enough memory, check to see if the neighbor is
|
/* Not enough memory, check to see if the neighbor is
|
||||||
free and can be merged. */
|
free and can be merged. */
|
||||||
work_ptr = TX_UCHAR_POINTER_ADD(next_ptr, (sizeof(UCHAR *)));
|
work_ptr = TX_UCHAR_POINTER_ADD(next_ptr, (sizeof(UCHAR *)));
|
||||||
free_ptr = TX_UCHAR_TO_ALIGN_TYPE_POINTER_CONVERT(work_ptr);
|
free_ptr = TX_UCHAR_TO_ALIGN_TYPE_POINTER_CONVERT(work_ptr);
|
||||||
@@ -207,14 +211,12 @@ UCHAR *work_ptr;
|
|||||||
/* See if the search pointer is affected. */
|
/* See if the search pointer is affected. */
|
||||||
if (pool_ptr -> tx_byte_pool_search == next_ptr)
|
if (pool_ptr -> tx_byte_pool_search == next_ptr)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Yes, update the search pointer. */
|
/* Yes, update the search pointer. */
|
||||||
pool_ptr -> tx_byte_pool_search = current_ptr;
|
pool_ptr -> tx_byte_pool_search = current_ptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Neighbor is not free so we can skip over it! */
|
/* Neighbor is not free so we can skip over it! */
|
||||||
next_block_link_ptr = TX_UCHAR_TO_INDIRECT_UCHAR_POINTER_CONVERT(next_ptr);
|
next_block_link_ptr = TX_UCHAR_TO_INDIRECT_UCHAR_POINTER_CONVERT(next_ptr);
|
||||||
current_ptr = *next_block_link_ptr;
|
current_ptr = *next_block_link_ptr;
|
||||||
@@ -222,7 +224,6 @@ UCHAR *work_ptr;
|
|||||||
/* Decrement the examined block count to account for this one. */
|
/* Decrement the examined block count to account for this one. */
|
||||||
if (examine_blocks != ((UINT) 0))
|
if (examine_blocks != ((UINT) 0))
|
||||||
{
|
{
|
||||||
|
|
||||||
examine_blocks--;
|
examine_blocks--;
|
||||||
|
|
||||||
#ifdef TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO
|
#ifdef TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO
|
||||||
@@ -297,7 +298,7 @@ UCHAR *work_ptr;
|
|||||||
|
|
||||||
/* Update the current pointer to point at the newly created block. */
|
/* Update the current pointer to point at the newly created block. */
|
||||||
*this_block_link_ptr = next_ptr;
|
*this_block_link_ptr = next_ptr;
|
||||||
|
|
||||||
/* Set available equal to memory size for subsequent calculation. */
|
/* Set available equal to memory size for subsequent calculation. */
|
||||||
available_bytes = memory_size;
|
available_bytes = memory_size;
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -98,7 +97,7 @@ UCHAR **suspend_info_ptr;
|
|||||||
|
|
||||||
/* Default to successful status. */
|
/* Default to successful status. */
|
||||||
status = TX_SUCCESS;
|
status = TX_SUCCESS;
|
||||||
|
|
||||||
/* Set the pool pointer to NULL. */
|
/* Set the pool pointer to NULL. */
|
||||||
pool_ptr = TX_NULL;
|
pool_ptr = TX_NULL;
|
||||||
|
|
||||||
@@ -109,7 +108,7 @@ UCHAR **suspend_info_ptr;
|
|||||||
work_ptr = TX_VOID_TO_UCHAR_POINTER_CONVERT(memory_ptr);
|
work_ptr = TX_VOID_TO_UCHAR_POINTER_CONVERT(memory_ptr);
|
||||||
if (work_ptr != TX_NULL)
|
if (work_ptr != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Back off the memory pointer to pickup its header. */
|
/* Back off the memory pointer to pickup its header. */
|
||||||
work_ptr = TX_UCHAR_POINTER_SUB(work_ptr, ((sizeof(UCHAR *)) + (sizeof(ALIGN_TYPE))));
|
work_ptr = TX_UCHAR_POINTER_SUB(work_ptr, ((sizeof(UCHAR *)) + (sizeof(ALIGN_TYPE))));
|
||||||
|
|
||||||
@@ -127,7 +126,7 @@ UCHAR **suspend_info_ptr;
|
|||||||
/* See if we have a valid pool pointer. */
|
/* See if we have a valid pool pointer. */
|
||||||
if (pool_ptr == TX_NULL)
|
if (pool_ptr == TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Return pointer error. */
|
/* Return pointer error. */
|
||||||
status = TX_PTR_ERROR;
|
status = TX_PTR_ERROR;
|
||||||
}
|
}
|
||||||
@@ -137,10 +136,10 @@ UCHAR **suspend_info_ptr;
|
|||||||
/* See if we have a valid pool. */
|
/* See if we have a valid pool. */
|
||||||
if (pool_ptr -> tx_byte_pool_id != TX_BYTE_POOL_ID)
|
if (pool_ptr -> tx_byte_pool_id != TX_BYTE_POOL_ID)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Return pointer error. */
|
/* Return pointer error. */
|
||||||
status = TX_PTR_ERROR;
|
status = TX_PTR_ERROR;
|
||||||
|
|
||||||
/* Reset the pool pointer is NULL. */
|
/* Reset the pool pointer is NULL. */
|
||||||
pool_ptr = TX_NULL;
|
pool_ptr = TX_NULL;
|
||||||
}
|
}
|
||||||
@@ -163,13 +162,13 @@ UCHAR **suspend_info_ptr;
|
|||||||
/* Determine if the pointer is valid. */
|
/* Determine if the pointer is valid. */
|
||||||
if (pool_ptr == TX_NULL)
|
if (pool_ptr == TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Restore interrupts. */
|
/* Restore interrupts. */
|
||||||
TX_RESTORE
|
TX_RESTORE
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
/* At this point, we know that the pointer is valid. */
|
/* At this point, we know that the pointer is valid. */
|
||||||
|
|
||||||
/* Pickup thread pointer. */
|
/* Pickup thread pointer. */
|
||||||
@@ -201,7 +200,7 @@ UCHAR **suspend_info_ptr;
|
|||||||
/* Update the number of available bytes in the pool. */
|
/* Update the number of available bytes in the pool. */
|
||||||
block_link_ptr = TX_UCHAR_TO_INDIRECT_UCHAR_POINTER_CONVERT(work_ptr);
|
block_link_ptr = TX_UCHAR_TO_INDIRECT_UCHAR_POINTER_CONVERT(work_ptr);
|
||||||
next_block_ptr = *block_link_ptr;
|
next_block_ptr = *block_link_ptr;
|
||||||
pool_ptr -> tx_byte_pool_available =
|
pool_ptr -> tx_byte_pool_available =
|
||||||
pool_ptr -> tx_byte_pool_available + TX_UCHAR_POINTER_DIF(next_block_ptr, work_ptr);
|
pool_ptr -> tx_byte_pool_available + TX_UCHAR_POINTER_DIF(next_block_ptr, work_ptr);
|
||||||
|
|
||||||
/* Determine if the free block is prior to current search pointer. */
|
/* Determine if the free block is prior to current search pointer. */
|
||||||
@@ -215,8 +214,8 @@ UCHAR **suspend_info_ptr;
|
|||||||
/* Determine if there are threads suspended on this byte pool. */
|
/* Determine if there are threads suspended on this byte pool. */
|
||||||
if (pool_ptr -> tx_byte_pool_suspended_count != TX_NO_SUSPENSIONS)
|
if (pool_ptr -> tx_byte_pool_suspended_count != TX_NO_SUSPENSIONS)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Now examine the suspension list to find threads waiting for
|
/* Now examine the suspension list to find threads waiting for
|
||||||
memory. Maybe it is now available! */
|
memory. Maybe it is now available! */
|
||||||
while (pool_ptr -> tx_byte_pool_suspended_count != TX_NO_SUSPENSIONS)
|
while (pool_ptr -> tx_byte_pool_suspended_count != TX_NO_SUSPENSIONS)
|
||||||
{
|
{
|
||||||
@@ -245,7 +244,7 @@ UCHAR **suspend_info_ptr;
|
|||||||
/* If there is not enough memory, break this loop! */
|
/* If there is not enough memory, break this loop! */
|
||||||
if (work_ptr == TX_NULL)
|
if (work_ptr == TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Break out of the loop. */
|
/* Break out of the loop. */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -257,7 +256,7 @@ UCHAR **suspend_info_ptr;
|
|||||||
/* Also, makes sure the memory size is the same. */
|
/* Also, makes sure the memory size is the same. */
|
||||||
if (susp_thread_ptr -> tx_thread_suspend_info == memory_size)
|
if (susp_thread_ptr -> tx_thread_suspend_info == memory_size)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Remove the suspended thread from the list. */
|
/* Remove the suspended thread from the list. */
|
||||||
|
|
||||||
/* Decrement the number of threads suspended. */
|
/* Decrement the number of threads suspended. */
|
||||||
@@ -302,7 +301,7 @@ UCHAR **suspend_info_ptr;
|
|||||||
|
|
||||||
/* Clear the memory pointer to indicate that it was given to the suspended thread. */
|
/* Clear the memory pointer to indicate that it was given to the suspended thread. */
|
||||||
work_ptr = TX_NULL;
|
work_ptr = TX_NULL;
|
||||||
|
|
||||||
/* Put return status into the thread control block. */
|
/* Put return status into the thread control block. */
|
||||||
susp_thread_ptr -> tx_thread_suspend_status = TX_SUCCESS;
|
susp_thread_ptr -> tx_thread_suspend_status = TX_SUCCESS;
|
||||||
|
|
||||||
@@ -328,11 +327,11 @@ UCHAR **suspend_info_ptr;
|
|||||||
TX_DISABLE
|
TX_DISABLE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Determine if the memory was given to the suspended thread. */
|
/* Determine if the memory was given to the suspended thread. */
|
||||||
if (work_ptr != TX_NULL)
|
if (work_ptr != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* No, it wasn't given to the suspended thread. */
|
/* No, it wasn't given to the suspended thread. */
|
||||||
|
|
||||||
/* Put the memory back on the available list since this thread is no longer
|
/* Put the memory back on the available list since this thread is no longer
|
||||||
@@ -345,7 +344,7 @@ UCHAR **suspend_info_ptr;
|
|||||||
/* Update the number of available bytes in the pool. */
|
/* Update the number of available bytes in the pool. */
|
||||||
block_link_ptr = TX_UCHAR_TO_INDIRECT_UCHAR_POINTER_CONVERT(work_ptr);
|
block_link_ptr = TX_UCHAR_TO_INDIRECT_UCHAR_POINTER_CONVERT(work_ptr);
|
||||||
next_block_ptr = *block_link_ptr;
|
next_block_ptr = *block_link_ptr;
|
||||||
pool_ptr -> tx_byte_pool_available =
|
pool_ptr -> tx_byte_pool_available =
|
||||||
pool_ptr -> tx_byte_pool_available + TX_UCHAR_POINTER_DIF(next_block_ptr, work_ptr);
|
pool_ptr -> tx_byte_pool_available + TX_UCHAR_POINTER_DIF(next_block_ptr, work_ptr);
|
||||||
|
|
||||||
/* Determine if the current pointer is before the search pointer. */
|
/* Determine if the current pointer is before the search pointer. */
|
||||||
@@ -357,7 +356,7 @@ UCHAR **suspend_info_ptr;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Restore interrupts. */
|
/* Restore interrupts. */
|
||||||
TX_RESTORE
|
TX_RESTORE
|
||||||
|
|
||||||
@@ -366,7 +365,7 @@ UCHAR **suspend_info_ptr;
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
/* No, threads suspended, restore interrupts. */
|
/* No, threads suspended, restore interrupts. */
|
||||||
TX_RESTORE
|
TX_RESTORE
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -104,11 +103,11 @@ TX_THREAD *previous_thread;
|
|||||||
|
|
||||||
/* Setup pointer to event flags control block. */
|
/* Setup pointer to event flags control block. */
|
||||||
group_ptr = TX_VOID_TO_EVENT_FLAGS_POINTER_CONVERT(thread_ptr -> tx_thread_suspend_control_block);
|
group_ptr = TX_VOID_TO_EVENT_FLAGS_POINTER_CONVERT(thread_ptr -> tx_thread_suspend_control_block);
|
||||||
|
|
||||||
/* Check for a NULL event flags control block pointer. */
|
/* Check for a NULL event flags control block pointer. */
|
||||||
if (group_ptr != TX_NULL)
|
if (group_ptr != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Is the group pointer ID valid? */
|
/* Is the group pointer ID valid? */
|
||||||
if (group_ptr -> tx_event_flags_group_id == TX_EVENT_FLAGS_ID)
|
if (group_ptr -> tx_event_flags_group_id == TX_EVENT_FLAGS_ID)
|
||||||
{
|
{
|
||||||
@@ -133,9 +132,9 @@ TX_THREAD *previous_thread;
|
|||||||
/* Pickup the suspension head. */
|
/* Pickup the suspension head. */
|
||||||
suspension_head = group_ptr -> tx_event_flags_group_suspension_list;
|
suspension_head = group_ptr -> tx_event_flags_group_suspension_list;
|
||||||
|
|
||||||
/* Determine if the cleanup is being done while a set operation was interrupted. If the
|
/* Determine if the cleanup is being done while a set operation was interrupted. If the
|
||||||
suspended count is non-zero and the suspension head is NULL, the list is being processed
|
suspended count is non-zero and the suspension head is NULL, the list is being processed
|
||||||
and cannot be touched from here. The suspension list removal will instead take place
|
and cannot be touched from here. The suspension list removal will instead take place
|
||||||
inside the event flag set code. */
|
inside the event flag set code. */
|
||||||
if (suspension_head != TX_NULL)
|
if (suspension_head != TX_NULL)
|
||||||
{
|
{
|
||||||
@@ -144,7 +143,7 @@ TX_THREAD *previous_thread;
|
|||||||
|
|
||||||
/* Decrement the local suspension count. */
|
/* Decrement the local suspension count. */
|
||||||
suspended_count--;
|
suspended_count--;
|
||||||
|
|
||||||
/* Store the updated suspended count. */
|
/* Store the updated suspended count. */
|
||||||
group_ptr -> tx_event_flags_group_suspended_count = suspended_count;
|
group_ptr -> tx_event_flags_group_suspended_count = suspended_count;
|
||||||
|
|
||||||
@@ -153,7 +152,7 @@ TX_THREAD *previous_thread;
|
|||||||
{
|
{
|
||||||
|
|
||||||
/* Yes, the only suspended thread. */
|
/* Yes, the only suspended thread. */
|
||||||
|
|
||||||
/* Update the head pointer. */
|
/* Update the head pointer. */
|
||||||
group_ptr -> tx_event_flags_group_suspension_list = TX_NULL;
|
group_ptr -> tx_event_flags_group_suspension_list = TX_NULL;
|
||||||
}
|
}
|
||||||
@@ -161,17 +160,17 @@ TX_THREAD *previous_thread;
|
|||||||
{
|
{
|
||||||
|
|
||||||
/* At least one more thread is on the same suspension list. */
|
/* At least one more thread is on the same suspension list. */
|
||||||
|
|
||||||
/* Update the links of the adjacent threads. */
|
/* Update the links of the adjacent threads. */
|
||||||
next_thread = thread_ptr -> tx_thread_suspended_next;
|
next_thread = thread_ptr -> tx_thread_suspended_next;
|
||||||
previous_thread = thread_ptr -> tx_thread_suspended_previous;
|
previous_thread = thread_ptr -> tx_thread_suspended_previous;
|
||||||
next_thread -> tx_thread_suspended_previous = previous_thread;
|
next_thread -> tx_thread_suspended_previous = previous_thread;
|
||||||
previous_thread -> tx_thread_suspended_next = next_thread;
|
previous_thread -> tx_thread_suspended_next = next_thread;
|
||||||
|
|
||||||
/* Determine if we need to update the head pointer. */
|
/* Determine if we need to update the head pointer. */
|
||||||
if (suspension_head == thread_ptr)
|
if (suspension_head == thread_ptr)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Update the list head pointer. */
|
/* Update the list head pointer. */
|
||||||
group_ptr -> tx_event_flags_group_suspension_list = next_thread;
|
group_ptr -> tx_event_flags_group_suspension_list = next_thread;
|
||||||
}
|
}
|
||||||
@@ -179,7 +178,7 @@ TX_THREAD *previous_thread;
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
/* In this case, the search pointer in an interrupted event flag set must be reset. */
|
/* In this case, the search pointer in an interrupted event flag set must be reset. */
|
||||||
group_ptr -> tx_event_flags_group_reset_search = TX_TRUE;
|
group_ptr -> tx_event_flags_group_reset_search = TX_TRUE;
|
||||||
}
|
}
|
||||||
@@ -189,7 +188,7 @@ TX_THREAD *previous_thread;
|
|||||||
if (thread_ptr -> tx_thread_state == TX_EVENT_FLAG)
|
if (thread_ptr -> tx_thread_state == TX_EVENT_FLAG)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Timeout condition and the thread still suspended on the event flags group.
|
/* Timeout condition and the thread still suspended on the event flags group.
|
||||||
Setup return error status and resume the thread. */
|
Setup return error status and resume the thread. */
|
||||||
|
|
||||||
#ifdef TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO
|
#ifdef TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO
|
||||||
@@ -216,8 +215,8 @@ TX_THREAD *previous_thread;
|
|||||||
/* Restore interrupts. */
|
/* Restore interrupts. */
|
||||||
TX_RESTORE
|
TX_RESTORE
|
||||||
|
|
||||||
/* Resume the thread! Check for preemption even though we are executing
|
/* Resume the thread! Check for preemption even though we are executing
|
||||||
from the system timer thread right now which normally executes at the
|
from the system timer thread right now which normally executes at the
|
||||||
highest priority. */
|
highest priority. */
|
||||||
_tx_thread_system_resume(thread_ptr);
|
_tx_thread_system_resume(thread_ptr);
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -86,7 +85,7 @@ TX_EVENT_FLAGS_GROUP *previous_group;
|
|||||||
|
|
||||||
/* Setup the basic event flags group fields. */
|
/* Setup the basic event flags group fields. */
|
||||||
group_ptr -> tx_event_flags_group_name = name_ptr;
|
group_ptr -> tx_event_flags_group_name = name_ptr;
|
||||||
|
|
||||||
/* Disable interrupts to put the event flags group on the created list. */
|
/* Disable interrupts to put the event flags group on the created list. */
|
||||||
TX_DISABLE
|
TX_DISABLE
|
||||||
|
|
||||||
@@ -121,7 +120,7 @@ TX_EVENT_FLAGS_GROUP *previous_group;
|
|||||||
|
|
||||||
/* Increment the number of created event flag groups. */
|
/* Increment the number of created event flag groups. */
|
||||||
_tx_event_flags_created_count++;
|
_tx_event_flags_created_count++;
|
||||||
|
|
||||||
/* Optional event flag group create extended processing. */
|
/* Optional event flag group create extended processing. */
|
||||||
TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr)
|
TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr)
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -106,7 +105,7 @@ TX_EVENT_FLAGS_GROUP *previous_group;
|
|||||||
|
|
||||||
/* Decrement the number of created event flag groups. */
|
/* Decrement the number of created event flag groups. */
|
||||||
_tx_event_flags_created_count--;
|
_tx_event_flags_created_count--;
|
||||||
|
|
||||||
/* See if this group is the only one on the list. */
|
/* See if this group is the only one on the list. */
|
||||||
if (_tx_event_flags_created_count == TX_EMPTY)
|
if (_tx_event_flags_created_count == TX_EMPTY)
|
||||||
{
|
{
|
||||||
@@ -126,7 +125,7 @@ TX_EVENT_FLAGS_GROUP *previous_group;
|
|||||||
/* See if we have to update the created list head pointer. */
|
/* See if we have to update the created list head pointer. */
|
||||||
if (_tx_event_flags_created_ptr == group_ptr)
|
if (_tx_event_flags_created_ptr == group_ptr)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Yes, move the head pointer to the next link. */
|
/* Yes, move the head pointer to the next link. */
|
||||||
_tx_event_flags_created_ptr = next_group;
|
_tx_event_flags_created_ptr = next_group;
|
||||||
}
|
}
|
||||||
@@ -144,18 +143,18 @@ TX_EVENT_FLAGS_GROUP *previous_group;
|
|||||||
/* Restore interrupts. */
|
/* Restore interrupts. */
|
||||||
TX_RESTORE
|
TX_RESTORE
|
||||||
|
|
||||||
/* Walk through the event flag suspension list to resume any and all threads
|
/* Walk through the event flag suspension list to resume any and all threads
|
||||||
suspended on this group. */
|
suspended on this group. */
|
||||||
while (suspended_count != TX_NO_SUSPENSIONS)
|
while (suspended_count != TX_NO_SUSPENSIONS)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Decrement the number of suspended threads. */
|
/* Decrement the number of suspended threads. */
|
||||||
suspended_count--;
|
suspended_count--;
|
||||||
|
|
||||||
/* Lockout interrupts. */
|
/* Lockout interrupts. */
|
||||||
TX_DISABLE
|
TX_DISABLE
|
||||||
|
|
||||||
/* Clear the cleanup pointer, this prevents the timeout from doing
|
/* Clear the cleanup pointer, this prevents the timeout from doing
|
||||||
anything. */
|
anything. */
|
||||||
thread_ptr -> tx_thread_suspend_cleanup = TX_NULL;
|
thread_ptr -> tx_thread_suspend_cleanup = TX_NULL;
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -36,7 +35,7 @@
|
|||||||
/* FUNCTION RELEASE */
|
/* FUNCTION RELEASE */
|
||||||
/* */
|
/* */
|
||||||
/* _tx_event_flags_get PORTABLE C */
|
/* _tx_event_flags_get PORTABLE C */
|
||||||
/* 6.1 */
|
/* 6.2.0 */
|
||||||
/* AUTHOR */
|
/* AUTHOR */
|
||||||
/* */
|
/* */
|
||||||
/* William E. Lamie, Microsoft Corporation */
|
/* William E. Lamie, Microsoft Corporation */
|
||||||
@@ -73,9 +72,15 @@
|
|||||||
/* */
|
/* */
|
||||||
/* DATE NAME DESCRIPTION */
|
/* DATE NAME DESCRIPTION */
|
||||||
/* */
|
/* */
|
||||||
/* 05-19-2020 William E. Lamie Initial Version 6.0 */
|
/* 05-19-2020 William E. Lamie Initial Version 6.0 */
|
||||||
/* 09-30-2020 Yuxin Zhou Modified comment(s), */
|
/* 09-30-2020 Yuxin Zhou Modified comment(s), */
|
||||||
/* resulting in version 6.1 */
|
/* resulting in version 6.1 */
|
||||||
|
/* 04-25-2022 Scott Larson Modified comment(s), */
|
||||||
|
/* handle 0 flags case, */
|
||||||
|
/* resulting in version 6.1.11 */
|
||||||
|
/* 10-31-2022 Scott Larson Modified comment(s), always */
|
||||||
|
/* return actual flags, */
|
||||||
|
/* resulting in version 6.2.0 */
|
||||||
/* */
|
/* */
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
UINT _tx_event_flags_get(TX_EVENT_FLAGS_GROUP *group_ptr, ULONG requested_flags,
|
UINT _tx_event_flags_get(TX_EVENT_FLAGS_GROUP *group_ptr, ULONG requested_flags,
|
||||||
@@ -122,6 +127,9 @@ UINT interrupted_set_request;
|
|||||||
/* Pickup current flags. */
|
/* Pickup current flags. */
|
||||||
current_flags = group_ptr -> tx_event_flags_group_current;
|
current_flags = group_ptr -> tx_event_flags_group_current;
|
||||||
|
|
||||||
|
/* Return the actual event flags and apply delayed clearing. */
|
||||||
|
*actual_flags_ptr = current_flags & ~group_ptr -> tx_event_flags_group_delayed_clear;
|
||||||
|
|
||||||
/* Apply the event flag option mask. */
|
/* Apply the event flag option mask. */
|
||||||
and_request = (get_option & TX_AND);
|
and_request = (get_option & TX_AND);
|
||||||
|
|
||||||
@@ -130,16 +138,16 @@ UINT interrupted_set_request;
|
|||||||
/* Check for AND condition. All flags must be present to satisfy request. */
|
/* Check for AND condition. All flags must be present to satisfy request. */
|
||||||
if (and_request == TX_AND)
|
if (and_request == TX_AND)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* AND request is present. */
|
/* AND request is present. */
|
||||||
|
|
||||||
/* Calculate the flags present. */
|
/* Calculate the flags present. */
|
||||||
flags_satisfied = (current_flags & requested_flags);
|
flags_satisfied = (current_flags & requested_flags);
|
||||||
|
|
||||||
/* Determine if they satisfy the AND request. */
|
/* Determine if they satisfy the AND request. */
|
||||||
if (flags_satisfied != requested_flags)
|
if (flags_satisfied != requested_flags)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* No, not all the requested flags are present. Clear the flags present variable. */
|
/* No, not all the requested flags are present. Clear the flags present variable. */
|
||||||
flags_satisfied = ((ULONG) 0);
|
flags_satisfied = ((ULONG) 0);
|
||||||
}
|
}
|
||||||
@@ -150,21 +158,18 @@ UINT interrupted_set_request;
|
|||||||
/* OR request is present. Simply or the requested flags and the current flags. */
|
/* OR request is present. Simply or the requested flags and the current flags. */
|
||||||
flags_satisfied = (current_flags & requested_flags);
|
flags_satisfied = (current_flags & requested_flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Determine if the request is satisfied. */
|
/* Determine if the request is satisfied. */
|
||||||
if (flags_satisfied != ((ULONG) 0))
|
if (flags_satisfied != ((ULONG) 0))
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Return the actual event flags that satisfied the request. */
|
|
||||||
*actual_flags_ptr = current_flags;
|
|
||||||
|
|
||||||
/* Pickup the clear bit. */
|
/* Pickup the clear bit. */
|
||||||
clear_request = (get_option & TX_EVENT_FLAGS_CLEAR_MASK);
|
clear_request = (get_option & TX_EVENT_FLAGS_CLEAR_MASK);
|
||||||
|
|
||||||
/* Determine whether or not clearing needs to take place. */
|
/* Determine whether or not clearing needs to take place. */
|
||||||
if (clear_request == TX_TRUE)
|
if (clear_request == TX_TRUE)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Yes, clear the flags that satisfied this request. */
|
/* Yes, clear the flags that satisfied this request. */
|
||||||
group_ptr -> tx_event_flags_group_current =
|
group_ptr -> tx_event_flags_group_current =
|
||||||
group_ptr -> tx_event_flags_group_current & (~requested_flags);
|
group_ptr -> tx_event_flags_group_current & (~requested_flags);
|
||||||
@@ -190,16 +195,16 @@ UINT interrupted_set_request;
|
|||||||
/* Check for AND condition. All flags must be present to satisfy request. */
|
/* Check for AND condition. All flags must be present to satisfy request. */
|
||||||
if (and_request == TX_AND)
|
if (and_request == TX_AND)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* AND request is present. */
|
/* AND request is present. */
|
||||||
|
|
||||||
/* Calculate the flags present. */
|
/* Calculate the flags present. */
|
||||||
flags_satisfied = (current_flags & requested_flags);
|
flags_satisfied = (current_flags & requested_flags);
|
||||||
|
|
||||||
/* Determine if they satisfy the AND request. */
|
/* Determine if they satisfy the AND request. */
|
||||||
if (flags_satisfied != requested_flags)
|
if (flags_satisfied != requested_flags)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* No, not all the requested flags are present. Clear the flags present variable. */
|
/* No, not all the requested flags are present. Clear the flags present variable. */
|
||||||
flags_satisfied = ((ULONG) 0);
|
flags_satisfied = ((ULONG) 0);
|
||||||
}
|
}
|
||||||
@@ -211,16 +216,13 @@ UINT interrupted_set_request;
|
|||||||
to see if any are present. */
|
to see if any are present. */
|
||||||
flags_satisfied = (current_flags & requested_flags);
|
flags_satisfied = (current_flags & requested_flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Determine if the request is satisfied. */
|
/* Determine if the request is satisfied. */
|
||||||
if (flags_satisfied != ((ULONG) 0))
|
if (flags_satisfied != ((ULONG) 0))
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Yes, this request can be handled immediately. */
|
/* Yes, this request can be handled immediately. */
|
||||||
|
|
||||||
/* Return the actual event flags that satisfied the request. */
|
|
||||||
*actual_flags_ptr = current_flags;
|
|
||||||
|
|
||||||
/* Pickup the clear bit. */
|
/* Pickup the clear bit. */
|
||||||
clear_request = (get_option & TX_EVENT_FLAGS_CLEAR_MASK);
|
clear_request = (get_option & TX_EVENT_FLAGS_CLEAR_MASK);
|
||||||
|
|
||||||
@@ -235,7 +237,7 @@ UINT interrupted_set_request;
|
|||||||
set request. */
|
set request. */
|
||||||
if (group_ptr -> tx_event_flags_group_suspended_count != TX_NO_SUSPENSIONS)
|
if (group_ptr -> tx_event_flags_group_suspended_count != TX_NO_SUSPENSIONS)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (group_ptr -> tx_event_flags_group_suspension_list == TX_NULL)
|
if (group_ptr -> tx_event_flags_group_suspension_list == TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -252,7 +254,7 @@ UINT interrupted_set_request;
|
|||||||
event clearing until the set operation is complete. */
|
event clearing until the set operation is complete. */
|
||||||
|
|
||||||
/* Remember the events to clear. */
|
/* Remember the events to clear. */
|
||||||
group_ptr -> tx_event_flags_group_delayed_clear =
|
group_ptr -> tx_event_flags_group_delayed_clear =
|
||||||
group_ptr -> tx_event_flags_group_delayed_clear | requested_flags;
|
group_ptr -> tx_event_flags_group_delayed_clear | requested_flags;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -271,16 +273,17 @@ UINT interrupted_set_request;
|
|||||||
#endif
|
#endif
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
/* flags_satisfied is 0. */
|
||||||
/* Determine if the request specifies suspension. */
|
/* Determine if the request specifies suspension. */
|
||||||
if (wait_option != TX_NO_WAIT)
|
if (wait_option != TX_NO_WAIT)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Determine if the preempt disable flag is non-zero. */
|
/* Determine if the preempt disable flag is non-zero OR the requested events is 0. */
|
||||||
if (_tx_thread_preempt_disable != ((UINT) 0))
|
if ((_tx_thread_preempt_disable != ((UINT) 0)) || (requested_flags == (UINT) 0))
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Suspension is not allowed if the preempt disable flag is non-zero at this point, return error completion. */
|
/* Suspension is not allowed if the preempt disable flag is non-zero at this point,
|
||||||
|
or if requested_flags is 0, return error completion. */
|
||||||
status = TX_NO_EVENTS;
|
status = TX_NO_EVENTS;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -296,7 +299,7 @@ UINT interrupted_set_request;
|
|||||||
/* Increment the number of event flags suspensions on this semaphore. */
|
/* Increment the number of event flags suspensions on this semaphore. */
|
||||||
group_ptr -> tx_event_flags_group___performance_suspension_count++;
|
group_ptr -> tx_event_flags_group___performance_suspension_count++;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Pickup thread pointer. */
|
/* Pickup thread pointer. */
|
||||||
TX_THREAD_GET_CURRENT(thread_ptr)
|
TX_THREAD_GET_CURRENT(thread_ptr)
|
||||||
|
|
||||||
@@ -325,7 +328,7 @@ UINT interrupted_set_request;
|
|||||||
|
|
||||||
/* Pickup the suspended count. */
|
/* Pickup the suspended count. */
|
||||||
suspended_count = group_ptr -> tx_event_flags_group_suspended_count;
|
suspended_count = group_ptr -> tx_event_flags_group_suspended_count;
|
||||||
|
|
||||||
/* Setup suspension list. */
|
/* Setup suspension list. */
|
||||||
if (suspended_count == TX_NO_SUSPENSIONS)
|
if (suspended_count == TX_NO_SUSPENSIONS)
|
||||||
{
|
{
|
||||||
@@ -350,7 +353,7 @@ UINT interrupted_set_request;
|
|||||||
|
|
||||||
/* Increment the number of threads suspended. */
|
/* Increment the number of threads suspended. */
|
||||||
group_ptr -> tx_event_flags_group_suspended_count++;
|
group_ptr -> tx_event_flags_group_suspended_count++;
|
||||||
|
|
||||||
/* Set the state to suspended. */
|
/* Set the state to suspended. */
|
||||||
thread_ptr -> tx_thread_state = TX_EVENT_FLAG;
|
thread_ptr -> tx_thread_state = TX_EVENT_FLAG;
|
||||||
|
|
||||||
@@ -377,10 +380,10 @@ UINT interrupted_set_request;
|
|||||||
|
|
||||||
/* Call actual thread suspension routine. */
|
/* Call actual thread suspension routine. */
|
||||||
_tx_thread_system_suspend(thread_ptr);
|
_tx_thread_system_suspend(thread_ptr);
|
||||||
|
|
||||||
/* Disable interrupts. */
|
/* Disable interrupts. */
|
||||||
TX_DISABLE
|
TX_DISABLE
|
||||||
|
|
||||||
/* Return the completion status. */
|
/* Return the completion status. */
|
||||||
status = thread_ptr -> tx_thread_suspend_status;
|
status = thread_ptr -> tx_thread_suspend_status;
|
||||||
#endif
|
#endif
|
||||||
@@ -388,7 +391,7 @@ UINT interrupted_set_request;
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Immediate return, return error completion. */
|
/* Immediate return, return error completion. */
|
||||||
status = TX_NO_EVENTS;
|
status = TX_NO_EVENTS;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -79,8 +78,8 @@
|
|||||||
/* resulting in version 6.1 */
|
/* resulting in version 6.1 */
|
||||||
/* */
|
/* */
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
UINT _tx_event_flags_info_get(TX_EVENT_FLAGS_GROUP *group_ptr, CHAR **name, ULONG *current_flags,
|
UINT _tx_event_flags_info_get(TX_EVENT_FLAGS_GROUP *group_ptr, CHAR **name, ULONG *current_flags,
|
||||||
TX_THREAD **first_suspended, ULONG *suspended_count,
|
TX_THREAD **first_suspended, ULONG *suspended_count,
|
||||||
TX_EVENT_FLAGS_GROUP **next_group)
|
TX_EVENT_FLAGS_GROUP **next_group)
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -102,7 +101,7 @@ TX_INTERRUPT_SAVE_AREA
|
|||||||
/* Retrieve the name of the event flag group. */
|
/* Retrieve the name of the event flag group. */
|
||||||
if (name != TX_NULL)
|
if (name != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*name = group_ptr -> tx_event_flags_group_name;
|
*name = group_ptr -> tx_event_flags_group_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -111,31 +110,31 @@ TX_INTERRUPT_SAVE_AREA
|
|||||||
{
|
{
|
||||||
|
|
||||||
/* Pickup the current flags and apply delayed clearing. */
|
/* Pickup the current flags and apply delayed clearing. */
|
||||||
*current_flags = group_ptr -> tx_event_flags_group_current &
|
*current_flags = group_ptr -> tx_event_flags_group_current &
|
||||||
~group_ptr -> tx_event_flags_group_delayed_clear;
|
~group_ptr -> tx_event_flags_group_delayed_clear;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the first thread suspended on this event flag group. */
|
/* Retrieve the first thread suspended on this event flag group. */
|
||||||
if (first_suspended != TX_NULL)
|
if (first_suspended != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*first_suspended = group_ptr -> tx_event_flags_group_suspension_list;
|
*first_suspended = group_ptr -> tx_event_flags_group_suspension_list;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the number of threads suspended on this event flag group. */
|
/* Retrieve the number of threads suspended on this event flag group. */
|
||||||
if (suspended_count != TX_NULL)
|
if (suspended_count != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*suspended_count = (ULONG) group_ptr -> tx_event_flags_group_suspended_count;
|
*suspended_count = (ULONG) group_ptr -> tx_event_flags_group_suspended_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the pointer to the next event flag group created. */
|
/* Retrieve the pointer to the next event flag group created. */
|
||||||
if (next_group != TX_NULL)
|
if (next_group != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*next_group = group_ptr -> tx_event_flags_group_created_next;
|
*next_group = group_ptr -> tx_event_flags_group_created_next;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Restore interrupts. */
|
/* Restore interrupts. */
|
||||||
TX_RESTORE
|
TX_RESTORE
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -94,15 +93,15 @@ UINT status;
|
|||||||
/* Determine if this is a legal request. */
|
/* Determine if this is a legal request. */
|
||||||
if (group_ptr == TX_NULL)
|
if (group_ptr == TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Event flags group pointer is illegal, return error. */
|
/* Event flags group pointer is illegal, return error. */
|
||||||
status = TX_PTR_ERROR;
|
status = TX_PTR_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Determine if the event group ID is invalid. */
|
/* Determine if the event group ID is invalid. */
|
||||||
else if (group_ptr -> tx_event_flags_group_id != TX_EVENT_FLAGS_ID)
|
else if (group_ptr -> tx_event_flags_group_id != TX_EVENT_FLAGS_ID)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Event flags group pointer is illegal, return error. */
|
/* Event flags group pointer is illegal, return error. */
|
||||||
status = TX_PTR_ERROR;
|
status = TX_PTR_ERROR;
|
||||||
}
|
}
|
||||||
@@ -124,34 +123,34 @@ UINT status;
|
|||||||
/* Retrieve the number of set operations on this event flag group. */
|
/* Retrieve the number of set operations on this event flag group. */
|
||||||
if (sets != TX_NULL)
|
if (sets != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*sets = group_ptr -> tx_event_flags_group_performance_set_count;
|
*sets = group_ptr -> tx_event_flags_group_performance_set_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the number of get operations on this event flag group. */
|
/* Retrieve the number of get operations on this event flag group. */
|
||||||
if (gets != TX_NULL)
|
if (gets != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*gets = group_ptr -> tx_event_flags_group__performance_get_count;
|
*gets = group_ptr -> tx_event_flags_group__performance_get_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the number of thread suspensions on this event flag group. */
|
/* Retrieve the number of thread suspensions on this event flag group. */
|
||||||
if (suspensions != TX_NULL)
|
if (suspensions != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*suspensions = group_ptr -> tx_event_flags_group___performance_suspension_count;
|
*suspensions = group_ptr -> tx_event_flags_group___performance_suspension_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the number of thread timeouts on this event flag group. */
|
/* Retrieve the number of thread timeouts on this event flag group. */
|
||||||
if (timeouts != TX_NULL)
|
if (timeouts != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*timeouts = group_ptr -> tx_event_flags_group____performance_timeout_count;
|
*timeouts = group_ptr -> tx_event_flags_group____performance_timeout_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Restore interrupts. */
|
/* Restore interrupts. */
|
||||||
TX_RESTORE
|
TX_RESTORE
|
||||||
|
|
||||||
/* Return successful completion. */
|
/* Return successful completion. */
|
||||||
status = TX_SUCCESS;
|
status = TX_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -101,37 +100,37 @@ TX_INTERRUPT_SAVE_AREA
|
|||||||
/* Retrieve the total number of event flag set operations. */
|
/* Retrieve the total number of event flag set operations. */
|
||||||
if (sets != TX_NULL)
|
if (sets != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*sets = _tx_event_flags_performance_set_count;
|
*sets = _tx_event_flags_performance_set_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the total number of event flag get operations. */
|
/* Retrieve the total number of event flag get operations. */
|
||||||
if (gets != TX_NULL)
|
if (gets != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*gets = _tx_event_flags_performance_get_count;
|
*gets = _tx_event_flags_performance_get_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the total number of event flag thread suspensions. */
|
/* Retrieve the total number of event flag thread suspensions. */
|
||||||
if (suspensions != TX_NULL)
|
if (suspensions != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*suspensions = _tx_event_flags_performance_suspension_count;
|
*suspensions = _tx_event_flags_performance_suspension_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the total number of event flag thread timeouts. */
|
/* Retrieve the total number of event flag thread timeouts. */
|
||||||
if (timeouts != TX_NULL)
|
if (timeouts != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*timeouts = _tx_event_flags_performance_timeout_count;
|
*timeouts = _tx_event_flags_performance_timeout_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Restore interrupts. */
|
/* Restore interrupts. */
|
||||||
TX_RESTORE
|
TX_RESTORE
|
||||||
|
|
||||||
/* Return completion status. */
|
/* Return completion status. */
|
||||||
return(TX_SUCCESS);
|
return(TX_SUCCESS);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
UINT status;
|
UINT status;
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -36,7 +35,7 @@
|
|||||||
/* FUNCTION RELEASE */
|
/* FUNCTION RELEASE */
|
||||||
/* */
|
/* */
|
||||||
/* _tx_event_flags_set PORTABLE C */
|
/* _tx_event_flags_set PORTABLE C */
|
||||||
/* 6.1 */
|
/* 6.1.11 */
|
||||||
/* AUTHOR */
|
/* AUTHOR */
|
||||||
/* */
|
/* */
|
||||||
/* William E. Lamie, Microsoft Corporation */
|
/* William E. Lamie, Microsoft Corporation */
|
||||||
@@ -72,9 +71,13 @@
|
|||||||
/* */
|
/* */
|
||||||
/* DATE NAME DESCRIPTION */
|
/* DATE NAME DESCRIPTION */
|
||||||
/* */
|
/* */
|
||||||
/* 05-19-2020 William E. Lamie Initial Version 6.0 */
|
/* 05-19-2020 William E. Lamie Initial Version 6.0 */
|
||||||
/* 09-30-2020 Yuxin Zhou Modified comment(s), */
|
/* 09-30-2020 Yuxin Zhou Modified comment(s), */
|
||||||
/* resulting in version 6.1 */
|
/* resulting in version 6.1 */
|
||||||
|
/* 04-25-2022 William E. Lamie Modified comment(s), and */
|
||||||
|
/* added corrected preemption */
|
||||||
|
/* check logic, resulting in */
|
||||||
|
/* version 6.1.11 */
|
||||||
/* */
|
/* */
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
UINT _tx_event_flags_set(TX_EVENT_FLAGS_GROUP *group_ptr, ULONG flags_to_set, UINT set_option)
|
UINT _tx_event_flags_set(TX_EVENT_FLAGS_GROUP *group_ptr, ULONG flags_to_set, UINT set_option)
|
||||||
@@ -137,7 +140,7 @@ VOID (*events_set_notify)(struct TX_EVENT_FLAGS_GROUP_STRUCT *notify_
|
|||||||
set request. */
|
set request. */
|
||||||
if (group_ptr -> tx_event_flags_group_suspended_count != TX_NO_SUSPENSIONS)
|
if (group_ptr -> tx_event_flags_group_suspended_count != TX_NO_SUSPENSIONS)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (group_ptr -> tx_event_flags_group_suspension_list == TX_NULL)
|
if (group_ptr -> tx_event_flags_group_suspension_list == TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -154,15 +157,15 @@ VOID (*events_set_notify)(struct TX_EVENT_FLAGS_GROUP_STRUCT *notify_
|
|||||||
event clearing until the set operation is complete. */
|
event clearing until the set operation is complete. */
|
||||||
|
|
||||||
/* Remember the events to clear. */
|
/* Remember the events to clear. */
|
||||||
group_ptr -> tx_event_flags_group_delayed_clear =
|
group_ptr -> tx_event_flags_group_delayed_clear =
|
||||||
group_ptr -> tx_event_flags_group_delayed_clear | ~flags_to_set;
|
group_ptr -> tx_event_flags_group_delayed_clear | ~flags_to_set;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Previous set operation was not interrupted, simply clear the
|
/* Previous set operation was not interrupted, simply clear the
|
||||||
specified flags by "ANDing" the flags into the current events
|
specified flags by "ANDing" the flags into the current events
|
||||||
of the group. */
|
of the group. */
|
||||||
group_ptr -> tx_event_flags_group_current =
|
group_ptr -> tx_event_flags_group_current =
|
||||||
group_ptr -> tx_event_flags_group_current & flags_to_set;
|
group_ptr -> tx_event_flags_group_current & flags_to_set;
|
||||||
@@ -195,7 +198,7 @@ VOID (*events_set_notify)(struct TX_EVENT_FLAGS_GROUP_STRUCT *notify_
|
|||||||
{
|
{
|
||||||
|
|
||||||
/* Yes, we need to neutralize the delayed clearing as well. */
|
/* Yes, we need to neutralize the delayed clearing as well. */
|
||||||
group_ptr -> tx_event_flags_group_delayed_clear =
|
group_ptr -> tx_event_flags_group_delayed_clear =
|
||||||
group_ptr -> tx_event_flags_group_delayed_clear & ~flags_to_set;
|
group_ptr -> tx_event_flags_group_delayed_clear & ~flags_to_set;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -210,7 +213,7 @@ VOID (*events_set_notify)(struct TX_EVENT_FLAGS_GROUP_STRUCT *notify_
|
|||||||
if (group_ptr -> tx_event_flags_group_suspension_list != TX_NULL)
|
if (group_ptr -> tx_event_flags_group_suspension_list != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Determine if there is just a single thread waiting on the event
|
/* Determine if there is just a single thread waiting on the event
|
||||||
flag group. */
|
flag group. */
|
||||||
if (suspended_count == ((UINT) 1))
|
if (suspended_count == ((UINT) 1))
|
||||||
{
|
{
|
||||||
@@ -223,7 +226,7 @@ VOID (*events_set_notify)(struct TX_EVENT_FLAGS_GROUP_STRUCT *notify_
|
|||||||
|
|
||||||
/* Pickup the current event flags. */
|
/* Pickup the current event flags. */
|
||||||
current_event_flags = group_ptr -> tx_event_flags_group_current;
|
current_event_flags = group_ptr -> tx_event_flags_group_current;
|
||||||
|
|
||||||
/* Pickup the suspend information. */
|
/* Pickup the suspend information. */
|
||||||
requested_flags = thread_ptr -> tx_thread_suspend_info;
|
requested_flags = thread_ptr -> tx_thread_suspend_info;
|
||||||
|
|
||||||
@@ -236,16 +239,16 @@ VOID (*events_set_notify)(struct TX_EVENT_FLAGS_GROUP_STRUCT *notify_
|
|||||||
/* Check for AND condition. All flags must be present to satisfy request. */
|
/* Check for AND condition. All flags must be present to satisfy request. */
|
||||||
if (and_request == TX_AND)
|
if (and_request == TX_AND)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* AND request is present. */
|
/* AND request is present. */
|
||||||
|
|
||||||
/* Calculate the flags present. */
|
/* Calculate the flags present. */
|
||||||
flags_satisfied = (current_event_flags & requested_flags);
|
flags_satisfied = (current_event_flags & requested_flags);
|
||||||
|
|
||||||
/* Determine if they satisfy the AND request. */
|
/* Determine if they satisfy the AND request. */
|
||||||
if (flags_satisfied != requested_flags)
|
if (flags_satisfied != requested_flags)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* No, not all the requested flags are present. Clear the flags present variable. */
|
/* No, not all the requested flags are present. Clear the flags present variable. */
|
||||||
flags_satisfied = ((ULONG) 0);
|
flags_satisfied = ((ULONG) 0);
|
||||||
}
|
}
|
||||||
@@ -256,7 +259,7 @@ VOID (*events_set_notify)(struct TX_EVENT_FLAGS_GROUP_STRUCT *notify_
|
|||||||
/* OR request is present. Simply or the requested flags and the current flags. */
|
/* OR request is present. Simply or the requested flags and the current flags. */
|
||||||
flags_satisfied = (current_event_flags & requested_flags);
|
flags_satisfied = (current_event_flags & requested_flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Determine if the request is satisfied. */
|
/* Determine if the request is satisfied. */
|
||||||
if (flags_satisfied != ((ULONG) 0))
|
if (flags_satisfied != ((ULONG) 0))
|
||||||
{
|
{
|
||||||
@@ -264,9 +267,6 @@ VOID (*events_set_notify)(struct TX_EVENT_FLAGS_GROUP_STRUCT *notify_
|
|||||||
/* Yes, resume the thread and apply any event flag
|
/* Yes, resume the thread and apply any event flag
|
||||||
clearing. */
|
clearing. */
|
||||||
|
|
||||||
/* Set the preempt check flag. */
|
|
||||||
preempt_check = TX_TRUE;
|
|
||||||
|
|
||||||
/* Return the actual event flags that satisfied the request. */
|
/* Return the actual event flags that satisfied the request. */
|
||||||
suspend_info_ptr = TX_VOID_TO_ULONG_POINTER_CONVERT(thread_ptr -> tx_thread_additional_suspend_info);
|
suspend_info_ptr = TX_VOID_TO_ULONG_POINTER_CONVERT(thread_ptr -> tx_thread_additional_suspend_info);
|
||||||
*suspend_info_ptr = current_event_flags;
|
*suspend_info_ptr = current_event_flags;
|
||||||
@@ -315,7 +315,7 @@ VOID (*events_set_notify)(struct TX_EVENT_FLAGS_GROUP_STRUCT *notify_
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Otherwise, the event flag requests of multiple threads must be
|
/* Otherwise, the event flag requests of multiple threads must be
|
||||||
examined. */
|
examined. */
|
||||||
|
|
||||||
/* Setup thread pointer, keep a local copy of the head pointer. */
|
/* Setup thread pointer, keep a local copy of the head pointer. */
|
||||||
@@ -325,7 +325,7 @@ VOID (*events_set_notify)(struct TX_EVENT_FLAGS_GROUP_STRUCT *notify_
|
|||||||
/* Clear the suspended list head pointer to thwart manipulation of
|
/* Clear the suspended list head pointer to thwart manipulation of
|
||||||
the list in ISR's while we are processing here. */
|
the list in ISR's while we are processing here. */
|
||||||
group_ptr -> tx_event_flags_group_suspension_list = TX_NULL;
|
group_ptr -> tx_event_flags_group_suspension_list = TX_NULL;
|
||||||
|
|
||||||
/* Setup the satisfied thread pointers. */
|
/* Setup the satisfied thread pointers. */
|
||||||
satisfied_list = TX_NULL;
|
satisfied_list = TX_NULL;
|
||||||
last_satisfied = TX_NULL;
|
last_satisfied = TX_NULL;
|
||||||
@@ -336,6 +336,11 @@ VOID (*events_set_notify)(struct TX_EVENT_FLAGS_GROUP_STRUCT *notify_
|
|||||||
/* Disable preemption while we process the suspended list. */
|
/* Disable preemption while we process the suspended list. */
|
||||||
_tx_thread_preempt_disable++;
|
_tx_thread_preempt_disable++;
|
||||||
|
|
||||||
|
/* Since we have temporarily disabled preemption globally, set the preempt
|
||||||
|
check flag to check for any preemption condition - including from
|
||||||
|
unrelated ISR processing. */
|
||||||
|
preempt_check = TX_TRUE;
|
||||||
|
|
||||||
/* Loop to examine all of the suspended threads. */
|
/* Loop to examine all of the suspended threads. */
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
@@ -382,16 +387,16 @@ VOID (*events_set_notify)(struct TX_EVENT_FLAGS_GROUP_STRUCT *notify_
|
|||||||
/* Check for AND condition. All flags must be present to satisfy request. */
|
/* Check for AND condition. All flags must be present to satisfy request. */
|
||||||
if (and_request == TX_AND)
|
if (and_request == TX_AND)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* AND request is present. */
|
/* AND request is present. */
|
||||||
|
|
||||||
/* Calculate the flags present. */
|
/* Calculate the flags present. */
|
||||||
flags_satisfied = (current_event_flags & requested_flags);
|
flags_satisfied = (current_event_flags & requested_flags);
|
||||||
|
|
||||||
/* Determine if they satisfy the AND request. */
|
/* Determine if they satisfy the AND request. */
|
||||||
if (flags_satisfied != requested_flags)
|
if (flags_satisfied != requested_flags)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* No, not all the requested flags are present. Clear the flags present variable. */
|
/* No, not all the requested flags are present. Clear the flags present variable. */
|
||||||
flags_satisfied = ((ULONG) 0);
|
flags_satisfied = ((ULONG) 0);
|
||||||
}
|
}
|
||||||
@@ -402,13 +407,13 @@ VOID (*events_set_notify)(struct TX_EVENT_FLAGS_GROUP_STRUCT *notify_
|
|||||||
/* OR request is present. Simply or the requested flags and the current flags. */
|
/* OR request is present. Simply or the requested flags and the current flags. */
|
||||||
flags_satisfied = (current_event_flags & requested_flags);
|
flags_satisfied = (current_event_flags & requested_flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check to see if the thread had a timeout or wait abort during the event search processing.
|
/* Check to see if the thread had a timeout or wait abort during the event search processing.
|
||||||
If so, just set the flags satisfied to ensure the processing here removes the thread from
|
If so, just set the flags satisfied to ensure the processing here removes the thread from
|
||||||
the suspension list. */
|
the suspension list. */
|
||||||
if (thread_ptr -> tx_thread_state != TX_EVENT_FLAG)
|
if (thread_ptr -> tx_thread_state != TX_EVENT_FLAG)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Simply set the satisfied flags to 1 in order to remove the thread from the suspension list. */
|
/* Simply set the satisfied flags to 1 in order to remove the thread from the suspension list. */
|
||||||
flags_satisfied = ((ULONG) 1);
|
flags_satisfied = ((ULONG) 1);
|
||||||
}
|
}
|
||||||
@@ -419,9 +424,6 @@ VOID (*events_set_notify)(struct TX_EVENT_FLAGS_GROUP_STRUCT *notify_
|
|||||||
|
|
||||||
/* Yes, this request can be handled now. */
|
/* Yes, this request can be handled now. */
|
||||||
|
|
||||||
/* Set the preempt check flag. */
|
|
||||||
preempt_check = TX_TRUE;
|
|
||||||
|
|
||||||
/* Determine if the thread is still suspended on the event flag group. If not, a wait
|
/* Determine if the thread is still suspended on the event flag group. If not, a wait
|
||||||
abort must have been done from an ISR. */
|
abort must have been done from an ISR. */
|
||||||
if (thread_ptr -> tx_thread_state == TX_EVENT_FLAG)
|
if (thread_ptr -> tx_thread_state == TX_EVENT_FLAG)
|
||||||
@@ -437,11 +439,11 @@ VOID (*events_set_notify)(struct TX_EVENT_FLAGS_GROUP_STRUCT *notify_
|
|||||||
/* Determine whether or not clearing needs to take place. */
|
/* Determine whether or not clearing needs to take place. */
|
||||||
if (clear_request == TX_TRUE)
|
if (clear_request == TX_TRUE)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Yes, clear the flags that satisfied this request. */
|
/* Yes, clear the flags that satisfied this request. */
|
||||||
group_ptr -> tx_event_flags_group_current = group_ptr -> tx_event_flags_group_current & ~requested_flags;
|
group_ptr -> tx_event_flags_group_current = group_ptr -> tx_event_flags_group_current & ~requested_flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Prepare for resumption of the first thread. */
|
/* Prepare for resumption of the first thread. */
|
||||||
|
|
||||||
/* Clear cleanup routine to avoid timeout. */
|
/* Clear cleanup routine to avoid timeout. */
|
||||||
@@ -478,7 +480,7 @@ VOID (*events_set_notify)(struct TX_EVENT_FLAGS_GROUP_STRUCT *notify_
|
|||||||
list. */
|
list. */
|
||||||
if (suspended_list == thread_ptr)
|
if (suspended_list == thread_ptr)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Yes, head pointer needs to be updated. */
|
/* Yes, head pointer needs to be updated. */
|
||||||
suspended_list = thread_ptr -> tx_thread_suspended_next;
|
suspended_list = thread_ptr -> tx_thread_suspended_next;
|
||||||
}
|
}
|
||||||
@@ -494,7 +496,7 @@ VOID (*events_set_notify)(struct TX_EVENT_FLAGS_GROUP_STRUCT *notify_
|
|||||||
/* First thread on the satisfied list. */
|
/* First thread on the satisfied list. */
|
||||||
satisfied_list = thread_ptr;
|
satisfied_list = thread_ptr;
|
||||||
last_satisfied = thread_ptr;
|
last_satisfied = thread_ptr;
|
||||||
|
|
||||||
/* Setup initial next pointer. */
|
/* Setup initial next pointer. */
|
||||||
thread_ptr -> tx_thread_suspended_next = TX_NULL;
|
thread_ptr -> tx_thread_suspended_next = TX_NULL;
|
||||||
}
|
}
|
||||||
@@ -502,7 +504,7 @@ VOID (*events_set_notify)(struct TX_EVENT_FLAGS_GROUP_STRUCT *notify_
|
|||||||
{
|
{
|
||||||
|
|
||||||
/* Not the first thread on the satisfied list. */
|
/* Not the first thread on the satisfied list. */
|
||||||
|
|
||||||
/* Link it up at the end. */
|
/* Link it up at the end. */
|
||||||
last_satisfied -> tx_thread_suspended_next = thread_ptr;
|
last_satisfied -> tx_thread_suspended_next = thread_ptr;
|
||||||
thread_ptr -> tx_thread_suspended_next = TX_NULL;
|
thread_ptr -> tx_thread_suspended_next = TX_NULL;
|
||||||
@@ -515,7 +517,7 @@ VOID (*events_set_notify)(struct TX_EVENT_FLAGS_GROUP_STRUCT *notify_
|
|||||||
|
|
||||||
/* Decrement the suspension count. */
|
/* Decrement the suspension count. */
|
||||||
suspended_count--;
|
suspended_count--;
|
||||||
|
|
||||||
} while (suspended_count != TX_NO_SUSPENSIONS);
|
} while (suspended_count != TX_NO_SUSPENSIONS);
|
||||||
|
|
||||||
/* Setup the group's suspension list head again. */
|
/* Setup the group's suspension list head again. */
|
||||||
@@ -543,7 +545,7 @@ VOID (*events_set_notify)(struct TX_EVENT_FLAGS_GROUP_STRUCT *notify_
|
|||||||
thread_ptr = satisfied_list;
|
thread_ptr = satisfied_list;
|
||||||
while(thread_ptr != TX_NULL)
|
while(thread_ptr != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Get next pointer first. */
|
/* Get next pointer first. */
|
||||||
next_thread_ptr = thread_ptr -> tx_thread_suspended_next;
|
next_thread_ptr = thread_ptr -> tx_thread_suspended_next;
|
||||||
|
|
||||||
@@ -586,7 +588,7 @@ VOID (*events_set_notify)(struct TX_EVENT_FLAGS_GROUP_STRUCT *notify_
|
|||||||
/* Determine if we need to set the reset search field. */
|
/* Determine if we need to set the reset search field. */
|
||||||
if (group_ptr -> tx_event_flags_group_suspended_count != TX_NO_SUSPENSIONS)
|
if (group_ptr -> tx_event_flags_group_suspended_count != TX_NO_SUSPENSIONS)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* We interrupted a search of an event flag group suspension
|
/* We interrupted a search of an event flag group suspension
|
||||||
list. Make sure we reset the search. */
|
list. Make sure we reset the search. */
|
||||||
group_ptr -> tx_event_flags_group_reset_search = TX_TRUE;
|
group_ptr -> tx_event_flags_group_reset_search = TX_TRUE;
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -44,9 +43,9 @@
|
|||||||
#include "tx_byte_pool.h"
|
#include "tx_byte_pool.h"
|
||||||
|
|
||||||
|
|
||||||
/* Define the unused memory pointer. The value of the first available
|
/* Define the unused memory pointer. The value of the first available
|
||||||
memory address is placed in this variable in the low-level
|
memory address is placed in this variable in the low-level
|
||||||
initialization function. The content of this variable is passed
|
initialization function. The content of this variable is passed
|
||||||
to the application's system definition function. */
|
to the application's system definition function. */
|
||||||
|
|
||||||
VOID *_tx_initialize_unused_memory;
|
VOID *_tx_initialize_unused_memory;
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -30,6 +29,9 @@
|
|||||||
#include "tx_thread.h"
|
#include "tx_thread.h"
|
||||||
#include "tx_timer.h"
|
#include "tx_timer.h"
|
||||||
|
|
||||||
|
#if defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE)
|
||||||
|
extern VOID _tx_execution_initialize(VOID);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Define any port-specific scheduling data structures. */
|
/* Define any port-specific scheduling data structures. */
|
||||||
|
|
||||||
@@ -46,7 +48,7 @@ TX_SAFETY_CRITICAL_EXCEPTION_HANDLER
|
|||||||
/* FUNCTION RELEASE */
|
/* FUNCTION RELEASE */
|
||||||
/* */
|
/* */
|
||||||
/* _tx_initialize_kernel_enter PORTABLE C */
|
/* _tx_initialize_kernel_enter PORTABLE C */
|
||||||
/* 6.1 */
|
/* 6.3.0 */
|
||||||
/* AUTHOR */
|
/* AUTHOR */
|
||||||
/* */
|
/* */
|
||||||
/* William E. Lamie, Microsoft Corporation */
|
/* William E. Lamie, Microsoft Corporation */
|
||||||
@@ -84,9 +86,16 @@ TX_SAFETY_CRITICAL_EXCEPTION_HANDLER
|
|||||||
/* */
|
/* */
|
||||||
/* DATE NAME DESCRIPTION */
|
/* DATE NAME DESCRIPTION */
|
||||||
/* */
|
/* */
|
||||||
/* 05-19-2020 William E. Lamie Initial Version 6.0 */
|
/* 05-19-2020 William E. Lamie Initial Version 6.0 */
|
||||||
/* 09-30-2020 Yuxin Zhou Modified comment(s), */
|
/* 09-30-2020 Yuxin Zhou Modified comment(s), */
|
||||||
/* resulting in version 6.1 */
|
/* resulting in version 6.1 */
|
||||||
|
/* 04-25-2022 Scott Larson Modified comment(s), */
|
||||||
|
/* added EPK initialization, */
|
||||||
|
/* resulting in version 6.1.11 */
|
||||||
|
/* 10-31-2023 Xiuwen Cai Modified comment(s), */
|
||||||
|
/* added random generator */
|
||||||
|
/* initialization, */
|
||||||
|
/* resulting in version 6.3.0 */
|
||||||
/* */
|
/* */
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
VOID _tx_initialize_kernel_enter(VOID)
|
VOID _tx_initialize_kernel_enter(VOID)
|
||||||
@@ -98,8 +107,8 @@ VOID _tx_initialize_kernel_enter(VOID)
|
|||||||
|
|
||||||
/* No, the initialization still needs to take place. */
|
/* No, the initialization still needs to take place. */
|
||||||
|
|
||||||
/* Ensure that the system state variable is set to indicate
|
/* Ensure that the system state variable is set to indicate
|
||||||
initialization is in progress. Note that this variable is
|
initialization is in progress. Note that this variable is
|
||||||
later used to represent interrupt nesting. */
|
later used to represent interrupt nesting. */
|
||||||
_tx_thread_system_state = TX_INITIALIZE_IN_PROGRESS;
|
_tx_thread_system_state = TX_INITIALIZE_IN_PROGRESS;
|
||||||
|
|
||||||
@@ -109,9 +118,9 @@ VOID _tx_initialize_kernel_enter(VOID)
|
|||||||
/* Invoke the low-level initialization to handle all processor specific
|
/* Invoke the low-level initialization to handle all processor specific
|
||||||
initialization issues. */
|
initialization issues. */
|
||||||
_tx_initialize_low_level();
|
_tx_initialize_low_level();
|
||||||
|
|
||||||
/* Invoke the high-level initialization to exercise all of the
|
/* Invoke the high-level initialization to exercise all of the
|
||||||
ThreadX components and the application's initialization
|
ThreadX components and the application's initialization
|
||||||
function. */
|
function. */
|
||||||
_tx_initialize_high_level();
|
_tx_initialize_high_level();
|
||||||
|
|
||||||
@@ -122,22 +131,30 @@ VOID _tx_initialize_kernel_enter(VOID)
|
|||||||
/* Optional processing extension. */
|
/* Optional processing extension. */
|
||||||
TX_INITIALIZE_KERNEL_ENTER_EXTENSION
|
TX_INITIALIZE_KERNEL_ENTER_EXTENSION
|
||||||
|
|
||||||
/* Ensure that the system state variable is set to indicate
|
/* Ensure that the system state variable is set to indicate
|
||||||
initialization is in progress. Note that this variable is
|
initialization is in progress. Note that this variable is
|
||||||
later used to represent interrupt nesting. */
|
later used to represent interrupt nesting. */
|
||||||
_tx_thread_system_state = TX_INITIALIZE_IN_PROGRESS;
|
_tx_thread_system_state = TX_INITIALIZE_IN_PROGRESS;
|
||||||
|
|
||||||
|
/* Optional random number generator initialization. */
|
||||||
|
TX_INITIALIZE_RANDOM_GENERATOR_INITIALIZATION
|
||||||
|
|
||||||
/* Call the application provided initialization function. Pass the
|
/* Call the application provided initialization function. Pass the
|
||||||
first available memory address to it. */
|
first available memory address to it. */
|
||||||
tx_application_define(_tx_initialize_unused_memory);
|
tx_application_define(_tx_initialize_unused_memory);
|
||||||
|
|
||||||
/* Set the system state in preparation for entering the thread
|
/* Set the system state in preparation for entering the thread
|
||||||
scheduler. */
|
scheduler. */
|
||||||
_tx_thread_system_state = TX_INITIALIZE_IS_FINISHED;
|
_tx_thread_system_state = TX_INITIALIZE_IS_FINISHED;
|
||||||
|
|
||||||
/* Call any port specific pre-scheduler processing. */
|
/* Call any port specific pre-scheduler processing. */
|
||||||
TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION
|
TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION
|
||||||
|
|
||||||
|
#if defined(TX_ENABLE_EXECUTION_CHANGE_NOTIFY) || defined(TX_EXECUTION_PROFILE_ENABLE)
|
||||||
|
/* Initialize Execution Profile Kit. */
|
||||||
|
_tx_execution_initialize();
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Enter the scheduling loop to start executing threads! */
|
/* Enter the scheduling loop to start executing threads! */
|
||||||
_tx_thread_schedule();
|
_tx_thread_schedule();
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -76,8 +75,8 @@
|
|||||||
VOID _tx_initialize_kernel_setup(VOID)
|
VOID _tx_initialize_kernel_setup(VOID)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Ensure that the system state variable is set to indicate
|
/* Ensure that the system state variable is set to indicate
|
||||||
initialization is in progress. Note that this variable is
|
initialization is in progress. Note that this variable is
|
||||||
later used to represent interrupt nesting. */
|
later used to represent interrupt nesting. */
|
||||||
_tx_thread_system_state = TX_INITIALIZE_IN_PROGRESS;
|
_tx_thread_system_state = TX_INITIALIZE_IN_PROGRESS;
|
||||||
|
|
||||||
@@ -87,9 +86,9 @@ VOID _tx_initialize_kernel_setup(VOID)
|
|||||||
/* Invoke the low-level initialization to handle all processor specific
|
/* Invoke the low-level initialization to handle all processor specific
|
||||||
initialization issues. */
|
initialization issues. */
|
||||||
_tx_initialize_low_level();
|
_tx_initialize_low_level();
|
||||||
|
|
||||||
/* Invoke the high-level initialization to exercise all of the
|
/* Invoke the high-level initialization to exercise all of the
|
||||||
ThreadX components and the application's initialization
|
ThreadX components and the application's initialization
|
||||||
function. */
|
function. */
|
||||||
_tx_initialize_high_level();
|
_tx_initialize_high_level();
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -33,7 +32,7 @@
|
|||||||
#include "tx_api.h"
|
#include "tx_api.h"
|
||||||
#else
|
#else
|
||||||
#define TX_THREAD_INIT
|
#define TX_THREAD_INIT
|
||||||
//CHAR _tx_version_id[100] = "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX 6.1 MISRA C Compliant *";
|
//CHAR _tx_version_id[100] = "Copyright (c) 2024 Microsoft Corporation. * ThreadX 6.1 MISRA C Compliant *";
|
||||||
|
|
||||||
#include "tx_api.h"
|
#include "tx_api.h"
|
||||||
#include "tx_thread.h"
|
#include "tx_thread.h"
|
||||||
@@ -92,7 +91,7 @@ ULONG _tx_misra_uchar_pointer_dif(UCHAR *ptr1, UCHAR *ptr2)
|
|||||||
{
|
{
|
||||||
|
|
||||||
ULONG value;
|
ULONG value;
|
||||||
|
|
||||||
value = (ULONG)(ptr1 - ptr2);
|
value = (ULONG)(ptr1 - ptr2);
|
||||||
return(value);
|
return(value);
|
||||||
}
|
}
|
||||||
@@ -150,7 +149,7 @@ ULONG *_tx_misra_ulong_pointer_sub(ULONG *ptr, ULONG amount)
|
|||||||
ULONG _tx_misra_ulong_pointer_dif(ULONG *ptr1, ULONG *ptr2)
|
ULONG _tx_misra_ulong_pointer_dif(ULONG *ptr1, ULONG *ptr2)
|
||||||
{
|
{
|
||||||
ULONG value;
|
ULONG value;
|
||||||
|
|
||||||
value = (ULONG)(ptr1 - ptr2);
|
value = (ULONG)(ptr1 - ptr2);
|
||||||
return(value);
|
return(value);
|
||||||
}
|
}
|
||||||
@@ -362,7 +361,7 @@ TX_THREAD *trace_thread_ptr;
|
|||||||
#endif
|
#endif
|
||||||
trace_event_ptr++;
|
trace_event_ptr++;
|
||||||
if (trace_event_ptr >= _tx_trace_buffer_end_ptr)
|
if (trace_event_ptr >= _tx_trace_buffer_end_ptr)
|
||||||
{
|
{
|
||||||
trace_event_ptr = _tx_trace_buffer_start_ptr;
|
trace_event_ptr = _tx_trace_buffer_start_ptr;
|
||||||
_tx_trace_buffer_current_ptr = trace_event_ptr;
|
_tx_trace_buffer_current_ptr = trace_event_ptr;
|
||||||
_tx_trace_header_ptr -> tx_trace_header_buffer_current_pointer = (ULONG) trace_event_ptr;
|
_tx_trace_header_ptr -> tx_trace_header_buffer_current_pointer = (ULONG) trace_event_ptr;
|
||||||
@@ -813,7 +812,7 @@ UCHAR *_tx_misra_entry_to_uchar_pointer_convert(TX_TRACE_BUFFER_ENTRY *pointer)
|
|||||||
/* Return a UCHAR pointer. */
|
/* Return a UCHAR pointer. */
|
||||||
return((UCHAR *) ((VOID *) pointer));
|
return((UCHAR *) ((VOID *) pointer));
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -100,14 +99,14 @@ TX_THREAD *previous_thread;
|
|||||||
/* Check for valid suspension sequence. */
|
/* Check for valid suspension sequence. */
|
||||||
if (suspension_sequence == thread_ptr -> tx_thread_suspension_sequence)
|
if (suspension_sequence == thread_ptr -> tx_thread_suspension_sequence)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Setup pointer to mutex control block. */
|
/* Setup pointer to mutex control block. */
|
||||||
mutex_ptr = TX_VOID_TO_MUTEX_POINTER_CONVERT(thread_ptr -> tx_thread_suspend_control_block);
|
mutex_ptr = TX_VOID_TO_MUTEX_POINTER_CONVERT(thread_ptr -> tx_thread_suspend_control_block);
|
||||||
|
|
||||||
/* Check for NULL mutex pointer. */
|
/* Check for NULL mutex pointer. */
|
||||||
if (mutex_ptr != TX_NULL)
|
if (mutex_ptr != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Determine if the mutex ID is valid. */
|
/* Determine if the mutex ID is valid. */
|
||||||
if (mutex_ptr -> tx_mutex_id == TX_MUTEX_ID)
|
if (mutex_ptr -> tx_mutex_id == TX_MUTEX_ID)
|
||||||
{
|
{
|
||||||
@@ -133,7 +132,7 @@ TX_THREAD *previous_thread;
|
|||||||
suspended_count = mutex_ptr -> tx_mutex_suspended_count;
|
suspended_count = mutex_ptr -> tx_mutex_suspended_count;
|
||||||
|
|
||||||
/* Remove the suspended thread from the list. */
|
/* Remove the suspended thread from the list. */
|
||||||
|
|
||||||
/* See if this is the only suspended thread on the list. */
|
/* See if this is the only suspended thread on the list. */
|
||||||
if (suspended_count == TX_NO_SUSPENSIONS)
|
if (suspended_count == TX_NO_SUSPENSIONS)
|
||||||
{
|
{
|
||||||
@@ -147,7 +146,7 @@ TX_THREAD *previous_thread;
|
|||||||
{
|
{
|
||||||
|
|
||||||
/* At least one more thread is on the same suspension list. */
|
/* At least one more thread is on the same suspension list. */
|
||||||
|
|
||||||
/* Update the links of the adjacent threads. */
|
/* Update the links of the adjacent threads. */
|
||||||
next_thread = thread_ptr -> tx_thread_suspended_next;
|
next_thread = thread_ptr -> tx_thread_suspended_next;
|
||||||
previous_thread = thread_ptr -> tx_thread_suspended_previous;
|
previous_thread = thread_ptr -> tx_thread_suspended_previous;
|
||||||
@@ -157,18 +156,18 @@ TX_THREAD *previous_thread;
|
|||||||
/* Determine if we need to update the head pointer. */
|
/* Determine if we need to update the head pointer. */
|
||||||
if (mutex_ptr -> tx_mutex_suspension_list == thread_ptr)
|
if (mutex_ptr -> tx_mutex_suspension_list == thread_ptr)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Update the list head pointer. */
|
/* Update the list head pointer. */
|
||||||
mutex_ptr -> tx_mutex_suspension_list = next_thread;
|
mutex_ptr -> tx_mutex_suspension_list = next_thread;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now we need to determine if this cleanup is from a terminate, timeout,
|
/* Now we need to determine if this cleanup is from a terminate, timeout,
|
||||||
or from a wait abort. */
|
or from a wait abort. */
|
||||||
if (thread_ptr -> tx_thread_state == TX_MUTEX_SUSP)
|
if (thread_ptr -> tx_thread_state == TX_MUTEX_SUSP)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Timeout condition and the thread still suspended on the mutex.
|
/* Timeout condition and the thread still suspended on the mutex.
|
||||||
Setup return error status and resume the thread. */
|
Setup return error status and resume the thread. */
|
||||||
|
|
||||||
#ifdef TX_MUTEX_ENABLE_PERFORMANCE_INFO
|
#ifdef TX_MUTEX_ENABLE_PERFORMANCE_INFO
|
||||||
@@ -194,7 +193,7 @@ TX_THREAD *previous_thread;
|
|||||||
|
|
||||||
/* Restore interrupts. */
|
/* Restore interrupts. */
|
||||||
TX_RESTORE
|
TX_RESTORE
|
||||||
|
|
||||||
/* Resume the thread! */
|
/* Resume the thread! */
|
||||||
_tx_thread_system_resume(thread_ptr);
|
_tx_thread_system_resume(thread_ptr);
|
||||||
|
|
||||||
@@ -208,7 +207,7 @@ TX_THREAD *previous_thread;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Restore interrupts. */
|
/* Restore interrupts. */
|
||||||
TX_RESTORE
|
TX_RESTORE
|
||||||
#endif
|
#endif
|
||||||
@@ -269,21 +268,21 @@ UINT status;
|
|||||||
|
|
||||||
/* Disable interrupts. */
|
/* Disable interrupts. */
|
||||||
TX_DISABLE
|
TX_DISABLE
|
||||||
|
|
||||||
/* Temporarily disable preemption. */
|
/* Temporarily disable preemption. */
|
||||||
_tx_thread_preempt_disable++;
|
_tx_thread_preempt_disable++;
|
||||||
|
|
||||||
/* Loop to look at all the mutexes. */
|
/* Loop to look at all the mutexes. */
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Pickup the mutex head pointer. */
|
/* Pickup the mutex head pointer. */
|
||||||
mutex_ptr = thread_ptr -> tx_thread_owned_mutex_list;
|
mutex_ptr = thread_ptr -> tx_thread_owned_mutex_list;
|
||||||
|
|
||||||
/* Determine if there is a mutex. */
|
/* Determine if there is a mutex. */
|
||||||
if (mutex_ptr != TX_NULL)
|
if (mutex_ptr != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Yes, set the ownership count to 1. */
|
/* Yes, set the ownership count to 1. */
|
||||||
mutex_ptr -> tx_mutex_ownership_count = ((UINT) 1);
|
mutex_ptr -> tx_mutex_ownership_count = ((UINT) 1);
|
||||||
|
|
||||||
@@ -307,10 +306,10 @@ UINT status;
|
|||||||
mutex_ptr = thread_ptr -> tx_thread_owned_mutex_list;
|
mutex_ptr = thread_ptr -> tx_thread_owned_mutex_list;
|
||||||
}
|
}
|
||||||
} while (mutex_ptr != TX_NULL);
|
} while (mutex_ptr != TX_NULL);
|
||||||
|
|
||||||
/* Restore preemption. */
|
/* Restore preemption. */
|
||||||
_tx_thread_preempt_disable--;
|
_tx_thread_preempt_disable--;
|
||||||
|
|
||||||
/* Restore interrupts. */
|
/* Restore interrupts. */
|
||||||
TX_RESTORE
|
TX_RESTORE
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -88,7 +87,7 @@ TX_MUTEX *previous_mutex;
|
|||||||
/* Setup the basic mutex fields. */
|
/* Setup the basic mutex fields. */
|
||||||
mutex_ptr -> tx_mutex_name = name_ptr;
|
mutex_ptr -> tx_mutex_name = name_ptr;
|
||||||
mutex_ptr -> tx_mutex_inherit = inherit;
|
mutex_ptr -> tx_mutex_inherit = inherit;
|
||||||
|
|
||||||
/* Disable interrupts to place the mutex on the created list. */
|
/* Disable interrupts to place the mutex on the created list. */
|
||||||
TX_DISABLE
|
TX_DISABLE
|
||||||
|
|
||||||
@@ -126,7 +125,7 @@ TX_MUTEX *previous_mutex;
|
|||||||
|
|
||||||
/* Increment the ownership count. */
|
/* Increment the ownership count. */
|
||||||
_tx_mutex_created_count++;
|
_tx_mutex_created_count++;
|
||||||
|
|
||||||
/* Optional mutex create extended processing. */
|
/* Optional mutex create extended processing. */
|
||||||
TX_MUTEX_CREATE_EXTENSION(mutex_ptr)
|
TX_MUTEX_CREATE_EXTENSION(mutex_ptr)
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -110,7 +109,7 @@ UINT status;
|
|||||||
|
|
||||||
/* Decrement the created count. */
|
/* Decrement the created count. */
|
||||||
_tx_mutex_created_count--;
|
_tx_mutex_created_count--;
|
||||||
|
|
||||||
/* See if the mutex is the only one on the list. */
|
/* See if the mutex is the only one on the list. */
|
||||||
if (_tx_mutex_created_count == TX_EMPTY)
|
if (_tx_mutex_created_count == TX_EMPTY)
|
||||||
{
|
{
|
||||||
@@ -130,7 +129,7 @@ UINT status;
|
|||||||
/* See if we have to update the created list head pointer. */
|
/* See if we have to update the created list head pointer. */
|
||||||
if (_tx_mutex_created_ptr == mutex_ptr)
|
if (_tx_mutex_created_ptr == mutex_ptr)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Yes, move the head pointer to the next link. */
|
/* Yes, move the head pointer to the next link. */
|
||||||
_tx_mutex_created_ptr = next_mutex;
|
_tx_mutex_created_ptr = next_mutex;
|
||||||
}
|
}
|
||||||
@@ -156,7 +155,7 @@ UINT status;
|
|||||||
{
|
{
|
||||||
|
|
||||||
/* Yes, remove this mutex from the owned list. */
|
/* Yes, remove this mutex from the owned list. */
|
||||||
|
|
||||||
/* Set the ownership count to 1. */
|
/* Set the ownership count to 1. */
|
||||||
mutex_ptr -> tx_mutex_ownership_count = ((UINT) 1);
|
mutex_ptr -> tx_mutex_ownership_count = ((UINT) 1);
|
||||||
|
|
||||||
@@ -184,14 +183,14 @@ UINT status;
|
|||||||
on this mutex. */
|
on this mutex. */
|
||||||
while (suspended_count != ((ULONG) 0))
|
while (suspended_count != ((ULONG) 0))
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Decrement the suspension count. */
|
/* Decrement the suspension count. */
|
||||||
suspended_count--;
|
suspended_count--;
|
||||||
|
|
||||||
/* Lockout interrupts. */
|
/* Lockout interrupts. */
|
||||||
TX_DISABLE
|
TX_DISABLE
|
||||||
|
|
||||||
/* Clear the cleanup pointer, this prevents the timeout from doing
|
/* Clear the cleanup pointer, this prevents the timeout from doing
|
||||||
anything. */
|
anything. */
|
||||||
thread_ptr -> tx_thread_suspend_cleanup = TX_NULL;
|
thread_ptr -> tx_thread_suspend_cleanup = TX_NULL;
|
||||||
|
|
||||||
@@ -215,7 +214,7 @@ UINT status;
|
|||||||
|
|
||||||
/* Restore interrupts. */
|
/* Restore interrupts. */
|
||||||
TX_RESTORE
|
TX_RESTORE
|
||||||
|
|
||||||
/* Resume the thread. */
|
/* Resume the thread. */
|
||||||
_tx_thread_system_resume(thread_ptr);
|
_tx_thread_system_resume(thread_ptr);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -126,7 +125,7 @@ UINT status;
|
|||||||
/* Determine if priority inheritance is required. */
|
/* Determine if priority inheritance is required. */
|
||||||
if (mutex_ptr -> tx_mutex_inherit == TX_TRUE)
|
if (mutex_ptr -> tx_mutex_inherit == TX_TRUE)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Remember the current priority of thread. */
|
/* Remember the current priority of thread. */
|
||||||
mutex_ptr -> tx_mutex_original_priority = thread_ptr -> tx_thread_priority;
|
mutex_ptr -> tx_mutex_original_priority = thread_ptr -> tx_thread_priority;
|
||||||
|
|
||||||
@@ -178,7 +177,7 @@ UINT status;
|
|||||||
else if (mutex_ptr -> tx_mutex_owner == thread_ptr)
|
else if (mutex_ptr -> tx_mutex_owner == thread_ptr)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* The owning thread is requesting the mutex again, just
|
/* The owning thread is requesting the mutex again, just
|
||||||
increment the ownership count. */
|
increment the ownership count. */
|
||||||
mutex_ptr -> tx_mutex_ownership_count++;
|
mutex_ptr -> tx_mutex_ownership_count++;
|
||||||
|
|
||||||
@@ -279,7 +278,7 @@ UINT status;
|
|||||||
previous_thread -> tx_thread_suspended_next = thread_ptr;
|
previous_thread -> tx_thread_suspended_next = thread_ptr;
|
||||||
next_thread -> tx_thread_suspended_previous = thread_ptr;
|
next_thread -> tx_thread_suspended_previous = thread_ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Increment the suspension count. */
|
/* Increment the suspension count. */
|
||||||
mutex_ptr -> tx_mutex_suspended_count++;
|
mutex_ptr -> tx_mutex_suspended_count++;
|
||||||
|
|
||||||
@@ -288,7 +287,7 @@ UINT status;
|
|||||||
|
|
||||||
#ifdef TX_NOT_INTERRUPTABLE
|
#ifdef TX_NOT_INTERRUPTABLE
|
||||||
|
|
||||||
/* Determine if we need to raise the priority of the thread
|
/* Determine if we need to raise the priority of the thread
|
||||||
owning the mutex. */
|
owning the mutex. */
|
||||||
if (mutex_ptr -> tx_mutex_inherit == TX_TRUE)
|
if (mutex_ptr -> tx_mutex_inherit == TX_TRUE)
|
||||||
{
|
{
|
||||||
@@ -304,7 +303,7 @@ UINT status;
|
|||||||
/* Determine if we have to update inherit priority level of the mutex owner. */
|
/* Determine if we have to update inherit priority level of the mutex owner. */
|
||||||
if (thread_ptr -> tx_thread_priority < mutex_owner -> tx_thread_inherit_priority)
|
if (thread_ptr -> tx_thread_priority < mutex_owner -> tx_thread_inherit_priority)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Remember the new priority inheritance priority. */
|
/* Remember the new priority inheritance priority. */
|
||||||
mutex_owner -> tx_thread_inherit_priority = thread_ptr -> tx_thread_priority;
|
mutex_owner -> tx_thread_inherit_priority = thread_ptr -> tx_thread_priority;
|
||||||
}
|
}
|
||||||
@@ -347,7 +346,7 @@ UINT status;
|
|||||||
/* Restore interrupts. */
|
/* Restore interrupts. */
|
||||||
TX_RESTORE
|
TX_RESTORE
|
||||||
|
|
||||||
/* Determine if we need to raise the priority of the thread
|
/* Determine if we need to raise the priority of the thread
|
||||||
owning the mutex. */
|
owning the mutex. */
|
||||||
if (mutex_ptr -> tx_mutex_inherit == TX_TRUE)
|
if (mutex_ptr -> tx_mutex_inherit == TX_TRUE)
|
||||||
{
|
{
|
||||||
@@ -363,7 +362,7 @@ UINT status;
|
|||||||
/* Determine if we have to update inherit priority level of the mutex owner. */
|
/* Determine if we have to update inherit priority level of the mutex owner. */
|
||||||
if (thread_ptr -> tx_thread_priority < mutex_owner -> tx_thread_inherit_priority)
|
if (thread_ptr -> tx_thread_priority < mutex_owner -> tx_thread_inherit_priority)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Remember the new priority inheritance priority. */
|
/* Remember the new priority inheritance priority. */
|
||||||
mutex_owner -> tx_thread_inherit_priority = thread_ptr -> tx_thread_priority;
|
mutex_owner -> tx_thread_inherit_priority = thread_ptr -> tx_thread_priority;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -79,7 +78,7 @@
|
|||||||
/* */
|
/* */
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
UINT _tx_mutex_info_get(TX_MUTEX *mutex_ptr, CHAR **name, ULONG *count, TX_THREAD **owner,
|
UINT _tx_mutex_info_get(TX_MUTEX *mutex_ptr, CHAR **name, ULONG *count, TX_THREAD **owner,
|
||||||
TX_THREAD **first_suspended, ULONG *suspended_count,
|
TX_THREAD **first_suspended, ULONG *suspended_count,
|
||||||
TX_MUTEX **next_mutex)
|
TX_MUTEX **next_mutex)
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -101,45 +100,45 @@ TX_INTERRUPT_SAVE_AREA
|
|||||||
/* Retrieve the name of the mutex. */
|
/* Retrieve the name of the mutex. */
|
||||||
if (name != TX_NULL)
|
if (name != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*name = mutex_ptr -> tx_mutex_name;
|
*name = mutex_ptr -> tx_mutex_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the current ownership count of the mutex. */
|
/* Retrieve the current ownership count of the mutex. */
|
||||||
if (count != TX_NULL)
|
if (count != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*count = ((ULONG) mutex_ptr -> tx_mutex_ownership_count);
|
*count = ((ULONG) mutex_ptr -> tx_mutex_ownership_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the current owner of the mutex. */
|
/* Retrieve the current owner of the mutex. */
|
||||||
if (owner != TX_NULL)
|
if (owner != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*owner = mutex_ptr -> tx_mutex_owner;
|
*owner = mutex_ptr -> tx_mutex_owner;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the first thread suspended on this mutex. */
|
/* Retrieve the first thread suspended on this mutex. */
|
||||||
if (first_suspended != TX_NULL)
|
if (first_suspended != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*first_suspended = mutex_ptr -> tx_mutex_suspension_list;
|
*first_suspended = mutex_ptr -> tx_mutex_suspension_list;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the number of threads suspended on this mutex. */
|
/* Retrieve the number of threads suspended on this mutex. */
|
||||||
if (suspended_count != TX_NULL)
|
if (suspended_count != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*suspended_count = (ULONG) mutex_ptr -> tx_mutex_suspended_count;
|
*suspended_count = (ULONG) mutex_ptr -> tx_mutex_suspended_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the pointer to the next mutex created. */
|
/* Retrieve the pointer to the next mutex created. */
|
||||||
if (next_mutex != TX_NULL)
|
if (next_mutex != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*next_mutex = mutex_ptr -> tx_mutex_created_next;
|
*next_mutex = mutex_ptr -> tx_mutex_created_next;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Restore interrupts. */
|
/* Restore interrupts. */
|
||||||
TX_RESTORE
|
TX_RESTORE
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -99,15 +98,15 @@ UINT status;
|
|||||||
/* Determine if this is a legal request. */
|
/* Determine if this is a legal request. */
|
||||||
if (mutex_ptr == TX_NULL)
|
if (mutex_ptr == TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Mutex pointer is illegal, return error. */
|
/* Mutex pointer is illegal, return error. */
|
||||||
status = TX_PTR_ERROR;
|
status = TX_PTR_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Determine if the mutex ID is invalid. */
|
/* Determine if the mutex ID is invalid. */
|
||||||
else if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID)
|
else if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Mutex pointer is illegal, return error. */
|
/* Mutex pointer is illegal, return error. */
|
||||||
status = TX_PTR_ERROR;
|
status = TX_PTR_ERROR;
|
||||||
}
|
}
|
||||||
@@ -129,45 +128,45 @@ UINT status;
|
|||||||
/* Retrieve the number of puts on this mutex. */
|
/* Retrieve the number of puts on this mutex. */
|
||||||
if (puts != TX_NULL)
|
if (puts != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*puts = mutex_ptr -> tx_mutex_performance_put_count;
|
*puts = mutex_ptr -> tx_mutex_performance_put_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the number of gets on this mutex. */
|
/* Retrieve the number of gets on this mutex. */
|
||||||
if (gets != TX_NULL)
|
if (gets != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*gets = mutex_ptr -> tx_mutex_performance_get_count;
|
*gets = mutex_ptr -> tx_mutex_performance_get_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the number of suspensions on this mutex. */
|
/* Retrieve the number of suspensions on this mutex. */
|
||||||
if (suspensions != TX_NULL)
|
if (suspensions != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*suspensions = mutex_ptr -> tx_mutex_performance_suspension_count;
|
*suspensions = mutex_ptr -> tx_mutex_performance_suspension_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the number of timeouts on this mutex. */
|
/* Retrieve the number of timeouts on this mutex. */
|
||||||
if (timeouts != TX_NULL)
|
if (timeouts != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*timeouts = mutex_ptr -> tx_mutex_performance_timeout_count;
|
*timeouts = mutex_ptr -> tx_mutex_performance_timeout_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the number of priority inversions on this mutex. */
|
/* Retrieve the number of priority inversions on this mutex. */
|
||||||
if (inversions != TX_NULL)
|
if (inversions != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*inversions = mutex_ptr -> tx_mutex_performance_priority_inversion_count;
|
*inversions = mutex_ptr -> tx_mutex_performance_priority_inversion_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the number of priority inheritances on this mutex. */
|
/* Retrieve the number of priority inheritances on this mutex. */
|
||||||
if (inheritances != TX_NULL)
|
if (inheritances != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*inheritances = mutex_ptr -> tx_mutex_performance__priority_inheritance_count;
|
*inheritances = mutex_ptr -> tx_mutex_performance__priority_inheritance_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Restore interrupts. */
|
/* Restore interrupts. */
|
||||||
TX_RESTORE
|
TX_RESTORE
|
||||||
}
|
}
|
||||||
@@ -225,7 +224,7 @@ UINT status;
|
|||||||
status = TX_FEATURE_NOT_ENABLED;
|
status = TX_FEATURE_NOT_ENABLED;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Return completion status. */
|
/* Return completion status. */
|
||||||
return(status);
|
return(status);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -82,7 +81,7 @@
|
|||||||
/* resulting in version 6.1 */
|
/* resulting in version 6.1 */
|
||||||
/* */
|
/* */
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
UINT _tx_mutex_performance_system_info_get(ULONG *puts, ULONG *gets, ULONG *suspensions,
|
UINT _tx_mutex_performance_system_info_get(ULONG *puts, ULONG *gets, ULONG *suspensions,
|
||||||
ULONG *timeouts, ULONG *inversions, ULONG *inheritances)
|
ULONG *timeouts, ULONG *inversions, ULONG *inheritances)
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -106,51 +105,51 @@ TX_INTERRUPT_SAVE_AREA
|
|||||||
/* Retrieve the total number of mutex puts. */
|
/* Retrieve the total number of mutex puts. */
|
||||||
if (puts != TX_NULL)
|
if (puts != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*puts = _tx_mutex_performance_put_count;
|
*puts = _tx_mutex_performance_put_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the total number of mutex gets. */
|
/* Retrieve the total number of mutex gets. */
|
||||||
if (gets != TX_NULL)
|
if (gets != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*gets = _tx_mutex_performance_get_count;
|
*gets = _tx_mutex_performance_get_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the total number of mutex suspensions. */
|
/* Retrieve the total number of mutex suspensions. */
|
||||||
if (suspensions != TX_NULL)
|
if (suspensions != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*suspensions = _tx_mutex_performance_suspension_count;
|
*suspensions = _tx_mutex_performance_suspension_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the total number of mutex timeouts. */
|
/* Retrieve the total number of mutex timeouts. */
|
||||||
if (timeouts != TX_NULL)
|
if (timeouts != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*timeouts = _tx_mutex_performance_timeout_count;
|
*timeouts = _tx_mutex_performance_timeout_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the total number of mutex priority inversions. */
|
/* Retrieve the total number of mutex priority inversions. */
|
||||||
if (inversions != TX_NULL)
|
if (inversions != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*inversions = _tx_mutex_performance_priority_inversion_count;
|
*inversions = _tx_mutex_performance_priority_inversion_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the total number of mutex priority inheritances. */
|
/* Retrieve the total number of mutex priority inheritances. */
|
||||||
if (inheritances != TX_NULL)
|
if (inheritances != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*inheritances = _tx_mutex_performance__priority_inheritance_count;
|
*inheritances = _tx_mutex_performance__priority_inheritance_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Restore interrupts. */
|
/* Restore interrupts. */
|
||||||
TX_RESTORE
|
TX_RESTORE
|
||||||
|
|
||||||
/* Return completion status. */
|
/* Return completion status. */
|
||||||
return(TX_SUCCESS);
|
return(TX_SUCCESS);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
UINT status;
|
UINT status;
|
||||||
@@ -159,43 +158,43 @@ UINT status;
|
|||||||
/* Access input arguments just for the sake of lint, MISRA, etc. */
|
/* Access input arguments just for the sake of lint, MISRA, etc. */
|
||||||
if (puts != TX_NULL)
|
if (puts != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Not enabled, return error. */
|
/* Not enabled, return error. */
|
||||||
status = TX_FEATURE_NOT_ENABLED;
|
status = TX_FEATURE_NOT_ENABLED;
|
||||||
}
|
}
|
||||||
else if (gets != TX_NULL)
|
else if (gets != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Not enabled, return error. */
|
/* Not enabled, return error. */
|
||||||
status = TX_FEATURE_NOT_ENABLED;
|
status = TX_FEATURE_NOT_ENABLED;
|
||||||
}
|
}
|
||||||
else if (suspensions != TX_NULL)
|
else if (suspensions != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Not enabled, return error. */
|
/* Not enabled, return error. */
|
||||||
status = TX_FEATURE_NOT_ENABLED;
|
status = TX_FEATURE_NOT_ENABLED;
|
||||||
}
|
}
|
||||||
else if (timeouts != TX_NULL)
|
else if (timeouts != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Not enabled, return error. */
|
/* Not enabled, return error. */
|
||||||
status = TX_FEATURE_NOT_ENABLED;
|
status = TX_FEATURE_NOT_ENABLED;
|
||||||
}
|
}
|
||||||
else if (inversions != TX_NULL)
|
else if (inversions != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Not enabled, return error. */
|
/* Not enabled, return error. */
|
||||||
status = TX_FEATURE_NOT_ENABLED;
|
status = TX_FEATURE_NOT_ENABLED;
|
||||||
}
|
}
|
||||||
else if (inheritances != TX_NULL)
|
else if (inheritances != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Not enabled, return error. */
|
/* Not enabled, return error. */
|
||||||
status = TX_FEATURE_NOT_ENABLED;
|
status = TX_FEATURE_NOT_ENABLED;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Not enabled, return error. */
|
/* Not enabled, return error. */
|
||||||
status = TX_FEATURE_NOT_ENABLED;
|
status = TX_FEATURE_NOT_ENABLED;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -164,28 +163,28 @@ UINT status;
|
|||||||
/* Disable interrupts again. */
|
/* Disable interrupts again. */
|
||||||
TX_DISABLE
|
TX_DISABLE
|
||||||
|
|
||||||
/* Determine if any changes to the list have occurred while
|
/* Determine if any changes to the list have occurred while
|
||||||
interrupts were enabled. */
|
interrupts were enabled. */
|
||||||
|
|
||||||
/* Is the list head the same? */
|
/* Is the list head the same? */
|
||||||
if (head_ptr != mutex_ptr -> tx_mutex_suspension_list)
|
if (head_ptr != mutex_ptr -> tx_mutex_suspension_list)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* The list head has changed, set the list changed flag. */
|
/* The list head has changed, set the list changed flag. */
|
||||||
list_changed = TX_TRUE;
|
list_changed = TX_TRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Is the suspended count the same? */
|
/* Is the suspended count the same? */
|
||||||
if (suspended_count != mutex_ptr -> tx_mutex_suspended_count)
|
if (suspended_count != mutex_ptr -> tx_mutex_suspended_count)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* The list head has changed, set the list changed flag. */
|
/* The list head has changed, set the list changed flag. */
|
||||||
list_changed = TX_TRUE;
|
list_changed = TX_TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Determine if the list has changed. */
|
/* Determine if the list has changed. */
|
||||||
if (list_changed == TX_FALSE)
|
if (list_changed == TX_FALSE)
|
||||||
{
|
{
|
||||||
@@ -215,12 +214,12 @@ UINT status;
|
|||||||
/* Release preemption. */
|
/* Release preemption. */
|
||||||
_tx_thread_preempt_disable--;
|
_tx_thread_preempt_disable--;
|
||||||
|
|
||||||
/* Now determine if the highest priority thread is at the front
|
/* Now determine if the highest priority thread is at the front
|
||||||
of the list. */
|
of the list. */
|
||||||
if (priority_thread_ptr != head_ptr)
|
if (priority_thread_ptr != head_ptr)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* No, we need to move the highest priority suspended thread to the
|
/* No, we need to move the highest priority suspended thread to the
|
||||||
front of the list. */
|
front of the list. */
|
||||||
|
|
||||||
/* First, remove the highest priority thread by updating the
|
/* First, remove the highest priority thread by updating the
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -35,7 +34,7 @@
|
|||||||
/* FUNCTION RELEASE */
|
/* FUNCTION RELEASE */
|
||||||
/* */
|
/* */
|
||||||
/* _tx_mutex_priority_change PORTABLE C */
|
/* _tx_mutex_priority_change PORTABLE C */
|
||||||
/* 6.1 */
|
/* 6.1.6 */
|
||||||
/* AUTHOR */
|
/* AUTHOR */
|
||||||
/* */
|
/* */
|
||||||
/* William E. Lamie, Microsoft Corporation */
|
/* William E. Lamie, Microsoft Corporation */
|
||||||
@@ -70,14 +69,18 @@
|
|||||||
/* */
|
/* */
|
||||||
/* DATE NAME DESCRIPTION */
|
/* DATE NAME DESCRIPTION */
|
||||||
/* */
|
/* */
|
||||||
/* 05-19-2020 William E. Lamie Initial Version 6.0 */
|
/* 05-19-2020 William E. Lamie Initial Version 6.0 */
|
||||||
/* 09-30-2020 William E. Lamie Modified comment(s), and */
|
/* 09-30-2020 William E. Lamie Modified comment(s), and */
|
||||||
/* change thread state from */
|
/* change thread state from */
|
||||||
/* TX_SUSPENDED to */
|
/* TX_SUSPENDED to */
|
||||||
/* TX_PRIORITY_CHANGE before */
|
/* TX_PRIORITY_CHANGE before */
|
||||||
/* calling */
|
/* calling */
|
||||||
/* _tx_thread_system_suspend, */
|
/* _tx_thread_system_suspend, */
|
||||||
/* resulting in version 6.1 */
|
/* resulting in version 6.1 */
|
||||||
|
/* 04-02-2021 Scott Larson Modified comments, fixed */
|
||||||
|
/* mapping current thread's */
|
||||||
|
/* priority rather than next, */
|
||||||
|
/* resulting in version 6.1.6 */
|
||||||
/* */
|
/* */
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
VOID _tx_mutex_priority_change(TX_THREAD *thread_ptr, UINT new_priority)
|
VOID _tx_mutex_priority_change(TX_THREAD *thread_ptr, UINT new_priority)
|
||||||
@@ -112,17 +115,17 @@ UINT map_index;
|
|||||||
|
|
||||||
/* Change thread priority to the new mutex priority-inheritance priority. */
|
/* Change thread priority to the new mutex priority-inheritance priority. */
|
||||||
thread_ptr -> tx_thread_priority = new_priority;
|
thread_ptr -> tx_thread_priority = new_priority;
|
||||||
|
|
||||||
/* Determine how to setup the thread's preemption-threshold. */
|
/* Determine how to setup the thread's preemption-threshold. */
|
||||||
if (thread_ptr -> tx_thread_user_preempt_threshold < new_priority)
|
if (thread_ptr -> tx_thread_user_preempt_threshold < new_priority)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Change thread preemption-threshold to the user's preemption-threshold. */
|
/* Change thread preemption-threshold to the user's preemption-threshold. */
|
||||||
thread_ptr -> tx_thread_preempt_threshold = thread_ptr -> tx_thread_user_preempt_threshold;
|
thread_ptr -> tx_thread_preempt_threshold = thread_ptr -> tx_thread_user_preempt_threshold;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Change the thread preemption-threshold to the new threshold. */
|
/* Change the thread preemption-threshold to the new threshold. */
|
||||||
thread_ptr -> tx_thread_preempt_threshold = new_priority;
|
thread_ptr -> tx_thread_preempt_threshold = new_priority;
|
||||||
}
|
}
|
||||||
@@ -152,22 +155,22 @@ UINT map_index;
|
|||||||
/* Call actual non-interruptable thread suspension routine. */
|
/* Call actual non-interruptable thread suspension routine. */
|
||||||
_tx_thread_system_ni_suspend(thread_ptr, ((ULONG) 0));
|
_tx_thread_system_ni_suspend(thread_ptr, ((ULONG) 0));
|
||||||
|
|
||||||
/* At this point, the preempt disable flag is still set, so we still have
|
/* At this point, the preempt disable flag is still set, so we still have
|
||||||
protection against all preemption. */
|
protection against all preemption. */
|
||||||
|
|
||||||
/* Change thread priority to the new mutex priority-inheritance priority. */
|
/* Change thread priority to the new mutex priority-inheritance priority. */
|
||||||
thread_ptr -> tx_thread_priority = new_priority;
|
thread_ptr -> tx_thread_priority = new_priority;
|
||||||
|
|
||||||
/* Determine how to setup the thread's preemption-threshold. */
|
/* Determine how to setup the thread's preemption-threshold. */
|
||||||
if (thread_ptr -> tx_thread_user_preempt_threshold < new_priority)
|
if (thread_ptr -> tx_thread_user_preempt_threshold < new_priority)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Change thread preemption-threshold to the user's preemption-threshold. */
|
/* Change thread preemption-threshold to the user's preemption-threshold. */
|
||||||
thread_ptr -> tx_thread_preempt_threshold = thread_ptr -> tx_thread_user_preempt_threshold;
|
thread_ptr -> tx_thread_preempt_threshold = thread_ptr -> tx_thread_user_preempt_threshold;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Change the thread preemption-threshold to the new threshold. */
|
/* Change the thread preemption-threshold to the new threshold. */
|
||||||
thread_ptr -> tx_thread_preempt_threshold = new_priority;
|
thread_ptr -> tx_thread_preempt_threshold = new_priority;
|
||||||
}
|
}
|
||||||
@@ -194,29 +197,29 @@ UINT map_index;
|
|||||||
/* Restore interrupts. */
|
/* Restore interrupts. */
|
||||||
TX_RESTORE
|
TX_RESTORE
|
||||||
|
|
||||||
/* The thread is ready and must first be removed from the list. Call the
|
/* The thread is ready and must first be removed from the list. Call the
|
||||||
system suspend function to accomplish this. */
|
system suspend function to accomplish this. */
|
||||||
_tx_thread_system_suspend(thread_ptr);
|
_tx_thread_system_suspend(thread_ptr);
|
||||||
|
|
||||||
/* Disable interrupts. */
|
/* Disable interrupts. */
|
||||||
TX_DISABLE
|
TX_DISABLE
|
||||||
|
|
||||||
/* At this point, the preempt disable flag is still set, so we still have
|
/* At this point, the preempt disable flag is still set, so we still have
|
||||||
protection against all preemption. */
|
protection against all preemption. */
|
||||||
|
|
||||||
/* Change thread priority to the new mutex priority-inheritance priority. */
|
/* Change thread priority to the new mutex priority-inheritance priority. */
|
||||||
thread_ptr -> tx_thread_priority = new_priority;
|
thread_ptr -> tx_thread_priority = new_priority;
|
||||||
|
|
||||||
/* Determine how to setup the thread's preemption-threshold. */
|
/* Determine how to setup the thread's preemption-threshold. */
|
||||||
if (thread_ptr -> tx_thread_user_preempt_threshold < new_priority)
|
if (thread_ptr -> tx_thread_user_preempt_threshold < new_priority)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Change thread preemption-threshold to the user's preemption-threshold. */
|
/* Change thread preemption-threshold to the user's preemption-threshold. */
|
||||||
thread_ptr -> tx_thread_preempt_threshold = thread_ptr -> tx_thread_user_preempt_threshold;
|
thread_ptr -> tx_thread_preempt_threshold = thread_ptr -> tx_thread_user_preempt_threshold;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Change the thread preemption-threshold to the new threshold. */
|
/* Change the thread preemption-threshold to the new threshold. */
|
||||||
thread_ptr -> tx_thread_preempt_threshold = new_priority;
|
thread_ptr -> tx_thread_preempt_threshold = new_priority;
|
||||||
}
|
}
|
||||||
@@ -236,14 +239,14 @@ UINT map_index;
|
|||||||
/* Disable interrupts. */
|
/* Disable interrupts. */
|
||||||
TX_DISABLE
|
TX_DISABLE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Pickup the next thread to execute. */
|
/* Pickup the next thread to execute. */
|
||||||
next_execute_ptr = _tx_thread_execute_ptr;
|
next_execute_ptr = _tx_thread_execute_ptr;
|
||||||
|
|
||||||
/* Determine if this thread is not the next thread to execute. */
|
/* Determine if this thread is not the next thread to execute. */
|
||||||
if (thread_ptr != next_execute_ptr)
|
if (thread_ptr != next_execute_ptr)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Make sure the thread is still ready. */
|
/* Make sure the thread is still ready. */
|
||||||
if (thread_ptr -> tx_thread_state == TX_READY)
|
if (thread_ptr -> tx_thread_state == TX_READY)
|
||||||
{
|
{
|
||||||
@@ -265,7 +268,7 @@ UINT map_index;
|
|||||||
/* Determine if we moved to a lower priority. If so, move the thread to the front of its priority list. */
|
/* Determine if we moved to a lower priority. If so, move the thread to the front of its priority list. */
|
||||||
if (original_priority < new_priority)
|
if (original_priority < new_priority)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Ensure that this thread is placed at the front of the priority list. */
|
/* Ensure that this thread is placed at the front of the priority list. */
|
||||||
_tx_thread_priority_list[thread_ptr -> tx_thread_priority] = thread_ptr;
|
_tx_thread_priority_list[thread_ptr -> tx_thread_priority] = thread_ptr;
|
||||||
}
|
}
|
||||||
@@ -283,7 +286,7 @@ UINT map_index;
|
|||||||
/* Compare the next thread to execute thread's priority against the thread's preemption-threshold. */
|
/* Compare the next thread to execute thread's priority against the thread's preemption-threshold. */
|
||||||
if (thread_ptr -> tx_thread_preempt_threshold <= next_execute_ptr -> tx_thread_priority)
|
if (thread_ptr -> tx_thread_preempt_threshold <= next_execute_ptr -> tx_thread_priority)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* We must swap execute pointers to enforce the preemption-threshold of a thread coming out of
|
/* We must swap execute pointers to enforce the preemption-threshold of a thread coming out of
|
||||||
priority inheritance. */
|
priority inheritance. */
|
||||||
_tx_thread_execute_ptr = thread_ptr;
|
_tx_thread_execute_ptr = thread_ptr;
|
||||||
@@ -291,7 +294,7 @@ UINT map_index;
|
|||||||
/* Determine if we moved to a lower priority. If so, move the thread to the front of its priority list. */
|
/* Determine if we moved to a lower priority. If so, move the thread to the front of its priority list. */
|
||||||
if (original_priority < new_priority)
|
if (original_priority < new_priority)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Ensure that this thread is placed at the front of the priority list. */
|
/* Ensure that this thread is placed at the front of the priority list. */
|
||||||
_tx_thread_priority_list[thread_ptr -> tx_thread_priority] = thread_ptr;
|
_tx_thread_priority_list[thread_ptr -> tx_thread_priority] = thread_ptr;
|
||||||
}
|
}
|
||||||
@@ -308,15 +311,15 @@ UINT map_index;
|
|||||||
#if TX_MAX_PRIORITIES > 32
|
#if TX_MAX_PRIORITIES > 32
|
||||||
|
|
||||||
/* Calculate the index into the bit map array. */
|
/* Calculate the index into the bit map array. */
|
||||||
map_index = (next_execute_ptr -> tx_thread_priority)/ ((UINT) 32);
|
map_index = (thread_ptr -> tx_thread_priority)/ ((UINT) 32);
|
||||||
|
|
||||||
/* Set the active bit to remember that the preempt map has something set. */
|
/* Set the active bit to remember that the preempt map has something set. */
|
||||||
TX_DIV32_BIT_SET(next_execute_ptr -> tx_thread_priority, priority_bit)
|
TX_DIV32_BIT_SET(thread_ptr -> tx_thread_priority, priority_bit)
|
||||||
_tx_thread_preempted_map_active = _tx_thread_preempted_map_active | priority_bit;
|
_tx_thread_preempted_map_active = _tx_thread_preempted_map_active | priority_bit;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Remember that this thread was preempted by a thread above the thread's threshold. */
|
/* Remember that this thread was preempted by a thread above the thread's threshold. */
|
||||||
TX_MOD32_BIT_SET(next_execute_ptr -> tx_thread_priority, priority_bit)
|
TX_MOD32_BIT_SET(thread_ptr -> tx_thread_priority, priority_bit)
|
||||||
_tx_thread_preempted_maps[MAP_INDEX] = _tx_thread_preempted_maps[MAP_INDEX] | priority_bit;
|
_tx_thread_preempted_maps[MAP_INDEX] = _tx_thread_preempted_maps[MAP_INDEX] | priority_bit;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -326,7 +329,7 @@ UINT map_index;
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifndef TX_NOT_INTERRUPTABLE
|
#ifndef TX_NOT_INTERRUPTABLE
|
||||||
|
|
||||||
/* Restore interrupts. */
|
/* Restore interrupts. */
|
||||||
TX_RESTORE
|
TX_RESTORE
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -131,8 +130,8 @@ UINT inheritance_priority;
|
|||||||
/* Check to see if the mutex is owned by the calling thread. */
|
/* Check to see if the mutex is owned by the calling thread. */
|
||||||
if (mutex_ptr -> tx_mutex_owner != current_thread)
|
if (mutex_ptr -> tx_mutex_owner != current_thread)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Determine if the preempt disable flag is set, indicating that
|
/* Determine if the preempt disable flag is set, indicating that
|
||||||
the caller is not the application but from ThreadX. In such
|
the caller is not the application but from ThreadX. In such
|
||||||
cases, the thread mutex owner does not need to match. */
|
cases, the thread mutex owner does not need to match. */
|
||||||
if (_tx_thread_preempt_disable == ((UINT) 0))
|
if (_tx_thread_preempt_disable == ((UINT) 0))
|
||||||
@@ -147,11 +146,11 @@ UINT inheritance_priority;
|
|||||||
status = TX_NOT_OWNED;
|
status = TX_NOT_OWNED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Determine if we should continue. */
|
/* Determine if we should continue. */
|
||||||
if (status == TX_NOT_DONE)
|
if (status == TX_NOT_DONE)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Decrement the mutex ownership count. */
|
/* Decrement the mutex ownership count. */
|
||||||
mutex_ptr -> tx_mutex_ownership_count--;
|
mutex_ptr -> tx_mutex_ownership_count--;
|
||||||
|
|
||||||
@@ -182,9 +181,9 @@ UINT inheritance_priority;
|
|||||||
{
|
{
|
||||||
|
|
||||||
/* The mutex is now available. */
|
/* The mutex is now available. */
|
||||||
|
|
||||||
/* Remove this mutex from the owned mutex list. */
|
/* Remove this mutex from the owned mutex list. */
|
||||||
|
|
||||||
/* Decrement the ownership count. */
|
/* Decrement the ownership count. */
|
||||||
thread_ptr -> tx_thread_owned_mutex_count--;
|
thread_ptr -> tx_thread_owned_mutex_count--;
|
||||||
|
|
||||||
@@ -218,14 +217,14 @@ UINT inheritance_priority;
|
|||||||
/* Determine if the simple, non-suspension, non-priority inheritance case is present. */
|
/* Determine if the simple, non-suspension, non-priority inheritance case is present. */
|
||||||
if (mutex_ptr -> tx_mutex_suspension_list == TX_NULL)
|
if (mutex_ptr -> tx_mutex_suspension_list == TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Is this a priority inheritance mutex? */
|
/* Is this a priority inheritance mutex? */
|
||||||
if (mutex_ptr -> tx_mutex_inherit == TX_FALSE)
|
if (mutex_ptr -> tx_mutex_inherit == TX_FALSE)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Yes, we are done - set the mutex owner to NULL. */
|
/* Yes, we are done - set the mutex owner to NULL. */
|
||||||
mutex_ptr -> tx_mutex_owner = TX_NULL;
|
mutex_ptr -> tx_mutex_owner = TX_NULL;
|
||||||
|
|
||||||
/* Restore interrupts. */
|
/* Restore interrupts. */
|
||||||
TX_RESTORE
|
TX_RESTORE
|
||||||
|
|
||||||
@@ -233,11 +232,11 @@ UINT inheritance_priority;
|
|||||||
status = TX_SUCCESS;
|
status = TX_SUCCESS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Determine if the processing is complete. */
|
/* Determine if the processing is complete. */
|
||||||
if (status == TX_NOT_DONE)
|
if (status == TX_NOT_DONE)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Initialize original owner and thread priority. */
|
/* Initialize original owner and thread priority. */
|
||||||
old_owner = TX_NULL;
|
old_owner = TX_NULL;
|
||||||
old_priority = thread_ptr -> tx_thread_user_priority;
|
old_priority = thread_ptr -> tx_thread_user_priority;
|
||||||
@@ -257,8 +256,8 @@ UINT inheritance_priority;
|
|||||||
|
|
||||||
/* Default the inheritance priority to disabled. */
|
/* Default the inheritance priority to disabled. */
|
||||||
inheritance_priority = ((UINT) TX_MAX_PRIORITIES);
|
inheritance_priority = ((UINT) TX_MAX_PRIORITIES);
|
||||||
|
|
||||||
/* Search the owned mutexes for this thread to determine the highest priority for this
|
/* Search the owned mutexes for this thread to determine the highest priority for this
|
||||||
former mutex owner to return to. */
|
former mutex owner to return to. */
|
||||||
next_mutex = thread_ptr -> tx_thread_owned_mutex_list;
|
next_mutex = thread_ptr -> tx_thread_owned_mutex_list;
|
||||||
while (next_mutex != TX_NULL)
|
while (next_mutex != TX_NULL)
|
||||||
@@ -267,8 +266,8 @@ UINT inheritance_priority;
|
|||||||
/* Does this mutex support priority inheritance? */
|
/* Does this mutex support priority inheritance? */
|
||||||
if (next_mutex -> tx_mutex_inherit == TX_TRUE)
|
if (next_mutex -> tx_mutex_inherit == TX_TRUE)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Determine if highest priority field of the mutex is higher than the priority to
|
/* Determine if highest priority field of the mutex is higher than the priority to
|
||||||
restore. */
|
restore. */
|
||||||
if (next_mutex -> tx_mutex_highest_priority_waiting < inheritance_priority)
|
if (next_mutex -> tx_mutex_highest_priority_waiting < inheritance_priority)
|
||||||
{
|
{
|
||||||
@@ -284,7 +283,7 @@ UINT inheritance_priority;
|
|||||||
/* Are we at the end of the list? */
|
/* Are we at the end of the list? */
|
||||||
if (next_mutex == thread_ptr -> tx_thread_owned_mutex_list)
|
if (next_mutex == thread_ptr -> tx_thread_owned_mutex_list)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Yes, set the next mutex to NULL. */
|
/* Yes, set the next mutex to NULL. */
|
||||||
next_mutex = TX_NULL;
|
next_mutex = TX_NULL;
|
||||||
}
|
}
|
||||||
@@ -298,14 +297,14 @@ UINT inheritance_priority;
|
|||||||
/* Undo the temporarily preemption disable. */
|
/* Undo the temporarily preemption disable. */
|
||||||
_tx_thread_preempt_disable--;
|
_tx_thread_preempt_disable--;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Set the inherit priority to that of the highest priority thread waiting on the mutex. */
|
/* Set the inherit priority to that of the highest priority thread waiting on the mutex. */
|
||||||
thread_ptr -> tx_thread_inherit_priority = inheritance_priority;
|
thread_ptr -> tx_thread_inherit_priority = inheritance_priority;
|
||||||
|
|
||||||
/* Determine if the inheritance priority is less than the default old priority. */
|
/* Determine if the inheritance priority is less than the default old priority. */
|
||||||
if (inheritance_priority < old_priority)
|
if (inheritance_priority < old_priority)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Yes, update the old priority. */
|
/* Yes, update the old priority. */
|
||||||
old_priority = inheritance_priority;
|
old_priority = inheritance_priority;
|
||||||
}
|
}
|
||||||
@@ -332,7 +331,7 @@ UINT inheritance_priority;
|
|||||||
TX_RESTORE
|
TX_RESTORE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Call the mutex prioritize processing to ensure the
|
/* Call the mutex prioritize processing to ensure the
|
||||||
highest priority thread is resumed. */
|
highest priority thread is resumed. */
|
||||||
#ifdef TX_MISRA_ENABLE
|
#ifdef TX_MISRA_ENABLE
|
||||||
do
|
do
|
||||||
@@ -375,17 +374,17 @@ UINT inheritance_priority;
|
|||||||
TX_RESTORE
|
TX_RESTORE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Mutex is not owned, but it is possible that a thread that
|
/* Mutex is not owned, but it is possible that a thread that
|
||||||
caused a priority inheritance to occur is no longer waiting
|
caused a priority inheritance to occur is no longer waiting
|
||||||
on the mutex. */
|
on the mutex. */
|
||||||
|
|
||||||
/* Setup the highest priority waiting thread. */
|
/* Setup the highest priority waiting thread. */
|
||||||
mutex_ptr -> tx_mutex_highest_priority_waiting = (UINT) TX_MAX_PRIORITIES;
|
mutex_ptr -> tx_mutex_highest_priority_waiting = (UINT) TX_MAX_PRIORITIES;
|
||||||
|
|
||||||
/* Determine if we need to restore priority. */
|
/* Determine if we need to restore priority. */
|
||||||
if ((mutex_ptr -> tx_mutex_owner) -> tx_thread_priority != old_priority)
|
if ((mutex_ptr -> tx_mutex_owner) -> tx_thread_priority != old_priority)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Yes, restore the priority of thread. */
|
/* Yes, restore the priority of thread. */
|
||||||
_tx_mutex_priority_change(mutex_ptr -> tx_mutex_owner, old_priority);
|
_tx_mutex_priority_change(mutex_ptr -> tx_mutex_owner, old_priority);
|
||||||
}
|
}
|
||||||
@@ -424,7 +423,7 @@ UINT inheritance_priority;
|
|||||||
|
|
||||||
/* Remember the old mutex owner. */
|
/* Remember the old mutex owner. */
|
||||||
old_owner = mutex_ptr -> tx_mutex_owner;
|
old_owner = mutex_ptr -> tx_mutex_owner;
|
||||||
|
|
||||||
/* Setup owner thread priority information. */
|
/* Setup owner thread priority information. */
|
||||||
mutex_ptr -> tx_mutex_original_priority = thread_ptr -> tx_thread_priority;
|
mutex_ptr -> tx_mutex_original_priority = thread_ptr -> tx_thread_priority;
|
||||||
|
|
||||||
@@ -473,7 +472,7 @@ UINT inheritance_priority;
|
|||||||
|
|
||||||
/* Decrement the suspension count. */
|
/* Decrement the suspension count. */
|
||||||
mutex_ptr -> tx_mutex_suspended_count--;
|
mutex_ptr -> tx_mutex_suspended_count--;
|
||||||
|
|
||||||
/* Pickup the suspended count. */
|
/* Pickup the suspended count. */
|
||||||
suspended_count = mutex_ptr -> tx_mutex_suspended_count;
|
suspended_count = mutex_ptr -> tx_mutex_suspended_count;
|
||||||
|
|
||||||
@@ -482,7 +481,7 @@ UINT inheritance_priority;
|
|||||||
{
|
{
|
||||||
|
|
||||||
/* Yes, the only suspended thread. */
|
/* Yes, the only suspended thread. */
|
||||||
|
|
||||||
/* Update the head pointer. */
|
/* Update the head pointer. */
|
||||||
mutex_ptr -> tx_mutex_suspension_list = TX_NULL;
|
mutex_ptr -> tx_mutex_suspension_list = TX_NULL;
|
||||||
}
|
}
|
||||||
@@ -536,7 +535,7 @@ UINT inheritance_priority;
|
|||||||
_tx_mutex_prioritize(mutex_ptr);
|
_tx_mutex_prioritize(mutex_ptr);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now, pickup the list head and set the priority. */
|
/* Now, pickup the list head and set the priority. */
|
||||||
|
|
||||||
/* Determine if there still are threads suspended for this mutex. */
|
/* Determine if there still are threads suspended for this mutex. */
|
||||||
@@ -551,11 +550,11 @@ UINT inheritance_priority;
|
|||||||
|
|
||||||
/* Restore previous priority needs to be restored after priority
|
/* Restore previous priority needs to be restored after priority
|
||||||
inheritance. */
|
inheritance. */
|
||||||
|
|
||||||
/* Determine if we need to restore priority. */
|
/* Determine if we need to restore priority. */
|
||||||
if (old_owner -> tx_thread_priority != old_priority)
|
if (old_owner -> tx_thread_priority != old_priority)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Restore priority of thread. */
|
/* Restore priority of thread. */
|
||||||
_tx_mutex_priority_change(old_owner, old_priority);
|
_tx_mutex_priority_change(old_owner, old_priority);
|
||||||
}
|
}
|
||||||
@@ -579,7 +578,7 @@ UINT inheritance_priority;
|
|||||||
{
|
{
|
||||||
|
|
||||||
/* Yes, priority inheritance is requested. */
|
/* Yes, priority inheritance is requested. */
|
||||||
|
|
||||||
/* Determine if there are any more threads still suspended on the mutex. */
|
/* Determine if there are any more threads still suspended on the mutex. */
|
||||||
if (mutex_ptr -> tx_mutex_suspended_count != TX_NO_SUSPENSIONS)
|
if (mutex_ptr -> tx_mutex_suspended_count != TX_NO_SUSPENSIONS)
|
||||||
{
|
{
|
||||||
@@ -594,7 +593,7 @@ UINT inheritance_priority;
|
|||||||
#else
|
#else
|
||||||
_tx_mutex_prioritize(mutex_ptr);
|
_tx_mutex_prioritize(mutex_ptr);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Now, pickup the list head and set the priority. */
|
/* Now, pickup the list head and set the priority. */
|
||||||
|
|
||||||
/* Optional processing extension. */
|
/* Optional processing extension. */
|
||||||
@@ -618,11 +617,11 @@ UINT inheritance_priority;
|
|||||||
|
|
||||||
/* Restore previous priority needs to be restored after priority
|
/* Restore previous priority needs to be restored after priority
|
||||||
inheritance. */
|
inheritance. */
|
||||||
|
|
||||||
/* Is the priority different? */
|
/* Is the priority different? */
|
||||||
if (old_owner -> tx_thread_priority != old_priority)
|
if (old_owner -> tx_thread_priority != old_priority)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Restore the priority of thread. */
|
/* Restore the priority of thread. */
|
||||||
_tx_mutex_priority_change(old_owner, old_priority);
|
_tx_mutex_priority_change(old_owner, old_priority);
|
||||||
}
|
}
|
||||||
@@ -631,7 +630,7 @@ UINT inheritance_priority;
|
|||||||
/* Resume thread. */
|
/* Resume thread. */
|
||||||
_tx_thread_system_resume(thread_ptr);
|
_tx_thread_system_resume(thread_ptr);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Return a successful status. */
|
/* Return a successful status. */
|
||||||
status = TX_SUCCESS;
|
status = TX_SUCCESS;
|
||||||
}
|
}
|
||||||
@@ -645,7 +644,7 @@ UINT inheritance_priority;
|
|||||||
|
|
||||||
/* Restore interrupts. */
|
/* Restore interrupts. */
|
||||||
TX_RESTORE
|
TX_RESTORE
|
||||||
|
|
||||||
/* Caller does not own the mutex. */
|
/* Caller does not own the mutex. */
|
||||||
status = TX_NOT_OWNED;
|
status = TX_NOT_OWNED;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -87,7 +86,7 @@ UINT suspended_count;
|
|||||||
TX_THREAD *next_thread;
|
TX_THREAD *next_thread;
|
||||||
TX_THREAD *previous_thread;
|
TX_THREAD *previous_thread;
|
||||||
|
|
||||||
|
|
||||||
#ifndef TX_NOT_INTERRUPTABLE
|
#ifndef TX_NOT_INTERRUPTABLE
|
||||||
|
|
||||||
/* Disable interrupts to remove the suspended thread from the queue. */
|
/* Disable interrupts to remove the suspended thread from the queue. */
|
||||||
@@ -96,7 +95,7 @@ TX_THREAD *previous_thread;
|
|||||||
/* Determine if the cleanup is still required. */
|
/* Determine if the cleanup is still required. */
|
||||||
if (thread_ptr -> tx_thread_suspend_cleanup == &(_tx_queue_cleanup))
|
if (thread_ptr -> tx_thread_suspend_cleanup == &(_tx_queue_cleanup))
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Check for valid suspension sequence. */
|
/* Check for valid suspension sequence. */
|
||||||
if (suspension_sequence == thread_ptr -> tx_thread_suspension_sequence)
|
if (suspension_sequence == thread_ptr -> tx_thread_suspension_sequence)
|
||||||
{
|
{
|
||||||
@@ -122,7 +121,7 @@ TX_THREAD *previous_thread;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Yes, we still have thread suspension! */
|
/* Yes, we still have thread suspension! */
|
||||||
|
|
||||||
/* Clear the suspension cleanup flag. */
|
/* Clear the suspension cleanup flag. */
|
||||||
thread_ptr -> tx_thread_suspend_cleanup = TX_NULL;
|
thread_ptr -> tx_thread_suspend_cleanup = TX_NULL;
|
||||||
|
|
||||||
@@ -168,7 +167,7 @@ TX_THREAD *previous_thread;
|
|||||||
if (thread_ptr -> tx_thread_state == TX_QUEUE_SUSP)
|
if (thread_ptr -> tx_thread_state == TX_QUEUE_SUSP)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Timeout condition and the thread still suspended on the queue.
|
/* Timeout condition and the thread still suspended on the queue.
|
||||||
Setup return error status and resume the thread. */
|
Setup return error status and resume the thread. */
|
||||||
|
|
||||||
#ifdef TX_QUEUE_ENABLE_PERFORMANCE_INFO
|
#ifdef TX_QUEUE_ENABLE_PERFORMANCE_INFO
|
||||||
@@ -183,17 +182,17 @@ TX_THREAD *previous_thread;
|
|||||||
/* Setup return status. */
|
/* Setup return status. */
|
||||||
if (queue_ptr -> tx_queue_enqueued != TX_NO_MESSAGES)
|
if (queue_ptr -> tx_queue_enqueued != TX_NO_MESSAGES)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Queue full timeout! */
|
/* Queue full timeout! */
|
||||||
thread_ptr -> tx_thread_suspend_status = TX_QUEUE_FULL;
|
thread_ptr -> tx_thread_suspend_status = TX_QUEUE_FULL;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Queue empty timeout! */
|
/* Queue empty timeout! */
|
||||||
thread_ptr -> tx_thread_suspend_status = TX_QUEUE_EMPTY;
|
thread_ptr -> tx_thread_suspend_status = TX_QUEUE_EMPTY;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef TX_NOT_INTERRUPTABLE
|
#ifdef TX_NOT_INTERRUPTABLE
|
||||||
|
|
||||||
/* Resume the thread! */
|
/* Resume the thread! */
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -74,7 +73,7 @@
|
|||||||
/* resulting in version 6.1 */
|
/* resulting in version 6.1 */
|
||||||
/* */
|
/* */
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
UINT _tx_queue_create(TX_QUEUE *queue_ptr, CHAR *name_ptr, UINT message_size,
|
UINT _tx_queue_create(TX_QUEUE *queue_ptr, CHAR *name_ptr, UINT message_size,
|
||||||
VOID *queue_start, ULONG queue_size)
|
VOID *queue_start, ULONG queue_size)
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -91,7 +90,7 @@ TX_QUEUE *previous_queue;
|
|||||||
|
|
||||||
/* Setup the basic queue fields. */
|
/* Setup the basic queue fields. */
|
||||||
queue_ptr -> tx_queue_name = name_ptr;
|
queue_ptr -> tx_queue_name = name_ptr;
|
||||||
|
|
||||||
/* Save the message size in the control block. */
|
/* Save the message size in the control block. */
|
||||||
queue_ptr -> tx_queue_message_size = message_size;
|
queue_ptr -> tx_queue_message_size = message_size;
|
||||||
|
|
||||||
@@ -100,7 +99,7 @@ TX_QUEUE *previous_queue;
|
|||||||
capacity = (UINT) (queue_size / ((ULONG) (((ULONG) message_size) * (sizeof(ULONG)))));
|
capacity = (UINT) (queue_size / ((ULONG) (((ULONG) message_size) * (sizeof(ULONG)))));
|
||||||
used_words = capacity * message_size;
|
used_words = capacity * message_size;
|
||||||
|
|
||||||
/* Save the starting address and calculate the ending address of
|
/* Save the starting address and calculate the ending address of
|
||||||
the queue. Note that the ending address is really one past the
|
the queue. Note that the ending address is really one past the
|
||||||
end! */
|
end! */
|
||||||
queue_ptr -> tx_queue_start = TX_VOID_TO_ULONG_POINTER_CONVERT(queue_start);
|
queue_ptr -> tx_queue_start = TX_VOID_TO_ULONG_POINTER_CONVERT(queue_start);
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -125,7 +124,7 @@ TX_QUEUE *previous_queue;
|
|||||||
/* See if we have to update the created list head pointer. */
|
/* See if we have to update the created list head pointer. */
|
||||||
if (_tx_queue_created_ptr == queue_ptr)
|
if (_tx_queue_created_ptr == queue_ptr)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Yes, move the head pointer to the next link. */
|
/* Yes, move the head pointer to the next link. */
|
||||||
_tx_queue_created_ptr = next_queue;
|
_tx_queue_created_ptr = next_queue;
|
||||||
}
|
}
|
||||||
@@ -147,14 +146,14 @@ TX_QUEUE *previous_queue;
|
|||||||
on this queue. */
|
on this queue. */
|
||||||
while (suspended_count != TX_NO_SUSPENSIONS)
|
while (suspended_count != TX_NO_SUSPENSIONS)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Decrement the suspension count. */
|
/* Decrement the suspension count. */
|
||||||
suspended_count--;
|
suspended_count--;
|
||||||
|
|
||||||
/* Lockout interrupts. */
|
/* Lockout interrupts. */
|
||||||
TX_DISABLE
|
TX_DISABLE
|
||||||
|
|
||||||
/* Clear the cleanup pointer, this prevents the timeout from doing
|
/* Clear the cleanup pointer, this prevents the timeout from doing
|
||||||
anything. */
|
anything. */
|
||||||
thread_ptr -> tx_thread_suspend_cleanup = TX_NULL;
|
thread_ptr -> tx_thread_suspend_cleanup = TX_NULL;
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -113,7 +112,7 @@ TX_THREAD *thread_ptr;
|
|||||||
if (queue_ptr -> tx_queue_suspended_count != TX_NO_SUSPENSIONS)
|
if (queue_ptr -> tx_queue_suspended_count != TX_NO_SUSPENSIONS)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Yes, there are threads suspended on this queue, they must be
|
/* Yes, there are threads suspended on this queue, they must be
|
||||||
resumed! */
|
resumed! */
|
||||||
|
|
||||||
/* Copy the information into temporary variables. */
|
/* Copy the information into temporary variables. */
|
||||||
@@ -141,24 +140,24 @@ TX_THREAD *thread_ptr;
|
|||||||
thread_ptr = suspension_list;
|
thread_ptr = suspension_list;
|
||||||
while (suspended_count != ((ULONG) 0))
|
while (suspended_count != ((ULONG) 0))
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Decrement the suspension count. */
|
/* Decrement the suspension count. */
|
||||||
suspended_count--;
|
suspended_count--;
|
||||||
|
|
||||||
/* Check for a NULL thread pointer. */
|
/* Check for a NULL thread pointer. */
|
||||||
if (thread_ptr == TX_NULL)
|
if (thread_ptr == TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Get out of the loop. */
|
/* Get out of the loop. */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Resume the next suspended thread. */
|
/* Resume the next suspended thread. */
|
||||||
|
|
||||||
/* Lockout interrupts. */
|
/* Lockout interrupts. */
|
||||||
TX_DISABLE
|
TX_DISABLE
|
||||||
|
|
||||||
/* Clear the cleanup pointer, this prevents the timeout from doing
|
/* Clear the cleanup pointer, this prevents the timeout from doing
|
||||||
anything. */
|
anything. */
|
||||||
thread_ptr -> tx_thread_suspend_cleanup = TX_NULL;
|
thread_ptr -> tx_thread_suspend_cleanup = TX_NULL;
|
||||||
|
|
||||||
@@ -182,7 +181,7 @@ TX_THREAD *thread_ptr;
|
|||||||
|
|
||||||
/* Restore interrupts. */
|
/* Restore interrupts. */
|
||||||
TX_RESTORE
|
TX_RESTORE
|
||||||
|
|
||||||
/* Resume the thread. */
|
/* Resume the thread. */
|
||||||
_tx_thread_system_resume(thread_ptr -> tx_thread_suspended_previous);
|
_tx_thread_system_resume(thread_ptr -> tx_thread_suspended_previous);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -123,7 +122,7 @@ VOID (*queue_send_notify)(struct TX_QUEUE_STRUCT *notify_queue_ptr);
|
|||||||
if (queue_ptr -> tx_queue_available_storage != ((UINT) 0))
|
if (queue_ptr -> tx_queue_available_storage != ((UINT) 0))
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Yes there is room in the queue. Now determine if there is a thread waiting
|
/* Yes there is room in the queue. Now determine if there is a thread waiting
|
||||||
for a message. */
|
for a message. */
|
||||||
if (suspended_count == TX_NO_SUSPENSIONS)
|
if (suspended_count == TX_NO_SUSPENSIONS)
|
||||||
{
|
{
|
||||||
@@ -137,20 +136,20 @@ VOID (*queue_send_notify)(struct TX_QUEUE_STRUCT *notify_queue_ptr);
|
|||||||
/* See if the read pointer is at the beginning of the queue area. */
|
/* See if the read pointer is at the beginning of the queue area. */
|
||||||
if (queue_ptr -> tx_queue_read == queue_ptr -> tx_queue_start)
|
if (queue_ptr -> tx_queue_read == queue_ptr -> tx_queue_start)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Adjust the read pointer to the last message at the end of the
|
/* Adjust the read pointer to the last message at the end of the
|
||||||
queue. */
|
queue. */
|
||||||
queue_ptr -> tx_queue_read = TX_ULONG_POINTER_SUB(queue_ptr -> tx_queue_end, queue_ptr -> tx_queue_message_size);
|
queue_ptr -> tx_queue_read = TX_ULONG_POINTER_SUB(queue_ptr -> tx_queue_end, queue_ptr -> tx_queue_message_size);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Not at the beginning of the queue, just move back one message. */
|
/* Not at the beginning of the queue, just move back one message. */
|
||||||
queue_ptr -> tx_queue_read = TX_ULONG_POINTER_SUB(queue_ptr -> tx_queue_read, queue_ptr -> tx_queue_message_size);
|
queue_ptr -> tx_queue_read = TX_ULONG_POINTER_SUB(queue_ptr -> tx_queue_read, queue_ptr -> tx_queue_message_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Simply place the message in the queue. */
|
/* Simply place the message in the queue. */
|
||||||
|
|
||||||
/* Reduce the amount of available storage. */
|
/* Reduce the amount of available storage. */
|
||||||
queue_ptr -> tx_queue_available_storage--;
|
queue_ptr -> tx_queue_available_storage--;
|
||||||
|
|
||||||
@@ -162,7 +161,7 @@ VOID (*queue_send_notify)(struct TX_QUEUE_STRUCT *notify_queue_ptr);
|
|||||||
destination = queue_ptr -> tx_queue_read;
|
destination = queue_ptr -> tx_queue_read;
|
||||||
size = queue_ptr -> tx_queue_message_size;
|
size = queue_ptr -> tx_queue_message_size;
|
||||||
|
|
||||||
/* Copy message. Note that the source and destination pointers are
|
/* Copy message. Note that the source and destination pointers are
|
||||||
incremented by the macro. */
|
incremented by the macro. */
|
||||||
TX_QUEUE_MESSAGE_COPY(source, destination, size)
|
TX_QUEUE_MESSAGE_COPY(source, destination, size)
|
||||||
|
|
||||||
@@ -241,7 +240,7 @@ VOID (*queue_send_notify)(struct TX_QUEUE_STRUCT *notify_queue_ptr);
|
|||||||
destination = TX_VOID_TO_ULONG_POINTER_CONVERT(thread_ptr -> tx_thread_additional_suspend_info);
|
destination = TX_VOID_TO_ULONG_POINTER_CONVERT(thread_ptr -> tx_thread_additional_suspend_info);
|
||||||
size = queue_ptr -> tx_queue_message_size;
|
size = queue_ptr -> tx_queue_message_size;
|
||||||
|
|
||||||
/* Copy message. Note that the source and destination pointers are
|
/* Copy message. Note that the source and destination pointers are
|
||||||
incremented by the macro. */
|
incremented by the macro. */
|
||||||
TX_QUEUE_MESSAGE_COPY(source, destination, size)
|
TX_QUEUE_MESSAGE_COPY(source, destination, size)
|
||||||
|
|
||||||
@@ -300,7 +299,7 @@ VOID (*queue_send_notify)(struct TX_QUEUE_STRUCT *notify_queue_ptr);
|
|||||||
/* Yes, suspension is requested. */
|
/* Yes, suspension is requested. */
|
||||||
|
|
||||||
/* Prepare for suspension of this thread. */
|
/* Prepare for suspension of this thread. */
|
||||||
|
|
||||||
/* Pickup thread pointer. */
|
/* Pickup thread pointer. */
|
||||||
TX_THREAD_GET_CURRENT(thread_ptr)
|
TX_THREAD_GET_CURRENT(thread_ptr)
|
||||||
|
|
||||||
@@ -345,7 +344,7 @@ VOID (*queue_send_notify)(struct TX_QUEUE_STRUCT *notify_queue_ptr);
|
|||||||
next_thread -> tx_thread_suspended_previous = thread_ptr;
|
next_thread -> tx_thread_suspended_previous = thread_ptr;
|
||||||
|
|
||||||
/* Update the suspension list to put this thread in front, which will put
|
/* Update the suspension list to put this thread in front, which will put
|
||||||
the message that was removed in the proper relative order when room is
|
the message that was removed in the proper relative order when room is
|
||||||
made in the queue. */
|
made in the queue. */
|
||||||
queue_ptr -> tx_queue_suspension_list = thread_ptr;
|
queue_ptr -> tx_queue_suspension_list = thread_ptr;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -99,45 +98,45 @@ TX_INTERRUPT_SAVE_AREA
|
|||||||
/* Retrieve the name of the queue. */
|
/* Retrieve the name of the queue. */
|
||||||
if (name != TX_NULL)
|
if (name != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*name = queue_ptr -> tx_queue_name;
|
*name = queue_ptr -> tx_queue_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the number of messages currently in the queue. */
|
/* Retrieve the number of messages currently in the queue. */
|
||||||
if (enqueued != TX_NULL)
|
if (enqueued != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*enqueued = (ULONG) queue_ptr -> tx_queue_enqueued;
|
*enqueued = (ULONG) queue_ptr -> tx_queue_enqueued;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the number of messages that will still fit in the queue. */
|
/* Retrieve the number of messages that will still fit in the queue. */
|
||||||
if (available_storage != TX_NULL)
|
if (available_storage != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*available_storage = (ULONG) queue_ptr -> tx_queue_available_storage;
|
*available_storage = (ULONG) queue_ptr -> tx_queue_available_storage;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the first thread suspended on this queue. */
|
/* Retrieve the first thread suspended on this queue. */
|
||||||
if (first_suspended != TX_NULL)
|
if (first_suspended != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*first_suspended = queue_ptr -> tx_queue_suspension_list;
|
*first_suspended = queue_ptr -> tx_queue_suspension_list;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the number of threads suspended on this queue. */
|
/* Retrieve the number of threads suspended on this queue. */
|
||||||
if (suspended_count != TX_NULL)
|
if (suspended_count != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*suspended_count = (ULONG) queue_ptr -> tx_queue_suspended_count;
|
*suspended_count = (ULONG) queue_ptr -> tx_queue_suspended_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the pointer to the next queue created. */
|
/* Retrieve the pointer to the next queue created. */
|
||||||
if (next_queue != TX_NULL)
|
if (next_queue != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*next_queue = queue_ptr -> tx_queue_created_next;
|
*next_queue = queue_ptr -> tx_queue_created_next;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Restore interrupts. */
|
/* Restore interrupts. */
|
||||||
TX_RESTORE
|
TX_RESTORE
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -95,15 +94,15 @@ UINT status;
|
|||||||
/* Determine if this is a legal request. */
|
/* Determine if this is a legal request. */
|
||||||
if (queue_ptr == TX_NULL)
|
if (queue_ptr == TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Queue pointer is illegal, return error. */
|
/* Queue pointer is illegal, return error. */
|
||||||
status = TX_PTR_ERROR;
|
status = TX_PTR_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Determine if the queue ID is invalid. */
|
/* Determine if the queue ID is invalid. */
|
||||||
else if (queue_ptr -> tx_queue_id != TX_QUEUE_ID)
|
else if (queue_ptr -> tx_queue_id != TX_QUEUE_ID)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Queue pointer is illegal, return error. */
|
/* Queue pointer is illegal, return error. */
|
||||||
status = TX_PTR_ERROR;
|
status = TX_PTR_ERROR;
|
||||||
}
|
}
|
||||||
@@ -125,45 +124,45 @@ UINT status;
|
|||||||
/* Retrieve the number of messages sent to this queue. */
|
/* Retrieve the number of messages sent to this queue. */
|
||||||
if (messages_sent != TX_NULL)
|
if (messages_sent != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*messages_sent = queue_ptr -> tx_queue_performance_messages_sent_count;
|
*messages_sent = queue_ptr -> tx_queue_performance_messages_sent_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the number of messages received from this queue. */
|
/* Retrieve the number of messages received from this queue. */
|
||||||
if (messages_received != TX_NULL)
|
if (messages_received != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*messages_received = queue_ptr -> tx_queue_performance_messages_received_count;
|
*messages_received = queue_ptr -> tx_queue_performance_messages_received_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the number of empty queue suspensions on this queue. */
|
/* Retrieve the number of empty queue suspensions on this queue. */
|
||||||
if (empty_suspensions != TX_NULL)
|
if (empty_suspensions != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*empty_suspensions = queue_ptr -> tx_queue_performance_empty_suspension_count;
|
*empty_suspensions = queue_ptr -> tx_queue_performance_empty_suspension_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the number of full queue suspensions on this queue. */
|
/* Retrieve the number of full queue suspensions on this queue. */
|
||||||
if (full_suspensions != TX_NULL)
|
if (full_suspensions != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*full_suspensions = queue_ptr -> tx_queue_performance_full_suspension_count;
|
*full_suspensions = queue_ptr -> tx_queue_performance_full_suspension_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the number of full errors (no suspension!) on this queue. */
|
/* Retrieve the number of full errors (no suspension!) on this queue. */
|
||||||
if (full_errors != TX_NULL)
|
if (full_errors != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*full_errors = queue_ptr -> tx_queue_performance_full_error_count;
|
*full_errors = queue_ptr -> tx_queue_performance_full_error_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the number of timeouts on this queue. */
|
/* Retrieve the number of timeouts on this queue. */
|
||||||
if (timeouts != TX_NULL)
|
if (timeouts != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*timeouts = queue_ptr -> tx_queue_performance_timeout_count;
|
*timeouts = queue_ptr -> tx_queue_performance_timeout_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Restore interrupts. */
|
/* Restore interrupts. */
|
||||||
TX_RESTORE
|
TX_RESTORE
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -106,51 +105,51 @@ TX_INTERRUPT_SAVE_AREA
|
|||||||
/* Retrieve the total number of queue messages sent. */
|
/* Retrieve the total number of queue messages sent. */
|
||||||
if (messages_sent != TX_NULL)
|
if (messages_sent != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*messages_sent = _tx_queue_performance_messages_sent_count;
|
*messages_sent = _tx_queue_performance_messages_sent_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the total number of queue messages received. */
|
/* Retrieve the total number of queue messages received. */
|
||||||
if (messages_received != TX_NULL)
|
if (messages_received != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*messages_received = _tx_queue_performance__messages_received_count;
|
*messages_received = _tx_queue_performance__messages_received_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the total number of empty queue suspensions. */
|
/* Retrieve the total number of empty queue suspensions. */
|
||||||
if (empty_suspensions != TX_NULL)
|
if (empty_suspensions != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*empty_suspensions = _tx_queue_performance_empty_suspension_count;
|
*empty_suspensions = _tx_queue_performance_empty_suspension_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the total number of full queue suspensions. */
|
/* Retrieve the total number of full queue suspensions. */
|
||||||
if (full_suspensions != TX_NULL)
|
if (full_suspensions != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*full_suspensions = _tx_queue_performance_full_suspension_count;
|
*full_suspensions = _tx_queue_performance_full_suspension_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the total number of full errors. */
|
/* Retrieve the total number of full errors. */
|
||||||
if (full_errors != TX_NULL)
|
if (full_errors != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*full_errors = _tx_queue_performance_full_error_count;
|
*full_errors = _tx_queue_performance_full_error_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the total number of queue timeouts. */
|
/* Retrieve the total number of queue timeouts. */
|
||||||
if (timeouts != TX_NULL)
|
if (timeouts != TX_NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
*timeouts = _tx_queue_performance_timeout_count;
|
*timeouts = _tx_queue_performance_timeout_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Restore interrupts. */
|
/* Restore interrupts. */
|
||||||
TX_RESTORE
|
TX_RESTORE
|
||||||
|
|
||||||
/* Return completion status. */
|
/* Return completion status. */
|
||||||
return(TX_SUCCESS);
|
return(TX_SUCCESS);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
UINT status;
|
UINT status;
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -161,28 +160,28 @@ UINT list_changed;
|
|||||||
/* Disable interrupts again. */
|
/* Disable interrupts again. */
|
||||||
TX_DISABLE
|
TX_DISABLE
|
||||||
|
|
||||||
/* Determine if any changes to the list have occurred while
|
/* Determine if any changes to the list have occurred while
|
||||||
interrupts were enabled. */
|
interrupts were enabled. */
|
||||||
|
|
||||||
/* Is the list head the same? */
|
/* Is the list head the same? */
|
||||||
if (head_ptr != queue_ptr -> tx_queue_suspension_list)
|
if (head_ptr != queue_ptr -> tx_queue_suspension_list)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* The list head has changed, set the list changed flag. */
|
/* The list head has changed, set the list changed flag. */
|
||||||
list_changed = TX_TRUE;
|
list_changed = TX_TRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Is the suspended count the same? */
|
/* Is the suspended count the same? */
|
||||||
if (suspended_count != queue_ptr -> tx_queue_suspended_count)
|
if (suspended_count != queue_ptr -> tx_queue_suspended_count)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* The list head has changed, set the list changed flag. */
|
/* The list head has changed, set the list changed flag. */
|
||||||
list_changed = TX_TRUE;
|
list_changed = TX_TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Determine if the list has changed. */
|
/* Determine if the list has changed. */
|
||||||
if (list_changed == TX_FALSE)
|
if (list_changed == TX_FALSE)
|
||||||
{
|
{
|
||||||
@@ -212,12 +211,12 @@ UINT list_changed;
|
|||||||
/* Release preemption. */
|
/* Release preemption. */
|
||||||
_tx_thread_preempt_disable--;
|
_tx_thread_preempt_disable--;
|
||||||
|
|
||||||
/* Now determine if the highest priority thread is at the front
|
/* Now determine if the highest priority thread is at the front
|
||||||
of the list. */
|
of the list. */
|
||||||
if (priority_thread_ptr != head_ptr)
|
if (priority_thread_ptr != head_ptr)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* No, we need to move the highest priority suspended thread to the
|
/* No, we need to move the highest priority suspended thread to the
|
||||||
front of the list. */
|
front of the list. */
|
||||||
|
|
||||||
/* First, remove the highest priority thread by updating the
|
/* First, remove the highest priority thread by updating the
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -118,7 +117,7 @@ UINT status;
|
|||||||
|
|
||||||
/* Pickup the thread suspension count. */
|
/* Pickup the thread suspension count. */
|
||||||
suspended_count = queue_ptr -> tx_queue_suspended_count;
|
suspended_count = queue_ptr -> tx_queue_suspended_count;
|
||||||
|
|
||||||
/* Determine if there is anything in the queue. */
|
/* Determine if there is anything in the queue. */
|
||||||
if (queue_ptr -> tx_queue_enqueued != TX_NO_MESSAGES)
|
if (queue_ptr -> tx_queue_enqueued != TX_NO_MESSAGES)
|
||||||
{
|
{
|
||||||
@@ -128,13 +127,13 @@ UINT status;
|
|||||||
{
|
{
|
||||||
|
|
||||||
/* There is a message waiting in the queue and there are no suspensi. */
|
/* There is a message waiting in the queue and there are no suspensi. */
|
||||||
|
|
||||||
/* Setup source and destination pointers. */
|
/* Setup source and destination pointers. */
|
||||||
source = queue_ptr -> tx_queue_read;
|
source = queue_ptr -> tx_queue_read;
|
||||||
destination = TX_VOID_TO_ULONG_POINTER_CONVERT(destination_ptr);
|
destination = TX_VOID_TO_ULONG_POINTER_CONVERT(destination_ptr);
|
||||||
size = queue_ptr -> tx_queue_message_size;
|
size = queue_ptr -> tx_queue_message_size;
|
||||||
|
|
||||||
/* Copy message. Note that the source and destination pointers are
|
/* Copy message. Note that the source and destination pointers are
|
||||||
incremented by the macro. */
|
incremented by the macro. */
|
||||||
TX_QUEUE_MESSAGE_COPY(source, destination, size)
|
TX_QUEUE_MESSAGE_COPY(source, destination, size)
|
||||||
|
|
||||||
@@ -145,10 +144,10 @@ UINT status;
|
|||||||
/* Yes, wrap around to the beginning. */
|
/* Yes, wrap around to the beginning. */
|
||||||
source = queue_ptr -> tx_queue_start;
|
source = queue_ptr -> tx_queue_start;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Setup the queue read pointer. */
|
/* Setup the queue read pointer. */
|
||||||
queue_ptr -> tx_queue_read = source;
|
queue_ptr -> tx_queue_read = source;
|
||||||
|
|
||||||
/* Increase the amount of available storage. */
|
/* Increase the amount of available storage. */
|
||||||
queue_ptr -> tx_queue_available_storage++;
|
queue_ptr -> tx_queue_available_storage++;
|
||||||
|
|
||||||
@@ -160,18 +159,18 @@ UINT status;
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
/* At this point we know the queue is full. */
|
/* At this point we know the queue is full. */
|
||||||
|
|
||||||
/* Pickup thread suspension list head pointer. */
|
/* Pickup thread suspension list head pointer. */
|
||||||
thread_ptr = queue_ptr -> tx_queue_suspension_list;
|
thread_ptr = queue_ptr -> tx_queue_suspension_list;
|
||||||
|
|
||||||
/* Now determine if there is a queue front suspension active. */
|
/* Now determine if there is a queue front suspension active. */
|
||||||
|
|
||||||
/* Is the front suspension flag set? */
|
/* Is the front suspension flag set? */
|
||||||
if (thread_ptr -> tx_thread_suspend_option == TX_TRUE)
|
if (thread_ptr -> tx_thread_suspend_option == TX_TRUE)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Yes, a queue front suspension is present. */
|
/* Yes, a queue front suspension is present. */
|
||||||
|
|
||||||
/* Return the message associated with this suspension. */
|
/* Return the message associated with this suspension. */
|
||||||
@@ -181,11 +180,11 @@ UINT status;
|
|||||||
destination = TX_VOID_TO_ULONG_POINTER_CONVERT(destination_ptr);
|
destination = TX_VOID_TO_ULONG_POINTER_CONVERT(destination_ptr);
|
||||||
size = queue_ptr -> tx_queue_message_size;
|
size = queue_ptr -> tx_queue_message_size;
|
||||||
|
|
||||||
/* Copy message. Note that the source and destination pointers are
|
/* Copy message. Note that the source and destination pointers are
|
||||||
incremented by the macro. */
|
incremented by the macro. */
|
||||||
TX_QUEUE_MESSAGE_COPY(source, destination, size)
|
TX_QUEUE_MESSAGE_COPY(source, destination, size)
|
||||||
|
|
||||||
/* Message is now in the caller's destination. See if this is the only suspended thread
|
/* Message is now in the caller's destination. See if this is the only suspended thread
|
||||||
on the list. */
|
on the list. */
|
||||||
suspended_count--;
|
suspended_count--;
|
||||||
if (suspended_count == TX_NO_SUSPENSIONS)
|
if (suspended_count == TX_NO_SUSPENSIONS)
|
||||||
@@ -244,7 +243,7 @@ UINT status;
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
/* At this point, we know that the queue is full and there
|
/* At this point, we know that the queue is full and there
|
||||||
are one or more threads suspended trying to send another
|
are one or more threads suspended trying to send another
|
||||||
message to this queue. */
|
message to this queue. */
|
||||||
|
|
||||||
@@ -253,7 +252,7 @@ UINT status;
|
|||||||
destination = TX_VOID_TO_ULONG_POINTER_CONVERT(destination_ptr);
|
destination = TX_VOID_TO_ULONG_POINTER_CONVERT(destination_ptr);
|
||||||
size = queue_ptr -> tx_queue_message_size;
|
size = queue_ptr -> tx_queue_message_size;
|
||||||
|
|
||||||
/* Copy message. Note that the source and destination pointers are
|
/* Copy message. Note that the source and destination pointers are
|
||||||
incremented by the macro. */
|
incremented by the macro. */
|
||||||
TX_QUEUE_MESSAGE_COPY(source, destination, size)
|
TX_QUEUE_MESSAGE_COPY(source, destination, size)
|
||||||
|
|
||||||
@@ -267,7 +266,7 @@ UINT status;
|
|||||||
|
|
||||||
/* Setup the queue read pointer. */
|
/* Setup the queue read pointer. */
|
||||||
queue_ptr -> tx_queue_read = source;
|
queue_ptr -> tx_queue_read = source;
|
||||||
|
|
||||||
/* Disable preemption. */
|
/* Disable preemption. */
|
||||||
_tx_thread_preempt_disable++;
|
_tx_thread_preempt_disable++;
|
||||||
|
|
||||||
@@ -291,14 +290,14 @@ UINT status;
|
|||||||
destination = queue_ptr -> tx_queue_write;
|
destination = queue_ptr -> tx_queue_write;
|
||||||
size = queue_ptr -> tx_queue_message_size;
|
size = queue_ptr -> tx_queue_message_size;
|
||||||
|
|
||||||
/* Copy message. Note that the source and destination pointers are
|
/* Copy message. Note that the source and destination pointers are
|
||||||
incremented by the macro. */
|
incremented by the macro. */
|
||||||
TX_QUEUE_MESSAGE_COPY(source, destination, size)
|
TX_QUEUE_MESSAGE_COPY(source, destination, size)
|
||||||
|
|
||||||
/* Determine if we are at the end. */
|
/* Determine if we are at the end. */
|
||||||
if (destination == queue_ptr -> tx_queue_end)
|
if (destination == queue_ptr -> tx_queue_end)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Yes, wrap around to the beginning. */
|
/* Yes, wrap around to the beginning. */
|
||||||
destination = queue_ptr -> tx_queue_start;
|
destination = queue_ptr -> tx_queue_start;
|
||||||
}
|
}
|
||||||
@@ -309,7 +308,7 @@ UINT status;
|
|||||||
/* Pickup thread pointer. */
|
/* Pickup thread pointer. */
|
||||||
thread_ptr = queue_ptr -> tx_queue_suspension_list;
|
thread_ptr = queue_ptr -> tx_queue_suspension_list;
|
||||||
|
|
||||||
/* Message is now in the queue. See if this is the only suspended thread
|
/* Message is now in the queue. See if this is the only suspended thread
|
||||||
on the list. */
|
on the list. */
|
||||||
suspended_count--;
|
suspended_count--;
|
||||||
if (suspended_count == TX_NO_SUSPENSIONS)
|
if (suspended_count == TX_NO_SUSPENSIONS)
|
||||||
@@ -378,7 +377,7 @@ UINT status;
|
|||||||
|
|
||||||
/* Restore interrupts. */
|
/* Restore interrupts. */
|
||||||
TX_RESTORE
|
TX_RESTORE
|
||||||
|
|
||||||
/* Suspension is not allowed if the preempt disable flag is non-zero at this point - return error completion. */
|
/* Suspension is not allowed if the preempt disable flag is non-zero at this point - return error completion. */
|
||||||
status = TX_QUEUE_EMPTY;
|
status = TX_QUEUE_EMPTY;
|
||||||
}
|
}
|
||||||
@@ -395,7 +394,7 @@ UINT status;
|
|||||||
/* Increment the number of empty suspensions on this queue. */
|
/* Increment the number of empty suspensions on this queue. */
|
||||||
queue_ptr -> tx_queue_performance_empty_suspension_count++;
|
queue_ptr -> tx_queue_performance_empty_suspension_count++;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Pickup thread pointer. */
|
/* Pickup thread pointer. */
|
||||||
TX_THREAD_GET_CURRENT(thread_ptr)
|
TX_THREAD_GET_CURRENT(thread_ptr)
|
||||||
|
|
||||||
@@ -477,7 +476,7 @@ UINT status;
|
|||||||
|
|
||||||
/* Restore interrupts. */
|
/* Restore interrupts. */
|
||||||
TX_RESTORE
|
TX_RESTORE
|
||||||
|
|
||||||
/* Immediate return, return error completion. */
|
/* Immediate return, return error completion. */
|
||||||
status = TX_QUEUE_EMPTY;
|
status = TX_QUEUE_EMPTY;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -81,7 +80,7 @@ UINT _tx_queue_send(TX_QUEUE *queue_ptr, VOID *source_ptr, ULONG wait_option)
|
|||||||
{
|
{
|
||||||
|
|
||||||
TX_INTERRUPT_SAVE_AREA
|
TX_INTERRUPT_SAVE_AREA
|
||||||
|
|
||||||
TX_THREAD *thread_ptr;
|
TX_THREAD *thread_ptr;
|
||||||
ULONG *source;
|
ULONG *source;
|
||||||
ULONG *destination;
|
ULONG *destination;
|
||||||
@@ -128,9 +127,9 @@ VOID (*queue_send_notify)(struct TX_QUEUE_STRUCT *notify_queue_ptr);
|
|||||||
/* Determine if there are suspended on this queue. */
|
/* Determine if there are suspended on this queue. */
|
||||||
if (suspended_count == TX_NO_SUSPENSIONS)
|
if (suspended_count == TX_NO_SUSPENSIONS)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* No suspended threads, simply place the message in the queue. */
|
/* No suspended threads, simply place the message in the queue. */
|
||||||
|
|
||||||
/* Reduce the amount of available storage. */
|
/* Reduce the amount of available storage. */
|
||||||
queue_ptr -> tx_queue_available_storage--;
|
queue_ptr -> tx_queue_available_storage--;
|
||||||
|
|
||||||
@@ -142,7 +141,7 @@ VOID (*queue_send_notify)(struct TX_QUEUE_STRUCT *notify_queue_ptr);
|
|||||||
destination = queue_ptr -> tx_queue_write;
|
destination = queue_ptr -> tx_queue_write;
|
||||||
size = queue_ptr -> tx_queue_message_size;
|
size = queue_ptr -> tx_queue_message_size;
|
||||||
|
|
||||||
/* Copy message. Note that the source and destination pointers are
|
/* Copy message. Note that the source and destination pointers are
|
||||||
incremented by the macro. */
|
incremented by the macro. */
|
||||||
TX_QUEUE_MESSAGE_COPY(source, destination, size)
|
TX_QUEUE_MESSAGE_COPY(source, destination, size)
|
||||||
|
|
||||||
@@ -182,7 +181,7 @@ VOID (*queue_send_notify)(struct TX_QUEUE_STRUCT *notify_queue_ptr);
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
/* There is a thread suspended on an empty queue. Simply
|
/* There is a thread suspended on an empty queue. Simply
|
||||||
copy the message to the suspended thread's destination
|
copy the message to the suspended thread's destination
|
||||||
pointer. */
|
pointer. */
|
||||||
|
|
||||||
@@ -230,7 +229,7 @@ VOID (*queue_send_notify)(struct TX_QUEUE_STRUCT *notify_queue_ptr);
|
|||||||
destination = TX_VOID_TO_ULONG_POINTER_CONVERT(thread_ptr -> tx_thread_additional_suspend_info);
|
destination = TX_VOID_TO_ULONG_POINTER_CONVERT(thread_ptr -> tx_thread_additional_suspend_info);
|
||||||
size = queue_ptr -> tx_queue_message_size;
|
size = queue_ptr -> tx_queue_message_size;
|
||||||
|
|
||||||
/* Copy message. Note that the source and destination pointers are
|
/* Copy message. Note that the source and destination pointers are
|
||||||
incremented by the macro. */
|
incremented by the macro. */
|
||||||
TX_QUEUE_MESSAGE_COPY(source, destination, size)
|
TX_QUEUE_MESSAGE_COPY(source, destination, size)
|
||||||
|
|
||||||
@@ -274,7 +273,7 @@ VOID (*queue_send_notify)(struct TX_QUEUE_STRUCT *notify_queue_ptr);
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* At this point, the queue is full. Determine if suspension is requested. */
|
/* At this point, the queue is full. Determine if suspension is requested. */
|
||||||
else if (wait_option != TX_NO_WAIT)
|
else if (wait_option != TX_NO_WAIT)
|
||||||
{
|
{
|
||||||
@@ -302,7 +301,7 @@ VOID (*queue_send_notify)(struct TX_QUEUE_STRUCT *notify_queue_ptr);
|
|||||||
/* Increment the number of full suspensions on this queue. */
|
/* Increment the number of full suspensions on this queue. */
|
||||||
queue_ptr -> tx_queue_performance_full_suspension_count++;
|
queue_ptr -> tx_queue_performance_full_suspension_count++;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Pickup thread pointer. */
|
/* Pickup thread pointer. */
|
||||||
TX_THREAD_GET_CURRENT(thread_ptr)
|
TX_THREAD_GET_CURRENT(thread_ptr)
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -87,7 +86,7 @@ UINT suspended_count;
|
|||||||
TX_THREAD *next_thread;
|
TX_THREAD *next_thread;
|
||||||
TX_THREAD *previous_thread;
|
TX_THREAD *previous_thread;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef TX_NOT_INTERRUPTABLE
|
#ifndef TX_NOT_INTERRUPTABLE
|
||||||
|
|
||||||
@@ -97,7 +96,7 @@ TX_THREAD *previous_thread;
|
|||||||
/* Determine if the cleanup is still required. */
|
/* Determine if the cleanup is still required. */
|
||||||
if (thread_ptr -> tx_thread_suspend_cleanup == &(_tx_semaphore_cleanup))
|
if (thread_ptr -> tx_thread_suspend_cleanup == &(_tx_semaphore_cleanup))
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Check for valid suspension sequence. */
|
/* Check for valid suspension sequence. */
|
||||||
if (suspension_sequence == thread_ptr -> tx_thread_suspension_sequence)
|
if (suspension_sequence == thread_ptr -> tx_thread_suspension_sequence)
|
||||||
{
|
{
|
||||||
@@ -121,7 +120,7 @@ TX_THREAD *previous_thread;
|
|||||||
/* Setup pointer to semaphore control block. */
|
/* Setup pointer to semaphore control block. */
|
||||||
semaphore_ptr = TX_VOID_TO_SEMAPHORE_POINTER_CONVERT(thread_ptr -> tx_thread_suspend_control_block);
|
semaphore_ptr = TX_VOID_TO_SEMAPHORE_POINTER_CONVERT(thread_ptr -> tx_thread_suspend_control_block);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Yes, we still have thread suspension! */
|
/* Yes, we still have thread suspension! */
|
||||||
|
|
||||||
/* Clear the suspension cleanup flag. */
|
/* Clear the suspension cleanup flag. */
|
||||||
@@ -140,7 +139,7 @@ TX_THREAD *previous_thread;
|
|||||||
{
|
{
|
||||||
|
|
||||||
/* Yes, the only suspended thread. */
|
/* Yes, the only suspended thread. */
|
||||||
|
|
||||||
/* Update the head pointer. */
|
/* Update the head pointer. */
|
||||||
semaphore_ptr -> tx_semaphore_suspension_list = TX_NULL;
|
semaphore_ptr -> tx_semaphore_suspension_list = TX_NULL;
|
||||||
}
|
}
|
||||||
@@ -154,7 +153,7 @@ TX_THREAD *previous_thread;
|
|||||||
previous_thread = thread_ptr -> tx_thread_suspended_previous;
|
previous_thread = thread_ptr -> tx_thread_suspended_previous;
|
||||||
next_thread -> tx_thread_suspended_previous = previous_thread;
|
next_thread -> tx_thread_suspended_previous = previous_thread;
|
||||||
previous_thread -> tx_thread_suspended_next = next_thread;
|
previous_thread -> tx_thread_suspended_next = next_thread;
|
||||||
|
|
||||||
/* Determine if we need to update the head pointer. */
|
/* Determine if we need to update the head pointer. */
|
||||||
if (semaphore_ptr -> tx_semaphore_suspension_list == thread_ptr)
|
if (semaphore_ptr -> tx_semaphore_suspension_list == thread_ptr)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
/**************************************************************************/
|
/***************************************************************************
|
||||||
/* */
|
* Copyright (c) 2024 Microsoft Corporation
|
||||||
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
*
|
||||||
/* */
|
* This program and the accompanying materials are made available under the
|
||||||
/* This software is licensed under the Microsoft Software License */
|
* terms of the MIT License which is available at
|
||||||
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
* https://opensource.org/licenses/MIT.
|
||||||
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
*
|
||||||
/* and in the root directory of this software. */
|
* SPDX-License-Identifier: MIT
|
||||||
/* */
|
**************************************************************************/
|
||||||
/**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@@ -87,7 +86,7 @@ TX_SEMAPHORE *previous_semaphore;
|
|||||||
/* Setup the basic semaphore fields. */
|
/* Setup the basic semaphore fields. */
|
||||||
semaphore_ptr -> tx_semaphore_name = name_ptr;
|
semaphore_ptr -> tx_semaphore_name = name_ptr;
|
||||||
semaphore_ptr -> tx_semaphore_count = initial_count;
|
semaphore_ptr -> tx_semaphore_count = initial_count;
|
||||||
|
|
||||||
/* Disable interrupts to place the semaphore on the created list. */
|
/* Disable interrupts to place the semaphore on the created list. */
|
||||||
TX_DISABLE
|
TX_DISABLE
|
||||||
|
|
||||||
@@ -119,7 +118,7 @@ TX_SEMAPHORE *previous_semaphore;
|
|||||||
semaphore_ptr -> tx_semaphore_created_previous = previous_semaphore;
|
semaphore_ptr -> tx_semaphore_created_previous = previous_semaphore;
|
||||||
semaphore_ptr -> tx_semaphore_created_next = next_semaphore;
|
semaphore_ptr -> tx_semaphore_created_next = next_semaphore;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Increment the created count. */
|
/* Increment the created count. */
|
||||||
_tx_semaphore_created_count++;
|
_tx_semaphore_created_count++;
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user