mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-04-19 21:11:57 -04:00
Add the first and most basic task pool example.
This commit is contained in:
parent
87eb37342f
commit
76cc2a00c6
|
@ -5,7 +5,7 @@
|
||||||
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
|
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
|
||||||
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
|
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
|
||||||
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
|
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
|
||||||
<provider class="org.eclipse.cdt.managedbuilder.internal.language.settings.providers.GCCBuiltinSpecsDetectorMinGW" console="false" env-hash="-390853995593138292" id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetectorMinGW" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings MinGW" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
|
<provider class="org.eclipse.cdt.managedbuilder.internal.language.settings.providers.GCCBuiltinSpecsDetectorMinGW" console="false" env-hash="-610351291490083443" id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetectorMinGW" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings MinGW" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
|
||||||
<language-scope id="org.eclipse.cdt.core.gcc"/>
|
<language-scope id="org.eclipse.cdt.core.gcc"/>
|
||||||
<language-scope id="org.eclipse.cdt.core.g++"/>
|
<language-scope id="org.eclipse.cdt.core.g++"/>
|
||||||
</provider>
|
</provider>
|
||||||
|
|
|
@ -2,15 +2,125 @@
|
||||||
#include "FreeRTOS.h"
|
#include "FreeRTOS.h"
|
||||||
#include "task.h"
|
#include "task.h"
|
||||||
|
|
||||||
|
/* IoT SDK includes. */
|
||||||
|
#include "iot_taskpool.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Prototypes for the functions that demonstrate the task pool API.
|
||||||
|
*/
|
||||||
|
static void prvExample_BasicSingleJob( void );
|
||||||
|
|
||||||
|
/* Prototypes of the callback functions used in the examples. */
|
||||||
|
static void prvSimpleTaskNotifyCallback( IotTaskPool_t pTaskPool, IotTaskPoolJob_t pJob, void *pUserContext );
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Prototypes for the standard FreeRTOS application hook (callback) functions
|
||||||
|
* implemented within this file. See http://www.freertos.org/a00016.html .
|
||||||
|
*/
|
||||||
|
void vApplicationMallocFailedHook( void );
|
||||||
|
void vApplicationIdleHook( void );
|
||||||
|
void vApplicationStackOverflowHook( TaskHandle_t pxTask, char *pcTaskName );
|
||||||
|
void vApplicationTickHook( void );
|
||||||
void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize );
|
void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize );
|
||||||
void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize );
|
void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize );
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The task used to demonstrate the task pool API.
|
||||||
|
*/
|
||||||
|
static void prvTaskPoolDemoTask( void *pvParameters );
|
||||||
|
|
||||||
|
static const IotTaskPoolInfo_t xTaskPoolParameters = {
|
||||||
|
/* Minimum number of threads in a task pool. */
|
||||||
|
2,
|
||||||
|
/* Maximum number of threads in a task pool. */
|
||||||
|
2,
|
||||||
|
/* Stack size for every task pool thread - in words, not bytes. */
|
||||||
|
configMINIMAL_STACK_SIZE,
|
||||||
|
/* Priority for every task pool thread. */
|
||||||
|
tskIDLE_PRIORITY,
|
||||||
|
};
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
int main( void )
|
int main( void )
|
||||||
{
|
{
|
||||||
|
/* This example uses a single application task, which in turn is used to
|
||||||
|
create and send jobs to task pool tasks. */
|
||||||
|
xTaskCreate( prvTaskPoolDemoTask,
|
||||||
|
"PoolDemo",
|
||||||
|
configMINIMAL_STACK_SIZE,
|
||||||
|
NULL,
|
||||||
|
tskIDLE_PRIORITY,
|
||||||
|
NULL );
|
||||||
|
|
||||||
|
vTaskStartScheduler();
|
||||||
|
|
||||||
|
/* Should not reach here as vTaskStartScheduler() will only return if there
|
||||||
|
was insufficient FreeRTOS heap memory to create the Idle or Timer
|
||||||
|
Daemon task. */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
static void prvSimpleTaskNotifyCallback( IotTaskPool_t pTaskPool, IotTaskPoolJob_t pJob, void *pUserContext )
|
||||||
|
{
|
||||||
|
TaskHandle_t xTaskToNotify = ( TaskHandle_t ) pUserContext;
|
||||||
|
|
||||||
|
/* Remove warnings about unused parameters. */
|
||||||
|
( void ) pTaskPool;
|
||||||
|
( void ) pJob;
|
||||||
|
|
||||||
|
/* Notify the task that created this job. */
|
||||||
|
xTaskNotifyGive( xTaskToNotify );
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
static void prvExample_BasicSingleJob( void )
|
||||||
|
{
|
||||||
|
IotTaskPoolJobStorage_t xJobStorage;
|
||||||
|
IotTaskPoolJob_t xJob;
|
||||||
|
IotTaskPoolError_t xResult;
|
||||||
|
|
||||||
|
/* Ensure the notification count is 0 before scheduling the job. */
|
||||||
|
while( ulTaskNotifyTake( pdTRUE, 0 ) != 0 );
|
||||||
|
|
||||||
|
/* Create and schedule a job using the handle of this task as the job's
|
||||||
|
context and the function that sends a notification to the task handle as
|
||||||
|
the jobs callback function. */
|
||||||
|
xResult = IotTaskPool_CreateJob( prvSimpleTaskNotifyCallback, /* Callback function. */
|
||||||
|
( void * ) xTaskGetCurrentTaskHandle(), /* Job context. */
|
||||||
|
&xJobStorage,
|
||||||
|
&xJob );
|
||||||
|
configASSERT( xResult == IOT_TASKPOOL_SUCCESS );
|
||||||
|
IotTaskPool_ScheduleSystem( xJob, 0 );
|
||||||
|
|
||||||
|
/* Wait for the notification coming from the job's callback function. */
|
||||||
|
ulTaskNotifyTake( pdTRUE, portMAX_DELAY );
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
static void prvTaskPoolDemoTask( void *pvParameters )
|
||||||
|
{
|
||||||
|
IotTaskPoolError_t xResult;
|
||||||
|
|
||||||
|
/* Remove compiler warnings about unused parameters. */
|
||||||
|
( void ) pvParameters;
|
||||||
|
|
||||||
|
/* The task pool must be created before it can be used. */
|
||||||
|
xResult = IotTaskPool_CreateSystemTaskPool( &xTaskPoolParameters );
|
||||||
|
configASSERT( xResult == IOT_TASKPOOL_SUCCESS );
|
||||||
|
|
||||||
|
for( ;; )
|
||||||
|
{
|
||||||
|
/* Run through each task pool example in turn. See the comments in the
|
||||||
|
below functions for details of their behaviour. */
|
||||||
|
prvExample_BasicSingleJob();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
vTaskDelete( NULL );
|
||||||
|
}
|
||||||
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
void vApplicationMallocFailedHook( void )
|
void vApplicationMallocFailedHook( void )
|
||||||
|
|
|
@ -411,6 +411,87 @@ IotTaskPoolError_t IotTaskPool_RecycleJob( IotTaskPool_t taskPool,
|
||||||
IotTaskPoolError_t IotTaskPool_Schedule( IotTaskPool_t taskPool,
|
IotTaskPoolError_t IotTaskPool_Schedule( IotTaskPool_t taskPool,
|
||||||
IotTaskPoolJob_t job,
|
IotTaskPoolJob_t job,
|
||||||
uint32_t flags );
|
uint32_t flags );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function schedules a job created with @ref IotTaskPool_CreateJob or @ref IotTaskPool_CreateRecyclableJob
|
||||||
|
* against the system task pool. The system task pool is the task pool created by @ref IotTaskPool_CreateSystemTaskPool.
|
||||||
|
*
|
||||||
|
* See @ref taskpool_design for a description of the jobs lifetime and interaction with the threads used in the task pool
|
||||||
|
* library.
|
||||||
|
*
|
||||||
|
* @param[in] job A job to schedule for execution. This must be first initialized with a call to @ref IotTaskPool_CreateJob.
|
||||||
|
* @param[in] flags Flags to be passed by the user, e.g. to identify the job as high priority by specifying #IOT_TASKPOOL_JOB_HIGH_PRIORITY.
|
||||||
|
*
|
||||||
|
* @return One of the following:
|
||||||
|
* - #IOT_TASKPOOL_SUCCESS
|
||||||
|
* - #IOT_TASKPOOL_BAD_PARAMETER
|
||||||
|
* - #IOT_TASKPOOL_ILLEGAL_OPERATION
|
||||||
|
* - #IOT_TASKPOOL_NO_MEMORY
|
||||||
|
* - #IOT_TASKPOOL_SHUTDOWN_IN_PROGRESS
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @note This function will not allocate memory, so it is guaranteed to succeed if the parameters are correct and the task pool
|
||||||
|
* was correctly initialized, and not yet destroyed.
|
||||||
|
*
|
||||||
|
* <b>Example</b>
|
||||||
|
* @code{c}
|
||||||
|
* // An example of a user context to pass to a callback through a task pool thread.
|
||||||
|
* typedef struct JobUserContext
|
||||||
|
* {
|
||||||
|
* uint32_t counter;
|
||||||
|
* } JobUserContext_t;
|
||||||
|
*
|
||||||
|
* // An example of a user callback to invoke through a task pool thread.
|
||||||
|
* static void ExecutionCb( IotTaskPool_t taskPool, IotTaskPoolJob_t job, void * context )
|
||||||
|
* {
|
||||||
|
* ( void )taskPool;
|
||||||
|
* ( void )job;
|
||||||
|
*
|
||||||
|
* JobUserContext_t * pUserContext = ( JobUserContext_t * )context;
|
||||||
|
*
|
||||||
|
* pUserContext->counter++;
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* void TaskPoolExample( )
|
||||||
|
* {
|
||||||
|
* JobUserContext_t userContext = { 0 };
|
||||||
|
* IotTaskPoolJob_t job;
|
||||||
|
*
|
||||||
|
* // Create the system task pool. This example assumes the task pool is created successfully.
|
||||||
|
* // It is recommended to test the function's return value in production code.
|
||||||
|
* IotTaskPool_CreateSystemTaskPool( &xTaskPoolParameters );
|
||||||
|
*
|
||||||
|
* // Statically allocate one job, schedule it.
|
||||||
|
* IotTaskPool_CreateJob( &ExecutionCb, &userContext, &job );
|
||||||
|
*
|
||||||
|
* IotTaskPoolError_t errorSchedule = IotTaskPool_ScheduleSystem( &job, 0 );
|
||||||
|
*
|
||||||
|
* switch ( errorSchedule )
|
||||||
|
* {
|
||||||
|
* case IOT_TASKPOOL_SUCCESS:
|
||||||
|
* break;
|
||||||
|
* case IOT_TASKPOOL_BAD_PARAMETER: // Invalid parameters, such as a NULL handle, can trigger this error.
|
||||||
|
* case IOT_TASKPOOL_ILLEGAL_OPERATION: // Scheduling a job that was previously scheduled or destroyed could trigger this error.
|
||||||
|
* case IOT_TASKPOOL_NO_MEMORY: // Scheduling a with flag #IOT_TASKPOOL_JOB_HIGH_PRIORITY could trigger this error.
|
||||||
|
* case IOT_TASKPOOL_SHUTDOWN_IN_PROGRESS: // Scheduling a job after trying to destroy the task pool could trigger this error.
|
||||||
|
* // ASSERT
|
||||||
|
* break;
|
||||||
|
* default:
|
||||||
|
* // ASSERT
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* //
|
||||||
|
* // ... Perform other operations ...
|
||||||
|
* //
|
||||||
|
*
|
||||||
|
* IotTaskPool_Destroy( taskPool );
|
||||||
|
* }
|
||||||
|
* @endcode
|
||||||
|
*/
|
||||||
|
/* @[declare_taskpool_schedule] */
|
||||||
|
IotTaskPoolError_t IotTaskPool_ScheduleSystem( IotTaskPoolJob_t pJob,
|
||||||
|
uint32_t flags );
|
||||||
|
|
||||||
/* @[declare_taskpool_schedule] */
|
/* @[declare_taskpool_schedule] */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in a new issue