| /* | |
| * FreeRTOS Kernel V10.3.0 | |
| * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. | |
| * | |
| * 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: | |
| * | |
| * The above copyright notice and this permission notice shall be included in all | |
| * copies or substantial portions of the Software. | |
| * | |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
| * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS | |
| * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR | |
| * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER | |
| * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | |
| * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |
| * | |
| * http://www.FreeRTOS.org | |
| * http://aws.amazon.com/freertos | |
| * | |
| * 1 tab == 4 spaces! | |
| */ | |
| /****************************************************************************** | |
| * This project provides two demo applications. A simple blinky style project, | |
| * and a more comprehensive test and demo application. The | |
| * mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting (defined in this file) is used to | |
| * select between the two. The simply blinky demo is implemented and described | |
| * in main_blinky.c. The more comprehensive test and demo application is | |
| * implemented and described in main_full.c. | |
| * | |
| * This file implements the code that is not demo specific, including the | |
| * hardware setup and standard FreeRTOS hook functions. | |
| * | |
| * ENSURE TO READ THE DOCUMENTATION PAGE FOR THIS PORT AND DEMO APPLICATION ON | |
| * THE http://www.FreeRTOS.org WEB SITE FOR FULL INFORMATION ON USING THIS DEMO | |
| * APPLICATION, AND ITS ASSOCIATE FreeRTOS ARCHITECTURE PORT! | |
| * | |
| */ | |
| /* Scheduler include files. */ | |
| #include "FreeRTOS.h" | |
| #include "task.h" | |
| #include "semphr.h" | |
| /* Library includes. */ | |
| #include "board.h" | |
| #include "asf.h" | |
| /* Set mainCREATE_SIMPLE_BLINKY_DEMO_ONLY to one to run the simple blinky demo, | |
| or 0 to run the more comprehensive test and demo application. */ | |
| #define mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 1 | |
| /*-----------------------------------------------------------*/ | |
| /* | |
| * Configure the hardware as necessary to run this demo. | |
| */ | |
| static void prvSetupHardware( void ); | |
| /* | |
| * main_blinky() is used when mainCREATE_SIMPLE_BLINKY_DEMO_ONLY is set to 1. | |
| * main_full() is used when mainCREATE_SIMPLE_BLINKY_DEMO_ONLY is set to 0. | |
| */ | |
| #if mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 1 | |
| extern void main_blinky( void ); | |
| #else | |
| extern void main_full( void ); | |
| #endif /* #if mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 1 */ | |
| /* Prototypes for the standard FreeRTOS callback/hook functions implemented | |
| within this file. */ | |
| void vApplicationMallocFailedHook( void ); | |
| void vApplicationIdleHook( void ); | |
| void vApplicationStackOverflowHook( TaskHandle_t pxTask, char *pcTaskName ); | |
| void vApplicationTickHook( void ); | |
| /*-----------------------------------------------------------*/ | |
| int main( void ) | |
| { | |
| /* Configure the hardware ready to run the demo. */ | |
| prvSetupHardware(); | |
| /* The mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting is described at the top | |
| of this file. */ | |
| #if( mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 1 ) | |
| { | |
| main_blinky(); | |
| } | |
| #else | |
| { | |
| main_full(); | |
| } | |
| #endif | |
| return 0; | |
| } | |
| /*-----------------------------------------------------------*/ | |
| static void prvSetupHardware( void ) | |
| { | |
| sysclk_init(); | |
| board_init(); | |
| } | |
| /*-----------------------------------------------------------*/ | |
| void vApplicationMallocFailedHook( void ) | |
| { | |
| /* Called if a call to pvPortMalloc() fails because there is insufficient | |
| free memory available in the FreeRTOS heap. pvPortMalloc() is called | |
| internally by FreeRTOS API functions that create tasks, queues, software | |
| timers, and semaphores. The size of the FreeRTOS heap is set by the | |
| configTOTAL_HEAP_SIZE configuration constant in FreeRTOSConfig.h. */ | |
| /* Force an assert. */ | |
| configASSERT( ( volatile void * ) NULL ); | |
| } | |
| /*-----------------------------------------------------------*/ | |
| void vApplicationStackOverflowHook( TaskHandle_t pxTask, 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. */ | |
| /* Force an assert. */ | |
| configASSERT( ( volatile void * ) NULL ); | |
| } | |
| /*-----------------------------------------------------------*/ | |
| void vApplicationIdleHook( void ) | |
| { | |
| volatile size_t xFreeHeapSpace; | |
| /* This is just a trivial example of an idle hook. It is called on each | |
| cycle of the idle task. It must *NOT* attempt to block. In this case the | |
| idle task just queries the amount of FreeRTOS heap that remains. See the | |
| memory management section on the http://www.FreeRTOS.org web site for memory | |
| management options. If there is a lot of heap memory free then the | |
| configTOTAL_HEAP_SIZE value in FreeRTOSConfig.h can be reduced to free up | |
| RAM. */ | |
| xFreeHeapSpace = xPortGetFreeHeapSize(); | |
| /* Remove compiler warning about xFreeHeapSpace being set but never used. */ | |
| ( void ) xFreeHeapSpace; | |
| } | |
| /*-----------------------------------------------------------*/ | |
| void vApplicationTickHook( void ) | |
| { | |
| #if( mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 0 ) | |
| { | |
| extern void vFullDemoTickHook( void ); | |
| /* The full demo includes some tests that execute in an interrupt | |
| context, and the tick hook is used for this purpose. */ | |
| vFullDemoTickHook(); | |
| } | |
| #endif | |
| } | |
| /*-----------------------------------------------------------*/ | |
| #if 0 | |
| /** | |
| * \file | |
| * | |
| * \brief Getting Started Application. | |
| * | |
| * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. | |
| * | |
| * \asf_license_start | |
| * | |
| * \page License | |
| * | |
| * Redistribution and use in source and binary forms, with or without | |
| * modification, are permitted provided that the following conditions are met: | |
| * | |
| * 1. Redistributions of source code must retain the above copyright notice, | |
| * this list of conditions and the following disclaimer. | |
| * | |
| * 2. Redistributions in binary form must reproduce the above copyright notice, | |
| * this list of conditions and the following disclaimer in the documentation | |
| * and/or other materials provided with the distribution. | |
| * | |
| * 3. The name of Atmel may not be used to endorse or promote products derived | |
| * from this software without specific prior written permission. | |
| * | |
| * 4. This software may only be redistributed and used in connection with an | |
| * Atmel microcontroller product. | |
| * | |
| * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED | |
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |
| * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE | |
| * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR | |
| * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
| * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
| * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
| * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | |
| * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | |
| * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |
| * POSSIBILITY OF SUCH DAMAGE. | |
| * | |
| * \asf_license_stop | |
| * | |
| */ | |
| /** | |
| * \mainpage Getting Started Application | |
| * | |
| * \section Purpose | |
| * | |
| * The Getting Started example will help new users get familiar with Atmel's | |
| * SAM family of microcontrollers. This basic application shows the startup | |
| * sequence of a chip and how to use its core peripherals. | |
| * | |
| * \section Requirements | |
| * | |
| * This package can be used with SAM evaluation kits. | |
| * | |
| * \section Description | |
| * | |
| * The demonstration program makes the LED(s) on the board blink at a fixed rate. | |
| * This rate is generated by using Time tick timer. The blinking can be stopped | |
| * using the push button. | |
| * | |
| * \section Usage | |
| * | |
| * -# Build the program and download it inside the evaluation board. | |
| * -# On the computer, open and configure a terminal application | |
| * (e.g. HyperTerminal on Microsoft Windows) with these settings: | |
| * - 115200 bauds | |
| * - 8 bits of data | |
| * - No parity | |
| * - 1 stop bit | |
| * - No flow control | |
| * -# Start the application. | |
| * -# The LED(s) should start blinking on the board. In the terminal window, the | |
| * following text should appear (values depend on the board and chip used): | |
| * \code | |
| -- Getting Started Example xxx -- | |
| -- xxxxxx-xx | |
| -- Compiled: xxx xx xxxx xx:xx:xx -- | |
| \endcode | |
| * -# Pressing and release button 1 should make one LED stop & restart | |
| * blinking. | |
| * -# If the button 2 available, pressing button 2 should make the other LED | |
| * stop & restart blinking. | |
| * | |
| */ | |
| /* | |
| * Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a> | |
| */ | |
| #include "FreeRTOS.h" | |
| #include "task.h" | |
| #include "asf.h" | |
| #include "stdio_serial.h" | |
| #include "conf_board.h" | |
| #include "conf_clock.h" | |
| /** IRQ priority for PIO (The lower the value, the greater the priority) */ | |
| // [main_def_pio_irq_prior] | |
| #define IRQ_PRIOR_PIO 0 | |
| // [main_def_pio_irq_prior] | |
| /** LED0 blink time, LED1 blink half this time, in ms */ | |
| #define BLINK_PERIOD 1000 | |
| #define STRING_EOL "\r" | |
| #define STRING_HEADER "-- Getting Started Example --\r\n" \ | |
| "-- "BOARD_NAME" --\r\n" \ | |
| "-- Compiled: "__DATE__" "__TIME__" --"STRING_EOL | |
| /** LED0 blinking control. */ | |
| // [main_var_led0_control] | |
| volatile bool g_b_led0_active = true; | |
| // [main_var_led0_control] | |
| #ifdef LED1_GPIO | |
| /** LED1 blinking control. */ | |
| // [main_var_led1_control] | |
| volatile bool g_b_led1_active = true; | |
| // [main_var_led1_control] | |
| #endif | |
| /** Global g_ul_ms_ticks in milliseconds since start of application */ | |
| // [main_var_ticks] | |
| volatile uint32_t g_ul_ms_ticks = 0; | |
| // [main_var_ticks] | |
| /// @cond 0 | |
| /**INDENT-OFF**/ | |
| #ifdef __cplusplus | |
| extern "C" { | |
| #endif | |
| /**INDENT-ON**/ | |
| /// @endcond | |
| /* Prototypes for the standard FreeRTOS callback/hook functions implemented | |
| within this file. */ | |
| void vApplicationMallocFailedHook( void ); | |
| void vApplicationIdleHook( void ); | |
| void vApplicationStackOverflowHook( TaskHandle_t pxTask, char *pcTaskName ); | |
| void vApplicationTickHook( void ); | |
| /** | |
| * \brief Process Buttons Events | |
| * | |
| * Change active states of LEDs when corresponding button events happened. | |
| */ | |
| static void ProcessButtonEvt(uint8_t uc_button) | |
| { | |
| // [main_button1_evnt_process] | |
| if (uc_button == 0) { | |
| g_b_led0_active = !g_b_led0_active; | |
| if (!g_b_led0_active) { | |
| ioport_set_pin_level(LED0_GPIO, IOPORT_PIN_LEVEL_HIGH); | |
| } | |
| } | |
| // [main_button1_evnt_process] | |
| #ifdef LED1_GPIO | |
| else { | |
| // [main_button2_evnt_process] | |
| g_b_led1_active = !g_b_led1_active; | |
| /* Enable LED#2 and TC if they were enabled */ | |
| if (g_b_led1_active) { | |
| ioport_set_pin_level(LED1_GPIO, IOPORT_PIN_LEVEL_LOW); | |
| tc_start(TC0, 0); | |
| } | |
| /* Disable LED#2 and TC if they were disabled */ | |
| else { | |
| ioport_set_pin_level(LED1_GPIO, IOPORT_PIN_LEVEL_HIGH); | |
| tc_stop(TC0, 0); | |
| } | |
| // [main_button2_evnt_process] | |
| } | |
| #endif | |
| } | |
| /** | |
| * \brief Handler for System Tick interrupt. | |
| * | |
| * Process System Tick Event | |
| * Increments the g_ul_ms_ticks counter. | |
| */ | |
| // [main_systick_handler] | |
| void _SysTick_Handler(void) | |
| { | |
| g_ul_ms_ticks++; | |
| } | |
| // [main_systick_handler] | |
| /** | |
| * \brief Handler for Button 1 rising edge interrupt. | |
| * | |
| * Handle process led1 status change. | |
| */ | |
| // [main_button1_handler] | |
| static void Button1_Handler(uint32_t id, uint32_t mask) | |
| { | |
| if (PIN_PUSHBUTTON_1_ID == id && PIN_PUSHBUTTON_1_MASK == mask) { | |
| ProcessButtonEvt(0); | |
| } | |
| } | |
| // [main_button1_handler] | |
| #ifndef BOARD_NO_PUSHBUTTON_2 | |
| /** | |
| * \brief Handler for Button 2 falling edge interrupt. | |
| * | |
| * Handle process led2 status change. | |
| */ | |
| // [main_button2_handler] | |
| static void Button2_Handler(uint32_t id, uint32_t mask) | |
| { | |
| if (PIN_PUSHBUTTON_2_ID == id && PIN_PUSHBUTTON_2_MASK == mask) { | |
| ProcessButtonEvt(1); | |
| } | |
| } | |
| // [main_button2_handler] | |
| #endif | |
| /** | |
| * \brief Configure the Pushbuttons | |
| * | |
| * Configure the PIO as inputs and generate corresponding interrupt when | |
| * pressed or released. | |
| */ | |
| static void configure_buttons(void) | |
| { | |
| // [main_button1_configure] | |
| /* Configure Pushbutton 1 */ | |
| pmc_enable_periph_clk(PIN_PUSHBUTTON_1_ID); | |
| pio_set_debounce_filter(PIN_PUSHBUTTON_1_PIO, PIN_PUSHBUTTON_1_MASK, 10); | |
| /* Interrupt on rising edge */ | |
| pio_handler_set(PIN_PUSHBUTTON_1_PIO, PIN_PUSHBUTTON_1_ID, | |
| PIN_PUSHBUTTON_1_MASK, PIN_PUSHBUTTON_1_ATTR, Button1_Handler); | |
| NVIC_EnableIRQ((IRQn_Type) PIN_PUSHBUTTON_1_ID); | |
| pio_handler_set_priority(PIN_PUSHBUTTON_1_PIO, | |
| (IRQn_Type) PIN_PUSHBUTTON_1_ID, IRQ_PRIOR_PIO); | |
| pio_enable_interrupt(PIN_PUSHBUTTON_1_PIO, PIN_PUSHBUTTON_1_MASK); | |
| // [main_button1_configure] | |
| #ifndef BOARD_NO_PUSHBUTTON_2 | |
| // [main_button2_configure] | |
| /* Configure Pushbutton 2 */ | |
| pmc_enable_periph_clk(PIN_PUSHBUTTON_2_ID); | |
| pio_set_debounce_filter(PIN_PUSHBUTTON_2_PIO, PIN_PUSHBUTTON_2_MASK, 10); | |
| /* Interrupt on falling edge */ | |
| pio_handler_set(PIN_PUSHBUTTON_2_PIO, PIN_PUSHBUTTON_2_ID, | |
| PIN_PUSHBUTTON_2_MASK, PIN_PUSHBUTTON_2_ATTR, Button2_Handler); | |
| NVIC_EnableIRQ((IRQn_Type) PIN_PUSHBUTTON_2_ID); | |
| pio_handler_set_priority(PIN_PUSHBUTTON_2_PIO, | |
| (IRQn_Type) PIN_PUSHBUTTON_2_ID, IRQ_PRIOR_PIO); | |
| pio_enable_interrupt(PIN_PUSHBUTTON_2_PIO, PIN_PUSHBUTTON_2_MASK); | |
| // [main_button2_configure] | |
| #endif | |
| } | |
| /** | |
| * Interrupt handler for TC0 interrupt. Toggles the state of LED\#2. | |
| */ | |
| // [main_tc0_handler] | |
| #ifndef BOARD_NO_LED_1 | |
| void TC0_Handler(void) | |
| { | |
| volatile uint32_t ul_dummy; | |
| /* Clear status bit to acknowledge interrupt */ | |
| ul_dummy = tc_get_status(TC0, 0); | |
| /* Avoid compiler warning */ | |
| UNUSED(ul_dummy); | |
| #ifdef LED1_GPIO | |
| /** Toggle LED state. */ | |
| ioport_toggle_pin_level(LED1_GPIO); | |
| #endif | |
| printf("2 "); | |
| } | |
| // [main_tc0_handler] | |
| /** | |
| * Configure Timer Counter 0 to generate an interrupt every 250ms. | |
| */ | |
| // [main_tc_configure] | |
| static void configure_tc(void) | |
| { | |
| uint32_t ul_div; | |
| uint32_t ul_tcclks; | |
| uint32_t ul_sysclk = sysclk_get_cpu_hz(); | |
| /* Configure PMC */ | |
| pmc_enable_periph_clk(ID_TC0); | |
| #if SAMG55 | |
| /* Enable PCK output */ | |
| pmc_disable_pck(PMC_PCK_3); | |
| pmc_switch_pck_to_sclk(PMC_PCK_3, PMC_PCK_PRES_CLK_1); | |
| pmc_enable_pck(PMC_PCK_3); | |
| #endif | |
| /** Configure TC for a 4Hz frequency and trigger on RC compare. */ | |
| tc_find_mck_divisor(4, ul_sysclk, &ul_div, &ul_tcclks, ul_sysclk); | |
| tc_init(TC0, 0, ul_tcclks | TC_CMR_CPCTRG); | |
| tc_write_rc(TC0, 0, (ul_sysclk / ul_div) / 4); | |
| /* Configure and enable interrupt on RC compare */ | |
| NVIC_EnableIRQ((IRQn_Type) ID_TC0); | |
| tc_enable_interrupt(TC0, 0, TC_IER_CPCS); | |
| #ifdef LED1_GPIO | |
| /** Start the counter if LED1 is enabled. */ | |
| if (g_b_led1_active) { | |
| tc_start(TC0, 0); | |
| } | |
| #else | |
| tc_start(TC0, 0); | |
| #endif | |
| } | |
| #endif | |
| // [main_tc_configure] | |
| /** | |
| * Configure UART console. | |
| */ | |
| // [main_console_configure] | |
| static void configure_console(void) | |
| { | |
| const usart_serial_options_t uart_serial_options = { | |
| .baudrate = CONF_UART_BAUDRATE, | |
| #ifdef CONF_UART_CHAR_LENGTH | |
| .charlength = CONF_UART_CHAR_LENGTH, | |
| #endif | |
| .paritytype = CONF_UART_PARITY, | |
| #ifdef CONF_UART_STOP_BITS | |
| .stopbits = CONF_UART_STOP_BITS, | |
| #endif | |
| }; | |
| /* Configure console UART. */ | |
| sysclk_enable_peripheral_clock(CONSOLE_UART_ID); | |
| stdio_serial_init(CONF_UART, &uart_serial_options); | |
| } | |
| // [main_console_configure] | |
| /** | |
| * \brief Wait for the given number of milliseconds (using the g_ul_ms_ticks | |
| * generated by the SAM's microcontrollers's system tick). | |
| * | |
| * \param ul_dly_ticks Delay to wait for, in milliseconds. | |
| */ | |
| // [main_ms_delay] | |
| static void mdelay(uint32_t ul_dly_ticks) | |
| { | |
| uint32_t ul_cur_ticks; | |
| ul_cur_ticks = g_ul_ms_ticks; | |
| while ((g_ul_ms_ticks - ul_cur_ticks) < ul_dly_ticks); | |
| } | |
| // [main_ms_delay] | |
| /** | |
| * \brief getting-started Application entry point. | |
| * | |
| * \return Unused (ANSI-C compatibility). | |
| */ | |
| // [main] | |
| int main(void) | |
| { | |
| //! [main_step_sys_init] | |
| /* Initialize the SAM system */ | |
| sysclk_init(); | |
| board_init(); | |
| //! [main_step_sys_init] | |
| #ifndef BOARD_NO_PUSHBUTTON_2 | |
| #if (SAMV71 || SAMV70 || SAMS70 || SAME70) | |
| if (GPIO_PUSH_BUTTON_2 == PIO_PB12_IDX) { | |
| matrix_set_system_io(matrix_get_system_io() | CCFG_SYSIO_SYSIO12); | |
| } | |
| ioport_set_pin_dir(GPIO_PUSH_BUTTON_2, IOPORT_DIR_INPUT); | |
| ioport_set_pin_mode(GPIO_PUSH_BUTTON_2, GPIO_PUSH_BUTTON_2_FLAGS); | |
| ioport_set_pin_sense_mode(GPIO_PUSH_BUTTON_2, GPIO_PUSH_BUTTON_2_SENSE); | |
| #endif | |
| #endif | |
| //! [main_step_console_init] | |
| /* Initialize the console uart */ | |
| configure_console(); | |
| //! [main_step_console_init] | |
| /* Output example information */ | |
| puts(STRING_HEADER); | |
| /* Configure systick for 1 ms */ | |
| puts("Configure system tick to get 1ms tick period.\r"); | |
| //! [main_step_systick_init] | |
| if (SysTick_Config(sysclk_get_cpu_hz() / 1000)) { | |
| puts("-F- Systick configuration error\r"); | |
| while (1); | |
| } | |
| //! [main_step_systick_init] | |
| #ifndef BOARD_NO_LED_1 | |
| puts("Configure TC.\r"); | |
| //! [main_step_tc_init] | |
| configure_tc(); | |
| //! [main_step_tc_init] | |
| #endif | |
| puts("Configure buttons with debouncing.\r"); | |
| //! [main_step_btn_init] | |
| configure_buttons(); | |
| //! [main_step_btn_init] | |
| printf("Press %s to Start/Stop the %s blinking.\r\n", | |
| PUSHBUTTON_1_NAME, LED_0_NAME); | |
| #ifndef BOARD_NO_PUSHBUTTON_2 | |
| printf("Press %s to Start/Stop the %s blinking.\r\n", | |
| PUSHBUTTON_2_NAME, LED_1_NAME); | |
| #endif | |
| //! [main_step_loop] | |
| while (1) { | |
| /* Wait for LED to be active */ | |
| while (!g_b_led0_active); | |
| /* Toggle LED state if active */ | |
| if (g_b_led0_active) { | |
| ioport_toggle_pin_level(LED0_GPIO); | |
| printf("1 "); | |
| } | |
| /* Wait for 500ms */ | |
| mdelay(500); | |
| } | |
| //! [main_step_loop] | |
| } | |
| // [main] | |
| /// @cond 0 | |
| /**INDENT-OFF**/ | |
| #ifdef __cplusplus | |
| } | |
| #endif | |
| /**INDENT-ON**/ | |
| /// @endcond | |
| void vApplicationMallocFailedHook( void ) | |
| { | |
| /* Called if a call to pvPortMalloc() fails because there is insufficient | |
| free memory available in the FreeRTOS heap. pvPortMalloc() is called | |
| internally by FreeRTOS API functions that create tasks, queues, software | |
| timers, and semaphores. The size of the FreeRTOS heap is set by the | |
| configTOTAL_HEAP_SIZE configuration constant in FreeRTOSConfig.h. */ | |
| /* Force an assert. */ | |
| configASSERT( ( volatile void * ) NULL ); | |
| } | |
| /*-----------------------------------------------------------*/ | |
| void vApplicationStackOverflowHook( TaskHandle_t pxTask, 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. */ | |
| /* Force an assert. */ | |
| configASSERT( ( volatile void * ) NULL ); | |
| } | |
| /*-----------------------------------------------------------*/ | |
| void vApplicationIdleHook( void ) | |
| { | |
| volatile size_t xFreeHeapSpace; | |
| /* This is just a trivial example of an idle hook. It is called on each | |
| cycle of the idle task. It must *NOT* attempt to block. In this case the | |
| idle task just queries the amount of FreeRTOS heap that remains. See the | |
| memory management section on the http://www.FreeRTOS.org web site for memory | |
| management options. If there is a lot of heap memory free then the | |
| configTOTAL_HEAP_SIZE value in FreeRTOSConfig.h can be reduced to free up | |
| RAM. */ | |
| xFreeHeapSpace = xPortGetFreeHeapSize(); | |
| /* Remove compiler warning about xFreeHeapSpace being set but never used. */ | |
| ( void ) xFreeHeapSpace; | |
| } | |
| /*-----------------------------------------------------------*/ | |
| void vApplicationTickHook( void ) | |
| { | |
| } | |
| /*-----------------------------------------------------------*/ | |
| #endif |