mirror of
https://github.com/FreeRTOS/FreeRTOS.git
synced 2026-07-27 16:23:46 +00:00
Demo: Run uncrustify on quemu mps2 demo (#643)
This commit is contained in:
@@ -24,97 +24,100 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef FREERTOS_CONFIG_H
|
||||
#define FREERTOS_CONFIG_H
|
||||
#ifndef FREERTOS_CONFIG_H
|
||||
#define FREERTOS_CONFIG_H
|
||||
|
||||
/*-----------------------------------------------------------
|
||||
* Application specific definitions.
|
||||
*
|
||||
* These definitions should be adjusted for your particular hardware and
|
||||
* application requirements.
|
||||
*
|
||||
* THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
|
||||
* FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
|
||||
*
|
||||
* See https://www.freertos.org/a00110.html
|
||||
*----------------------------------------------------------*/
|
||||
* Application specific definitions.
|
||||
*
|
||||
* These definitions should be adjusted for your particular hardware and
|
||||
* application requirements.
|
||||
*
|
||||
* THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
|
||||
* FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
|
||||
*
|
||||
* See https://www.freertos.org/a00110.html
|
||||
*----------------------------------------------------------*/
|
||||
|
||||
#define configASSERT_DEFINED 1
|
||||
#define configASSERT_DEFINED 1
|
||||
extern void vAssertCalled( void );
|
||||
#define configASSERT( x ) if( ( x ) == 0 ) vAssertCalled( )
|
||||
#define configQUEUE_REGISTRY_SIZE 20
|
||||
#define configASSERT( x ) if( ( x ) == 0 ) vAssertCalled()
|
||||
#define configQUEUE_REGISTRY_SIZE 20
|
||||
|
||||
#define configUSE_PREEMPTION 1
|
||||
#define configUSE_TIME_SLICING 0
|
||||
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0
|
||||
#define configUSE_PREEMPTION 1
|
||||
#define configUSE_TIME_SLICING 0
|
||||
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0
|
||||
|
||||
#define configUSE_IDLE_HOOK 1
|
||||
#define configUSE_TICK_HOOK 1
|
||||
#define configUSE_DAEMON_TASK_STARTUP_HOOK 0
|
||||
#define configCPU_CLOCK_HZ ( ( unsigned long ) 20000000 )
|
||||
#define configTICK_RATE_HZ ( ( TickType_t ) 1000 )
|
||||
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 2000 )
|
||||
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 900 ) )
|
||||
#define configMAX_TASK_NAME_LEN ( 10 )
|
||||
#define configUSE_TRACE_FACILITY 1
|
||||
#define configUSE_16_BIT_TICKS 0
|
||||
#define configIDLE_SHOULD_YIELD 1
|
||||
#define configUSE_CO_ROUTINES 0
|
||||
#define configUSE_IDLE_HOOK 1
|
||||
#define configUSE_TICK_HOOK 1
|
||||
#define configUSE_DAEMON_TASK_STARTUP_HOOK 0
|
||||
#define configCPU_CLOCK_HZ ( ( unsigned long ) 20000000 )
|
||||
#define configTICK_RATE_HZ ( ( TickType_t ) 1000 )
|
||||
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 2000 )
|
||||
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 900 ) )
|
||||
#define configMAX_TASK_NAME_LEN ( 10 )
|
||||
#define configUSE_TRACE_FACILITY 1
|
||||
#define configUSE_16_BIT_TICKS 0
|
||||
#define configIDLE_SHOULD_YIELD 1
|
||||
#define configUSE_CO_ROUTINES 0
|
||||
|
||||
#define configMAX_PRIORITIES ( 10 )
|
||||
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
|
||||
#define configTIMER_QUEUE_LENGTH 20
|
||||
#define configTIMER_TASK_PRIORITY ( configMAX_PRIORITIES - 1 )
|
||||
#define configUSE_COUNTING_SEMAPHORES 1
|
||||
#define configSUPPORT_DYNAMIC_ALLOCATION 1
|
||||
#define configSUPPORT_STATIC_ALLOCATION 1
|
||||
#define configNUM_TX_DESCRIPTORS 15
|
||||
#define configSTREAM_BUFFER_TRIGGER_LEVEL_TEST_MARGIN 2
|
||||
#define configMAX_PRIORITIES ( 10 )
|
||||
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
|
||||
#define configTIMER_QUEUE_LENGTH 20
|
||||
#define configTIMER_TASK_PRIORITY ( configMAX_PRIORITIES - 1 )
|
||||
#define configUSE_COUNTING_SEMAPHORES 1
|
||||
#define configSUPPORT_DYNAMIC_ALLOCATION 1
|
||||
#define configSUPPORT_STATIC_ALLOCATION 1
|
||||
#define configNUM_TX_DESCRIPTORS 15
|
||||
#define configSTREAM_BUFFER_TRIGGER_LEVEL_TEST_MARGIN 2
|
||||
|
||||
/* Set the following definitions to 1 to include the API function, or zero
|
||||
to exclude the API function. */
|
||||
/* Set the following definitions to 1 to include the API function, or zero
|
||||
* to exclude the API function. */
|
||||
|
||||
#define configUSE_MALLOC_FAILED_HOOK 1
|
||||
#define configUSE_MUTEXES 1
|
||||
#define configUSE_RECURSIVE_MUTEXES 1
|
||||
#define configUSE_TIMERS 1
|
||||
#define configTIMER_TASK_STACK_DEPTH ( configMINIMAL_STACK_SIZE * 2 )
|
||||
#define configUSE_MALLOC_FAILED_HOOK 1
|
||||
#define configUSE_MUTEXES 1
|
||||
#define configUSE_RECURSIVE_MUTEXES 1
|
||||
#define configUSE_TIMERS 1
|
||||
#define configTIMER_TASK_STACK_DEPTH ( configMINIMAL_STACK_SIZE * 2 )
|
||||
|
||||
#define INCLUDE_vTaskPrioritySet 1
|
||||
#define INCLUDE_uxTaskPriorityGet 1
|
||||
#define INCLUDE_vTaskDelete 1
|
||||
#define INCLUDE_vTaskCleanUpResources 0
|
||||
#define INCLUDE_vTaskSuspend 1
|
||||
#define INCLUDE_vTaskDelayUntil 1
|
||||
#define INCLUDE_vTaskDelay 1
|
||||
#define INCLUDE_uxTaskGetStackHighWaterMark 1
|
||||
#define INCLUDE_uxTaskGetStackHighWaterMark2 1
|
||||
#define INCLUDE_xTaskGetSchedulerState 1
|
||||
#define INCLUDE_xTimerGetTimerDaemonTaskHandle 1
|
||||
#define INCLUDE_xTaskGetIdleTaskHandle 1
|
||||
#define INCLUDE_xTaskGetHandle 1
|
||||
#define INCLUDE_eTaskGetState 1
|
||||
#define INCLUDE_xSemaphoreGetMutexHolder 1
|
||||
#define INCLUDE_xTimerPendFunctionCall 1
|
||||
#define INCLUDE_xTaskAbortDelay 1
|
||||
#define INCLUDE_vTaskPrioritySet 1
|
||||
#define INCLUDE_uxTaskPriorityGet 1
|
||||
#define INCLUDE_vTaskDelete 1
|
||||
#define INCLUDE_vTaskCleanUpResources 0
|
||||
#define INCLUDE_vTaskSuspend 1
|
||||
#define INCLUDE_vTaskDelayUntil 1
|
||||
#define INCLUDE_vTaskDelay 1
|
||||
#define INCLUDE_uxTaskGetStackHighWaterMark 1
|
||||
#define INCLUDE_uxTaskGetStackHighWaterMark2 1
|
||||
#define INCLUDE_xTaskGetSchedulerState 1
|
||||
#define INCLUDE_xTimerGetTimerDaemonTaskHandle 1
|
||||
#define INCLUDE_xTaskGetIdleTaskHandle 1
|
||||
#define INCLUDE_xTaskGetHandle 1
|
||||
#define INCLUDE_eTaskGetState 1
|
||||
#define INCLUDE_xSemaphoreGetMutexHolder 1
|
||||
#define INCLUDE_xTimerPendFunctionCall 1
|
||||
#define INCLUDE_xTaskAbortDelay 1
|
||||
|
||||
unsigned long ulGetRunTimeCounterValue( void ); /* Prototype of function that returns run time counter. */
|
||||
|
||||
#define projCOVERAGE_TEST 0
|
||||
#define projCOVERAGE_TEST 0
|
||||
|
||||
#define configKERNEL_INTERRUPT_PRIORITY 255
|
||||
|
||||
/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
|
||||
See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
|
||||
* See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
|
||||
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 191 /* equivalent to 0xa0, or priority 5. */
|
||||
#define configMAC_INTERRUPT_PRIORITY 5
|
||||
#define configMAC_INTERRUPT_PRIORITY 5
|
||||
|
||||
/* Prototype for the function used to print out. In this case it prints to the
|
||||
| 10 console before the network is connected then a UDP port after the network has
|
||||
| 9 connected. */
|
||||
extern void vLoggingPrintf( const char *pcFormatString, ... );
|
||||
| 10 console before the network is connected then a UDP port after the network has
|
||||
| 9 connected. */
|
||||
extern void vLoggingPrintf( const char * pcFormatString,
|
||||
... );
|
||||
|
||||
#ifdef HEAP3
|
||||
#define xPortGetMinimumEverFreeHeapSize (x)
|
||||
#define xPortGetFreeHeapSize (x)
|
||||
#define xPortGetMinimumEverFreeHeapSize ( x )
|
||||
#define xPortGetFreeHeapSize ( x )
|
||||
#endif
|
||||
|
||||
#endif /* FREERTOS_CONFIG_H */
|
||||
#endif /* FREERTOS_CONFIG_H */
|
||||
|
||||
@@ -25,8 +25,8 @@
|
||||
*/
|
||||
|
||||
/*-----------------------------------------------------------
|
||||
* Example console I/O wrappers.
|
||||
*----------------------------------------------------------*/
|
||||
* Example console I/O wrappers.
|
||||
*----------------------------------------------------------*/
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
@@ -37,22 +37,23 @@
|
||||
SemaphoreHandle_t xStdioMutex;
|
||||
StaticSemaphore_t xStdioMutexBuffer;
|
||||
|
||||
void console_init(void)
|
||||
void console_init( void )
|
||||
{
|
||||
xStdioMutex = xSemaphoreCreateMutexStatic(&xStdioMutexBuffer);
|
||||
xStdioMutex = xSemaphoreCreateMutexStatic( &xStdioMutexBuffer );
|
||||
}
|
||||
|
||||
void console_print(const char *fmt, ...)
|
||||
void console_print( const char * fmt,
|
||||
... )
|
||||
{
|
||||
va_list vargs;
|
||||
|
||||
va_start(vargs, fmt);
|
||||
|
||||
xSemaphoreTake(xStdioMutex, portMAX_DELAY);
|
||||
va_start( vargs, fmt );
|
||||
|
||||
vprintf(fmt, vargs);
|
||||
xSemaphoreTake( xStdioMutex, portMAX_DELAY );
|
||||
|
||||
xSemaphoreGive(xStdioMutex);
|
||||
vprintf( fmt, vargs );
|
||||
|
||||
va_end(vargs);
|
||||
xSemaphoreGive( xStdioMutex );
|
||||
|
||||
va_end( vargs );
|
||||
}
|
||||
|
||||
@@ -26,20 +26,24 @@
|
||||
|
||||
#ifndef CONSOLE_H
|
||||
#define CONSOLE_H
|
||||
|
||||
/* *INDENT-OFF* */
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
extern "C" {
|
||||
#endif
|
||||
/* *INDENT-ON* */
|
||||
|
||||
/*-----------------------------------------------------------
|
||||
* Example console I/O wrappers.
|
||||
*----------------------------------------------------------*/
|
||||
* Example console I/O wrappers.
|
||||
*----------------------------------------------------------*/
|
||||
|
||||
void console_init(void);
|
||||
void console_print(const char *fmt, ...);
|
||||
void console_init( void );
|
||||
void console_print( const char * fmt,
|
||||
... );
|
||||
|
||||
/* *INDENT-OFF* */
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
}
|
||||
#endif
|
||||
/* *INDENT-ON* */
|
||||
|
||||
#endif /* CONSOLE_H */
|
||||
|
||||
@@ -37,48 +37,50 @@ extern void xPortSysTickHandler( void );
|
||||
extern void uart_init();
|
||||
extern int main();
|
||||
|
||||
void __attribute__((weak)) EthernetISR (void);
|
||||
void __attribute__( ( weak ) ) EthernetISR( void );
|
||||
|
||||
extern uint32_t _estack, _sidata, _sdata, _edata, _sbss, _ebss;
|
||||
|
||||
/* Prevent optimization so gcc does not replace code with memcpy */
|
||||
__attribute__((optimize("O0")))
|
||||
__attribute__((naked))
|
||||
void Reset_Handler(void)
|
||||
__attribute__( ( optimize( "O0" ) ) )
|
||||
__attribute__( ( naked ) )
|
||||
void Reset_Handler( void )
|
||||
{
|
||||
// set stack pointer
|
||||
__asm volatile ("ldr r0, =_estack");
|
||||
__asm volatile ("mov sp, r0");
|
||||
// copy .data section from flash to RAM
|
||||
for (uint32_t *src = &_sidata, *dest = &_sdata; dest < &_edata;)
|
||||
/* set stack pointer */
|
||||
__asm volatile ( "ldr r0, =_estack" );
|
||||
__asm volatile ( "mov sp, r0" );
|
||||
|
||||
/* copy .data section from flash to RAM */
|
||||
for( uint32_t * src = &_sidata, * dest = &_sdata; dest < &_edata; )
|
||||
{
|
||||
*dest++ = *src++;
|
||||
}
|
||||
|
||||
// zero out .bss section
|
||||
for (uint32_t *dest = &_sbss; dest < &_ebss;)
|
||||
/* zero out .bss section */
|
||||
for( uint32_t * dest = &_sbss; dest < &_ebss; )
|
||||
{
|
||||
*dest++ = 0;
|
||||
}
|
||||
// jump to board initialisation
|
||||
void _start(void);
|
||||
|
||||
/* jump to board initialisation */
|
||||
void _start( void );
|
||||
_start();
|
||||
}
|
||||
|
||||
void prvGetRegistersFromStack( uint32_t *pulFaultStackAddress )
|
||||
void prvGetRegistersFromStack( uint32_t * pulFaultStackAddress )
|
||||
{
|
||||
/* These are volatile to try and prevent the compiler/linker optimising them
|
||||
away as the variables never actually get used. If the debugger won't show the
|
||||
values of the variables, make them global my moving their declaration outside
|
||||
of this function. */
|
||||
* away as the variables never actually get used. If the debugger won't show the
|
||||
* values of the variables, make them global my moving their declaration outside
|
||||
* of this function. */
|
||||
volatile uint32_t r0;
|
||||
volatile uint32_t r1;
|
||||
volatile uint32_t r2;
|
||||
volatile uint32_t r3;
|
||||
volatile uint32_t r12;
|
||||
volatile uint32_t lr; /* Link register. */
|
||||
volatile uint32_t pc; /* Program counter. */
|
||||
volatile uint32_t psr;/* Program status register. */
|
||||
volatile uint32_t lr; /* Link register. */
|
||||
volatile uint32_t pc; /* Program counter. */
|
||||
volatile uint32_t psr; /* Program status register. */
|
||||
|
||||
r0 = pulFaultStackAddress[ 0 ];
|
||||
r1 = pulFaultStackAddress[ 1 ];
|
||||
@@ -91,11 +93,13 @@ of this function. */
|
||||
psr = pulFaultStackAddress[ 7 ];
|
||||
|
||||
/* When the following line is hit, the variables contain the register values. */
|
||||
for( ;; );
|
||||
for( ; ; )
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
static void Default_Handler( void ) __attribute__( ( naked ) );
|
||||
void Default_Handler(void)
|
||||
void Default_Handler( void )
|
||||
{
|
||||
__asm volatile
|
||||
(
|
||||
@@ -111,9 +115,8 @@ void Default_Handler(void)
|
||||
);
|
||||
}
|
||||
static void HardFault_Handler( void ) __attribute__( ( naked ) );
|
||||
void Default_Handler2(void)
|
||||
void Default_Handler2( void )
|
||||
{
|
||||
|
||||
__asm volatile
|
||||
(
|
||||
" tst lr, #4 \n"
|
||||
@@ -127,80 +130,86 @@ void Default_Handler2(void)
|
||||
);
|
||||
}
|
||||
|
||||
void Default_Handler3(void)
|
||||
void Default_Handler3( void )
|
||||
{
|
||||
for (;;) { }
|
||||
for( ; ; )
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
void Default_Handler4(void)
|
||||
void Default_Handler4( void )
|
||||
{
|
||||
for (;;) { }
|
||||
for( ; ; )
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
void Default_Handler5(void)
|
||||
void Default_Handler5( void )
|
||||
{
|
||||
for (;;) { }
|
||||
for( ; ; )
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
void Default_Handler6(void)
|
||||
void Default_Handler6( void )
|
||||
{
|
||||
for (;;) { }
|
||||
for( ; ; )
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
const uint32_t* isr_vector[] __attribute__((section(".isr_vector"))) =
|
||||
const uint32_t * isr_vector[] __attribute__( ( section( ".isr_vector" ) ) ) =
|
||||
{
|
||||
(uint32_t*)&_estack,
|
||||
(uint32_t*)&Reset_Handler, // Reset -15
|
||||
(uint32_t*)&Default_Handler, // NMI_Handler -14
|
||||
(uint32_t*)&Default_Handler2, // HardFault_Handler -13
|
||||
(uint32_t*)&Default_Handler3, // MemManage_Handler -12
|
||||
(uint32_t*)&Default_Handler4, // BusFault_Handler -11
|
||||
(uint32_t*)&Default_Handler5, // UsageFault_Handler -10
|
||||
0, // reserved
|
||||
0, // reserved
|
||||
0, // reserved
|
||||
0, // reserved -6
|
||||
(uint32_t*)&vPortSVCHandler, // SVC_Handler -5
|
||||
(uint32_t*)&Default_Handler6, // DebugMon_Handler -4
|
||||
0, // reserved
|
||||
(uint32_t*)&xPortPendSVHandler, // PendSV handler -2
|
||||
(uint32_t*)&xPortSysTickHandler, // SysTick_Handler -1
|
||||
0, // uart0 receive 0
|
||||
0, // uart0 transmit
|
||||
0, // uart1 receive
|
||||
0, // uart1 transmit
|
||||
0, // uart 2 receive
|
||||
0, // uart 2 transmit
|
||||
0, // GPIO 0 combined interrupt
|
||||
0, // GPIO 2 combined interrupt
|
||||
0, // Timer 0
|
||||
0, // Timer 1
|
||||
0, // Dial Timer
|
||||
0, // SPI0 SPI1
|
||||
0, // uart overflow 1, 2,3
|
||||
0, // Ethernet 13
|
||||
|
||||
( uint32_t * ) &_estack,
|
||||
( uint32_t * ) &Reset_Handler, /* Reset -15 */
|
||||
( uint32_t * ) &Default_Handler, /* NMI_Handler -14 */
|
||||
( uint32_t * ) &Default_Handler2, /* HardFault_Handler -13 */
|
||||
( uint32_t * ) &Default_Handler3, /* MemManage_Handler -12 */
|
||||
( uint32_t * ) &Default_Handler4, /* BusFault_Handler -11 */
|
||||
( uint32_t * ) &Default_Handler5, /* UsageFault_Handler -10 */
|
||||
0, /* reserved */
|
||||
0, /* reserved */
|
||||
0, /* reserved */
|
||||
0, /* reserved -6 */
|
||||
( uint32_t * ) &vPortSVCHandler, /* SVC_Handler -5 */
|
||||
( uint32_t * ) &Default_Handler6, /* DebugMon_Handler -4 */
|
||||
0, /* reserved */
|
||||
( uint32_t * ) &xPortPendSVHandler, /* PendSV handler -2 */
|
||||
( uint32_t * ) &xPortSysTickHandler, /* SysTick_Handler -1 */
|
||||
0, /* uart0 receive 0 */
|
||||
0, /* uart0 transmit */
|
||||
0, /* uart1 receive */
|
||||
0, /* uart1 transmit */
|
||||
0, /* uart 2 receive */
|
||||
0, /* uart 2 transmit */
|
||||
0, /* GPIO 0 combined interrupt */
|
||||
0, /* GPIO 2 combined interrupt */
|
||||
0, /* Timer 0 */
|
||||
0, /* Timer 1 */
|
||||
0, /* Dial Timer */
|
||||
0, /* SPI0 SPI1 */
|
||||
0, /* uart overflow 1, 2,3 */
|
||||
0, /* Ethernet 13 */
|
||||
};
|
||||
|
||||
void _start(void)
|
||||
void _start( void )
|
||||
{
|
||||
uart_init();
|
||||
main(0, 0);
|
||||
exit(0);
|
||||
main( 0, 0 );
|
||||
exit( 0 );
|
||||
}
|
||||
|
||||
__attribute__((naked)) void exit(int status)
|
||||
__attribute__( ( naked ) ) void exit( int status )
|
||||
{
|
||||
// Force qemu to exit using ARM Semihosting
|
||||
/* Force qemu to exit using ARM Semihosting */
|
||||
__asm volatile (
|
||||
"mov r1, r0\n"
|
||||
"cmp r1, #0\n"
|
||||
"bne .notclean\n"
|
||||
"ldr r1, =0x20026\n" // ADP_Stopped_ApplicationExit, a clean exit
|
||||
"ldr r1, =0x20026\n" /* ADP_Stopped_ApplicationExit, a clean exit */
|
||||
".notclean:\n"
|
||||
"movs r0, #0x18\n" // SYS_EXIT
|
||||
"movs r0, #0x18\n" /* SYS_EXIT */
|
||||
"bkpt 0xab\n"
|
||||
"end: b end\n"
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -27,46 +27,47 @@
|
||||
#include <FreeRTOS.h>
|
||||
#include <task.h>
|
||||
|
||||
#include<FreeRTOSConfig.h>
|
||||
#include <FreeRTOSConfig.h>
|
||||
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
|
||||
void vApplicationStackOverflowHook( TaskHandle_t pxTask, char *pcTaskName );
|
||||
void vApplicationStackOverflowHook( TaskHandle_t pxTask,
|
||||
char * pcTaskName );
|
||||
void vApplicationMallocFailedHook( void );
|
||||
void vApplicationIdleHook( void );
|
||||
void vApplicationTickHook( void );
|
||||
void vFullDemoIdleFunction( void );
|
||||
void vFullDemoTickHookFunction( void );
|
||||
void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer,
|
||||
StackType_t **ppxTimerTaskStackBuffer,
|
||||
uint32_t *pulTimerTaskStackSize );
|
||||
void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer,
|
||||
StackType_t **ppxIdleTaskStackBuffer,
|
||||
uint32_t *pulIdleTaskStackSize );
|
||||
void vApplicationGetTimerTaskMemory( StaticTask_t ** ppxTimerTaskTCBBuffer,
|
||||
StackType_t ** ppxTimerTaskStackBuffer,
|
||||
uint32_t * pulTimerTaskStackSize );
|
||||
void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer,
|
||||
StackType_t ** ppxIdleTaskStackBuffer,
|
||||
uint32_t * pulIdleTaskStackSize );
|
||||
void main_blinky( void );
|
||||
void main_full( void );
|
||||
|
||||
extern void initialise_monitor_handles(void);
|
||||
extern void initialise_monitor_handles( void );
|
||||
|
||||
StackType_t uxTimerTaskStack[ configTIMER_TASK_STACK_DEPTH ];
|
||||
|
||||
int main ()
|
||||
int main()
|
||||
{
|
||||
#if (mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 1)
|
||||
{
|
||||
main_blinky();
|
||||
}
|
||||
#elif (mainCREATE_FULL_DEMO_ONLY == 1)
|
||||
{
|
||||
main_full();
|
||||
}
|
||||
#else
|
||||
{
|
||||
#error "Invalid Selection...\nPlease Select a Demo application from the main command"
|
||||
}
|
||||
#endif
|
||||
#if ( mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 1 )
|
||||
{
|
||||
main_blinky();
|
||||
}
|
||||
#elif ( mainCREATE_FULL_DEMO_ONLY == 1 )
|
||||
{
|
||||
main_full();
|
||||
}
|
||||
#else
|
||||
{
|
||||
#error "Invalid Selection...\nPlease Select a Demo application from the main command"
|
||||
}
|
||||
#endif /* if ( mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 1 ) */
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -75,66 +76,74 @@ int main ()
|
||||
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. */
|
||||
* 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. */
|
||||
taskDISABLE_INTERRUPTS();
|
||||
for( ;; ){};
|
||||
|
||||
for( ; ; )
|
||||
{
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vApplicationStackOverflowHook( TaskHandle_t pxTask, char *pcTaskName )
|
||||
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. */
|
||||
* configCHECK_FOR_STACK_OVERFLOW is defined to 1 or 2. This hook
|
||||
* function is called if a stack overflow is detected. */
|
||||
taskDISABLE_INTERRUPTS();
|
||||
for( ;; ){};
|
||||
|
||||
for( ; ; )
|
||||
{
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vApplicationIdleHook( void )
|
||||
{
|
||||
volatile size_t xFreeHeapSpace;
|
||||
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 https://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. */
|
||||
#if (mainCREATE_FULL_DEMO_ONLY == 1)
|
||||
{
|
||||
/* Call the idle task processing used by the full demo. The simple
|
||||
blinky demo does not use the idle task hook. */
|
||||
vFullDemoIdleFunction();
|
||||
}
|
||||
#endif
|
||||
* 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 https://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. */
|
||||
#if ( mainCREATE_FULL_DEMO_ONLY == 1 )
|
||||
{
|
||||
/* Call the idle task processing used by the full demo. The simple
|
||||
* blinky demo does not use the idle task hook. */
|
||||
vFullDemoIdleFunction();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vApplicationTickHook( void )
|
||||
{
|
||||
#if (mainCREATE_FULL_DEMO_ONLY == 1)
|
||||
{
|
||||
vFullDemoTickHookFunction();
|
||||
}
|
||||
#endif /* mainSELECTED_APPLICATION */
|
||||
#if ( mainCREATE_FULL_DEMO_ONLY == 1 )
|
||||
{
|
||||
vFullDemoTickHookFunction();
|
||||
}
|
||||
#endif /* mainSELECTED_APPLICATION */
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vAssertCalled( void )
|
||||
{
|
||||
volatile unsigned long looping = 0;
|
||||
|
||||
taskENTER_CRITICAL();
|
||||
{
|
||||
/* Use the debugger to set ul to a non-zero value in order to step out
|
||||
of this function to determine why it was called. */
|
||||
* of this function to determine why it was called. */
|
||||
while( looping == 0LU )
|
||||
{
|
||||
portNOP();
|
||||
@@ -143,60 +152,62 @@ void vAssertCalled( void )
|
||||
taskEXIT_CRITICAL();
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
void vLoggingPrintf( const char *pcFormat, ... )
|
||||
void vLoggingPrintf( const char * pcFormat,
|
||||
... )
|
||||
{
|
||||
va_list arg;
|
||||
va_list arg;
|
||||
|
||||
va_start( arg, pcFormat );
|
||||
vprintf( pcFormat, arg );
|
||||
va_end( arg );
|
||||
va_start( arg, pcFormat );
|
||||
vprintf( pcFormat, arg );
|
||||
va_end( arg );
|
||||
}
|
||||
|
||||
/* configUSE_STATIC_ALLOCATION is set to 1, so the application must provide an
|
||||
implementation of vApplicationGetIdleTaskMemory() to provide the memory that is
|
||||
used by the Idle task. */
|
||||
void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer,
|
||||
StackType_t **ppxIdleTaskStackBuffer,
|
||||
uint32_t *pulIdleTaskStackSize )
|
||||
* implementation of vApplicationGetIdleTaskMemory() to provide the memory that is
|
||||
* used by the Idle task. */
|
||||
void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer,
|
||||
StackType_t ** ppxIdleTaskStackBuffer,
|
||||
uint32_t * pulIdleTaskStackSize )
|
||||
{
|
||||
/* If the buffers to be provided to the Idle task are declared inside this
|
||||
function then they must be declared static - otherwise they will be allocated on
|
||||
the stack and so not exists after this function exits. */
|
||||
* function then they must be declared static - otherwise they will be allocated on
|
||||
* the stack and so not exists after this function exits. */
|
||||
static StaticTask_t xIdleTaskTCB;
|
||||
static StackType_t uxIdleTaskStack[ configMINIMAL_STACK_SIZE ];
|
||||
|
||||
/* Pass out a pointer to the StaticTask_t structure in which the Idle task's
|
||||
state will be stored. */
|
||||
* state will be stored. */
|
||||
*ppxIdleTaskTCBBuffer = &xIdleTaskTCB;
|
||||
|
||||
/* Pass out the array that will be used as the Idle task's stack. */
|
||||
*ppxIdleTaskStackBuffer = uxIdleTaskStack;
|
||||
|
||||
/* Pass out the size of the array pointed to by *ppxIdleTaskStackBuffer.
|
||||
Note that, as the array is necessarily of type StackType_t,
|
||||
configMINIMAL_STACK_SIZE is specified in words, not bytes. */
|
||||
* Note that, as the array is necessarily of type StackType_t,
|
||||
* configMINIMAL_STACK_SIZE is specified in words, not bytes. */
|
||||
*pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer,
|
||||
StackType_t **ppxTimerTaskStackBuffer,
|
||||
uint32_t *pulTimerTaskStackSize )
|
||||
void vApplicationGetTimerTaskMemory( StaticTask_t ** ppxTimerTaskTCBBuffer,
|
||||
StackType_t ** ppxTimerTaskStackBuffer,
|
||||
uint32_t * pulTimerTaskStackSize )
|
||||
{
|
||||
/* If the buffers to be provided to the Timer task are declared inside this
|
||||
function then they must be declared static - otherwise they will be allocated on
|
||||
the stack and so not exists after this function exits. */
|
||||
* function then they must be declared static - otherwise they will be allocated on
|
||||
* the stack and so not exists after this function exits. */
|
||||
static StaticTask_t xTimerTaskTCB;
|
||||
|
||||
/* Pass out a pointer to the StaticTask_t structure in which the Timer
|
||||
task's state will be stored. */
|
||||
* task's state will be stored. */
|
||||
*ppxTimerTaskTCBBuffer = &xTimerTaskTCB;
|
||||
|
||||
/* Pass out the array that will be used as the Timer task's stack. */
|
||||
*ppxTimerTaskStackBuffer = uxTimerTaskStack;
|
||||
|
||||
/* Pass out the size of the array pointed to by *ppxTimerTaskStackBuffer.
|
||||
Note that, as the array is necessarily of type StackType_t,
|
||||
configMINIMAL_STACK_SIZE is specified in words, not bytes. */
|
||||
/* Pass out the size of the array pointed to by *ppxTimerTaskStackBuffer.
|
||||
* Note that, as the array is necessarily of type StackType_t,
|
||||
* configMINIMAL_STACK_SIZE is specified in words, not bytes. */
|
||||
*pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH;
|
||||
}
|
||||
|
||||
@@ -29,13 +29,13 @@
|
||||
#include <queue.h>
|
||||
#include <stdio.h>
|
||||
|
||||
static void prvQueueReceiveTask( void *pvParameters );
|
||||
static void prvQueueSendTask( void *pvParameters );
|
||||
static void prvQueueReceiveTask( void * pvParameters );
|
||||
static void prvQueueSendTask( void * pvParameters );
|
||||
|
||||
#define mainQUEUE_RECEIVE_TASK_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
||||
#define mainQUEUE_SEND_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 )
|
||||
#define mainQUEUE_LENGTH ( 1 )
|
||||
#define mainQUEUE_SEND_FREQUENCY_MS ( 200 / portTICK_PERIOD_MS )
|
||||
#define mainQUEUE_RECEIVE_TASK_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
||||
#define mainQUEUE_SEND_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 )
|
||||
#define mainQUEUE_LENGTH ( 1 )
|
||||
#define mainQUEUE_SEND_FREQUENCY_MS ( 200 / portTICK_PERIOD_MS )
|
||||
/* The queue used by both tasks. */
|
||||
static QueueHandle_t xQueue = NULL;
|
||||
|
||||
@@ -47,38 +47,40 @@ void main_blinky( void )
|
||||
if( xQueue != NULL )
|
||||
{
|
||||
/* Start the two tasks as described in the comments at the top of this
|
||||
file. */
|
||||
xTaskCreate( prvQueueReceiveTask, /* The function that implements the task. */
|
||||
"Rx", /* The text name assigned to the task - for debug only as it is not used by the kernel. */
|
||||
configMINIMAL_STACK_SIZE, /* The size of the stack to allocate to the task. */
|
||||
NULL, /* The parameter passed to the task - not used in this case. */
|
||||
mainQUEUE_RECEIVE_TASK_PRIORITY, /* The priority assigned to the task. */
|
||||
NULL ); /* The task handle is not required, so NULL is passed. */
|
||||
* file. */
|
||||
xTaskCreate( prvQueueReceiveTask, /* The function that implements the task. */
|
||||
"Rx", /* The text name assigned to the task - for debug only as it is not used by the kernel. */
|
||||
configMINIMAL_STACK_SIZE, /* The size of the stack to allocate to the task. */
|
||||
NULL, /* The parameter passed to the task - not used in this case. */
|
||||
mainQUEUE_RECEIVE_TASK_PRIORITY, /* The priority assigned to the task. */
|
||||
NULL ); /* The task handle is not required, so NULL is passed. */
|
||||
|
||||
xTaskCreate( prvQueueSendTask,
|
||||
"TX",
|
||||
configMINIMAL_STACK_SIZE,
|
||||
NULL,
|
||||
mainQUEUE_SEND_TASK_PRIORITY,
|
||||
NULL );
|
||||
"TX",
|
||||
configMINIMAL_STACK_SIZE,
|
||||
NULL,
|
||||
mainQUEUE_SEND_TASK_PRIORITY,
|
||||
NULL );
|
||||
|
||||
/* Start the tasks and timer running. */
|
||||
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 on the FreeRTOS heap
|
||||
http://www.freertos.org/a00111.html. */
|
||||
for( ;; );
|
||||
* 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 on the FreeRTOS heap
|
||||
* http://www.freertos.org/a00111.html. */
|
||||
for( ; ; )
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
static void prvQueueSendTask( void *pvParameters )
|
||||
static void prvQueueSendTask( void * pvParameters )
|
||||
{
|
||||
TickType_t xNextWakeTime;
|
||||
const uint32_t ulValueToSend = 100UL;
|
||||
TickType_t xNextWakeTime;
|
||||
const uint32_t ulValueToSend = 100UL;
|
||||
|
||||
/* Remove compiler warning about unused parameter. */
|
||||
( void ) pvParameters;
|
||||
@@ -86,41 +88,41 @@ const uint32_t ulValueToSend = 100UL;
|
||||
/* Initialise xNextWakeTime - this only needs to be done once. */
|
||||
xNextWakeTime = xTaskGetTickCount();
|
||||
|
||||
for( ;; )
|
||||
for( ; ; )
|
||||
{
|
||||
/* Place this task in the blocked state until it is time to run again. */
|
||||
vTaskDelayUntil( &xNextWakeTime, mainQUEUE_SEND_FREQUENCY_MS );
|
||||
|
||||
/* Send to the queue - causing the queue receive task to unblock and
|
||||
toggle the LED. 0 is used as the block time so the sending operation
|
||||
will not block - it shouldn't need to block as the queue should always
|
||||
be empty at this point in the code. */
|
||||
* toggle the LED. 0 is used as the block time so the sending operation
|
||||
* will not block - it shouldn't need to block as the queue should always
|
||||
* be empty at this point in the code. */
|
||||
xQueueSend( xQueue, &ulValueToSend, 0U );
|
||||
}
|
||||
}
|
||||
|
||||
volatile uint32_t ulRxEvents = 0;
|
||||
static void prvQueueReceiveTask( void *pvParameters )
|
||||
static void prvQueueReceiveTask( void * pvParameters )
|
||||
{
|
||||
uint32_t ulReceivedValue;
|
||||
const uint32_t ulExpectedValue = 100UL;
|
||||
uint32_t ulReceivedValue;
|
||||
const uint32_t ulExpectedValue = 100UL;
|
||||
|
||||
/* Remove compiler warning about unused parameter. */
|
||||
( void ) pvParameters;
|
||||
|
||||
for( ;; )
|
||||
for( ; ; )
|
||||
{
|
||||
/* Wait until something arrives in the queue - this task will block
|
||||
indefinitely provided INCLUDE_vTaskSuspend is set to 1 in
|
||||
FreeRTOSConfig.h. */
|
||||
* indefinitely provided INCLUDE_vTaskSuspend is set to 1 in
|
||||
* FreeRTOSConfig.h. */
|
||||
xQueueReceive( xQueue, &ulReceivedValue, portMAX_DELAY );
|
||||
|
||||
/* To get here something must have been received from the queue, but
|
||||
is it the expected value? If it is, toggle the LED. */
|
||||
* is it the expected value? If it is, toggle the LED. */
|
||||
if( ulReceivedValue == ulExpectedValue )
|
||||
{
|
||||
printf("%s\n","blinking");
|
||||
vTaskDelay(1000);
|
||||
printf( "%s\n", "blinking" );
|
||||
vTaskDelay( 1000 );
|
||||
ulReceivedValue = 0U;
|
||||
ulRxEvents++;
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -24,12 +24,13 @@
|
||||
*
|
||||
*/
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
typedef struct UART_t {
|
||||
typedef struct UART_t
|
||||
{
|
||||
volatile uint32_t DATA;
|
||||
volatile uint32_t STATE;
|
||||
volatile uint32_t CTRL;
|
||||
@@ -37,19 +38,19 @@ typedef struct UART_t {
|
||||
volatile uint32_t BAUDDIV;
|
||||
} UART_t;
|
||||
|
||||
#define UART0_ADDR ((UART_t *)(0x40004000))
|
||||
#define UART_DR(baseaddr) (*(unsigned int *)(baseaddr))
|
||||
#define UART0_ADDR ( ( UART_t * ) ( 0x40004000 ) )
|
||||
#define UART_DR( baseaddr ) ( *( unsigned int * ) ( baseaddr ) )
|
||||
|
||||
#define UART_STATE_TXFULL (1 << 0)
|
||||
#define UART_CTRL_TX_EN (1 << 0)
|
||||
#define UART_CTRL_RX_EN (1 << 1)
|
||||
#define UART_STATE_TXFULL ( 1 << 0 )
|
||||
#define UART_CTRL_TX_EN ( 1 << 0 )
|
||||
#define UART_CTRL_RX_EN ( 1 << 1 )
|
||||
|
||||
|
||||
extern unsigned long _heap_bottom;
|
||||
extern unsigned long _heap_top;
|
||||
extern unsigned long g_ulBase;
|
||||
|
||||
static void *heap_end = 0;
|
||||
static void * heap_end = 0;
|
||||
|
||||
/**
|
||||
* @brief initializes the UART emulated hardware
|
||||
@@ -65,7 +66,7 @@ void uart_init()
|
||||
* @todo implement if necessary
|
||||
*
|
||||
*/
|
||||
int _fstat(int file)
|
||||
int _fstat( int file )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
@@ -75,9 +76,11 @@ int _fstat(int file)
|
||||
* @todo implement if necessary
|
||||
*
|
||||
*/
|
||||
int _read(int file, char *buf, int len)
|
||||
int _read( int file,
|
||||
char * buf,
|
||||
int len )
|
||||
{
|
||||
return -1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -88,13 +91,17 @@ int _read(int file, char *buf, int len)
|
||||
* @param [in] len length of the buffer
|
||||
* @returns the number of bytes written
|
||||
*/
|
||||
int _write(int file, char *buf, int len)
|
||||
int _write( int file,
|
||||
char * buf,
|
||||
int len )
|
||||
{
|
||||
int todo;
|
||||
|
||||
for (todo = 0; todo < len; todo++){
|
||||
UART_DR(UART0_ADDR) = *buf++;
|
||||
for( todo = 0; todo < len; todo++ )
|
||||
{
|
||||
UART_DR( UART0_ADDR ) = *buf++;
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
@@ -104,20 +111,20 @@ int _write(int file, char *buf, int len)
|
||||
* @returns the previous top of the heap
|
||||
* @note uses a global variable <b>heap_end</b> to keep track of the previous top
|
||||
*/
|
||||
void* _sbrk(int incr)
|
||||
void * _sbrk( int incr )
|
||||
{
|
||||
char *prev_heap_end;
|
||||
char * prev_heap_end;
|
||||
|
||||
if (heap_end == 0)
|
||||
if( heap_end == 0 )
|
||||
{
|
||||
heap_end = (void*) &_heap_bottom;
|
||||
heap_end = ( void * ) &_heap_bottom;
|
||||
}
|
||||
|
||||
prev_heap_end = heap_end;
|
||||
|
||||
if ((heap_end + incr) > (void*)&_heap_top)
|
||||
if( ( heap_end + incr ) > ( void * ) &_heap_top )
|
||||
{
|
||||
return (void*)-1;
|
||||
return ( void * ) -1;
|
||||
}
|
||||
|
||||
heap_end += incr;
|
||||
@@ -126,5 +133,5 @@ void* _sbrk(int incr)
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user