parent
01c3159a83
commit
af63e677d9
|
@ -6,12 +6,12 @@
|
||||||
|
|
||||||
**simple**: 简单的加、减、乘、除运算测试例程。
|
**simple**: 简单的加、减、乘、除运算测试例程。
|
||||||
|
|
||||||
**timer_int**: 定时器中断测试例程,每500ms翻转一下IO口的电平。在FPGA上运行时需要将其Makefile里的CFLAGS += -DSIMULATION这一行注释掉。
|
**machine_timer**: 定时器中断测试例程,每500ms翻转一下IO口的电平。在FPGA上运行时需要将其Makefile里的CFLAGS += -DSIMULATION这一行注释掉。
|
||||||
|
|
||||||
**uart_tx**: 串口发送测试例程,向上位机发送hello world字符串。
|
**coremark**: 已经移植好的coremark跑分测试例程。
|
||||||
|
|
||||||
**uart_rx:**串口接收测试例程,将接收到的数据发回给上位机(echo)。
|
**freertos**: FreeRTOS嵌入式操作系统测试例程,效果:每1s翻转一下IO口的电平。
|
||||||
|
|
||||||
**coremark:**已经移植好的coremark跑分测试例程。
|
**uart_loopback**: 串口收发例程。
|
||||||
|
|
||||||
**FreeRTOS:**FreeRTOS嵌入式操作系统测试例程,效果:每1s翻转一下IO口的电平。
|
**hello_world**: 串口发送hello world字符串。
|
||||||
|
|
|
@ -45,8 +45,8 @@
|
||||||
#define configUSE_PREEMPTION 1
|
#define configUSE_PREEMPTION 1
|
||||||
#define configUSE_IDLE_HOOK 0
|
#define configUSE_IDLE_HOOK 0
|
||||||
#define configUSE_TICK_HOOK 1
|
#define configUSE_TICK_HOOK 1
|
||||||
#define configCPU_CLOCK_HZ ( 50000000 )
|
#define configCPU_CLOCK_HZ ( 25000000 )
|
||||||
#define configTICK_RATE_HZ ( ( TickType_t ) 1000 )
|
#define configTICK_RATE_HZ ( ( TickType_t ) 100 )
|
||||||
#define configMAX_PRIORITIES ( 7 )
|
#define configMAX_PRIORITIES ( 7 )
|
||||||
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 120 ) /* Only needs to be this high as some demo tasks also use this constant. In production only the idle task would use this. */
|
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 120 ) /* Only needs to be this high as some demo tasks also use this constant. In production only the idle task would use this. */
|
||||||
#define configTOTAL_HEAP_SIZE ( ( size_t ) 2048 )
|
#define configTOTAL_HEAP_SIZE ( ( size_t ) 2048 )
|
|
@ -53,7 +53,7 @@
|
||||||
#ifndef __FREERTOS_RISC_V_EXTENSIONS_H__
|
#ifndef __FREERTOS_RISC_V_EXTENSIONS_H__
|
||||||
#define __FREERTOS_RISC_V_EXTENSIONS_H__
|
#define __FREERTOS_RISC_V_EXTENSIONS_H__
|
||||||
|
|
||||||
#define portasmHAS_SIFIVE_CLINT 1
|
#define portasmHAS_SIFIVE_CLINT 0
|
||||||
#define portasmHAS_MTIME 1
|
#define portasmHAS_MTIME 1
|
||||||
#define portasmADDITIONAL_CONTEXT_SIZE 0 /* Must be even number on 32-bit cores. */
|
#define portasmADDITIONAL_CONTEXT_SIZE 0 /* Must be even number on 32-bit cores. */
|
||||||
|
|
|
@ -37,7 +37,7 @@
|
||||||
/* Standard includes. */
|
/* Standard includes. */
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
|
|
||||||
#include "include/timer.h"
|
#include "include/machine_timer.h"
|
||||||
|
|
||||||
/* Let the user override the pre-loading of the initial LR with the address of
|
/* Let the user override the pre-loading of the initial LR with the address of
|
||||||
prvTaskExitError() in case it messes up unwinding of the stack in the
|
prvTaskExitError() in case it messes up unwinding of the stack in the
|
||||||
|
@ -133,17 +133,18 @@ volatile uint32_t ulHartId;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef SIMULATION
|
#ifdef SIMULATION
|
||||||
TIMER0_REG(TIMER0_VALUE) = 500;
|
machine_timer_set_cmp_val(5000);
|
||||||
#else
|
#else
|
||||||
TIMER0_REG(TIMER0_VALUE) = uxTimerIncrementsForOneTick;
|
machine_timer_set_cmp_val(uxTimerIncrementsForOneTick);
|
||||||
#endif
|
#endif
|
||||||
TIMER0_REG(TIMER0_CTRL) = 0x07; // enable interrupt and start timer
|
machine_timer_irq_enable(1);// enable timer interrupt
|
||||||
|
machine_timer_enable(1); // start timer
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
void xPortClearTimerIntPending()
|
void xPortClearTimerIntPending()
|
||||||
{
|
{
|
||||||
TIMER0_REG(TIMER0_CTRL) |= (1 << 2) | (1 << 0); // clear int pending
|
machine_timer_clear_irq_pending(); // clear int pending
|
||||||
}
|
}
|
||||||
|
|
||||||
BaseType_t xPortStartScheduler( void )
|
BaseType_t xPortStartScheduler( void )
|
|
@ -69,11 +69,6 @@
|
||||||
|
|
||||||
#include "freertos_risc_v_chip_specific_extensions.h"
|
#include "freertos_risc_v_chip_specific_extensions.h"
|
||||||
|
|
||||||
/*
|
|
||||||
#ifndef portasmHANDLE_INTERRUPT
|
|
||||||
#error portasmHANDLE_INTERRUPT must be defined to the function to be called to handle external/peripheral interrupts. portasmHANDLE_INTERRUPT can be defined on the assembler command line or in the appropriate freertos_risc_v_chip_specific_extensions.h header file. https://www.freertos.org/Using-FreeRTOS-on-RISC-V.html
|
|
||||||
#endif
|
|
||||||
*/
|
|
||||||
#ifndef portasmHAS_SIFIVE_CLINT
|
#ifndef portasmHAS_SIFIVE_CLINT
|
||||||
#define portasmHAS_SIFIVE_CLINT 0
|
#define portasmHAS_SIFIVE_CLINT 0
|
||||||
#endif
|
#endif
|
||||||
|
@ -85,6 +80,8 @@ specific version of freertos_risc_v_chip_specific_extensions.h. See the notes
|
||||||
at the top of this file. */
|
at the top of this file. */
|
||||||
#define portCONTEXT_SIZE ( 30 * portWORD_SIZE )
|
#define portCONTEXT_SIZE ( 30 * portWORD_SIZE )
|
||||||
|
|
||||||
|
.global timer_irq_handler
|
||||||
|
.global ecall_handler
|
||||||
.global xPortStartFirstTask
|
.global xPortStartFirstTask
|
||||||
.global freertos_risc_v_trap_handler
|
.global freertos_risc_v_trap_handler
|
||||||
.global pxPortInitialiseStack
|
.global pxPortInitialiseStack
|
||||||
|
@ -99,7 +96,6 @@ at the top of this file. */
|
||||||
.extern xISRStackTop
|
.extern xISRStackTop
|
||||||
#.extern portasmHANDLE_INTERRUPT
|
#.extern portasmHANDLE_INTERRUPT
|
||||||
.extern xPortClearTimerIntPending
|
.extern xPortClearTimerIntPending
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
.align 8
|
.align 8
|
||||||
|
@ -287,6 +283,177 @@ processed_source:
|
||||||
.endfunc
|
.endfunc
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
.align 3
|
||||||
|
.func
|
||||||
|
timer_irq_handler:
|
||||||
|
|
||||||
|
addi sp, sp, -portCONTEXT_SIZE
|
||||||
|
store_x x1, 1 * portWORD_SIZE( sp )
|
||||||
|
store_x x5, 2 * portWORD_SIZE( sp )
|
||||||
|
store_x x6, 3 * portWORD_SIZE( sp )
|
||||||
|
store_x x7, 4 * portWORD_SIZE( sp )
|
||||||
|
store_x x8, 5 * portWORD_SIZE( sp )
|
||||||
|
store_x x9, 6 * portWORD_SIZE( sp )
|
||||||
|
store_x x10, 7 * portWORD_SIZE( sp )
|
||||||
|
store_x x11, 8 * portWORD_SIZE( sp )
|
||||||
|
store_x x12, 9 * portWORD_SIZE( sp )
|
||||||
|
store_x x13, 10 * portWORD_SIZE( sp )
|
||||||
|
store_x x14, 11 * portWORD_SIZE( sp )
|
||||||
|
store_x x15, 12 * portWORD_SIZE( sp )
|
||||||
|
store_x x16, 13 * portWORD_SIZE( sp )
|
||||||
|
store_x x17, 14 * portWORD_SIZE( sp )
|
||||||
|
store_x x18, 15 * portWORD_SIZE( sp )
|
||||||
|
store_x x19, 16 * portWORD_SIZE( sp )
|
||||||
|
store_x x20, 17 * portWORD_SIZE( sp )
|
||||||
|
store_x x21, 18 * portWORD_SIZE( sp )
|
||||||
|
store_x x22, 19 * portWORD_SIZE( sp )
|
||||||
|
store_x x23, 20 * portWORD_SIZE( sp )
|
||||||
|
store_x x24, 21 * portWORD_SIZE( sp )
|
||||||
|
store_x x25, 22 * portWORD_SIZE( sp )
|
||||||
|
store_x x26, 23 * portWORD_SIZE( sp )
|
||||||
|
store_x x27, 24 * portWORD_SIZE( sp )
|
||||||
|
store_x x28, 25 * portWORD_SIZE( sp )
|
||||||
|
store_x x29, 26 * portWORD_SIZE( sp )
|
||||||
|
store_x x30, 27 * portWORD_SIZE( sp )
|
||||||
|
store_x x31, 28 * portWORD_SIZE( sp )
|
||||||
|
|
||||||
|
load_x t0, pxCurrentTCB /* Load pxCurrentTCB. */
|
||||||
|
store_x sp, 0( t0 ) /* Write sp to first TCB member. */
|
||||||
|
|
||||||
|
csrr a1, mepc
|
||||||
|
store_x a1, 0( sp ) /* Asynch so save unmodified exception return address. */
|
||||||
|
|
||||||
|
load_x sp, xISRStackTop /* Switch to ISR stack before function call. */
|
||||||
|
call xPortClearTimerIntPending
|
||||||
|
jal xTaskIncrementTick
|
||||||
|
beqz a0, not_switch /* Don't switch context if incrementing tick didn't unblock a task. */
|
||||||
|
jal vTaskSwitchContext
|
||||||
|
|
||||||
|
not_switch:
|
||||||
|
load_x t1, pxCurrentTCB /* Load pxCurrentTCB. */
|
||||||
|
load_x sp, 0( t1 ) /* Read sp from first TCB member. */
|
||||||
|
|
||||||
|
/* Load mret with the address of the next instruction in the task to run next. */
|
||||||
|
load_x t0, 0( sp )
|
||||||
|
csrw mepc, t0
|
||||||
|
|
||||||
|
load_x x1, 1 * portWORD_SIZE( sp )
|
||||||
|
load_x x5, 2 * portWORD_SIZE( sp ) /* t0 */
|
||||||
|
load_x x6, 3 * portWORD_SIZE( sp ) /* t1 */
|
||||||
|
load_x x7, 4 * portWORD_SIZE( sp ) /* t2 */
|
||||||
|
load_x x8, 5 * portWORD_SIZE( sp ) /* s0/fp */
|
||||||
|
load_x x9, 6 * portWORD_SIZE( sp ) /* s1 */
|
||||||
|
load_x x10, 7 * portWORD_SIZE( sp ) /* a0 */
|
||||||
|
load_x x11, 8 * portWORD_SIZE( sp ) /* a1 */
|
||||||
|
load_x x12, 9 * portWORD_SIZE( sp ) /* a2 */
|
||||||
|
load_x x13, 10 * portWORD_SIZE( sp ) /* a3 */
|
||||||
|
load_x x14, 11 * portWORD_SIZE( sp ) /* a4 */
|
||||||
|
load_x x15, 12 * portWORD_SIZE( sp ) /* a5 */
|
||||||
|
load_x x16, 13 * portWORD_SIZE( sp ) /* a6 */
|
||||||
|
load_x x17, 14 * portWORD_SIZE( sp ) /* a7 */
|
||||||
|
load_x x18, 15 * portWORD_SIZE( sp ) /* s2 */
|
||||||
|
load_x x19, 16 * portWORD_SIZE( sp ) /* s3 */
|
||||||
|
load_x x20, 17 * portWORD_SIZE( sp ) /* s4 */
|
||||||
|
load_x x21, 18 * portWORD_SIZE( sp ) /* s5 */
|
||||||
|
load_x x22, 19 * portWORD_SIZE( sp ) /* s6 */
|
||||||
|
load_x x23, 20 * portWORD_SIZE( sp ) /* s7 */
|
||||||
|
load_x x24, 21 * portWORD_SIZE( sp ) /* s8 */
|
||||||
|
load_x x25, 22 * portWORD_SIZE( sp ) /* s9 */
|
||||||
|
load_x x26, 23 * portWORD_SIZE( sp ) /* s10 */
|
||||||
|
load_x x27, 24 * portWORD_SIZE( sp ) /* s11 */
|
||||||
|
load_x x28, 25 * portWORD_SIZE( sp ) /* t3 */
|
||||||
|
load_x x29, 26 * portWORD_SIZE( sp ) /* t4 */
|
||||||
|
load_x x30, 27 * portWORD_SIZE( sp ) /* t5 */
|
||||||
|
load_x x31, 28 * portWORD_SIZE( sp ) /* t6 */
|
||||||
|
addi sp, sp, portCONTEXT_SIZE
|
||||||
|
|
||||||
|
mret
|
||||||
|
.endfunc
|
||||||
|
|
||||||
|
.align 3
|
||||||
|
.func
|
||||||
|
ecall_handler:
|
||||||
|
|
||||||
|
addi sp, sp, -portCONTEXT_SIZE
|
||||||
|
store_x x1, 1 * portWORD_SIZE( sp )
|
||||||
|
store_x x5, 2 * portWORD_SIZE( sp )
|
||||||
|
store_x x6, 3 * portWORD_SIZE( sp )
|
||||||
|
store_x x7, 4 * portWORD_SIZE( sp )
|
||||||
|
store_x x8, 5 * portWORD_SIZE( sp )
|
||||||
|
store_x x9, 6 * portWORD_SIZE( sp )
|
||||||
|
store_x x10, 7 * portWORD_SIZE( sp )
|
||||||
|
store_x x11, 8 * portWORD_SIZE( sp )
|
||||||
|
store_x x12, 9 * portWORD_SIZE( sp )
|
||||||
|
store_x x13, 10 * portWORD_SIZE( sp )
|
||||||
|
store_x x14, 11 * portWORD_SIZE( sp )
|
||||||
|
store_x x15, 12 * portWORD_SIZE( sp )
|
||||||
|
store_x x16, 13 * portWORD_SIZE( sp )
|
||||||
|
store_x x17, 14 * portWORD_SIZE( sp )
|
||||||
|
store_x x18, 15 * portWORD_SIZE( sp )
|
||||||
|
store_x x19, 16 * portWORD_SIZE( sp )
|
||||||
|
store_x x20, 17 * portWORD_SIZE( sp )
|
||||||
|
store_x x21, 18 * portWORD_SIZE( sp )
|
||||||
|
store_x x22, 19 * portWORD_SIZE( sp )
|
||||||
|
store_x x23, 20 * portWORD_SIZE( sp )
|
||||||
|
store_x x24, 21 * portWORD_SIZE( sp )
|
||||||
|
store_x x25, 22 * portWORD_SIZE( sp )
|
||||||
|
store_x x26, 23 * portWORD_SIZE( sp )
|
||||||
|
store_x x27, 24 * portWORD_SIZE( sp )
|
||||||
|
store_x x28, 25 * portWORD_SIZE( sp )
|
||||||
|
store_x x29, 26 * portWORD_SIZE( sp )
|
||||||
|
store_x x30, 27 * portWORD_SIZE( sp )
|
||||||
|
store_x x31, 28 * portWORD_SIZE( sp )
|
||||||
|
|
||||||
|
load_x t0, pxCurrentTCB /* Load pxCurrentTCB. */
|
||||||
|
store_x sp, 0( t0 ) /* Write sp to first TCB member. */
|
||||||
|
|
||||||
|
csrr a1, mepc
|
||||||
|
addi a1, a1, 4 /* Synchronous so updated exception return address to the instruction after the instruction that generated the exeption. */
|
||||||
|
store_x a1, 0( sp ) /* Save updated exception return address. */
|
||||||
|
|
||||||
|
load_x sp, xISRStackTop /* Switch to ISR stack before function call. */
|
||||||
|
jal vTaskSwitchContext
|
||||||
|
|
||||||
|
load_x t1, pxCurrentTCB /* Load pxCurrentTCB. */
|
||||||
|
load_x sp, 0( t1 ) /* Read sp from first TCB member. */
|
||||||
|
|
||||||
|
/* Load mret with the address of the next instruction in the task to run next. */
|
||||||
|
load_x t0, 0( sp )
|
||||||
|
csrw mepc, t0
|
||||||
|
|
||||||
|
load_x x1, 1 * portWORD_SIZE( sp )
|
||||||
|
load_x x5, 2 * portWORD_SIZE( sp ) /* t0 */
|
||||||
|
load_x x6, 3 * portWORD_SIZE( sp ) /* t1 */
|
||||||
|
load_x x7, 4 * portWORD_SIZE( sp ) /* t2 */
|
||||||
|
load_x x8, 5 * portWORD_SIZE( sp ) /* s0/fp */
|
||||||
|
load_x x9, 6 * portWORD_SIZE( sp ) /* s1 */
|
||||||
|
load_x x10, 7 * portWORD_SIZE( sp ) /* a0 */
|
||||||
|
load_x x11, 8 * portWORD_SIZE( sp ) /* a1 */
|
||||||
|
load_x x12, 9 * portWORD_SIZE( sp ) /* a2 */
|
||||||
|
load_x x13, 10 * portWORD_SIZE( sp ) /* a3 */
|
||||||
|
load_x x14, 11 * portWORD_SIZE( sp ) /* a4 */
|
||||||
|
load_x x15, 12 * portWORD_SIZE( sp ) /* a5 */
|
||||||
|
load_x x16, 13 * portWORD_SIZE( sp ) /* a6 */
|
||||||
|
load_x x17, 14 * portWORD_SIZE( sp ) /* a7 */
|
||||||
|
load_x x18, 15 * portWORD_SIZE( sp ) /* s2 */
|
||||||
|
load_x x19, 16 * portWORD_SIZE( sp ) /* s3 */
|
||||||
|
load_x x20, 17 * portWORD_SIZE( sp ) /* s4 */
|
||||||
|
load_x x21, 18 * portWORD_SIZE( sp ) /* s5 */
|
||||||
|
load_x x22, 19 * portWORD_SIZE( sp ) /* s6 */
|
||||||
|
load_x x23, 20 * portWORD_SIZE( sp ) /* s7 */
|
||||||
|
load_x x24, 21 * portWORD_SIZE( sp ) /* s8 */
|
||||||
|
load_x x25, 22 * portWORD_SIZE( sp ) /* s9 */
|
||||||
|
load_x x26, 23 * portWORD_SIZE( sp ) /* s10 */
|
||||||
|
load_x x27, 24 * portWORD_SIZE( sp ) /* s11 */
|
||||||
|
load_x x28, 25 * portWORD_SIZE( sp ) /* t3 */
|
||||||
|
load_x x29, 26 * portWORD_SIZE( sp ) /* t4 */
|
||||||
|
load_x x30, 27 * portWORD_SIZE( sp ) /* t5 */
|
||||||
|
load_x x31, 28 * portWORD_SIZE( sp ) /* t6 */
|
||||||
|
addi sp, sp, portCONTEXT_SIZE
|
||||||
|
|
||||||
|
mret
|
||||||
|
.endfunc
|
||||||
|
|
||||||
.align 8
|
.align 8
|
||||||
.func
|
.func
|
||||||
xPortStartFirstTask:
|
xPortStartFirstTask:
|
Loading…
Reference in New Issue