- #include <stdio.h>
- /* Kernel includes. */
- #include "FreeRTOS.h"
- #include "task.h"
- #include "timers.h"
- #include "semphr.h"
- /* Demo application includes. */
- #include "partest.h"
- #include "flash.h"
- #include "flop.h"
- #include "integer.h"
- #include "PollQ.h"
- #include "semtest.h"
- #include "dynamic.h"
- #include "BlockQ.h"
- #include "blocktim.h"
- #include "countsem.h"
- #include "GenQTest.h"
- #include "QueueSet.h"
- #include "recmutex.h"
- #include "death.h"
- /* Hardware and starter kit includes. */
- #include "M451Series.h"
- #define PLL_CLOCK 72000000
- /* Priorities for the demo application tasks. */
- #define mainFLASH_TASK_PRIORITY ( tskIDLE_PRIORITY + 1UL )
- #define mainQUEUE_POLL_PRIORITY ( tskIDLE_PRIORITY + 2UL )
- #define mainSEM_TEST_PRIORITY ( tskIDLE_PRIORITY + 1UL )
- #define mainBLOCK_Q_PRIORITY ( tskIDLE_PRIORITY + 2UL )
- #define mainCREATOR_TASK_PRIORITY ( tskIDLE_PRIORITY + 3UL )
- #define mainFLOP_TASK_PRIORITY ( tskIDLE_PRIORITY )
- #define mainCHECK_TASK_PRIORITY ( tskIDLE_PRIORITY + 3UL )
- #define mainCHECK_TASK_STACK_SIZE ( configMINIMAL_STACK_SIZE )
- /* The time between cycles of the 'check' task. */
- #define mainCHECK_DELAY ( ( portTickType ) 5000 / portTICK_RATE_MS )
- /* The LED used by the check timer. */
- #define mainCHECK_LED ( 3UL )
- /* A block time of zero simply means "don't block". */
- #define mainDONT_BLOCK ( 0UL )
- /* The period after which the check timer will expire, in ms, provided no errors
- have been reported by any of the standard demo tasks. ms are converted to the
- equivalent in ticks using the portTICK_RATE_MS constant. */
- #define mainCHECK_TIMER_PERIOD_MS ( 3000UL / portTICK_RATE_MS )
- /* The period at which the check timer will expire, in ms, if an error has been
- reported in one of the standard demo tasks. ms are converted to the equivalent
- in ticks using the portTICK_RATE_MS constant. */
- #define mainERROR_CHECK_TIMER_PERIOD_MS ( 200UL / portTICK_RATE_MS )
- /* Set mainCREATE_SIMPLE_LED_FLASHER_DEMO_ONLY to 1 to create a simple demo.
- Set mainCREATE_SIMPLE_LED_FLASHER_DEMO_ONLY to 0 to create a much more
- comprehensive test application. See the comments at the top of this file, and
- the documentation page on the http://www.FreeRTOS.org web site for more
- information. */
- #define mainCREATE_SIMPLE_LED_FLASHER_DEMO_ONLY 0
- #define CHECK_TEST
- /*-----------------------------------------------------------*/
- /*
- * Set up the hardware ready to run this demo.
- */
- static void prvSetupHardware(void);
- /*-----------------------------------------------------------*/
- #ifdef CHECK_TEST
- static void vCheckTask(void *pvParameters);
- #endif
- int main(void)
- {
- /* Configure the hardware ready to run the test. */
- prvSetupHardware();
- #ifdef CHECK_TEST
- xTaskCreate(vCheckTask, (signed portCHAR *) "Check", mainCHECK_TASK_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL);
- #endif
- /* Start standard demo/test application flash tasks. See the comments at
- the top of this file. The LED flash tasks are always created. The other
- tasks are only created if mainCREATE_SIMPLE_LED_FLASHER_DEMO_ONLY is set to
- 0 (at the top of this file). See the comments at the top of this file for
- more information. */
- vStartLEDFlashTasks(mainFLASH_TASK_PRIORITY);
- vStartPolledQueueTasks(mainQUEUE_POLL_PRIORITY);
- /* The following function will only create more tasks and timers if
- mainCREATE_SIMPLE_LED_FLASHER_DEMO_ONLY is set to 0 (at the top of this
- file). See the comments at the top of this file for more information. */
- //prvOptionallyCreateComprehensveTestApplication();
- printf("FreeRTOS is starting ...\n");
- /* Start the scheduler. */
- vTaskStartScheduler();
- /* If all is well, the scheduler will now be running, and the following line
- will never be reached. If the following line does execute, then there was
- insufficient FreeRTOS heap memory available for the idle and/or timer tasks
- to be created. See the memory management section on the FreeRTOS web site
- for more details. */
- for(;;);
- }
- /*-----------------------------------------------------------*/
- static void prvSetupHardware(void)
- {
- /* Unlock protected registers */
- SYS_UnlockReg();
- /* Enable HIRC clock */
- CLK_EnableXtalRC(CLK_PWRCTL_HIRCEN_Msk);
- /* Waiting for HIRC clock ready */
- CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk);
- /* Switch HCLK clock source to HIRC */
- CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HIRC, CLK_CLKDIV0_HCLK(1));
- /* Enable HXT clock (external XTAL 12MHz) */
- CLK_EnableXtalRC(CLK_PWRCTL_HXTEN_Msk);
- /* Wait for HXT clock ready */
- CLK_WaitClockReady(CLK_STATUS_HXTSTB_Msk);
- /* Configure PLL */
- CLK_EnablePLL(CLK_PLLCTL_PLLSRC_HXT, PLL_CLOCK);
- /* Switch HCLK clock source to PLL */
- CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_PLL, CLK_CLKDIV0_HCLK(1));
- /* Select UART module clock source as HXT and UART module clock divider as 1 */
- CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UARTSEL_HXT, CLK_CLKDIV0_UART(1));
- /* Enable peripheral clock */
- CLK_EnableModuleClock(UART0_MODULE);
- CLK_EnableModuleClock(TMR0_MODULE);
- /* Update System Core Clock */
- /* User can use SystemCoreClockUpdate() to calculate SystemCoreClock. */
- SystemCoreClockUpdate();
- /*---------------------------------------------------------------------------------------------------------*/
- /* Init I/O Multi-function */
- /*---------------------------------------------------------------------------------------------------------*/
- /* Set PD multi-function pins for UART0 RXD and TXD */
- SYS->GPD_MFPL &= ~(SYS_GPD_MFPL_PD0MFP_Msk | SYS_GPD_MFPL_PD1MFP_Msk);
- SYS->GPD_MFPL |= (SYS_GPD_MFPL_PD0MFP_UART0_RXD | SYS_GPD_MFPL_PD1MFP_UART0_TXD);
- /* Lock protected registers */
- SYS_LockReg();
- /* Init UART to 115200-8n1 for print message */
- UART_Open(UART0, 115200);
- }
- /*-----------------------------------------------------------*/
- void vApplicationMallocFailedHook(void)
- {
- /* vApplicationMallocFailedHook() will only be called if
- configUSE_MALLOC_FAILED_HOOK is set to 1 in FreeRTOSConfig.h. It is a hook
- function that will get called if a call to pvPortMalloc() fails.
- pvPortMalloc() is called internally by the kernel whenever a task, queue,
- timer or semaphore is created. It is also called by various parts of the
- demo application. If heap_1.c or heap_2.c are used, then the size of the
- heap available to pvPortMalloc() is defined by configTOTAL_HEAP_SIZE in
- FreeRTOSConfig.h, and the xPortGetFreeHeapSize() API function can be used
- to query the size of free heap space that remains (although it does not
- provide information on how the remaining heap might be fragmented). */
- taskDISABLE_INTERRUPTS();
- for(;;);
- }
- /*-----------------------------------------------------------*/
- void vApplicationIdleHook(void)
- {
- /* vApplicationIdleHook() will only be called if configUSE_IDLE_HOOK is set
- to 1 in FreeRTOSConfig.h. It will be called on each iteration of the idle
- task. It is essential that code added to this hook function never attempts
- to block in any way (for example, call xQueueReceive() with a block time
- specified, or call vTaskDelay()). If the application makes use of the
- vTaskDelete() API function (as this demo application does) then it is also
- important that vApplicationIdleHook() is permitted to return to its calling
- function, because it is the responsibility of the idle task to clean up
- memory allocated by the kernel to any task that has since been deleted. */
- }
- /*-----------------------------------------------------------*/
- void vApplicationStackOverflowHook(xTaskHandle pxTask, signed char *pcTaskName)
- {
- (void) pcTaskName;
- (void) pxTask;
- /* Run time stack overflow checking is performed if
- configCHECK_FOR_STACK_OVERFLOW is defined to 1 or 2. This hook
- function is called if a stack overflow is detected. */
- taskDISABLE_INTERRUPTS();
- for(;;);
- }
- /*-----------------------------------------------------------*/
- void vApplicationTickHook(void)
- {
- /* This function will be called by each tick interrupt if
- configUSE_TICK_HOOK is set to 1 in FreeRTOSConfig.h. User code can be
- added here, but the tick hook is called from an interrupt context, so
- code must not attempt to block, and only the interrupt safe FreeRTOS API
- functions can be used (those that end in FromISR()). */
- #if ( mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 0 )
- {
- /* In this case the tick hook is used as part of the queue set test. */
- vQueueSetAccessQueueSetFromISR();
- }
- #endif /* mainCREATE_SIMPLE_BLINKY_DEMO_ONLY */
- }
- /*-----------------------------------------------------------*/
- #ifdef CHECK_TEST
- static void vCheckTask(void *pvParameters)
- {
- portTickType xLastExecutionTime;
- xLastExecutionTime = xTaskGetTickCount();
- printf("M451 Check Task is running ...\n");
- printf("LED toggle at PA.13\n\n");
- for(;;)
- {
- /* Perform this check every mainCHECK_DELAY milliseconds. */
- vTaskDelayUntil(&xLastExecutionTime, mainCHECK_DELAY);
- if(xArePollingQueuesStillRunning() != pdTRUE)
- {
- printf("ERROR IN POLL Q\n");
- }
- }
- }
- #endif
|