URL
https://opencores.org/ocsvn/neorv32/neorv32/trunk
Subversion Repositories neorv32
Compare Revisions
- This comparison shows the changes necessary to convert path
/neorv32/trunk/sw/example
- from Rev 21 to Rev 22
- ↔ Reverse comparison
Rev 21 → Rev 22
/blink_led/main.c
52,40 → 52,37
|
|
/**********************************************************************//** |
* Main function, shows an incrementing 8-bit timer on GPIO.output(7:0). |
* Main function; shows an incrementing 8-bit counter on GPIO.output(7:0). |
* |
* @note This program requires the GPIO to be synthesized (the UART is optional). |
* @note This program requires the GPIO controller to be synthesized (the UART is optional). |
* |
* @return Irrelevant. |
**************************************************************************/ |
int main() { |
|
// init UART at default baud rate, no rx interrupt, no tx interrupt |
neorv32_uart_setup(BAUD_RATE, 0, 0); |
|
// check if GPIO unit is implemented at all |
if (neorv32_gpio_available() == 0) { |
return 0; // nope, no GPIO unit synthesized :( |
neorv32_uart_print("Error! No GPIO unit synthesized!\n"); |
return 0; // nope, no GPIO unit synthesized |
} |
|
|
// capture all exceptions and give debug info via UART |
// this is not required, but keeps us safe |
neorv32_rte_setup(); |
|
|
// init UART at default baud rate, no rx interrupt, no tx interrupt |
neorv32_uart_setup(BAUD_RATE, 0, 0); |
|
// say hello |
neorv32_uart_print("Blinking LED demo program\n"); |
|
|
neorv32_gpio_port_set(0); // clear gpio output put |
|
int cnt = 0; |
|
while (1) { |
neorv32_gpio_port_set(cnt & 0xFF); // mask for lowest 8 bit |
neorv32_cpu_delay_ms(200); // wait 0.2s using busy wait |
cnt++; // increment counter |
neorv32_gpio_port_set(cnt++ & 0xFF); // increment counter and mask for lowest 8 bit |
neorv32_cpu_delay_ms(200); // wait 200ms using busy wait |
} |
|
return 0; |
/blink_led/makefile
86,7 → 86,7
# Application start-up code |
CORE_SRC += $(NEORV32_COM_PATH)/crt0.S |
|
# Default linker script |
# Linker script |
LD_SCRIPT = $(NEORV32_COM_PATH)/neorv32.ld |
|
# Main output files |
141,9 → 141,8
all: $(APP_ASM) $(APP_EXE) $(APP_IMG) |
|
# Check if making bootloader |
# This will disable some functions in crt0.S that are not relevant for the bootloader |
target bootloader: USER_FLAGS += -D__BOOTLOADER_START_CODE__ |
target bootloader: LD_SCRIPT = $(NEORV32_COM_PATH)/bootloader_neorv32.ld |
# Use different base address and legth for instruction memory/"rom" (BOOTMEM instead of IMEM) |
target bootloader: CC_OPTS += -Wl,--defsym=make_bootloader=1 |
|
|
# ----------------------------------------------------------------------------- |
262,7 → 261,6
@echo "---------------- Info: NEORV32 ----------------" |
@echo "NEORV32 home folder (NEORV32_HOME): $(NEORV32_HOME)" |
@echo "IMAGE_GEN: $(IMAGE_GEN)" |
@echo "LD script: $(LD_SCRIPT)" |
@echo "Core source files:" |
@echo "$(CORE_SRC)" |
@echo "Core include folder:" |
/coremark/core_main.c
97,11 → 97,11
// ----------------------------------------------- |
// Disable coremark compilation by default |
#ifndef RUN_COREMARK |
#warning COREMARK HAS NOT BEEN COMPILED! Use >>make USER_FLAGS+=-DRUN_COREMARK clean_all compile<< to compile it. |
#warning COREMARK HAS NOT BEEN COMPILED! Use >>make USER_FLAGS+=-DRUN_COREMARK clean_all exe<< to compile it. |
|
// inform the user if you are actually executing this |
portable_init(NULL, &argc, argv); |
ee_printf("ERROR! CoreMark has not been compiled. Use >>make USER_FLAGS+=-DRUN_COREMARK clean_all compile<< to compile it.\n"); |
ee_printf("ERROR! CoreMark has not been compiled. Use >>make USER_FLAGS+=-DRUN_COREMARK clean_all exe<< to compile it.\n"); |
|
return 0; |
#endif |
/coremark/core_portme.c
156,7 → 156,9
exe_time.uint64 = (uint64_t)elapsed_cycles; |
exe_instructions.uint64 = neorv32_cpu_get_instret(); |
|
neorv32_uart_printf("\nNEORV32: Executed instructions 0x%x_%x\n", (uint32_t)exe_instructions.uint32[1], (uint32_t)exe_instructions.uint32[0]); |
neorv32_uart_printf("\nNEORV32: All reported numbers only show the integer results.\n\n"); |
|
neorv32_uart_printf("NEORV32: Executed instructions 0x%x_%x\n", (uint32_t)exe_instructions.uint32[1], (uint32_t)exe_instructions.uint32[0]); |
neorv32_uart_printf("NEORV32: CoreMark core clock cycles 0x%x_%x\n", (uint32_t)exe_time.uint32[1], (uint32_t)exe_time.uint32[0]); |
|
uint64_t average_cpi = exe_time.uint64 / exe_instructions.uint64; |
/coremark/makefile
86,7 → 86,7
# Application start-up code |
CORE_SRC += $(NEORV32_COM_PATH)/crt0.S |
|
# Default linker script |
# Linker script |
LD_SCRIPT = $(NEORV32_COM_PATH)/neorv32.ld |
|
# Main output files |
141,9 → 141,8
all: $(APP_ASM) $(APP_EXE) $(APP_IMG) |
|
# Check if making bootloader |
# This will disable some functions in crt0.S that are not relevant for the bootloader |
target bootloader: USER_FLAGS += -D__BOOTLOADER_START_CODE__ |
target bootloader: LD_SCRIPT = $(NEORV32_COM_PATH)/bootloader_neorv32.ld |
# Use different base address and legth for instruction memory/"rom" (BOOTMEM instead of IMEM) |
target bootloader: CC_OPTS += -Wl,--defsym=make_bootloader=1 |
|
|
# ----------------------------------------------------------------------------- |
262,7 → 261,6
@echo "---------------- Info: NEORV32 ----------------" |
@echo "NEORV32 home folder (NEORV32_HOME): $(NEORV32_HOME)" |
@echo "IMAGE_GEN: $(IMAGE_GEN)" |
@echo "LD script: $(LD_SCRIPT)" |
@echo "Core source files:" |
@echo "$(CORE_SRC)" |
@echo "Core include folder:" |
/cpu_test/main.c
107,12 → 107,10
uint32_t uint32[sizeof(uint64_t)/2]; |
} cpu_systime; |
|
|
// reset performance counter |
neorv32_cpu_set_minstret(0); |
neorv32_cpu_set_mcycle(0); |
|
|
// check if UART unit is implemented at all |
if (neorv32_uart_available() == 0) { |
return 0; |
123,11 → 121,9
return 0; |
} |
|
|
// init UART at default baud rate, no rx interrupt, no tx interrupt |
neorv32_uart_setup(BAUD_RATE, 0, 0); |
|
|
neorv32_mtime_set_time(0); |
// set CMP of machine system timer MTIME to max to prevent an IRQ |
uint64_t mtime_cmp_max = 0xFFFFFFFFFFFFFFFFL; |
134,11 → 130,14
neorv32_mtime_set_timecmp(mtime_cmp_max); |
|
// intro |
neorv32_uart_printf("\n\n-==== CPU TEST ====-\n\n"); |
neorv32_uart_printf("\n\n--- CPU TEST ---\n\n"); |
|
// show project credits |
neorv32_rte_print_credits(); |
|
// show project license |
neorv32_rte_print_license(); |
|
// show full HW config report |
neorv32_rte_print_hw_config(); |
|
227,6 → 226,7
neorv32_uart_printf("skipped (disabled)\n"); |
#endif |
|
|
// ---------------------------------------------------------- |
// Data memory test |
// ---------------------------------------------------------- |
260,7 → 260,6
#endif |
|
|
|
// ---------------------------------------------------------- |
// Test time[h] (must be == MTIME) |
// ---------------------------------------------------------- |
367,7 → 366,7
#endif |
} |
else { |
neorv32_uart_printf("skipped (not possible when C-EXT enabled)\n"); |
neorv32_uart_printf("skipped (not possible when C extension is enabled)\n"); |
} |
|
|
405,7 → 404,7
}; |
|
tmp_a = (uint32_t)&dummy_sub_program; // call the dummy sub program |
asm volatile ( "jalr ra, %0 " : "=r" (tmp_a) : "r" (tmp_a)); |
asm volatile ("jalr ra, %[input_i]" : : [input_i] "r" (tmp_a)); |
|
#if (DETAILED_EXCEPTION_DEBUG==0) |
if (exception_handler_answer == TRAP_CODE_I_ILLEGAL) { |
435,7 → 434,7
}; |
|
tmp_a = (uint32_t)&dummy_sub_program_ci; // call the dummy sub program |
asm volatile ( "jalr ra, %0 " : "=r" (tmp_a) : "r" (tmp_a)); |
asm volatile ("jalr ra, %[input_i]" : : [input_i] "r" (tmp_a)); |
|
#if (DETAILED_EXCEPTION_DEBUG==0) |
if (exception_handler_answer == TRAP_CODE_I_ILLEGAL) { |
/cpu_test/makefile
86,7 → 86,7
# Application start-up code |
CORE_SRC += $(NEORV32_COM_PATH)/crt0.S |
|
# Default linker script |
# Linker script |
LD_SCRIPT = $(NEORV32_COM_PATH)/neorv32.ld |
|
# Main output files |
141,9 → 141,8
all: $(APP_ASM) $(APP_EXE) $(APP_IMG) |
|
# Check if making bootloader |
# This will disable some functions in crt0.S that are not relevant for the bootloader |
target bootloader: USER_FLAGS += -D__BOOTLOADER_START_CODE__ |
target bootloader: LD_SCRIPT = $(NEORV32_COM_PATH)/bootloader_neorv32.ld |
# Use different base address and legth for instruction memory/"rom" (BOOTMEM instead of IMEM) |
target bootloader: CC_OPTS += -Wl,--defsym=make_bootloader=1 |
|
|
# ----------------------------------------------------------------------------- |
262,7 → 261,6
@echo "---------------- Info: NEORV32 ----------------" |
@echo "NEORV32 home folder (NEORV32_HOME): $(NEORV32_HOME)" |
@echo "IMAGE_GEN: $(IMAGE_GEN)" |
@echo "LD script: $(LD_SCRIPT)" |
@echo "Core source files:" |
@echo "$(CORE_SRC)" |
@echo "Core include folder:" |
/demo_freeRTOS/blinky_demo/main_blinky.c
0,0 → 1,209
/* |
* 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! |
*/ |
|
#ifdef RUN_FREERTOS_DEMO |
|
/****************************************************************************** |
* NOTE 1: 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 in main.c is used to select |
* between the two. See the notes on using mainCREATE_SIMPLE_BLINKY_DEMO_ONLY |
* in main.c. This file implements the simply blinky style version. |
* |
* NOTE 2: This file only contains the source code that is specific to the |
* basic demo. Generic functions, such FreeRTOS hook functions, and functions |
* required to configure the hardware are defined in main.c. |
****************************************************************************** |
* |
* main_blinky() creates one queue, and two tasks. It then starts the |
* scheduler. |
* |
* The Queue Send Task: |
* The queue send task is implemented by the prvQueueSendTask() function in |
* this file. prvQueueSendTask() sits in a loop that causes it to repeatedly |
* block for 1000 milliseconds, before sending the value 100 to the queue that |
* was created within main_blinky(). Once the value is sent, the task loops |
* back around to block for another 1000 milliseconds...and so on. |
* |
* The Queue Receive Task: |
* The queue receive task is implemented by the prvQueueReceiveTask() function |
* in this file. prvQueueReceiveTask() sits in a loop where it repeatedly |
* blocks on attempts to read data from the queue that was created within |
* main_blinky(). When data is received, the task checks the value of the |
* data, and if the value equals the expected 100, writes 'Blink' to the UART |
* (the UART is used in place of the LED to allow easy execution in QEMU). The |
* 'block time' parameter passed to the queue receive function specifies that |
* the task should be held in the Blocked state indefinitely to wait for data to |
* be available on the queue. The queue receive task will only leave the |
* Blocked state when the queue send task writes to the queue. As the queue |
* send task writes to the queue every 1000 milliseconds, the queue receive |
* task leaves the Blocked state every 1000 milliseconds, and therefore toggles |
* the LED every 200 milliseconds. |
*/ |
|
/* Standard includes. */ |
#include <stdio.h> |
#include <string.h> |
#include <unistd.h> |
|
/* Kernel includes. */ |
#include "FreeRTOS.h" |
#include "task.h" |
#include "queue.h" |
|
/* Priorities used by the tasks. */ |
#define mainQUEUE_RECEIVE_TASK_PRIORITY ( tskIDLE_PRIORITY + 2 ) |
#define mainQUEUE_SEND_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 ) |
|
/* The rate at which data is sent to the queue. The 200ms value is converted |
to ticks using the pdMS_TO_TICKS() macro. */ |
#define mainQUEUE_SEND_FREQUENCY_MS pdMS_TO_TICKS( 1000 ) |
|
/* The maximum number items the queue can hold. The priority of the receiving |
task is above the priority of the sending task, so the receiving task will |
preempt the sending task and remove the queue items each time the sending task |
writes to the queue. Therefore the queue will never have more than one item in |
it at any time, and even with a queue length of 1, the sending task will never |
find the queue full. */ |
#define mainQUEUE_LENGTH ( 1 ) |
|
/*-----------------------------------------------------------*/ |
|
/* |
* Called by main when mainCREATE_SIMPLE_BLINKY_DEMO_ONLY is set to 1 in |
* main.c. |
*/ |
void main_blinky( void ); |
|
/* |
* The tasks as described in the comments at the top of this file. |
*/ |
static void prvQueueReceiveTask( void *pvParameters ); |
static void prvQueueSendTask( void *pvParameters ); |
|
/*-----------------------------------------------------------*/ |
|
/* The queue used by both tasks. */ |
static QueueHandle_t xQueue = NULL; |
|
/*-----------------------------------------------------------*/ |
|
void main_blinky( void ) |
{ |
/* Create the queue. */ |
xQueue = xQueueCreate( mainQUEUE_LENGTH, sizeof( uint32_t ) ); |
|
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 * 2U, /* 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 * 2U, 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( ;; ); |
} |
/*-----------------------------------------------------------*/ |
|
static void prvQueueSendTask( void *pvParameters ) |
{ |
TickType_t xNextWakeTime; |
const unsigned long ulValueToSend = 100UL; |
BaseType_t xReturned; |
|
/* Remove compiler warning about unused parameter. */ |
( void ) pvParameters; |
|
/* Initialise xNextWakeTime - this only needs to be done once. */ |
xNextWakeTime = xTaskGetTickCount(); |
|
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. */ |
xReturned = xQueueSend( xQueue, &ulValueToSend, 0U ); |
configASSERT( xReturned == pdPASS ); |
} |
} |
/*-----------------------------------------------------------*/ |
|
static void prvQueueReceiveTask( void *pvParameters ) |
{ |
unsigned long ulReceivedValue; |
const unsigned long ulExpectedValue = 100UL; |
const char * const pcPassMessage = "Blink\r\n"; |
const char * const pcFailMessage = "Unexpected value received\r\n"; |
extern void vSendString( const char * const pcString ); |
extern void vToggleLED( void ); |
|
/* Remove compiler warning about unused parameter. */ |
( void ) pvParameters; |
|
for( ;; ) |
{ |
/* Wait until something arrives in the queue - this task will block |
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. */ |
if( ulReceivedValue == ulExpectedValue ) |
{ |
vSendString( pcPassMessage ); |
vToggleLED(); |
ulReceivedValue = 0U; |
} |
else |
{ |
vSendString( pcFailMessage ); |
} |
} |
} |
/*-----------------------------------------------------------*/ |
|
#endif |
/demo_freeRTOS/chip_specific_extensions/neorv32/freertos_risc_v_chip_specific_extensions.h
0,0 → 1,72
/* |
* FreeRTOS Kernel V10.3.1 |
* 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! |
*/ |
|
/* |
* The FreeRTOS kernel's RISC-V port is split between the the code that is |
* common across all currently supported RISC-V chips (implementations of the |
* RISC-V ISA), and code that tailors the port to a specific RISC-V chip: |
* |
* + FreeRTOS\Source\portable\GCC\RISC-V-RV32\portASM.S contains the code that |
* is common to all currently supported RISC-V chips. There is only one |
* portASM.S file because the same file is built for all RISC-V target chips. |
* |
* + Header files called freertos_risc_v_chip_specific_extensions.h contain the |
* code that tailors the FreeRTOS kernel's RISC-V port to a specific RISC-V |
* chip. There are multiple freertos_risc_v_chip_specific_extensions.h files |
* as there are multiple RISC-V chip implementations. |
* |
* !!!NOTE!!! |
* TAKE CARE TO INCLUDE THE CORRECT freertos_risc_v_chip_specific_extensions.h |
* HEADER FILE FOR THE CHIP IN USE. This is done using the assembler's (not the |
* compiler's!) include path. For example, if the chip in use includes a core |
* local interrupter (CLINT) and does not include any chip specific register |
* extensions then add the path below to the assembler's include path: |
* FreeRTOS\Source\portable\GCC\RISC-V-RV32\chip_specific_extensions\RV32I_CLINT_no_extensions |
* |
*/ |
|
/* |
* NEORV32 chip specific extensions |
*/ |
|
|
#ifndef __FREERTOS_RISC_V_EXTENSIONS_H__ |
#define __FREERTOS_RISC_V_EXTENSIONS_H__ |
|
#define portasmHAS_SIFIVE_CLINT 0 |
#define portasmHAS_MTIME 1 |
#define portasmADDITIONAL_CONTEXT_SIZE 0 /* Must be even number on 32-bit cores. */ |
|
.macro portasmSAVE_ADDITIONAL_REGISTERS |
/* No additional registers to save, so this macro does nothing. */ |
.endm |
|
.macro portasmRESTORE_ADDITIONAL_REGISTERS |
/* No additional registers to restore, so this macro does nothing. */ |
.endm |
|
#endif /* __FREERTOS_RISC_V_EXTENSIONS_H__ */ |
/demo_freeRTOS/FreeRTOSConfig.h
0,0 → 1,156
/* |
FreeRTOS V8.2.3 - Copyright (C) 2015 Real Time Engineers Ltd. |
All rights reserved |
|
VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. |
|
This file is part of the FreeRTOS distribution. |
|
FreeRTOS is free software; you can redistribute it and/or modify it under |
the terms of the GNU General Public License (version 2) as published by the |
Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. |
|
*************************************************************************** |
>>! NOTE: The modification to the GPL is included to allow you to !<< |
>>! distribute a combined work that includes FreeRTOS without being !<< |
>>! obliged to provide the source code for proprietary components !<< |
>>! outside of the FreeRTOS kernel. !<< |
*************************************************************************** |
|
FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY |
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
FOR A PARTICULAR PURPOSE. Full license text is available on the following |
link: http://www.freertos.org/a00114.html |
|
*************************************************************************** |
* * |
* FreeRTOS provides completely free yet professionally developed, * |
* robust, strictly quality controlled, supported, and cross * |
* platform software that is more than just the market leader, it * |
* is the industry's de facto standard. * |
* * |
* Help yourself get started quickly while simultaneously helping * |
* to support the FreeRTOS project by purchasing a FreeRTOS * |
* tutorial book, reference manual, or both: * |
* http://www.FreeRTOS.org/Documentation * |
* * |
*************************************************************************** |
|
http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading |
the FAQ page "My application does not run, what could be wrong?". Have you |
defined configASSERT()? |
|
http://www.FreeRTOS.org/support - In return for receiving this top quality |
embedded software for free we request you assist our global community by |
participating in the support forum. |
|
http://www.FreeRTOS.org/training - Investing in training allows your team to |
be as productive as possible as early as possible. Now you can receive |
FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers |
Ltd, and the world's leading authority on the world's leading RTOS. |
|
http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, |
including FreeRTOS+Trace - an indispensable productivity tool, a DOS |
compatible FAT file system, and our tiny thread aware UDP/IP stack. |
|
http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. |
Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. |
|
http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High |
Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS |
licenses offer ticketed support, indemnification and commercial middleware. |
|
http://www.SafeRTOS.com - High Integrity Systems also provide a safety |
engineered and independently SIL3 certified version for use in safety and |
mission critical applications that require provable dependability. |
|
1 tab == 4 spaces! |
*/ |
|
|
#ifndef FREERTOS_CONFIG_H |
#define FREERTOS_CONFIG_H |
|
//#include "clock_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 http://www.freertos.org/a00110.html. |
*----------------------------------------------------------*/ |
|
/* See https://www.freertos.org/Using-FreeRTOS-on-RISC-V.html */ |
#define configMTIME_BASE_ADDRESS ( 0xFFFFFF90UL ) |
#define configMTIMECMP_BASE_ADDRESS ( 0xFFFFFF98UL ) |
|
#define configISR_STACK_SIZE_WORDS ( 128 ) |
|
#define configUSE_PREEMPTION 1 |
#define configUSE_IDLE_HOOK 1 |
#define configUSE_TICK_HOOK 1 |
#define configCPU_CLOCK_HZ 100000000 |
#define configTICK_RATE_HZ ( ( TickType_t ) 100 ) |
#define configMAX_PRIORITIES ( 5 ) |
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 200 ) /* Can be as low as 60 but some of the demo tasks that use this constant require it to be higher. */ |
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 7 * 1024 ) ) |
#define configMAX_TASK_NAME_LEN ( 16 ) |
#define configUSE_TRACE_FACILITY 0 |
#define configUSE_16_BIT_TICKS 0 |
#define configIDLE_SHOULD_YIELD 0 |
#define configUSE_MUTEXES 1 |
#define configQUEUE_REGISTRY_SIZE 8 |
#define configCHECK_FOR_STACK_OVERFLOW 2 |
#define configUSE_RECURSIVE_MUTEXES 1 |
#define configUSE_MALLOC_FAILED_HOOK 1 |
#define configUSE_APPLICATION_TASK_TAG 0 |
#define configUSE_COUNTING_SEMAPHORES 1 |
#define configGENERATE_RUN_TIME_STATS 0 |
|
/* Co-routine definitions. */ |
#define configUSE_CO_ROUTINES 0 |
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) |
|
/* Software timer definitions. */ |
#define configUSE_TIMERS 1 |
#define configTIMER_TASK_PRIORITY ( configMAX_PRIORITIES - 1 ) |
#define configTIMER_QUEUE_LENGTH 4 |
#define configTIMER_TASK_STACK_DEPTH ( configMINIMAL_STACK_SIZE ) |
|
/* Task priorities. Allow these to be overridden. */ |
#ifndef uartPRIMARY_PRIORITY |
#define uartPRIMARY_PRIORITY ( configMAX_PRIORITIES - 3 ) |
#endif |
|
/* Set the following definitions to 1 to include the API function, or zero |
to exclude the API function. */ |
#define INCLUDE_vTaskPrioritySet 1 |
#define INCLUDE_uxTaskPriorityGet 1 |
#define INCLUDE_vTaskDelete 1 |
#define INCLUDE_vTaskCleanUpResources 1 |
#define INCLUDE_vTaskSuspend 1 |
#define INCLUDE_vTaskDelayUntil 1 |
#define INCLUDE_vTaskDelay 1 |
#define INCLUDE_eTaskGetState 1 |
#define INCLUDE_xTimerPendFunctionCall 1 |
#define INCLUDE_xTaskAbortDelay 1 |
#define INCLUDE_xTaskGetHandle 1 |
#define INCLUDE_xSemaphoreGetMutexHolder 1 |
|
// get runtime stats |
#define configGENERATE_RUN_TIME_STATS 0 |
|
/* Normal assert() semantics without relying on the provision of an assert.h |
header file. */ |
#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); __asm volatile( "ebreak" ); for( ;; ); } |
|
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0 |
#define configKERNEL_INTERRUPT_PRIORITY 7 |
|
|
#endif /* FREERTOS_CONFIG_H */ |
/demo_freeRTOS/README.md
0,0 → 1,59
# FreeRTOS Demo for the NEORV32 Processor |
|
This is simple example shows the usage of [FreeRTOS](https://www.freertos.org/) on the NEORV32 processor. It uses the default *blink* |
demo application (`blinky_demo/main_blinky.c`). See the comments in that source file for more information. |
|
The chip-specific extensions folder (`chip_specific_extensions/neorv32`) should be in `$(FREERTOS_HOME)/Source/portable/GCC/RISC-V/chip_specific_extensions`, |
but is placed in this source directory for simplicity. |
|
|
## Hardware Requirements |
|
* 8kB DMEM and 16kB IMEM |
* MTIME (machine timer) |
* `Zicsr` CPU extension |
|
|
## Instructions |
|
Download FreeRTOS from the [official GitHub repository](https://github.com/FreeRTOS/FreeRTOS). |
|
$ git clone https://github.com/FreeRTOS/FreeRTOS.git |
|
Open the makefile from this example folder and configure the `FREERTOS_HOME` variable to point to the `FreeRTOS/FreeRTOS` home folder. |
|
FREERTOS_HOME ?= /mnt/n/Projects/FreeRTOS/FreeRTOS |
|
Compile the NEORV32 executable. Do not forget the `RUN_FREERTOS_DEMO` switch. |
|
$ make USER_FLAGS+=-DRUN_FREERTOS_DEMO clean_all exe |
|
Note: The *.c sources and the FreeRTOS-specific part of the makefile have (include) guards that test if `RUN_FREERTOS_DEMO` is defined. |
This has no pratical usage for the user - it is just a work-around for the NEORV32 CI environment. |
|
Upload the executable (`neorv32_exe.bin`) to the processor via the bootloader and execute it. |
|
``` |
Awaiting neorv32_exe.bin... OK |
CMD:> e |
Booting... |
|
FreeRTOS V10.3.1 |
Blink |
Blink |
Blink |
``` |
|
|
## Note |
|
The onfiguration of the FreeRTOS home folder (via `FREERTOS_HOME`) is corrupted if the compiler shows the following error: |
|
``` |
main.c:36:10: fatal error: FreeRTOS.h: No such file or directory |
36 | #include <FreeRTOS.h> |
| ^~~~~~~~~~~~ |
compilation terminated. |
make: *** [makefile:203: main.c.o] Error 1 |
``` |
|
/demo_freeRTOS/main.c
0,0 → 1,196
/* |
* 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! |
*/ |
|
/* |
* Modified for the NEORV32 processor by Stephan Nolting. |
*/ |
|
#ifdef RUN_FREERTOS_DEMO |
|
|
/* FreeRTOS kernel includes. */ |
#include <FreeRTOS.h> |
#include <task.h> |
|
/* NEORV32 includes. */ |
#include <neorv32.h> |
|
|
#define BAUD_RATE 19200 |
|
|
/****************************************************************************** |
* 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! |
* |
*/ |
|
extern void main_blinky( void ); |
extern void freertos_risc_v_trap_handler( void ); |
|
/* Prototypes for the standard FreeRTOS callback/hook functions implemented |
within this file. See https://www.freertos.org/a00016.html */ |
void vApplicationMallocFailedHook( void ); |
void vApplicationIdleHook( void ); |
void vApplicationStackOverflowHook( TaskHandle_t pxTask, char *pcTaskName ); |
void vApplicationTickHook( void ); |
|
/* Prepare hardware to run the demo. */ |
static void prvSetupHardware( void ); |
|
/* Send a message to the UART initialised in prvSetupHardware. */ |
void vSendString( const char * const pcString ); |
|
/*-----------------------------------------------------------*/ |
|
int main( void ) |
{ |
prvSetupHardware(); |
|
neorv32_uart_printf("FreeRTOS %s\n", tskKERNEL_VERSION_NUMBER); |
|
main_blinky(); |
} |
|
/*-----------------------------------------------------------*/ |
|
static void prvSetupHardware( void ) |
{ |
// configure trap handler entry point |
neorv32_cpu_csr_write(CSR_MTVEC, (uint32_t)&freertos_risc_v_trap_handler); |
|
// configure UART for default baud rate, no rx interrupt, no tx interrupt |
neorv32_uart_setup(BAUD_RATE, 0, 0); |
} |
|
/*-----------------------------------------------------------*/ |
|
void vToggleLED( void ) |
{ |
neorv32_gpio_pin_toggle(0); |
} |
|
/*-----------------------------------------------------------*/ |
|
void vSendString( const char * const pcString ) |
{ |
neorv32_uart_print( (char *)pcString ); |
} |
|
/*-----------------------------------------------------------*/ |
|
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(); |
neorv32_uart_print("FreeRTOS_FAULT: vApplicationMallocFailedHook\n"); |
__asm volatile( "ebreak" ); |
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. */ |
neorv32_cpu_sleep(); |
} |
|
/*-----------------------------------------------------------*/ |
|
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. */ |
taskDISABLE_INTERRUPTS(); |
neorv32_uart_print("FreeRTOS_FAULT: vApplicationStackOverflowHook\n"); |
__asm volatile( "ebreak" ); |
for( ;; ); |
} |
|
/*-----------------------------------------------------------*/ |
|
void vApplicationTickHook( void ) |
{ |
|
} |
|
/*-----------------------------------------------------------*/ |
|
/* This handler is responsible for handling all interrupts. Only the machine timer interrupt is handled by the kernel. */ |
void SystemIrqHandler( uint32_t mcause ) |
{ |
neorv32_uart_printf("freeRTOS: Unknown interrupt (0x%x)\n", mcause); |
} |
|
|
|
|
|
// ---------- Primitive main in case this demo is not enabled (i.e. RUN_FREERTOS_DEMO is not defined) ---------- |
#else |
#warning FREERTOS DEMO HAS NOT BEEN COMPILED! Use >>make USER_FLAGS+=-DRUN_FREERTOS_DEMO clean_all exe<< to compile it. |
|
#include <neorv32.h> |
int main() { |
|
neorv32_uart_setup(19200, 0, 0); |
neorv32_uart_print("ERROR! FreeRTOS has not been compiled. Use >>make USER_FLAGS+=-DRUN_FREERTOS_DEMO clean_all exe<< to compile it.\n"); |
return 0; |
} |
#endif |
/demo_freeRTOS/makefile
0,0 → 1,355
################################################################################################# |
# << NEORV32 - Application Makefile >> # |
# ********************************************************************************************* # |
# Make sure to add the riscv GCC compiler's bin folder to your PATH environment variable. # |
# ********************************************************************************************* # |
# BSD 3-Clause License # |
# # |
# Copyright (c) 2020, Stephan Nolting. All rights reserved. # |
# # |
# 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. Neither the name of the copyright holder nor the names of its contributors may be used to # |
# endorse or promote products derived from this software without specific prior written # |
# permission. # |
# # |
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS # |
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # |
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # |
# COPYRIGHT HOLDER OR CONTRIBUTORS 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. # |
# ********************************************************************************************* # |
# The NEORV32 Processor - https://github.com/stnolting/neorv32 (c) Stephan Nolting # |
################################################################################################# |
|
|
# ***************************************************************************** |
# USER CONFIGURATION |
# ***************************************************************************** |
# User's application sources (*.c, *.cpp, *.s, *.S); add additional files here |
APP_SRC ?= $(wildcard ./*.c) $(wildcard ./*.s) $(wildcard ./*.cpp) $(wildcard ./*.S) |
|
# User's application include folders (don't forget the '-I' before each entry) |
APP_INC ?= -I . |
# User's application include folders - for assembly files only (don't forget the '-I' before each entry) |
ASM_INC ?= -I . |
|
# Optimization |
EFFORT ?= -Os |
|
# Compiler toolchain |
RISCV_TOOLCHAIN ?= riscv32-unknown-elf |
|
# CPU architecture and ABI |
MARCH ?= -march=rv32i |
MABI ?= -mabi=ilp32 |
|
# User flags for additional configuration (will be added to compiler flags) |
USER_FLAGS ?= |
|
# Relative or absolute path to the NEORV32 home folder |
NEORV32_HOME ?= ../../.. |
# ***************************************************************************** |
|
|
|
# ----------------------------------------------------------------------------- |
# FreeRTOS |
# ----------------------------------------------------------------------------- |
ifneq (,$(findstring RUN_FREERTOS_DEMO,$(USER_FLAGS))) |
# FreeRTOS home folder (adapt this!) |
FREERTOS_HOME ?= /mnt/n/Projects/FreeRTOS/FreeRTOS |
|
# Application |
APP_SRC += blinky_demo/main_blinky.c |
|
# FreeRTOS core |
APP_SRC += $(wildcard $(FREERTOS_HOME)/Source/*.c) |
APP_SRC += $(wildcard $(FREERTOS_HOME)/Source/portable/MemMang/heap_1.c) |
|
APP_INC += -I $(FREERTOS_HOME)/Source/include |
|
# FreeRTOS RISC-V specific |
APP_SRC += $(wildcard $(FREERTOS_HOME)/Source/portable/GCC/RISC-V/*.c) |
APP_SRC += $(FREERTOS_HOME)/Source/portable/GCC/RISC-V/portASM.S |
|
APP_INC += -I $(FREERTOS_HOME)/Source/portable/GCC/RISC-V |
|
# NEORV32 specific |
ASM_INC += -DportasmHANDLE_INTERRUPT=SystemIrqHandler |
|
APP_INC += -I chip_specific_extensions/neorv32 |
|
ASM_INC += -I chip_specific_extensions/neorv32 |
endif |
|
|
# ----------------------------------------------------------------------------- |
# NEORV32 framework |
# ----------------------------------------------------------------------------- |
# Path to NEORV32 linker script and startup file |
NEORV32_COM_PATH = $(NEORV32_HOME)/sw/common |
# Path to main NEORV32 library include files |
NEORV32_INC_PATH = $(NEORV32_HOME)/sw/lib/include |
# Path to main NEORV32 library source files |
NEORV32_SRC_PATH = $(NEORV32_HOME)/sw/lib/source |
# Path to NEORV32 executable generator |
NEORV32_EXG_PATH = $(NEORV32_HOME)/sw/image_gen |
# Path to NEORV32 core rtl folder |
NEORV32_RTL_PATH = $(NEORV32_HOME)/rtl/core |
# Marker file to check for NEORV32 home folder |
NEORV32_HOME_MARKER = $(NEORV32_INC_PATH)/neorv32.h |
|
# Core libraries (peripheral and CPU drivers) |
CORE_SRC = $(wildcard $(NEORV32_SRC_PATH)/*.c) |
# Application start-up code |
CORE_SRC += $(NEORV32_COM_PATH)/crt0.S |
|
# Linker script |
LD_SCRIPT = $(NEORV32_COM_PATH)/neorv32.ld |
|
# Main output files |
APP_EXE = neorv32_exe.bin |
APP_ASM = main.asm |
APP_IMG = neorv32_application_image.vhd |
BOOT_IMG = neorv32_bootloader_image.vhd |
|
|
# ----------------------------------------------------------------------------- |
# Sources and objects |
# ----------------------------------------------------------------------------- |
# Define all sources |
SRC = $(APP_SRC) |
SRC += $(CORE_SRC) |
|
# Define all object files |
OBJ = $(SRC:%=%.o) |
|
|
# ----------------------------------------------------------------------------- |
# Tools and flags |
# ----------------------------------------------------------------------------- |
# Compiler tools |
CC = $(RISCV_TOOLCHAIN)-gcc |
OBJDUMP = $(RISCV_TOOLCHAIN)-objdump |
OBJCOPY = $(RISCV_TOOLCHAIN)-objcopy |
SIZE = $(RISCV_TOOLCHAIN)-size |
|
# Host native compiler |
CC_X86 = gcc -Wall -O -g |
|
# NEORV32 executable image generator |
IMAGE_GEN = $(NEORV32_EXG_PATH)/image_gen |
|
# Compiler & linker flags |
CC_OPTS = $(MARCH) $(MABI) $(EFFORT) -Wall -ffunction-sections -fdata-sections -nostartfiles |
CC_OPTS += -Wl,--gc-sections -lm -lc -lgcc -lc |
CC_OPTS += $(USER_FLAGS) |
|
|
# ----------------------------------------------------------------------------- |
# Application output definitions |
# ----------------------------------------------------------------------------- |
.PHONY: check info help elf_info clean clean_all bootloader |
.DEFAULT_GOAL := help |
|
# 'compile' is still here for compatibility |
exe: $(APP_ASM) $(APP_EXE) |
compile: $(APP_ASM) $(APP_EXE) |
install: $(APP_ASM) $(APP_IMG) |
all: $(APP_ASM) $(APP_EXE) $(APP_IMG) |
|
# Check if making bootloader |
# Use different base address and legth for instruction memory/"rom" (BOOTMEM instead of IMEM) |
target bootloader: CC_OPTS += -Wl,--defsym=make_bootloader=1 |
|
|
# ----------------------------------------------------------------------------- |
# Image generator targets |
# ----------------------------------------------------------------------------- |
# install/compile tools |
$(IMAGE_GEN): $(NEORV32_EXG_PATH)/image_gen.cpp |
@echo Compiling $(IMAGE_GEN) |
@$(CC_X86) $< -o $(IMAGE_GEN) |
|
|
# ----------------------------------------------------------------------------- |
# General targets: Assemble, compile, link, dump |
# ----------------------------------------------------------------------------- |
# Compile app *.s sources (assembly) |
%.s.o: %.s |
@$(CC) -c $(CC_OPTS) -I $(NEORV32_INC_PATH) $(ASM_INC) $< -o $@ |
|
# Compile app *.S sources (assembly + C pre-processor) |
%.S.o: %.S |
@$(CC) -c $(CC_OPTS) -I $(NEORV32_INC_PATH) $(ASM_INC) $< -o $@ |
|
# Compile app *.c sources |
%.c.o: %.c |
@$(CC) -c $(CC_OPTS) -I $(NEORV32_INC_PATH) $(APP_INC) $< -o $@ |
|
# Compile app *.cpp sources |
%.cpp.o: %.cpp |
@$(CC) -c $(CC_OPTS) -I $(NEORV32_INC_PATH) $(APP_INC) $< -o $@ |
|
# Link object files and show memory utilization |
main.elf: $(OBJ) |
@$(CC) $(CC_OPTS) -T $(LD_SCRIPT) $(OBJ) -o $@ |
@echo "Memory utilization:" |
@$(SIZE) main.elf |
|
# Assembly listing file (for debugging) |
$(APP_ASM): main.elf |
@$(OBJDUMP) -D -S -z $< > $@ |
|
# Generate final executable from .text + .rodata + .data (in THIS order!) |
main.bin: main.elf $(APP_ASM) |
@$(OBJCOPY) -I elf32-little $< -j .text -O binary text.bin |
@$(OBJCOPY) -I elf32-little $< -j .rodata -O binary rodata.bin |
@$(OBJCOPY) -I elf32-little $< -j .data -O binary data.bin |
@cat text.bin rodata.bin data.bin > $@ |
@rm -f text.bin rodata.bin data.bin |
|
|
# ----------------------------------------------------------------------------- |
# Application targets: Generate binary executable, install (as VHDL file) |
# ----------------------------------------------------------------------------- |
# Generate NEORV32 executable image for upload via bootloader |
$(APP_EXE): main.bin $(IMAGE_GEN) |
@set -e |
@$(IMAGE_GEN) -app_bin $< $@ $(shell basename $(CURDIR)) |
@echo "Executable ($(APP_EXE)) size in bytes:" |
@wc -c < $(APP_EXE) |
|
# Generate NEORV32 executable VHDL boot image |
$(APP_IMG): main.bin $(IMAGE_GEN) |
@set -e |
@$(IMAGE_GEN) -app_img $< $@ $(shell basename $(CURDIR)) |
@echo "Installing application image to $(NEORV32_RTL_PATH)/$(APP_IMG)" |
@cp $(APP_IMG) $(NEORV32_RTL_PATH)/. |
|
|
# ----------------------------------------------------------------------------- |
# Bootloader targets |
# ----------------------------------------------------------------------------- |
# Create and install bootloader VHDL init image |
$(BOOT_IMG): main.bin $(IMAGE_GEN) |
@set -e |
@$(IMAGE_GEN) -bld_img $< $(BOOT_IMG) $(shell basename $(CURDIR)) |
@echo "Installing bootloader image to $(NEORV32_RTL_PATH)/$(BOOT_IMG)" |
@cp $(BOOT_IMG) $(NEORV32_RTL_PATH)/. |
|
# Just an alias that |
bootloader: $(BOOT_IMG) |
|
|
# ----------------------------------------------------------------------------- |
# Check toolchain |
# ----------------------------------------------------------------------------- |
check: $(IMAGE_GEN) |
@echo "---------------- Check: NEORV32_HOME folder ----------------" |
ifneq ($(shell [ -e $(NEORV32_HOME_MARKER) ] && echo 1 || echo 0 ), 1) |
$(error NEORV32_HOME folder not found!) |
endif |
@echo "NEORV32_HOME: $(NEORV32_HOME)" |
@echo "---------------- Check: $(CC) ----------------" |
@$(CC) -v |
@echo "---------------- Check: $(OBJDUMP) ----------------" |
@$(OBJDUMP) -V |
@echo "---------------- Check: $(OBJCOPY) ----------------" |
@$(OBJCOPY) -V |
@echo "---------------- Check: $(SIZE) ----------------" |
@$(SIZE) -V |
@echo "---------------- Check: NEORV32 image_gen ----------------" |
@$(IMAGE_GEN) -help |
@echo "---------------- Check: Native GCC ----------------" |
@$(CC_X86) -v |
@echo |
@echo "Toolchain check OK" |
|
|
# ----------------------------------------------------------------------------- |
# Show configuration |
# ----------------------------------------------------------------------------- |
info: |
@echo "---------------- Info: Project ----------------" |
@echo "Project folder: $(shell basename $(CURDIR))" |
@echo "Source files: $(APP_SRC)" |
@echo "Include folder(s): $(APP_INC)" |
@echo "ASM include folder(s): $(ASM_INC)" |
@echo "---------------- Info: NEORV32 ----------------" |
@echo "NEORV32 home folder (NEORV32_HOME): $(NEORV32_HOME)" |
@echo "IMAGE_GEN: $(IMAGE_GEN)" |
@echo "Core source files:" |
@echo "$(CORE_SRC)" |
@echo "Core include folder:" |
@echo "$(NEORV32_INC_PATH)" |
@echo "---------------- Info: Objects ----------------" |
@echo "Project object files:" |
@echo "$(OBJ)" |
@echo "---------------- Info: RISC-V CPU ----------------" |
@echo "MARCH: $(MARCH)" |
@echo "MABI: $(MABI)" |
@echo "---------------- Info: Toolchain ----------------" |
@echo "Toolchain: $(RISCV_TOLLCHAIN)" |
@echo "CC: $(CC)" |
@echo "OBJDUMP: $(OBJDUMP)" |
@echo "OBJCOPY: $(OBJCOPY)" |
@echo "SIZE: $(SIZE)" |
@echo "---------------- Info: Compiler Libraries ----------------" |
@echo "LIBGCC:" |
@$(CC) -print-libgcc-file-name |
@echo "SEARCH-DIRS:" |
@$(CC) -print-search-dirs |
@echo "---------------- Info: Flags ----------------" |
@echo "USER_FLAGS: $(USER_FLAGS)" |
@echo "CC_OPTS: $(CC_OPTS)" |
@echo "---------------- Info: Host Native GCC Flags ----------------" |
@echo "CC_X86: $(CC_X86)" |
|
|
# ----------------------------------------------------------------------------- |
# Show final ELF details (just for debugging) |
# ----------------------------------------------------------------------------- |
elf_info: main.elf |
@$(OBJDUMP) -x main.elf |
|
|
# ----------------------------------------------------------------------------- |
# Help |
# ----------------------------------------------------------------------------- |
help: |
@echo "<<< NEORV32 Application Makefile >>>" |
@echo "Make sure to add the bin folder of RISC-V GCC to your PATH variable." |
@echo "Targets:" |
@echo " help - show this text" |
@echo " check - check toolchain" |
@echo " info - show makefile/toolchain configuration" |
@echo " exe - compile and generate <neorv32_exe.bin> executable for upload via bootloader" |
@echo " install - compile, generate and install VHDL IMEM boot image (for application)" |
@echo " all - compile and generate <neorv32_exe.bin> executable for upload via bootloader and generate and install VHDL IMEM boot image (for application)" |
@echo " clean - clean up project" |
@echo " clean_all - clean up project, core libraries and image generator" |
@echo " bootloader - compile, generate and install VHDL BOOTROM boot image (for bootloader only!)" |
|
|
# ----------------------------------------------------------------------------- |
# Clean up |
# ----------------------------------------------------------------------------- |
clean: |
@rm -f *.elf *.o *.bin *.out *.asm *.vhd |
|
clean_all: clean |
@rm -f $(OBJ) $(IMAGE_GEN) |
/demo_pwm/makefile
86,7 → 86,7
# Application start-up code |
CORE_SRC += $(NEORV32_COM_PATH)/crt0.S |
|
# Default linker script |
# Linker script |
LD_SCRIPT = $(NEORV32_COM_PATH)/neorv32.ld |
|
# Main output files |
141,9 → 141,8
all: $(APP_ASM) $(APP_EXE) $(APP_IMG) |
|
# Check if making bootloader |
# This will disable some functions in crt0.S that are not relevant for the bootloader |
target bootloader: USER_FLAGS += -D__BOOTLOADER_START_CODE__ |
target bootloader: LD_SCRIPT = $(NEORV32_COM_PATH)/bootloader_neorv32.ld |
# Use different base address and legth for instruction memory/"rom" (BOOTMEM instead of IMEM) |
target bootloader: CC_OPTS += -Wl,--defsym=make_bootloader=1 |
|
|
# ----------------------------------------------------------------------------- |
262,7 → 261,6
@echo "---------------- Info: NEORV32 ----------------" |
@echo "NEORV32 home folder (NEORV32_HOME): $(NEORV32_HOME)" |
@echo "IMAGE_GEN: $(IMAGE_GEN)" |
@echo "LD script: $(LD_SCRIPT)" |
@echo "Core source files:" |
@echo "$(CORE_SRC)" |
@echo "Core include folder:" |
/demo_trng/makefile
86,7 → 86,7
# Application start-up code |
CORE_SRC += $(NEORV32_COM_PATH)/crt0.S |
|
# Default linker script |
# Linker script |
LD_SCRIPT = $(NEORV32_COM_PATH)/neorv32.ld |
|
# Main output files |
141,9 → 141,8
all: $(APP_ASM) $(APP_EXE) $(APP_IMG) |
|
# Check if making bootloader |
# This will disable some functions in crt0.S that are not relevant for the bootloader |
target bootloader: USER_FLAGS += -D__BOOTLOADER_START_CODE__ |
target bootloader: LD_SCRIPT = $(NEORV32_COM_PATH)/bootloader_neorv32.ld |
# Use different base address and legth for instruction memory/"rom" (BOOTMEM instead of IMEM) |
target bootloader: CC_OPTS += -Wl,--defsym=make_bootloader=1 |
|
|
# ----------------------------------------------------------------------------- |
262,7 → 261,6
@echo "---------------- Info: NEORV32 ----------------" |
@echo "NEORV32 home folder (NEORV32_HOME): $(NEORV32_HOME)" |
@echo "IMAGE_GEN: $(IMAGE_GEN)" |
@echo "LD script: $(LD_SCRIPT)" |
@echo "Core source files:" |
@echo "$(CORE_SRC)" |
@echo "Core include folder:" |
/demo_twi/makefile
86,7 → 86,7
# Application start-up code |
CORE_SRC += $(NEORV32_COM_PATH)/crt0.S |
|
# Default linker script |
# Linker script |
LD_SCRIPT = $(NEORV32_COM_PATH)/neorv32.ld |
|
# Main output files |
141,9 → 141,8
all: $(APP_ASM) $(APP_EXE) $(APP_IMG) |
|
# Check if making bootloader |
# This will disable some functions in crt0.S that are not relevant for the bootloader |
target bootloader: USER_FLAGS += -D__BOOTLOADER_START_CODE__ |
target bootloader: LD_SCRIPT = $(NEORV32_COM_PATH)/bootloader_neorv32.ld |
# Use different base address and legth for instruction memory/"rom" (BOOTMEM instead of IMEM) |
target bootloader: CC_OPTS += -Wl,--defsym=make_bootloader=1 |
|
|
# ----------------------------------------------------------------------------- |
262,7 → 261,6
@echo "---------------- Info: NEORV32 ----------------" |
@echo "NEORV32 home folder (NEORV32_HOME): $(NEORV32_HOME)" |
@echo "IMAGE_GEN: $(IMAGE_GEN)" |
@echo "LD script: $(LD_SCRIPT)" |
@echo "Core source files:" |
@echo "$(CORE_SRC)" |
@echo "Core include folder:" |
/demo_wdt/makefile
86,7 → 86,7
# Application start-up code |
CORE_SRC += $(NEORV32_COM_PATH)/crt0.S |
|
# Default linker script |
# Linker script |
LD_SCRIPT = $(NEORV32_COM_PATH)/neorv32.ld |
|
# Main output files |
141,9 → 141,8
all: $(APP_ASM) $(APP_EXE) $(APP_IMG) |
|
# Check if making bootloader |
# This will disable some functions in crt0.S that are not relevant for the bootloader |
target bootloader: USER_FLAGS += -D__BOOTLOADER_START_CODE__ |
target bootloader: LD_SCRIPT = $(NEORV32_COM_PATH)/bootloader_neorv32.ld |
# Use different base address and legth for instruction memory/"rom" (BOOTMEM instead of IMEM) |
target bootloader: CC_OPTS += -Wl,--defsym=make_bootloader=1 |
|
|
# ----------------------------------------------------------------------------- |
262,7 → 261,6
@echo "---------------- Info: NEORV32 ----------------" |
@echo "NEORV32 home folder (NEORV32_HOME): $(NEORV32_HOME)" |
@echo "IMAGE_GEN: $(IMAGE_GEN)" |
@echo "LD script: $(LD_SCRIPT)" |
@echo "Core source files:" |
@echo "$(CORE_SRC)" |
@echo "Core include folder:" |
/game_of_life/main.c
54,6 → 54,10
#define NUM_CELLS_Y 40 |
/** Delay between generations in ms */ |
#define GEN_DELAY 500 |
/** Symbol for dead cell */ |
#define CELL_DEAD (' ') |
/** Symbol for alive cell */ |
#define CELL_ALIVE ('#') |
/**@}*/ |
|
|
172,7 → 176,10
cell = get_cell(u, x, y); // state of current cell |
n = get_neighborhood(u, x, y); // number of living neighbor cells |
|
// classic rule set |
// -- classic rule set -- |
// if center cell is dead -> cell comes to life when there are exactly 3 living cells around |
// if center cell is alive -> stay alive if there are 2 or three living cells around |
// else -> cell is/becomes dead |
if (((cell == 0) && (n == 3)) || ((cell != 0) && ((n == 2) || (n == 3)))) { |
set_cell((u + 1) & 1, x, y); |
} |
214,9 → 221,9
|
for (x=0; x<NUM_CELLS_X; x++) { |
if (get_cell(u, x, y)) |
neorv32_uart_putc('#'); |
neorv32_uart_putc((char)CELL_ALIVE); |
else |
neorv32_uart_putc(' '); |
neorv32_uart_putc((char)CELL_DEAD); |
} |
|
// end of line |
/game_of_life/makefile
86,7 → 86,7
# Application start-up code |
CORE_SRC += $(NEORV32_COM_PATH)/crt0.S |
|
# Default linker script |
# Linker script |
LD_SCRIPT = $(NEORV32_COM_PATH)/neorv32.ld |
|
# Main output files |
141,9 → 141,8
all: $(APP_ASM) $(APP_EXE) $(APP_IMG) |
|
# Check if making bootloader |
# This will disable some functions in crt0.S that are not relevant for the bootloader |
target bootloader: USER_FLAGS += -D__BOOTLOADER_START_CODE__ |
target bootloader: LD_SCRIPT = $(NEORV32_COM_PATH)/bootloader_neorv32.ld |
# Use different base address and legth for instruction memory/"rom" (BOOTMEM instead of IMEM) |
target bootloader: CC_OPTS += -Wl,--defsym=make_bootloader=1 |
|
|
# ----------------------------------------------------------------------------- |
262,7 → 261,6
@echo "---------------- Info: NEORV32 ----------------" |
@echo "NEORV32 home folder (NEORV32_HOME): $(NEORV32_HOME)" |
@echo "IMAGE_GEN: $(IMAGE_GEN)" |
@echo "LD script: $(LD_SCRIPT)" |
@echo "Core source files:" |
@echo "$(CORE_SRC)" |
@echo "Core include folder:" |