/* * Setup the hardware, create the tasks/co-routines, then start the scheduler. */ void main( void ) { /* Create the queue used by tasks wanting to write to the LCD. */ xLCDQueue = xQueueCreate( mainLCD_QUEUE_LEN, sizeof( xLCDMessage ) ); /* Setup the ports used by the demo and the clock. */ prvSetupHardware(); /* Create the co-routines that flash the LED's. */ vStartFlashCoRoutines( mainNUM_FLASH_CO_ROUTINES ); /* Create the co-routine that initiates the transmission of characters on the UART and the task that receives them, as described at the top of this file. */ xCoRoutineCreate( vSerialTxCoRoutine, mainTX_CO_ROUTINE_PRIORITY, mainTX_CO_ROUTINE_INDEX ); xTaskCreate( vCommsRxTask, "CMS", configMINIMAL_STACK_SIZE, NULL, mainCOMMS_RX_TASK_PRIORITY, NULL ); /* Create the task that waits for messages to display on the LCD, plus the task and co-routine that send messages for display (as described at the top of this file. */ xTaskCreate( prvLCDTask, "LCD", configMINIMAL_STACK_SIZE, ( void * ) &xLCDQueue, mainLCD_TASK_PRIORITY, NULL ); xTaskCreate( prvLCDMessageTask, "MSG", configMINIMAL_STACK_SIZE, ( void * ) &xLCDQueue, mainMSG_TASK_PRIORITY, NULL ); xCoRoutineCreate( prvADCCoRoutine, mainADC_CO_ROUTINE_PRIORITY, mainADC_CO_ROUTINE_INDEX ); /* Start the scheduler running the tasks and co-routines just created. */ vTaskStartScheduler(); /* Should not get here unless we did not have enough memory to start the scheduler. */ for( ;; ); }
void Main( void ) { /* Create the queue used to communicate between the UART ISR and the Comms Rx task. */ xCommsQueue = xQueueCreate( mainRX_QUEUE_LEN, sizeof( char ) ); /* Setup the ports used by the demo and the clock. */ prvSetupHardware(); /* Create the co-routines that flash the LED's. */ vStartFlashCoRoutines( mainNUM_FLASH_CO_ROUTINES ); /* Create the co-routine that initiates the transmission of characters on the UART. */ xCoRoutineCreate( vSerialTxCoRoutine, mainTX_CO_ROUTINE_PRIORITY, mainTX_CO_ROUTINE_INDEX ); /* Create the co-routine that receives characters from the UART. */ xCoRoutineCreate( vCommsRxCoRoutine, mainRX_CO_ROUTINE_PRIORITY, mainRX_CO_ROUTINE_INDEX ); /* Create the LCD task. */ xTaskCreate( vLCDTask, "LCD", configMINIMAL_STACK_SIZE, NULL, mainLCD_TASK_PRIORITY, NULL ); /* Start the scheduler running the tasks and co-routines just created. */ vTaskStartScheduler(); /* Should not get here unless we did not have enough memory to start the scheduler. */ for( ;; ); }
int main( void ) { unsigned portBASE_TYPE uxCoRoutine; /* Setup all the hardware used by this demo. */ prvSetupHardware(); /* Create the queue used to communicate between the ISR and I2C co-routine. This can only ever contain one value. */ xADCQueue = xQueueCreate( mainQUEUE_LENGTH, sizeof( portTickType ) ); /* Create the queue used to synchronise the flash co-routines. The queue is used to trigger three tasks, but is for synchronisation only and does not pass any data. It therefore has three position each of zero length. */ xDelayQueue = xQueueCreate( mainNUM_LEDs, mainZERO_LENGTH ); /* Create the co-routine that initiates the i2c. */ xCoRoutineCreate( vI2CCoRoutine, mainI2c_CO_ROUTINE_PRIORITY, 0 ); /* Create the flash co-routines. */ for( uxCoRoutine = 0; uxCoRoutine < mainNUM_LEDs; uxCoRoutine++ ) { xCoRoutineCreate( vFlashCoRoutine, tskIDLE_PRIORITY, uxCoRoutine ); } /* Start the scheduler. From this point on the co-routines should execute. */ vTaskStartScheduler(); /* Should not get here unless we did not have enough memory to start the scheduler. */ for( ;; ); return 0; }
/* * See the header file for details. */ void vStartFlashCoRoutines( unsigned portBASE_TYPE uxNumberToCreate ) { unsigned portBASE_TYPE uxIndex; if( uxNumberToCreate > crfMAX_FLASH_TASKS ) { uxNumberToCreate = crfMAX_FLASH_TASKS; } /* Create the queue used to pass data between the co-routines. */ xFlashQueue = xQueueCreate( crfQUEUE_LENGTH, sizeof( unsigned portBASE_TYPE ) ); if( xFlashQueue ) { /* Create uxNumberToCreate 'fixed delay' co-routines. */ for( uxIndex = 0; uxIndex < uxNumberToCreate; uxIndex++ ) { xCoRoutineCreate( prvFixedDelayCoRoutine, crfFIXED_DELAY_PRIORITY, uxIndex ); } /* Create the 'flash' co-routine. */ xCoRoutineCreate( prvFlashCoRoutine, crfFLASH_PRIORITY, crfFLASH_INDEX ); } }
static void vLEDCoRoutineControlTask( void *pvParameters ) { unsigned short usCoroutine; ( void ) pvParameters; /* Create the co-routines - one of each segment of the right side display. */ for( usCoroutine = 0; usCoroutine < ledNUM_OF_LED_CO_ROUTINES; usCoroutine++ ) { xCoRoutineCreate( prvFixedDelayCoRoutine, ledCO_ROUTINE_PRIORITY, usCoroutine ); } /* This task has nothing else to do except scheduler the co-routines it just created. */ for( ;; ) { vCoRoutineSchedule(); } }
void vStartHookCoRoutines( void ) { UBaseType_t uxIndex, uxValueToPost = 0; for( uxIndex = 0; uxIndex < hookNUM_HOOK_CO_ROUTINES; uxIndex++ ) { /* Create a queue to transmit to and receive from each 'hook' co-routine. */ xHookRxQueues[ uxIndex ] = xQueueCreate( hookHOOK_QUEUE_LENGTH, sizeof( UBaseType_t ) ); xHookTxQueues[ uxIndex ] = xQueueCreate( hookHOOK_QUEUE_LENGTH, sizeof( UBaseType_t ) ); /* To start things off the tick hook function expects the queue it uses to receive data to contain a value. */ xQueueSend( xHookRxQueues[ uxIndex ], &uxValueToPost, hookNO_BLOCK_TIME ); /* Create the 'hook' co-routine itself. */ xCoRoutineCreate( prvHookCoRoutine, mainHOOK_CR_PRIORITY, uxIndex ); } }