Merge branch 'feature/xcore' into feature/xcore-smp

* feature/xcore:
  Add some assertions and coverage exceptions to queue.c (#273)
  Moved git-secrets check to a different workflow (#271)
  Comment: fix code comment for xTaskAbortDelay (#272)
  Added git-secrets check to Github Actions (#270)
  fixed documentation for ulTaskNotifyTake() and ulTaskNotifyTakeIndexed() (#269)
  Add description for vTaskList (#206)
  Support allocating stack from separate heap (#267)
  Update python version to 3.7.10 (#265)
  Update URL in history.txt (#259)
  Remove unmatched braces in MessageBuffer pre tags (#256)
  Check: improve verbosity of url verifier (#260)
  Update issue templates
  incorporate updates from common (#255)
  Typos (#248)
  Delete gitattributes (#253)
  Fix typo in comment in task.h (#244)
  Fix Github checks after move from master to main (#246)
This commit is contained in:
Michael Bruno 2021-03-09 09:37:47 -05:00
commit 37a6edeb33
16 changed files with 169 additions and 185 deletions

105
.gitattributes vendored
View file

@ -1,105 +0,0 @@
# Line ending normalization
* text=auto
# Documents
*.doc diff=astextplain
*.DOC diff=astextplain
*.docx diff=astextplain
*.DOCX diff=astextplain
*.dot diff=astextplain
*.DOT diff=astextplain
*.pdf diff=astextplain
*.PDF diff=astextplain
*.rtf diff=astextplain
*.RTF diff=astextplain
*.md text
*.adoc text
*.textile text
*.mustache text
*.csv text
*.tab text
*.tsv text
*.sql text
*.html text
*.css text
# Graphics
*.png binary
*.jpg binary
*.jpeg binary
*.gif binary
*.tif binary
*.tiff binary
*.ico binary
*.svg binary
*.eps binary
#sources
*.c text
*.cc text
*.cxx text
*.cpp text
*.c++ text
*.hpp text
*.h text
*.h++ text
*.hh text
*.s text
*.S text
*.asm text
# Compiled Object files
*.slo binary
*.lo binary
*.o binary
*.obj binary
# Precompiled Headers
*.gch binary
*.pch binary
# Compiled Dynamic libraries
*.so binary
*.dylib binary
*.dll binary
# Compiled Static libraries
*.lai binary
*.la binary
*.a binary
*.lib binary
# Executables
*.exe binary
*.out binary
*.app binary
# Basic .gitattributes for a python repo.
# Source files
# ============
*.pxd text
*.py text
*.py3 text
*.pyw text
*.pyx text
# Binary files
# ============
*.db binary
*.p binary
*.pkl binary
*.pyc binary
*.pyd binary
*.pyo binary
# Note: .db, .p, and .pkl files are associated
# with the python modules ``pickle``, ``dbm.*``,
# ``shelve``, ``marshal``, ``anydbm``, & ``bsddb``
# (among others).
*.sh text
make text
makefile text
*.mk text

View file

@ -0,0 +1,20 @@
---
name: Feature request
about: Suggest a new feature for this project
title: "[Feature Request] <replace with your title>"
labels: enhancement
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.

View file

@ -8,6 +8,7 @@ then
exit 2 exit 2
fi fi
USER_AGENT="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36"
SCRIPT_RET=0 SCRIPT_RET=0
set -o nounset # Treat unset variables as an error set -o nounset # Treat unset variables as an error
@ -27,7 +28,7 @@ function test {
for UNIQ_URL in ${!dict[@]} # loop urls for UNIQ_URL in ${!dict[@]} # loop urls
do do
CURL_RES=$(curl -I ${UNIQ_URL} 2>/dev/null| head -n 1 | cut -f 2 -d ' ') CURL_RES=$(curl -si --user-agent "$(USER_AGENT)" ${UNIQ_URL} 2>/dev/null| head -n 1 | cut -f 2 -d ' ')
RES=$? RES=$?
if [ "${CURL_RES}" == '' -o "${CURL_RES}" != '200' ] if [ "${CURL_RES}" == '' -o "${CURL_RES}" != '200' ]
@ -38,11 +39,14 @@ function test {
then then
CURL_RES=$RES CURL_RES=$RES
SCRIPT_RET=1 SCRIPT_RET=1
echo ERROR: Result is: "${CURL_RES}"
elif [ "${CURL_RES}" == '403' ] elif [ "${CURL_RES}" == '403' ]
then then
SCRIPT_RET=1 SCRIPT_RET=1
echo ERROR: Result is: "${CURL_RES}"
else
echo WARNING: Result is: "${CURL_RES}"
fi fi
echo Result is: "${CURL_RES}"
echo "=================================" echo "================================="
fi fi
done done

5
.github/lexicon.txt vendored
View file

@ -1529,6 +1529,7 @@ prvinitialisenewstreambuffer
prvinitialisenewtimer prvinitialisenewtimer
prvinsertblockintofreelist prvinsertblockintofreelist
prvlockqueue prvlockqueue
prvnotifyqueuesetcontainer
prvportmalloc prvportmalloc
prvportresetpic prvportresetpic
prvprocesssimulatedinterrupts prvprocesssimulatedinterrupts
@ -1617,6 +1618,7 @@ pvowner
pvparameter pvparameter
pvparameters pvparameters
pvportmalloc pvportmalloc
pvportmallocstack
pvportrealloc pvportrealloc
pvreg pvreg
pvrxdata pvrxdata
@ -1686,6 +1688,7 @@ pxprevious
pxpreviouswaketime pxpreviouswaketime
pxqueue pxqueue
pxqueuebuffer pxqueuebuffer
pxqueuesetcontainer
pxramstack pxramstack
pxreadycoroutinelists pxreadycoroutinelists
pxreadytaskslists pxreadytaskslists
@ -1705,6 +1708,7 @@ pxstreambuffercreatestatic
pxtagvalue pxtagvalue
pxtask pxtask
pxtaskbuffer pxtaskbuffer
pxtaskcode
pxtaskdefinition pxtaskdefinition
pxtaskstatus pxtaskstatus
pxtaskstatusarray pxtaskstatusarray
@ -3017,6 +3021,7 @@ xtaskswaitingforbits
xtaskswaitingtermination xtaskswaitingtermination
xtaskswaitingtoreceive xtaskswaitingtoreceive
xtaskswaitingtosend xtaskswaitingtosend
xtasktodelete
xtasktonotify xtasktonotify
xtasktoquery xtasktoquery
xtasktoresume xtasktoresume

View file

@ -30,7 +30,8 @@ KERNEL_IGNORED_EXTENSIONS = [
'.tex', '.tex',
'.png', '.png',
'.bat', '.bat',
'.sh' '.sh',
'.txt'
] ]
KERNEL_IGNORED_PATTERNS = [ KERNEL_IGNORED_PATTERNS = [
@ -83,7 +84,11 @@ def main():
checker.ignoreFile(*KERNEL_IGNORED_FILES) checker.ignoreFile(*KERNEL_IGNORED_FILES)
checker.ignoreFile(os.path.split(__file__)[-1]) checker.ignoreFile(os.path.split(__file__)[-1])
return checker.processArgs(args) rc = checker.processArgs(args)
if rc:
checker.showHelp(__file__)
return rc
if __name__ == '__main__': if __name__ == '__main__':
exit(main()) exit(main())

View file

@ -21,7 +21,7 @@ jobs:
- name: Tool Setup - name: Tool Setup
uses: actions/setup-python@v2 uses: actions/setup-python@v2
with: with:
python-version: 3.8.5 python-version: 3.7.10
architecture: x64 architecture: x64
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View file

@ -3,7 +3,7 @@ on:
push: push:
branches: ["**"] branches: ["**"]
pull_request: pull_request:
branches: [master] branches: [main]
workflow_dispatch: workflow_dispatch:
jobs: jobs:
spell-check: spell-check:
@ -44,3 +44,4 @@ jobs:
- name: URL Checker - name: URL Checker
run: | run: |
bash kernel/.github/actions/url_verifier.sh kernel bash kernel/.github/actions/url_verifier.sh kernel

24
.github/workflows/git-secrets.yml vendored Normal file
View file

@ -0,0 +1,24 @@
name: git-secrets Check
on:
push:
pull_request:
workflow_dispatch:
jobs:
git-secrets:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
submodules: recursive
- name: Checkout awslabs/git-secrets
uses: actions/checkout@v2
with:
repository: awslabs/git-secrets
ref: master
path: git-secrets
- name: Install git-secrets
run: cd git-secrets && sudo make install && cd ..
- name: Run git-secrets
run: |
git-secrets --register-aws
git-secrets --scan

View file

@ -11,7 +11,7 @@ jobs:
- name: Tool Setup - name: Tool Setup
uses: actions/setup-python@v2 uses: actions/setup-python@v2
with: with:
python-version: 3.8.5 python-version: 3.7.10
architecture: x64 architecture: x64
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@ -41,7 +41,7 @@ jobs:
- name: Check File Headers - name: Check File Headers
run: | run: |
mv tools/.github/scripts/common inspect/.github/scripts mv tools/.github/scripts/common inspect/.github/scripts
pip install -r inspect/.github/scripts/common/requirements.txt
cd inspect cd inspect
.github/scripts/kernel_checker.py --json ${HOME}/files_modified.json ${HOME}/files_added.json ${HOME}/files_renamed.json .github/scripts/kernel_checker.py --json ${HOME}/files_modified.json ${HOME}/files_added.json ${HOME}/files_renamed.json
exit $? exit $?

View file

@ -79,7 +79,7 @@ Changes between FreeRTOS V10.3.1 and FreeRTOS V10.4.0 released September 10 2020
the same way the Windows port layer enables FreeRTOS to run on Windows the same way the Windows port layer enables FreeRTOS to run on Windows
hosts. hosts.
+ Many other minor optimisations and enhancements. For full details + Many other minor optimisations and enhancements. For full details
see https://github.com/FreeRTOS/FreeRTOS-Kernel/commits/master see https://github.com/FreeRTOS/FreeRTOS-Kernel/commits/main
Changes between FreeRTOS V10.3.0 and FreeRTOS V10.3.1 released February 18 2020 Changes between FreeRTOS V10.3.0 and FreeRTOS V10.3.1 released February 18 2020

View file

@ -913,6 +913,11 @@
#define configSUPPORT_DYNAMIC_ALLOCATION 1 #define configSUPPORT_DYNAMIC_ALLOCATION 1
#endif #endif
#ifndef configSTACK_ALLOCATION_FROM_SEPARATE_HEAP
/* Defaults to 0 for backward compatibility. */
#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP 0
#endif
#ifndef configSTACK_DEPTH_TYPE #ifndef configSTACK_DEPTH_TYPE
/* Defaults to uint16_t for backward compatibility, but can be overridden /* Defaults to uint16_t for backward compatibility, but can be overridden
@ -1008,7 +1013,7 @@
#ifndef configMIN #ifndef configMIN
/* The application writer has not provided their own MAX macro, so define /* The application writer has not provided their own MIN macro, so define
* the following generic implementation. */ * the following generic implementation. */
#define configMIN( a, b ) ( ( ( a ) < ( b ) ) ? ( a ) : ( b ) ) #define configMIN( a, b ) ( ( ( a ) < ( b ) ) ? ( a ) : ( b ) )
#endif #endif
@ -1134,7 +1139,7 @@
* data hiding policy, so the real structures used by FreeRTOS to maintain the * data hiding policy, so the real structures used by FreeRTOS to maintain the
* state of tasks, queues, semaphores, etc. are not accessible to the application * state of tasks, queues, semaphores, etc. are not accessible to the application
* code. However, if the application writer wants to statically allocate such * code. However, if the application writer wants to statically allocate such
* an object then the size of the object needs to be know. Dummy structures * an object then the size of the object needs to be known. Dummy structures
* that are guaranteed to have the same size and alignment requirements of the * that are guaranteed to have the same size and alignment requirements of the
* real objects are used for this purpose. The dummy list and list item * real objects are used for this purpose. The dummy list and list item
* structures below are used for inclusion in such a dummy structure. * structures below are used for inclusion in such a dummy structure.
@ -1183,7 +1188,7 @@ typedef struct xSTATIC_LIST
* strict data hiding policy. This means the Task structure used internally by * strict data hiding policy. This means the Task structure used internally by
* FreeRTOS is not accessible to application code. However, if the application * FreeRTOS is not accessible to application code. However, if the application
* writer wants to statically allocate the memory required to create a task then * writer wants to statically allocate the memory required to create a task then
* the size of the task object needs to be know. The StaticTask_t structure * the size of the task object needs to be known. The StaticTask_t structure
* below is provided for this purpose. Its sizes and alignment requirements are * below is provided for this purpose. Its sizes and alignment requirements are
* guaranteed to match those of the genuine structure, no matter which * guaranteed to match those of the genuine structure, no matter which
* architecture is being used, and no matter how the values in FreeRTOSConfig.h * architecture is being used, and no matter how the values in FreeRTOSConfig.h
@ -1253,7 +1258,7 @@ typedef struct xSTATIC_TCB
* strict data hiding policy. This means the Queue structure used internally by * strict data hiding policy. This means the Queue structure used internally by
* FreeRTOS is not accessible to application code. However, if the application * FreeRTOS is not accessible to application code. However, if the application
* writer wants to statically allocate the memory required to create a queue * writer wants to statically allocate the memory required to create a queue
* then the size of the queue object needs to be know. The StaticQueue_t * then the size of the queue object needs to be known. The StaticQueue_t
* structure below is provided for this purpose. Its sizes and alignment * structure below is provided for this purpose. Its sizes and alignment
* requirements are guaranteed to match those of the genuine structure, no * requirements are guaranteed to match those of the genuine structure, no
* matter which architecture is being used, and no matter how the values in * matter which architecture is being used, and no matter how the values in
@ -1324,7 +1329,7 @@ typedef struct xSTATIC_EVENT_GROUP
* strict data hiding policy. This means the software timer structure used * strict data hiding policy. This means the software timer structure used
* internally by FreeRTOS is not accessible to application code. However, if * internally by FreeRTOS is not accessible to application code. However, if
* the application writer wants to statically allocate the memory required to * the application writer wants to statically allocate the memory required to
* create a software timer then the size of the queue object needs to be know. * create a software timer then the size of the queue object needs to be known.
* The StaticTimer_t structure below is provided for this purpose. Its sizes * The StaticTimer_t structure below is provided for this purpose. Its sizes
* and alignment requirements are guaranteed to match those of the genuine * and alignment requirements are guaranteed to match those of the genuine
* structure, no matter which architecture is being used, and no matter how the * structure, no matter which architecture is being used, and no matter how the
@ -1352,12 +1357,12 @@ typedef struct xSTATIC_TIMER
* internally by FreeRTOS is not accessible to application code. However, if * internally by FreeRTOS is not accessible to application code. However, if
* the application writer wants to statically allocate the memory required to * the application writer wants to statically allocate the memory required to
* create a stream buffer then the size of the stream buffer object needs to be * create a stream buffer then the size of the stream buffer object needs to be
* know. The StaticStreamBuffer_t structure below is provided for this purpose. * known. The StaticStreamBuffer_t structure below is provided for this
* Its size and alignment requirements are guaranteed to match those of the * purpose. Its size and alignment requirements are guaranteed to match those
* genuine structure, no matter which architecture is being used, and no matter * of the genuine structure, no matter which architecture is being used, and
* how the values in FreeRTOSConfig.h are set. Its contents are somewhat * no matter how the values in FreeRTOSConfig.h are set. Its contents are
* obfuscated in the hope users will recognise that it would be unwise to make * somewhat obfuscated in the hope users will recognise that it would be unwise
* direct use of the structure members. * to make direct use of the structure members.
*/ */
typedef struct xSTATIC_STREAM_BUFFER typedef struct xSTATIC_STREAM_BUFFER
{ {

View file

@ -630,7 +630,7 @@ typedef void * MessageBufferHandle_t;
/** /**
* message_buffer.h * message_buffer.h
* <pre> * <pre>
* BaseType_t xMessageBufferIsFull( MessageBufferHandle_t xMessageBuffer ) ); * BaseType_t xMessageBufferIsFull( MessageBufferHandle_t xMessageBuffer );
* </pre> * </pre>
* *
* Tests to see if a message buffer is full. A message buffer is full if it * Tests to see if a message buffer is full. A message buffer is full if it
@ -648,7 +648,7 @@ typedef void * MessageBufferHandle_t;
/** /**
* message_buffer.h * message_buffer.h
* <pre> * <pre>
* BaseType_t xMessageBufferIsEmpty( MessageBufferHandle_t xMessageBuffer ) ); * BaseType_t xMessageBufferIsEmpty( MessageBufferHandle_t xMessageBuffer );
* </pre> * </pre>
* *
* Tests to see if a message buffer is empty (does not contain any messages). * Tests to see if a message buffer is empty (does not contain any messages).
@ -690,7 +690,7 @@ typedef void * MessageBufferHandle_t;
/** /**
* message_buffer.h * message_buffer.h
* <pre> * <pre>
* size_t xMessageBufferSpaceAvailable( MessageBufferHandle_t xMessageBuffer ) ); * size_t xMessageBufferSpaceAvailable( MessageBufferHandle_t xMessageBuffer );
* </pre> * </pre>
* Returns the number of bytes of free space in the message buffer. * Returns the number of bytes of free space in the message buffer.
* *
@ -714,7 +714,7 @@ typedef void * MessageBufferHandle_t;
/** /**
* message_buffer.h * message_buffer.h
* <pre> * <pre>
* size_t xMessageBufferNextLengthBytes( MessageBufferHandle_t xMessageBuffer ) ); * size_t xMessageBufferNextLengthBytes( MessageBufferHandle_t xMessageBuffer );
* </pre> * </pre>
* Returns the length (in bytes) of the next message in a message buffer. * Returns the length (in bytes) of the next message in a message buffer.
* Useful if xMessageBufferReceive() returned 0 because the size of the buffer * Useful if xMessageBufferReceive() returned 0 because the size of the buffer

View file

@ -179,6 +179,14 @@ void vPortInitialiseBlocks( void ) PRIVILEGED_FUNCTION;
size_t xPortGetFreeHeapSize( void ) PRIVILEGED_FUNCTION; size_t xPortGetFreeHeapSize( void ) PRIVILEGED_FUNCTION;
size_t xPortGetMinimumEverFreeHeapSize( void ) PRIVILEGED_FUNCTION; size_t xPortGetMinimumEverFreeHeapSize( void ) PRIVILEGED_FUNCTION;
#if( configSTACK_ALLOCATION_FROM_SEPARATE_HEAP == 1 )
void *pvPortMallocStack( size_t xSize ) PRIVILEGED_FUNCTION;
void vPortFreeStack( void *pv ) PRIVILEGED_FUNCTION;
#else
#define pvPortMallocStack pvPortMalloc
#define vPortFreeStack vPortFree
#endif
/* /*
* Setup the hardware ready for the scheduler to take control. This generally * Setup the hardware ready for the scheduler to take control. This generally
* sets up a tick interrupt and sets timers for the correct tick frequency. * sets up a tick interrupt and sets timers for the correct tick frequency.

View file

@ -87,7 +87,7 @@ typedef BaseType_t (* TaskHookFunction_t)( void * );
typedef enum typedef enum
{ {
eRunning = 0, /* A task is querying the state of itself, so must be running. */ eRunning = 0, /* A task is querying the state of itself, so must be running. */
eReady, /* The task being queried is in a read or pending ready list. */ eReady, /* The task being queried is in a ready or pending ready list. */
eBlocked, /* The task being queried is in the Blocked state. */ eBlocked, /* The task being queried is in the Blocked state. */
eSuspended, /* The task being queried is in the Suspended state, or is in the Blocked state with an infinite time out. */ eSuspended, /* The task being queried is in the Suspended state, or is in the Blocked state with an infinite time out. */
eDeleted, /* The task being queried has been deleted, but its TCB has not yet been freed. */ eDeleted, /* The task being queried has been deleted, but its TCB has not yet been freed. */
@ -158,7 +158,7 @@ typedef struct xTASK_STATUS
/* Possible return values for eTaskConfirmSleepModeStatus(). */ /* Possible return values for eTaskConfirmSleepModeStatus(). */
typedef enum typedef enum
{ {
eAbortSleep = 0, /* A task has been made ready or a context switch pended since portSUPPORESS_TICKS_AND_SLEEP() was called - abort entering a sleep mode. */ eAbortSleep = 0, /* A task has been made ready or a context switch pended since portSUPPRESS_TICKS_AND_SLEEP() was called - abort entering a sleep mode. */
eStandardSleep, /* Enter a sleep mode that will not last any longer than the expected idle time. */ eStandardSleep, /* Enter a sleep mode that will not last any longer than the expected idle time. */
eNoTasksWaitingTimeout /* No tasks are waiting for a timeout so it is safe to enter a sleep mode that can only be exited by an external interrupt. */ eNoTasksWaitingTimeout /* No tasks are waiting for a timeout so it is safe to enter a sleep mode that can only be exited by an external interrupt. */
} eSleepModeStatus; } eSleepModeStatus;
@ -273,12 +273,12 @@ typedef enum
* task. h * task. h
* <pre> * <pre>
* BaseType_t xTaskCreate( * BaseType_t xTaskCreate(
* TaskFunction_t pvTaskCode, * TaskFunction_t pxTaskCode,
* const char * const pcName, * const char *pcName,
* configSTACK_DEPTH_TYPE usStackDepth, * configSTACK_DEPTH_TYPE usStackDepth,
* void *pvParameters, * void *pvParameters,
* UBaseType_t uxPriority, * UBaseType_t uxPriority,
* TaskHandle_t *pvCreatedTask * TaskHandle_t *pxCreatedTask
* ); * );
* </pre> * </pre>
* *
@ -302,7 +302,7 @@ typedef enum
* support can alternatively create an MPU constrained task using * support can alternatively create an MPU constrained task using
* xTaskCreateRestricted(). * xTaskCreateRestricted().
* *
* @param pvTaskCode Pointer to the task entry function. Tasks * @param pxTaskCode Pointer to the task entry function. Tasks
* must be implemented to never return (i.e. continuous loop). * must be implemented to never return (i.e. continuous loop).
* *
* @param pcName A descriptive name for the task. This is mainly used to * @param pcName A descriptive name for the task. This is mainly used to
@ -323,7 +323,7 @@ typedef enum
* example, to create a privileged task at priority 2 the uxPriority parameter * example, to create a privileged task at priority 2 the uxPriority parameter
* should be set to ( 2 | portPRIVILEGE_BIT ). * should be set to ( 2 | portPRIVILEGE_BIT ).
* *
* @param pvCreatedTask Used to pass back a handle by which the created task * @param pxCreatedTask Used to pass back a handle by which the created task
* can be referenced. * can be referenced.
* *
* @return pdPASS if the task was successfully created and added to a ready * @return pdPASS if the task was successfully created and added to a ready
@ -375,12 +375,12 @@ typedef enum
/** /**
* task. h * task. h
* <pre> * <pre>
* TaskHandle_t xTaskCreateStatic( TaskFunction_t pvTaskCode, * TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode,
* const char * const pcName, * const char *pcName,
* uint32_t ulStackDepth, * uint32_t ulStackDepth,
* void *pvParameters, * void *pvParameters,
* UBaseType_t uxPriority, * UBaseType_t uxPriority,
* StackType_t *pxStackBuffer, * StackType_t *puxStackBuffer,
* StaticTask_t *pxTaskBuffer ); * StaticTask_t *pxTaskBuffer );
* </pre> * </pre>
* *
@ -396,7 +396,7 @@ typedef enum
* memory. xTaskCreateStatic() therefore allows a task to be created without * memory. xTaskCreateStatic() therefore allows a task to be created without
* using any dynamic memory allocation. * using any dynamic memory allocation.
* *
* @param pvTaskCode Pointer to the task entry function. Tasks * @param pxTaskCode Pointer to the task entry function. Tasks
* must be implemented to never return (i.e. continuous loop). * must be implemented to never return (i.e. continuous loop).
* *
* @param pcName A descriptive name for the task. This is mainly used to * @param pcName A descriptive name for the task. This is mainly used to
@ -413,7 +413,7 @@ typedef enum
* *
* @param uxPriority The priority at which the task will run. * @param uxPriority The priority at which the task will run.
* *
* @param pxStackBuffer Must point to a StackType_t array that has at least * @param puxStackBuffer Must point to a StackType_t array that has at least
* ulStackDepth indexes - the array will then be used as the task's stack, * ulStackDepth indexes - the array will then be used as the task's stack,
* removing the need for the stack to be allocated dynamically. * removing the need for the stack to be allocated dynamically.
* *
@ -421,15 +421,15 @@ typedef enum
* then be used to hold the task's data structures, removing the need for the * then be used to hold the task's data structures, removing the need for the
* memory to be allocated dynamically. * memory to be allocated dynamically.
* *
* @return If neither pxStackBuffer or pxTaskBuffer are NULL, then the task will * @return If neither puxStackBuffer nor pxTaskBuffer are NULL, then the task
* be created and a handle to the created task is returned. If either * will be created and a handle to the created task is returned. If either
* pxStackBuffer or pxTaskBuffer are NULL then the task will not be created and * puxStackBuffer or pxTaskBuffer are NULL then the task will not be created and
* NULL is returned. * NULL is returned.
* *
* Example usage: * Example usage:
* <pre> * <pre>
* *
* // Dimensions the buffer that the task being created will use as its stack. * // Dimensions of the buffer that the task being created will use as its stack.
* // NOTE: This is the number of words the stack will hold, not the number of * // NOTE: This is the number of words the stack will hold, not the number of
* // bytes. For example, if each stack item is 32-bits, and this is set to 100, * // bytes. For example, if each stack item is 32-bits, and this is set to 100,
* // then 400 bytes (100 * 32-bits) will be allocated. * // then 400 bytes (100 * 32-bits) will be allocated.
@ -670,7 +670,7 @@ typedef enum
* *
* @param xTask The handle of the task being updated. * @param xTask The handle of the task being updated.
* *
* @param xRegions A pointer to an MemoryRegion_t structure that contains the * @param xRegions A pointer to a MemoryRegion_t structure that contains the
* new memory region definitions. * new memory region definitions.
* *
* Example usage: * Example usage:
@ -711,7 +711,7 @@ void vTaskAllocateMPURegions( TaskHandle_t xTask,
/** /**
* task. h * task. h
* <pre> * <pre>
* void vTaskDelete( TaskHandle_t xTask ); * void vTaskDelete( TaskHandle_t xTaskToDelete );
* </pre> * </pre>
* *
* INCLUDE_vTaskDelete must be defined as 1 for this function to be available. * INCLUDE_vTaskDelete must be defined as 1 for this function to be available.
@ -730,7 +730,7 @@ void vTaskAllocateMPURegions( TaskHandle_t xTask,
* See the demo application file death.c for sample code that utilises * See the demo application file death.c for sample code that utilises
* vTaskDelete (). * vTaskDelete ().
* *
* @param xTask The handle of the task to be deleted. Passing NULL will * @param xTaskToDelete The handle of the task to be deleted. Passing NULL will
* cause the calling task to be deleted. * cause the calling task to be deleted.
* *
* Example usage: * Example usage:
@ -1671,7 +1671,7 @@ configSTACK_DEPTH_TYPE uxTaskGetStackHighWaterMark2( TaskHandle_t xTask ) PRIVIL
* configSUPPORT_STATIC_ALLOCATION is set. For more information see this URI: https://www.FreeRTOS.org/a00110.html#configSUPPORT_STATIC_ALLOCATION * configSUPPORT_STATIC_ALLOCATION is set. For more information see this URI: https://www.FreeRTOS.org/a00110.html#configSUPPORT_STATIC_ALLOCATION
* *
* @param ppxIdleTaskTCBBuffer A handle to a statically allocated TCB buffer * @param ppxIdleTaskTCBBuffer A handle to a statically allocated TCB buffer
* @param ppxIdleTaskStackBuffer A handle to a statically allocated Stack buffer for thie idle task * @param ppxIdleTaskStackBuffer A handle to a statically allocated Stack buffer for the idle task
* @param pulIdleTaskStackSize A pointer to the number of elements that will fit in the allocated stack buffer * @param pulIdleTaskStackSize A pointer to the number of elements that will fit in the allocated stack buffer
*/ */
void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer, void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer,
@ -1828,8 +1828,10 @@ UBaseType_t uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray,
* demo applications. Do not consider it to be part of the scheduler. * demo applications. Do not consider it to be part of the scheduler.
* *
* vTaskList() calls uxTaskGetSystemState(), then formats part of the * vTaskList() calls uxTaskGetSystemState(), then formats part of the
* uxTaskGetSystemState() output into a human readable table that displays task * uxTaskGetSystemState() output into a human readable table that displays task:
* names, states and stack usage. * names, states, priority, stack usage and task number.
* Stack usage specified as the number of unused StackType_t words stack can hold
* on top of stack - not the number of bytes.
* *
* vTaskList() has a dependency on the sprintf() C library function that might * vTaskList() has a dependency on the sprintf() C library function that might
* bloat the code size, use a lot of stack, and provide different results on * bloat the code size, use a lot of stack, and provide different results on
@ -1965,9 +1967,8 @@ uint32_t ulTaskGetIdleRunTimeCounter( void ) PRIVILEGED_FUNCTION;
* that way task notifications can be used to send data to a task, or be used as * that way task notifications can be used to send data to a task, or be used as
* light weight and fast binary or counting semaphores. * light weight and fast binary or counting semaphores.
* *
* A task can use xTaskNotifyWaitIndexed() to [optionally] block to wait for a * A task can use xTaskNotifyWaitIndexed() or ulTaskNotifyTakeIndexed() to
* notification to be pending, or ulTaskNotifyTakeIndexed() to [optionally] block * [optionally] block to wait for a notification to be pending. The task does
* to wait for a notification value to have a non-zero value. The task does
* not consume any CPU time while it is in the Blocked state. * not consume any CPU time while it is in the Blocked state.
* *
* A notification sent to a task will remain pending until it is cleared by the * A notification sent to a task will remain pending until it is cleared by the
@ -2009,7 +2010,7 @@ uint32_t ulTaskGetIdleRunTimeCounter( void ) PRIVILEGED_FUNCTION;
* *
* eSetBits - * eSetBits -
* The target notification value is bitwise ORed with ulValue. * The target notification value is bitwise ORed with ulValue.
* xTaskNofifyIndexed() always returns pdPASS in this case. * xTaskNotifyIndexed() always returns pdPASS in this case.
* *
* eIncrement - * eIncrement -
* The target notification value is incremented. ulValue is not used and * The target notification value is incremented. ulValue is not used and
@ -2152,7 +2153,7 @@ BaseType_t xTaskGenericNotify( TaskHandle_t xTaskToNotify,
* value, if at all. Valid values for eAction are as follows: * value, if at all. Valid values for eAction are as follows:
* *
* eSetBits - * eSetBits -
* The task's notification value is bitwise ORed with ulValue. xTaskNofify() * The task's notification value is bitwise ORed with ulValue. xTaskNotify()
* always returns pdPASS in this case. * always returns pdPASS in this case.
* *
* eIncrement - * eIncrement -
@ -2322,7 +2323,7 @@ BaseType_t xTaskGenericNotifyFromISR( TaskHandle_t xTaskToNotify,
* the Blocked state for a notification to be received, should a notification * the Blocked state for a notification to be received, should a notification
* not already be pending when xTaskNotifyWait() was called. The task * not already be pending when xTaskNotifyWait() was called. The task
* will not consume any processing time while it is in the Blocked state. This * will not consume any processing time while it is in the Blocked state. This
* is specified in kernel ticks, the macro pdMS_TO_TICSK( value_in_ms ) can be * is specified in kernel ticks, the macro pdMS_TO_TICKS( value_in_ms ) can be
* used to convert a time specified in milliseconds to a time specified in * used to convert a time specified in milliseconds to a time specified in
* ticks. * ticks.
* *
@ -2553,8 +2554,8 @@ void vTaskGenericNotifyGiveFromISR( TaskHandle_t xTaskToNotify,
* value acts like a counting semaphore. * value acts like a counting semaphore.
* *
* A task can use ulTaskNotifyTakeIndexed() to [optionally] block to wait for * A task can use ulTaskNotifyTakeIndexed() to [optionally] block to wait for
* the task's notification value to be non-zero. The task does not consume any * a notification. The task does not consume any CPU time while it is in the
* CPU time while it is in the Blocked state. * Blocked state.
* *
* Where as xTaskNotifyWaitIndexed() will return when a notification is pending, * Where as xTaskNotifyWaitIndexed() will return when a notification is pending,
* ulTaskNotifyTakeIndexed() will return when the task's notification value is * ulTaskNotifyTakeIndexed() will return when the task's notification value is
@ -2592,7 +2593,7 @@ void vTaskGenericNotifyGiveFromISR( TaskHandle_t xTaskToNotify,
* should the count not already be greater than zero when * should the count not already be greater than zero when
* ulTaskNotifyTake() was called. The task will not consume any processing * ulTaskNotifyTake() was called. The task will not consume any processing
* time while it is in the Blocked state. This is specified in kernel ticks, * time while it is in the Blocked state. This is specified in kernel ticks,
* the macro pdMS_TO_TICSK( value_in_ms ) can be used to convert a time * the macro pdMS_TO_TICKS( value_in_ms ) can be used to convert a time
* specified in milliseconds to a time specified in ticks. * specified in milliseconds to a time specified in ticks.
* *
* @return The task's notification count before it is either cleared to zero or * @return The task's notification count before it is either cleared to zero or
@ -2771,7 +2772,7 @@ void vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) PRIVILEGED_FUNCTION;
* @param pxTicksToWait The number of ticks to check for timeout i.e. if * @param pxTicksToWait The number of ticks to check for timeout i.e. if
* pxTicksToWait ticks have passed since pxTimeOut was last updated (either by * pxTicksToWait ticks have passed since pxTimeOut was last updated (either by
* vTaskSetTimeOutState() or xTaskCheckForTimeOut()), the timeout has occurred. * vTaskSetTimeOutState() or xTaskCheckForTimeOut()), the timeout has occurred.
* If the timeout has not occurred, pxTIcksToWait is updated to reflect the * If the timeout has not occurred, pxTicksToWait is updated to reflect the
* number of remaining ticks. * number of remaining ticks.
* *
* @return If timeout has occurred, pdTRUE is returned. Otherwise pdFALSE is * @return If timeout has occurred, pdTRUE is returned. Otherwise pdFALSE is
@ -2908,7 +2909,7 @@ BaseType_t xTaskIncrementTick( void ) PRIVILEGED_FUNCTION;
* xItemValue value, and inserts the list item at the end of the list. * xItemValue value, and inserts the list item at the end of the list.
* *
* The 'ordered' version uses the existing event list item value (which is the * The 'ordered' version uses the existing event list item value (which is the
* owning tasks priority) to insert the list item into the event list is task * owning task's priority) to insert the list item into the event list in task
* priority order. * priority order.
* *
* @param pxEventList The list containing tasks that are blocked waiting * @param pxEventList The list containing tasks that are blocked waiting

24
queue.c
View file

@ -342,7 +342,9 @@ BaseType_t xQueueGenericReset( QueueHandle_t xQueue,
* variable of type StaticQueue_t or StaticSemaphore_t equals the size of * variable of type StaticQueue_t or StaticSemaphore_t equals the size of
* the real queue and semaphore structures. */ * the real queue and semaphore structures. */
volatile size_t xSize = sizeof( StaticQueue_t ); volatile size_t xSize = sizeof( StaticQueue_t );
configASSERT( xSize == sizeof( Queue_t ) );
/* This assertion cannot be branch covered in unit tests */
configASSERT( xSize == sizeof( Queue_t ) ); /* LCOV_EXCL_BR_LINE */
( void ) xSize; /* Keeps lint quiet when configASSERT() is not defined. */ ( void ) xSize; /* Keeps lint quiet when configASSERT() is not defined. */
} }
#endif /* configASSERT_DEFINED */ #endif /* configASSERT_DEFINED */
@ -561,6 +563,8 @@ static void prvInitialiseNewQueue( const UBaseType_t uxQueueLength,
TaskHandle_t pxReturn; TaskHandle_t pxReturn;
Queue_t * const pxSemaphore = ( Queue_t * ) xSemaphore; Queue_t * const pxSemaphore = ( Queue_t * ) xSemaphore;
configASSERT( xSemaphore );
/* This function is called by xSemaphoreGetMutexHolder(), and should not /* This function is called by xSemaphoreGetMutexHolder(), and should not
* be called directly. Note: This is a good way of determining if the * be called directly. Note: This is a good way of determining if the
* calling task is the mutex holder, but not a good way of determining the * calling task is the mutex holder, but not a good way of determining the
@ -947,12 +951,12 @@ BaseType_t xQueueGenericSend( QueueHandle_t xQueue,
* event list. It is possible that interrupts occurring now * event list. It is possible that interrupts occurring now
* remove this task from the event list again - but as the * remove this task from the event list again - but as the
* scheduler is suspended the task will go onto the pending * scheduler is suspended the task will go onto the pending
* ready last instead of the actual ready list. */ * ready list instead of the actual ready list. */
prvUnlockQueue( pxQueue ); prvUnlockQueue( pxQueue );
/* Resuming the scheduler will move tasks from the pending /* Resuming the scheduler will move tasks from the pending
* ready list into the ready list - so it is feasible that this * ready list into the ready list - so it is feasible that this
* task is already in a ready list before it yields - in which * task is already in the ready list before it yields - in which
* case the yield will not cause a context switch unless there * case the yield will not cause a context switch unless there
* is also a higher priority task in the pending ready list. */ * is also a higher priority task in the pending ready list. */
if( xTaskResumeAll() == pdFALSE ) if( xTaskResumeAll() == pdFALSE )
@ -1774,7 +1778,7 @@ BaseType_t xQueuePeek( QueueHandle_t xQueue,
taskEXIT_CRITICAL(); taskEXIT_CRITICAL();
/* Interrupts and other tasks can send to and receive from the queue /* Interrupts and other tasks can send to and receive from the queue
* now the critical section has been exited. */ * now that the critical section has been exited. */
vTaskSuspendAll(); vTaskSuspendAll();
prvLockQueue( pxQueue ); prvLockQueue( pxQueue );
@ -2723,6 +2727,9 @@ BaseType_t xQueueIsQueueFullFromISR( const QueueHandle_t xQueue )
{ {
UBaseType_t ux; UBaseType_t ux;
configASSERT( xQueue );
configASSERT( pcQueueName );
/* See if there is an empty space in the registry. A NULL name denotes /* See if there is an empty space in the registry. A NULL name denotes
* a free slot. */ * a free slot. */
for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ ) for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ )
@ -2753,6 +2760,8 @@ BaseType_t xQueueIsQueueFullFromISR( const QueueHandle_t xQueue )
UBaseType_t ux; UBaseType_t ux;
const char * pcReturn = NULL; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ const char * pcReturn = NULL; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
configASSERT( xQueue );
/* Note there is nothing here to protect against another task adding or /* Note there is nothing here to protect against another task adding or
* removing entries from the registry while it is being searched. */ * removing entries from the registry while it is being searched. */
@ -2781,6 +2790,8 @@ BaseType_t xQueueIsQueueFullFromISR( const QueueHandle_t xQueue )
{ {
UBaseType_t ux; UBaseType_t ux;
configASSERT( xQueue );
/* See if the handle of the queue being unregistered in actually in the /* See if the handle of the queue being unregistered in actually in the
* registry. */ * registry. */
for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ ) for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ )
@ -2967,7 +2978,10 @@ BaseType_t xQueueIsQueueFullFromISR( const QueueHandle_t xQueue )
/* This function must be called form a critical section. */ /* This function must be called form a critical section. */
configASSERT( pxQueueSetContainer ); /* The following line is not reachable in unit tests because every call
* to prvNotifyQueueSetContainer is preceded by a check that
* pxQueueSetContainer != NULL */
configASSERT( pxQueueSetContainer ); /* LCOV_EXCL_BR_LINE */
configASSERT( pxQueueSetContainer->uxMessagesWaiting < pxQueueSetContainer->uxLength ); configASSERT( pxQueueSetContainer->uxMessagesWaiting < pxQueueSetContainer->uxLength );
if( pxQueueSetContainer->uxMessagesWaiting < pxQueueSetContainer->uxLength ) if( pxQueueSetContainer->uxMessagesWaiting < pxQueueSetContainer->uxLength )

28
tasks.c
View file

@ -78,7 +78,7 @@
*/ */
#define tskSTACK_FILL_BYTE ( 0xa5U ) #define tskSTACK_FILL_BYTE ( 0xa5U )
/* Bits used to recored how a task's stack and TCB were allocated. */ /* Bits used to record how a task's stack and TCB were allocated. */
#define tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB ( ( uint8_t ) 0 ) #define tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB ( ( uint8_t ) 0 )
#define tskSTATICALLY_ALLOCATED_STACK_ONLY ( ( uint8_t ) 1 ) #define tskSTATICALLY_ALLOCATED_STACK_ONLY ( ( uint8_t ) 1 )
#define tskSTATICALLY_ALLOCATED_STACK_AND_TCB ( ( uint8_t ) 2 ) #define tskSTATICALLY_ALLOCATED_STACK_AND_TCB ( ( uint8_t ) 2 )
@ -102,8 +102,8 @@
#define tskSUSPENDED_CHAR ( 'S' ) #define tskSUSPENDED_CHAR ( 'S' )
/* /*
* Some kernel aware debuggers require the data the debugger needs access to be * Some kernel aware debuggers require the data the debugger needs access to to
* global, rather than file scope. * be global, rather than file scope.
*/ */
#ifdef portREMOVE_STATIC_QUALIFIER #ifdef portREMOVE_STATIC_QUALIFIER
#define static #define static
@ -197,7 +197,7 @@
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/
/* /*
* Several functions take an TaskHandle_t parameter that can optionally be NULL, * Several functions take a TaskHandle_t parameter that can optionally be NULL,
* where NULL is used to indicate that the handle of the currently executing * where NULL is used to indicate that the handle of the currently executing
* task should be used in place of the parameter. This macro simply checks to * task should be used in place of the parameter. This macro simply checks to
* see if the parameter is NULL and returns a pointer to the appropriate TCB. * see if the parameter is NULL and returns a pointer to the appropriate TCB.
@ -333,7 +333,7 @@ PRIVILEGED_DATA TCB_t * volatile pxCurrentTCBs[ configNUM_CORES ] = { NULL };
#define pxCurrentTCB xTaskGetCurrentTaskHandle() #define pxCurrentTCB xTaskGetCurrentTaskHandle()
/* Lists for ready and blocked tasks. -------------------- /* Lists for ready and blocked tasks. --------------------
* xDelayedTaskList1 and xDelayedTaskList2 could be move to function scople but * xDelayedTaskList1 and xDelayedTaskList2 could be moved to function scope but
* doing so breaks some kernel aware debuggers and debuggers that rely on removing * doing so breaks some kernel aware debuggers and debuggers that rely on removing
* the static qualifier. */ * the static qualifier. */
PRIVILEGED_DATA static List_t pxReadyTasksLists[ configMAX_PRIORITIES ]; /*< Prioritised ready tasks. */ PRIVILEGED_DATA static List_t pxReadyTasksLists[ configMAX_PRIORITIES ]; /*< Prioritised ready tasks. */
@ -1235,7 +1235,7 @@ static void prvYieldForTask( TCB_t * pxTCB,
/* Allocate space for the stack used by the task being created. /* Allocate space for the stack used by the task being created.
* The base of the stack memory stored in the TCB so the task can * The base of the stack memory stored in the TCB so the task can
* be deleted later if required. */ * be deleted later if required. */
pxNewTCB->pxStack = ( StackType_t * ) pvPortMalloc( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ pxNewTCB->pxStack = ( StackType_t * ) pvPortMallocStack( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */
if( pxNewTCB->pxStack == NULL ) if( pxNewTCB->pxStack == NULL )
{ {
@ -1250,7 +1250,7 @@ static void prvYieldForTask( TCB_t * pxTCB,
StackType_t * pxStack; StackType_t * pxStack;
/* Allocate space for the stack used by the task being created. */ /* Allocate space for the stack used by the task being created. */
pxStack = pvPortMalloc( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) ); /*lint !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack and this allocation is the stack. */ pxStack = pvPortMallocStack( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) ); /*lint !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack and this allocation is the stack. */
if( pxStack != NULL ) if( pxStack != NULL )
{ {
@ -1266,7 +1266,7 @@ static void prvYieldForTask( TCB_t * pxTCB,
{ {
/* The stack cannot be used as the TCB was not created. Free /* The stack cannot be used as the TCB was not created. Free
* it again. */ * it again. */
vPortFree( pxStack ); vPortFreeStack( pxStack );
} }
} }
else else
@ -2168,7 +2168,7 @@ static void prvAddNewTaskToReadyList( TCB_t * pxNewTCB )
if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ uxPriorityUsedOnEntry ] ), &( pxTCB->xStateListItem ) ) != pdFALSE ) if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ uxPriorityUsedOnEntry ] ), &( pxTCB->xStateListItem ) ) != pdFALSE )
{ {
/* The task is currently in its ready list - remove before /* The task is currently in its ready list - remove before
* adding it to it's new ready list. As we are in a critical * adding it to its new ready list. As we are in a critical
* section we can do this even if the scheduler is suspended. */ * section we can do this even if the scheduler is suspended. */
if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 )
{ {
@ -3501,7 +3501,7 @@ BaseType_t xTaskIncrementTick( void )
* state - so record the item value in * state - so record the item value in
* xNextTaskUnblockTime. */ * xNextTaskUnblockTime. */
xNextTaskUnblockTime = xItemValue; xNextTaskUnblockTime = xItemValue;
break; /*lint !e9011 Code structure here is deedmed easier to understand with multiple breaks. */ break; /*lint !e9011 Code structure here is deemed easier to understand with multiple breaks. */
} }
else else
{ {
@ -4732,7 +4732,7 @@ static void prvCheckTasksWaitingTermination( void )
{ {
/* The task can only have been allocated dynamically - free both /* The task can only have been allocated dynamically - free both
* the stack and TCB. */ * the stack and TCB. */
vPortFree( pxTCB->pxStack ); vPortFreeStack( pxTCB->pxStack );
vPortFree( pxTCB ); vPortFree( pxTCB );
} }
#elif ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 !e9029 Macro has been consolidated for readability reasons. */ #elif ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 !e9029 Macro has been consolidated for readability reasons. */
@ -4744,7 +4744,7 @@ static void prvCheckTasksWaitingTermination( void )
{ {
/* Both the stack and TCB were allocated dynamically, so both /* Both the stack and TCB were allocated dynamically, so both
* must be freed. */ * must be freed. */
vPortFree( pxTCB->pxStack ); vPortFreeStack( pxTCB->pxStack );
vPortFree( pxTCB ); vPortFree( pxTCB );
} }
else if( pxTCB->ucStaticallyAllocated == tskSTATICALLY_ALLOCATED_STACK_ONLY ) else if( pxTCB->ucStaticallyAllocated == tskSTATICALLY_ALLOCATED_STACK_ONLY )
@ -5285,7 +5285,9 @@ void vTaskYieldWithinAPI( void )
* *
* vTaskList() calls uxTaskGetSystemState(), then formats part of the * vTaskList() calls uxTaskGetSystemState(), then formats part of the
* uxTaskGetSystemState() output into a human readable table that * uxTaskGetSystemState() output into a human readable table that
* displays task names, states and stack usage. * displays task: names, states, priority, stack usage and task number.
* Stack usage specified as the number of unused StackType_t words stack can hold
* on top of stack - not the number of bytes.
* *
* vTaskList() has a dependency on the sprintf() C library function that * vTaskList() has a dependency on the sprintf() C library function that
* might bloat the code size, use a lot of stack, and provide different * might bloat the code size, use a lot of stack, and provide different