MPS2_AN385 improvements (#1225)

* MPS2_AN385 improvements

Sync various MPS2_AN385 CORTEX-M3 QEMU targets and improve their
Makefiles and cleanup gcc support:
- FreeRTOS-Plus/Demo/FreeRTOS_Plus_TCP_Echo_Qemu_mps2:
  - Makefile
    - output image size after linking
    - move -nostartfiles from compiler to linker flags
    - modernize compiler warning flags
    - add --gc-sections to linker flags
  - TCPEchoClient_SingleTasks.c: fix compiler warnings
  - main.c: fix compiler warnings (remove unused code)
  - main_networking.c
    - remove ipLOCAL_MAC_ADDRESS (unknown)
    - fix compiler warnings about unused params
  - startup.c: main(void), remove unused includes,
    silence  unused params
  - syscalls.c: remove unused defines, silence unused params,
    more compact _sbrk()
- FreeRTOS/Demo/CORTEX_MPS2_QEMU_IAR_GCC/build/gcc:
  - Makefile
    - CFLAGS/LDFLAGS in more readable lines
    - move -nostartfiles to linker flags
    - comment out -specs=rdimon.specs as it is not needed
  - startup_gcc.c: fix typo in comment, remove unused uart code
- FreeRTOS/Demo/CORTEX_MPU_M3_MPS2_QEMU_GCC
  - Makefile
    - after compilation output size of image
    - remove -DQEMU_SOC_MPS2, not needed
    - update many CFLAGS/LDFLAGS settings to more modern gcc/source
    - -ffunction-sections -fdata-sections is moved to CFLAGS
  - startup.c: sync with other ports
  - syscall.c: _write(): param buf is not unused, silence unused params

Signed-off-by: Florian La Roche <Florian.LaRoche@gmail.com>

* remove ipLOCAL_MAC_ADDRESS completely and fix formatting errors

remove ipLOCAL_MAC_ADDRESS completely and fix formatting errors

Signed-off-by: Florian La Roche <Florian.LaRoche@gmail.com>
This commit is contained in:
Florian La Roche 2024-06-04 16:38:16 +02:00 committed by GitHub
parent 49bbe71166
commit 995a030a92
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 122 additions and 109 deletions

View file

@ -1,4 +1,5 @@
CC = arm-none-eabi-gcc CC = arm-none-eabi-gcc
SIZE = arm-none-eabi-size
BIN := freertos_tcp_mps2_demo.axf BIN := freertos_tcp_mps2_demo.axf
BUILD_DIR := build BUILD_DIR := build
@ -51,30 +52,33 @@ SOURCE_FILES += ${FREERTOS_TCP}/source/portable/BufferManagement/BufferAllocatio
SOURCE_FILES += ${FREERTOS_TCP}/source/portable/NetworkInterface/MPS2_AN385/NetworkInterface.c SOURCE_FILES += ${FREERTOS_TCP}/source/portable/NetworkInterface/MPS2_AN385/NetworkInterface.c
SOURCE_FILES += ${FREERTOS_TCP}/source/portable/NetworkInterface/MPS2_AN385/ether_lan9118/smsc9220_eth_drv.c SOURCE_FILES += ${FREERTOS_TCP}/source/portable/NetworkInterface/MPS2_AN385/ether_lan9118/smsc9220_eth_drv.c
DEFINES := -DQEMU_SOC_MPS2 -DHEAP3 DEFINES := -DHEAP3
CPPFLAGS += $(DEFINES)
LDFLAGS = -T mps2_m3.ld -specs=nano.specs --specs=rdimon.specs -lc -lrdimon
LDFLAGS += -Xlinker -Map=${BUILD_DIR}/output.map
CFLAGS += -nostartfiles -mthumb -mcpu=cortex-m3 -Wno-error=implicit-function-declaration
CFLAGS += -Wno-builtin-declaration-mismatch -Werror
CFLAGS += -mthumb -mcpu=cortex-m3
ifeq ($(DEBUG), 1) ifeq ($(DEBUG), 1)
CFLAGS += -ggdb3 -Og CFLAGS += -g3 -Og -ffunction-sections -fdata-sections
else else
CFLAGS += -O3 CFLAGS += -Os -ffunction-sections -fdata-sections
endif endif
CFLAGS += -fstrict-aliasing -Wstrict-aliasing -Wno-error=address-of-packed-member CFLAGS += -MMD
CFLAGS += -Wall -Wextra -Wshadow
#CFLAGS += -Wpedantic -fanalyzer
#CFLAGS += -flto
CFLAGS += $(INCLUDE_DIRS)
LDFLAGS = -T mps2_m3.ld
LDFLAGS += -Xlinker -Map=${BUILD_DIR}/output.map
LDFLAGS += -Xlinker --gc-sections
LDFLAGS += -nostartfiles -specs=nano.specs -specs=nosys.specs -specs=rdimon.specs
OBJ_FILES := $(SOURCE_FILES:%.c=$(BUILD_DIR)/%.o) OBJ_FILES := $(SOURCE_FILES:%.c=$(BUILD_DIR)/%.o)
CPPFLAGS += $(DEFINES)
CFLAGS += $(INCLUDE_DIRS)
.PHONY: clean .PHONY: clean
$(BUILD_DIR)/$(BIN) : $(OBJ_FILES) $(BUILD_DIR)/$(BIN) : $(OBJ_FILES)
$(CC) -ffunction-sections -fdata-sections $(CFLAGS) $(LDFLAGS) $+ -o $(@) $(CC) $(CFLAGS) $(LDFLAGS) $+ -o $(@)
$(SIZE) $(@)
%.d: %.c %.d: %.c
@set -e; rm -f $@; \ @set -e; rm -f $@; \
@ -87,7 +91,7 @@ INCLUDES := $(SOURCE_FILES:%.c=$(BUILD_DIR)/%.d)
${BUILD_DIR}/%.o : %.c Makefile ${BUILD_DIR}/%.o : %.c Makefile
-mkdir -p $(@D) -mkdir -p $(@D)
$(CC) $(CPPFLAGS) $(CFLAGS) -MMD -c $< -o $@ $(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@
clean: clean:
-rm -rf build -rm -rf build

View file

@ -206,10 +206,10 @@
lStringLength = prvCreateTxData( pcTransmittedString, echoBUFFER_SIZES ); lStringLength = prvCreateTxData( pcTransmittedString, echoBUFFER_SIZES );
/* Add in some unique text at the front of the string. */ /* Add in some unique text at the front of the string. */
sprintf( pcTransmittedString, "TxRx message number %u", ulTxCount ); sprintf( pcTransmittedString, "TxRx message number %lu", ulTxCount );
ulTxCount++; ulTxCount++;
printf( "sending data to the echo server size %d original %d\n", printf( "sending data to the echo server size %ld original %d\n",
lStringLength, lStringLength,
echoBUFFER_SIZES ); echoBUFFER_SIZES );
/* Send the string to the socket. */ /* Send the string to the socket. */
@ -217,7 +217,7 @@
( void * ) pcTransmittedString, /* The data being sent. */ ( void * ) pcTransmittedString, /* The data being sent. */
lStringLength, /* The length of the data being sent. */ lStringLength, /* The length of the data being sent. */
0 ); /* No flags. */ 0 ); /* No flags. */
printf( "FreeRTOS_send returned...transmitted %d\n", printf( "FreeRTOS_send returned...transmitted %ld\n",
lTransmitted ); lTransmitted );
if( lTransmitted < 0 ) if( lTransmitted < 0 )
@ -398,15 +398,24 @@
#if ( ipconfigIPv4_BACKWARD_COMPATIBLE == 1 ) #if ( ipconfigIPv4_BACKWARD_COMPATIBLE == 1 )
eDHCPCallbackAnswer_t xApplicationDHCPHook( eDHCPCallbackPhase_t eDHCPPhase, eDHCPCallbackAnswer_t xApplicationDHCPHook( eDHCPCallbackPhase_t eDHCPPhase,
uint32_t ulIPAddress ) uint32_t ulIPAddress )
{
( void ) eDHCPPhase;
( void ) ulIPAddress;
return eDHCPContinue;
}
#else /* ( ipconfigIPv4_BACKWARD_COMPATIBLE == 1 ) */ #else /* ( ipconfigIPv4_BACKWARD_COMPATIBLE == 1 ) */
eDHCPCallbackAnswer_t xApplicationDHCPHook_Multi( eDHCPCallbackPhase_t eDHCPPhase, eDHCPCallbackAnswer_t xApplicationDHCPHook_Multi( eDHCPCallbackPhase_t eDHCPPhase,
struct xNetworkEndPoint * pxEndPoint, struct xNetworkEndPoint * pxEndPoint,
IP_Address_t * pxIPAddress ) IP_Address_t * pxIPAddress )
{
( void ) eDHCPPhase;
( void ) pxEndPoint;
( void ) pxIPAddress;
return eDHCPContinue;
}
#endif /* ( ipconfigIPv4_BACKWARD_COMPATIBLE == 1 ) */ #endif /* ( ipconfigIPv4_BACKWARD_COMPATIBLE == 1 ) */
{
/* Provide a stub for this function. */
return eDHCPContinue;
}
#endif /* if ( ipconfigUSE_DHCP_HOOK != 0 )*/ #endif /* if ( ipconfigUSE_DHCP_HOOK != 0 )*/

View file

@ -40,9 +40,7 @@ void main_tcp_echo_client_tasks( void );
void vApplicationIdleHook( void ); void vApplicationIdleHook( void );
void vApplicationTickHook( void ); void vApplicationTickHook( void );
extern void initialise_monitor_handles( void ); int main( void )
int main()
{ {
main_tcp_echo_client_tasks(); main_tcp_echo_client_tasks();
return 0; return 0;
@ -84,8 +82,6 @@ void vApplicationStackOverflowHook( TaskHandle_t pxTask,
void vApplicationIdleHook( void ) void vApplicationIdleHook( void )
{ {
volatile size_t xFreeHeapSpace;
/* This is just a trivial example of an idle hook. It is called on each /* 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 * 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 * idle task just queries the amount of FreeRTOS heap that remains. See the

View file

@ -180,8 +180,6 @@ void main_tcp_echo_client_tasks( void )
} }
#endif /* ( ipconfigUSE_DHCP != 0 ) */ #endif /* ( ipconfigUSE_DHCP != 0 ) */
memcpy( ipLOCAL_MAC_ADDRESS, ucMACAddress, sizeof( ucMACAddress ) );
FreeRTOS_IPInit_Multi(); FreeRTOS_IPInit_Multi();
#else /* if defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) */ #else /* if defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) */
/* Using the old /single /IPv4 library, or using backward compatible mode of the new /multi library. */ /* Using the old /single /IPv4 library, or using backward compatible mode of the new /multi library. */
@ -224,6 +222,10 @@ BaseType_t xTasksAlreadyCreated = pdFALSE;
uint32_t ulDNSServerAddress; uint32_t ulDNSServerAddress;
char cBuffer[ 16 ]; char cBuffer[ 16 ];
#if defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 )
( void ) pxEndPoint;
#endif /* defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) */
/* If the network has just come up...*/ /* If the network has just come up...*/
if( eNetworkEvent == eNetworkUp ) if( eNetworkEvent == eNetworkUp )
{ {
@ -335,6 +337,10 @@ static void prvMiscInitialisation( void )
{ {
BaseType_t xReturn; BaseType_t xReturn;
#if defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 )
( void ) pxEndPoint;
#endif /* defined( ipconfigIPv4_BACKWARD_COMPATIBLE ) && ( ipconfigIPv4_BACKWARD_COMPATIBLE == 0 ) */
/* Determine if a name lookup is for this node. Two names are given /* Determine if a name lookup is for this node. Two names are given
* to this node: that returned by pcApplicationHostnameHook() and that set * to this node: that returned by pcApplicationHostnameHook() and that set
* by mainDEVICE_NICK_NAME. */ * by mainDEVICE_NICK_NAME. */

View file

@ -28,15 +28,14 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include "CMSIS/CMSDK_CM3.h"
#include "CMSIS/core_cm3.h"
extern void vPortSVCHandler( void ); extern void vPortSVCHandler( void );
extern void xPortPendSVHandler( void ); extern void xPortPendSVHandler( void );
extern void xPortSysTickHandler( void ); extern void xPortSysTickHandler( void );
extern void uart_init(); extern void uart_init( void );
extern int main(); extern int main( void );
void _start( void );
void __attribute__( ( weak ) ) EthernetISR( void ); void __attribute__( ( weak ) ) EthernetISR( void );
extern uint32_t _estack, _sidata, _sdata, _edata, _sbss, _ebss; extern uint32_t _estack, _sidata, _sdata, _edata, _sbss, _ebss;
@ -63,7 +62,6 @@ void Reset_Handler( void )
} }
/* jump to board initialisation */ /* jump to board initialisation */
void _start( void );
_start(); _start();
} }
@ -96,6 +94,16 @@ void prvGetRegistersFromStack( uint32_t * pulFaultStackAddress )
for( ; ; ) for( ; ; )
{ {
} }
/* Remove the warning about unused variables. */
( void ) r0;
( void ) r1;
( void ) r2;
( void ) r3;
( void ) r12;
( void ) lr;
( void ) pc;
( void ) psr;
} }
static void Default_Handler( void ) __attribute__( ( naked ) ); static void Default_Handler( void ) __attribute__( ( naked ) );
@ -114,7 +122,8 @@ void Default_Handler( void )
"NVIC_INT_CTRL_CONST: .word 0xe000ed04\n" "NVIC_INT_CTRL_CONST: .word 0xe000ed04\n"
); );
} }
static void HardFault_Handler( void ) __attribute__( ( naked ) );
static void Default_Handler2( void ) __attribute__( ( naked ) );
void Default_Handler2( void ) void Default_Handler2( void )
{ {
__asm volatile __asm volatile
@ -158,7 +167,7 @@ void Default_Handler6( void )
} }
} }
const uint32_t * isr_vector[] __attribute__( ( section( ".isr_vector" ) ) ) = const uint32_t * const isr_vector[] __attribute__( ( section( ".isr_vector" ) ) ) =
{ {
( uint32_t * ) &_estack, ( uint32_t * ) &_estack,
( uint32_t * ) &Reset_Handler, /* Reset -15 */ ( uint32_t * ) &Reset_Handler, /* Reset -15 */
@ -195,7 +204,7 @@ const uint32_t * isr_vector[] __attribute__( ( section( ".isr_vector" ) ) ) =
void _start( void ) void _start( void )
{ {
uart_init(); uart_init();
main( 0, 0 ); main();
exit( 0 ); exit( 0 );
} }
@ -212,4 +221,6 @@ __attribute__( ( naked ) ) void exit( int status )
"bkpt 0xab\n" "bkpt 0xab\n"
"end: b end\n" "end: b end\n"
); );
( void ) status;
} }

View file

@ -38,24 +38,21 @@ typedef struct UART_t
volatile uint32_t BAUDDIV; volatile uint32_t BAUDDIV;
} UART_t; } UART_t;
#define UART0_ADDR ( ( UART_t * ) ( 0x40004000 ) ) #define UART0_ADDR ( ( UART_t * ) ( 0x40004000 ) )
#define UART_DR( baseaddr ) ( *( unsigned int * ) ( baseaddr ) ) #define UART_DR( baseaddr ) ( *( unsigned int * ) ( baseaddr ) )
#define UART_STATE_TXFULL ( 1 << 0 ) #define UART_CTRL_TX_EN ( 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_bottom;
extern unsigned long _heap_top; extern unsigned long _heap_top;
extern unsigned long g_ulBase;
static void * heap_end = 0; static char * heap_end = ( char * ) &_heap_bottom;
/** /**
* @brief initializes the UART emulated hardware * @brief initializes the UART emulated hardware
*/ */
void uart_init() void uart_init( void )
{ {
UART0_ADDR->BAUDDIV = 16; UART0_ADDR->BAUDDIV = 16;
UART0_ADDR->CTRL = UART_CTRL_TX_EN; UART0_ADDR->CTRL = UART_CTRL_TX_EN;
@ -68,6 +65,7 @@ void uart_init()
*/ */
int _fstat( int file ) int _fstat( int file )
{ {
( void ) file;
return 0; return 0;
} }
@ -80,6 +78,9 @@ int _read( int file,
char * buf, char * buf,
int len ) int len )
{ {
( void ) file;
( void ) buf;
( void ) len;
return -1; return -1;
} }
@ -97,6 +98,8 @@ int _write( int file,
{ {
int todo; int todo;
( void ) file;
for( todo = 0; todo < len; todo++ ) for( todo = 0; todo < len; todo++ )
{ {
UART_DR( UART0_ADDR ) = *buf++; UART_DR( UART0_ADDR ) = *buf++;
@ -113,16 +116,9 @@ int _write( int file,
*/ */
void * _sbrk( int incr ) void * _sbrk( int incr )
{ {
char * prev_heap_end; void * prev_heap_end = heap_end;
if( heap_end == 0 ) if( ( heap_end + incr ) > ( char * ) &_heap_top )
{
heap_end = ( void * ) &_heap_bottom;
}
prev_heap_end = heap_end;
if( ( heap_end + incr ) > ( void * ) &_heap_top )
{ {
return ( void * ) -1; return ( void * ) -1;
} }

View file

@ -9,13 +9,20 @@ LD = arm-none-eabi-gcc
SIZE = arm-none-eabi-size SIZE = arm-none-eabi-size
MAKE = make MAKE = make
CFLAGS += -ffreestanding -mthumb -mcpu=cortex-m3
CFLAGS += $(INCLUDE_DIRS) -nostartfiles -ffreestanding -mthumb -mcpu=cortex-m3 \ CFLAGS += -Wall -Wextra -Wshadow
-Wall -Wextra -g3 -Os -ffunction-sections -fdata-sections \ CFLAGS += -g3 -Os -ffunction-sections -fdata-sections
-MMD -MP -MF"$(@:%.o=%.d)" -MT $@ CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)" -MT $@
#CFLAGS += -std=c99
#CFLAGS += -Wpedantic -Wshadow -fanalyzer #CFLAGS += -Wpedantic -fanalyzer
#CFLAGS += -flto #CFLAGS += -flto
CFLAGS += $(INCLUDE_DIRS)
LDFLAGS = -T ./mps2_m3.ld
LDFLAGS += -Xlinker -Map=$(OUTPUT_DIR)/RTOSDemo.map
LDFLAGS += -Xlinker --gc-sections
LDFLAGS += -nostartfiles
LDFLAGS += -specs=nano.specs -specs=nosys.specs # -specs=rdimon.specs
# #
# Kernel build. # Kernel build.
@ -106,9 +113,7 @@ $(IMAGE): ./mps2_m3.ld $(OBJS_OUTPUT) Makefile
@echo "" @echo ""
@echo "--- Final linking ---" @echo "--- Final linking ---"
@echo "" @echo ""
$(LD) $(OBJS_OUTPUT) $(CFLAGS) -Xlinker --gc-sections -Xlinker -T ./mps2_m3.ld \ $(LD) $(CFLAGS) $(LDFLAGS) $(OBJS_OUTPUT) -o $(IMAGE)
-Xlinker -Map=$(OUTPUT_DIR)/RTOSDemo.map -specs=nano.specs \
-specs=nosys.specs -specs=rdimon.specs -o $(IMAGE)
$(SIZE) $(IMAGE) $(SIZE) $(IMAGE)
$(DEP_OUTPUT): $(DEP_OUTPUT):

View file

@ -27,22 +27,6 @@
#include <stdint.h> #include <stdint.h>
#include <stdio.h> #include <stdio.h>
/* UART peripheral register addresses and bits. */
#define UART0_ADDR ( ( UART_t * ) ( 0x40004000 ) )
#define UART_DR( baseaddr ) ( *( uint32_t * ) ( baseaddr ) )
#define UART_STATE( baseaddr ) ( *( uint32_t * ) ( baseaddr + 4 ) )
#define UART_STATE_TXFULL ( 1 << 0 )
typedef struct UART_t
{
volatile uint32_t DATA;
volatile uint32_t STATE;
volatile uint32_t CTRL;
volatile uint32_t INTSTATUS;
volatile uint32_t BAUDDIV;
} UART_t;
/* FreeRTOS interrupt handlers. */ /* FreeRTOS interrupt handlers. */
extern void vPortSVCHandler( void ); extern void vPortSVCHandler( void );
extern void xPortPendSVHandler( void ); extern void xPortPendSVHandler( void );
@ -99,7 +83,7 @@ void Reset_Handler( void )
} }
/* Variables used to store the value of registers at the time a hardfault /* Variables used to store the value of registers at the time a hardfault
* occurs. These are volatile to try and prevent the compiler/linker optimising * occurs. These are volatile to try and prevent the compiler/linker optimizing
* them away as the variables never actually get used. */ * them away as the variables never actually get used. */
volatile uint32_t r0; volatile uint32_t r0;
volatile uint32_t r1; volatile uint32_t r1;

View file

@ -1,4 +1,5 @@
CC = arm-none-eabi-gcc CC = arm-none-eabi-gcc
SIZE = arm-none-eabi-size
BIN := RTOSDemo.axf BIN := RTOSDemo.axf
BUILD_DIR := build BUILD_DIR := build
@ -34,33 +35,23 @@ INCLUDE_DIRS += -I$(FREERTOS_DIR)/Demo/CORTEX_MPU_M3_MPS2_QEMU_GCC/C
INCLUDE_DIRS += -I$(KERNEL_DIR)/include INCLUDE_DIRS += -I$(KERNEL_DIR)/include
INCLUDE_DIRS += -I$(KERNEL_DIR)/portable/GCC/ARM_CM3_MPU INCLUDE_DIRS += -I$(KERNEL_DIR)/portable/GCC/ARM_CM3_MPU
DEFINES := -DQEMU_SOC_MPS2
DEFINES := -DHEAP4 DEFINES := -DHEAP4
CPPFLAGS += $(DEFINES) CPPFLAGS += $(DEFINES)
CFLAGS += -mcpu=cortex-m3 CFLAGS += -mthumb -mcpu=cortex-m3
CFLAGS += -Wno-error=implicit-function-declaration CFLAGS += -Wall -Wextra -Wshadow -Wno-unused-parameter
CFLAGS += -Wno-builtin-declaration-mismatch #CFLAGS += -Wpedantic -fanalyzer
CFLAGS += -Werror
CFLAGS += -Wall
CFLAGS += -Wextra
CFLAGS += -fstrict-aliasing
CFLAGS += -Wstrict-aliasing
CFLAGS += -Wno-error=address-of-packed-member
CFLAGS += -Wno-unused-parameter
CFLAGS += $(INCLUDE_DIRS) CFLAGS += $(INCLUDE_DIRS)
LDFLAGS = -T ./scripts/mps2_m3.ld LDFLAGS = -T ./scripts/mps2_m3.ld
LDFLAGS += -mthumb
LDFLAGS += -Xlinker -Map=${BUILD_DIR}/output.map LDFLAGS += -Xlinker -Map=${BUILD_DIR}/output.map
LDFLAGS += -Xlinker --gc-sections
LDFLAGS += -nostartfiles -nostdlib -nolibc -nodefaultlibs LDFLAGS += -nostartfiles -nostdlib -nolibc -nodefaultlibs
ifeq ($(DEBUG), 1) ifeq ($(DEBUG), 1)
CFLAGS += -ggdb3 -Og -save-temps=obj CFLAGS += -g3 -Og -ffunction-sections -fdata-sections -save-temps=obj
else else
CFLAGS += -O3 CFLAGS += -Os -ffunction-sections -fdata-sections
endif endif
ifeq ($(PICOLIBC), 1) ifeq ($(PICOLIBC), 1)
@ -73,7 +64,8 @@ OBJ_FILES := $(SOURCE_FILES:%.c=$(BUILD_DIR)/%.o)
.PHONY: clean .PHONY: clean
$(BUILD_DIR)/$(BIN) : $(OBJ_FILES) $(BUILD_DIR)/$(BIN) : $(OBJ_FILES)
$(CC) -ffunction-sections -fdata-sections $(LDFLAGS) $+ -o $(@) $(CC) $(CFLAGS) $(LDFLAGS) $+ -o $(@)
$(SIZE) $(@)
%.d: %.c %.d: %.c
@set -e; rm -f $@; \ @set -e; rm -f $@; \

View file

@ -35,7 +35,9 @@ extern void vPortSVCHandler( void );
extern void xPortPendSVHandler( void ); extern void xPortPendSVHandler( void );
extern void xPortSysTickHandler( void ); extern void xPortSysTickHandler( void );
extern void uart_init( void ); extern void uart_init( void );
extern int main(); extern int main( void );
void _start( void );
extern uint32_t _estack, _sidata, _sdata, _edata, _sbss, _ebss; extern uint32_t _estack, _sidata, _sdata, _edata, _sbss, _ebss;
@ -61,13 +63,12 @@ void Reset_Handler( void )
} }
/* jump to board initialisation */ /* jump to board initialisation */
void _start( void );
_start(); _start();
} }
void prvGetRegistersFromStack( uint32_t * pulFaultStackAddress ) void prvGetRegistersFromStack( uint32_t * pulFaultStackAddress )
{ {
/* These are volatile to try and prevent the compiler/linker optimising them /* These are volatile to try and prevent the compiler/linker optimizing them
* away as the variables never actually get used. If the debugger won't show the * 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 * values of the variables, make them global my moving their declaration outside
* of this function. */ * of this function. */
@ -122,6 +123,7 @@ void Default_Handler( void )
"NVIC_INT_CTRL_CONST: .word 0xe000ed04\n" "NVIC_INT_CTRL_CONST: .word 0xe000ed04\n"
); );
} }
static void HardFault_Handler( void ) __attribute__( ( naked ) ); static void HardFault_Handler( void ) __attribute__( ( naked ) );
void HardFault_Handler( void ) void HardFault_Handler( void )
{ {
@ -232,12 +234,12 @@ const uint32_t * const isr_vector[] __attribute__( ( section( ".isr_vector" ) )
void _start( void ) void _start( void )
{ {
uart_init(); uart_init();
main( 0, 0 ); main();
exit( 0 ); exit( 0 );
} }
__attribute__( ( naked ) ) __attribute__( ( naked ) )
void exit( __attribute__( ( unused ) ) int status ) void exit( int status )
{ {
/* Force qemu to exit using ARM Semihosting */ /* Force qemu to exit using ARM Semihosting */
__asm volatile ( __asm volatile (
@ -250,4 +252,6 @@ void exit( __attribute__( ( unused ) ) int status )
"bkpt 0xab\n" "bkpt 0xab\n"
"end: b end\n" "end: b end\n"
); );
( void ) status;
} }

View file

@ -37,7 +37,7 @@
void vApplicationIdleHook( void ); void vApplicationIdleHook( void );
void vApplicationTickHook( void ); void vApplicationTickHook( void );
int main() int main( void )
{ {
app_main(); app_main();
return 0; return 0;

View file

@ -69,7 +69,7 @@ void uart_init(void)
int int
_uart_putc(char c, FILE *file) _uart_putc(char c, FILE *file)
{ {
(void) file; ( void ) file;
UART_DR( UART0_ADDR ) = c; UART_DR( UART0_ADDR ) = c;
return (unsigned char) c; return (unsigned char) c;
} }
@ -90,8 +90,9 @@ static char * heap_end = ( char * ) &_heap_bottom;
* @todo implement if necessary * @todo implement if necessary
* *
*/ */
int _fstat( __attribute__( ( unused ) ) int file ) int _fstat( int file )
{ {
( void ) file;
return 0; return 0;
} }
@ -100,10 +101,13 @@ int _fstat( __attribute__( ( unused ) ) int file )
* @todo implement if necessary * @todo implement if necessary
* *
*/ */
int _read( __attribute__( ( unused ) ) int file, int _read( int file,
__attribute__( ( unused ) ) char * buf, char * buf,
__attribute__( ( unused ) ) int len ) int len )
{ {
( void ) file;
( void ) buf;
( void ) len;
return -1; return -1;
} }
@ -115,12 +119,14 @@ int _read( __attribute__( ( unused ) ) int file,
* @param [in] len length of the buffer * @param [in] len length of the buffer
* @returns the number of bytes written * @returns the number of bytes written
*/ */
int _write( __attribute__( ( unused ) ) int file, int _write( int file,
__attribute__( ( unused ) ) char * buf, char * buf,
int len ) int len )
{ {
int todo; int todo;
( void ) file;
for( todo = 0; todo < len; todo++ ) for( todo = 0; todo < len; todo++ )
{ {
UART_DR( UART0_ADDR ) = *buf++; UART_DR( UART0_ADDR ) = *buf++;