From e8386ed459b77f9c3e4f75498c0a135b70a035bd Mon Sep 17 00:00:00 2001 From: Zicheng Hu Date: Wed, 28 Jun 2023 19:23:49 +0800 Subject: [PATCH 1/5] feat: add clock test --- src/arch/riscv64/port/clock.c | 27 +++++++++++++++++++ src/platform/qemu_riscv64/defconfig | 3 +-- .../qemu_riscv64/include/nx_configure.h | 3 +-- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/arch/riscv64/port/clock.c b/src/arch/riscv64/port/clock.c index c7b7c56..369323b 100644 --- a/src/arch/riscv64/port/clock.c +++ b/src/arch/riscv64/port/clock.c @@ -45,11 +45,36 @@ NX_PRIVATE NX_U64 GetTimerCounter() return ret; } +NX_U64 NX_ClockGetMicrosecond(void) +{ + NX_U64 us = 0; + + NX_U64 val = GetTimerCounter(); + + val = val - (val / tickDelta) * tickDelta; + + /** + * us in per ms + */ + us = (val / (tickDelta / 1000)) % 1000; + /** + * us in time + */ + us += NX_ClockGetMillisecond() * 1000; + return us; +} + void NX_HalClockHandler(void) { NX_ClockTickGo(); /* update timer */ sbi_set_timer(GetTimerCounter() + tickDelta); + + if (NX_ClockGetMillisecond() % 1000 == 0) + { + NX_Printf("us: %ld %ld\n", NX_ClockGetMicrosecond(), GetTimerCounter()); + } + } NX_INTERFACE NX_Error NX_HalInitClock(void) @@ -57,6 +82,8 @@ NX_INTERFACE NX_Error NX_HalInitClock(void) /* Clear the Supervisor-Timer bit in SIE */ ClearCSR(sie, SIE_STIE); + NX_Printf("cntval:%ld us per ms:%ld\n", tickDelta, tickDelta / 1000); + /* Set timer */ sbi_set_timer(GetTimerCounter() + tickDelta); diff --git a/src/platform/qemu_riscv64/defconfig b/src/platform/qemu_riscv64/defconfig index 6f8d415..68ce7ba 100644 --- a/src/platform/qemu_riscv64/defconfig +++ b/src/platform/qemu_riscv64/defconfig @@ -32,7 +32,7 @@ CONFIG_NX_THREAD_STACK_SIZE=8192 CONFIG_NX_ENABLE_SCHED=y CONFIG_NX_THREAD_MAX_PRIORITY_NR=16 CONFIG_NX_PORCESS_ENV_ARGS=1024 -CONFIG_NX_TICKS_PER_SECOND=100 +CONFIG_NX_TICKS_PER_SECOND=1000 # end of OS Kernel # @@ -48,7 +48,6 @@ CONFIG_NX_UART0_FROM_SBI=y CONFIG_NX_DRIVER_CONSOLE=y CONFIG_NX_PRINT_BUF_LEN=256 CONFIG_NX_DRIVER_ROMDISK=y -CONFIG_NX_DRIVER_ROMDISK_HOSTOS_PATH="../../romdisk.cpio" # CONFIG_NX_DRIVER_DUMMY is not set CONFIG_NX_DRIVER_NULL=y CONFIG_NX_DRIVER_ZERO=y diff --git a/src/platform/qemu_riscv64/include/nx_configure.h b/src/platform/qemu_riscv64/include/nx_configure.h index 6ff566c..f6ad433 100644 --- a/src/platform/qemu_riscv64/include/nx_configure.h +++ b/src/platform/qemu_riscv64/include/nx_configure.h @@ -17,13 +17,12 @@ #define CONFIG_NX_ENABLE_SCHED 1 #define CONFIG_NX_THREAD_MAX_PRIORITY_NR 16 #define CONFIG_NX_PORCESS_ENV_ARGS 1024 -#define CONFIG_NX_TICKS_PER_SECOND 100 +#define CONFIG_NX_TICKS_PER_SECOND 1000 #define CONFIG_NX_PLATFORM_RISCV64_QEMU 1 #define CONFIG_NX_UART0_FROM_SBI 1 #define CONFIG_NX_DRIVER_CONSOLE 1 #define CONFIG_NX_PRINT_BUF_LEN 256 #define CONFIG_NX_DRIVER_ROMDISK 1 -#define CONFIG_NX_DRIVER_ROMDISK_HOSTOS_PATH "../../romdisk.cpio" #define CONFIG_NX_DRIVER_NULL 1 #define CONFIG_NX_DRIVER_ZERO 1 #define CONFIG_NX_DRIVER_MEMINFO 1 -- Gitee From 425a80a5825edeeb8331caf1fb1a1f50204ff423 Mon Sep 17 00:00:00 2001 From: wupi Date: Sat, 1 Jul 2023 00:52:17 +0800 Subject: [PATCH 2/5] feat(clock): add delay microsecond for riscv64 --- src/arch/riscv64/port/clock.c | 37 +++++++++++++++++++++++------------ src/include/base/clock.h | 3 +++ src/time/clock.c | 10 ++++++++++ 3 files changed, 37 insertions(+), 13 deletions(-) diff --git a/src/arch/riscv64/port/clock.c b/src/arch/riscv64/port/clock.c index 369323b..9280a4e 100644 --- a/src/arch/riscv64/port/clock.c +++ b/src/arch/riscv64/port/clock.c @@ -37,6 +37,7 @@ #endif NX_PRIVATE NX_U64 tickDelta = NX_TIMER_CLK_FREQ / NX_TICKS_PER_SECOND; +NX_PRIVATE volatile NX_U64 tickNext = 0; NX_PRIVATE NX_U64 GetTimerCounter() { @@ -49,14 +50,13 @@ NX_U64 NX_ClockGetMicrosecond(void) { NX_U64 us = 0; - NX_U64 val = GetTimerCounter(); - - val = val - (val / tickDelta) * tickDelta; + NX_U64 counter = GetTimerCounter() % tickDelta; /** * us in per ms */ - us = (val / (tickDelta / 1000)) % 1000; + us = (NX_DIV_ROUND_UP(counter, (tickDelta / 1000))) % 1000; + /** * us in time */ @@ -66,26 +66,37 @@ NX_U64 NX_ClockGetMicrosecond(void) void NX_HalClockHandler(void) { - NX_ClockTickGo(); - /* update timer */ - sbi_set_timer(GetTimerCounter() + tickDelta); + NX_U64 counter; - if (NX_ClockGetMillisecond() % 1000 == 0) + /* update timer */ + counter = GetTimerCounter(); + if (counter - tickNext >= tickDelta) { - NX_Printf("us: %ld %ld\n", NX_ClockGetMicrosecond(), GetTimerCounter()); + tickNext = counter + tickDelta; } - + else + { + tickNext += tickDelta; + } + sbi_set_timer(tickNext); + + NX_ClockTickGo(); } NX_INTERFACE NX_Error NX_HalInitClock(void) { + NX_U64 counter; /* Clear the Supervisor-Timer bit in SIE */ ClearCSR(sie, SIE_STIE); - NX_Printf("cntval:%ld us per ms:%ld\n", tickDelta, tickDelta / 1000); - /* Set timer */ - sbi_set_timer(GetTimerCounter() + tickDelta); + tickNext = tickDelta; + counter = GetTimerCounter(); + if (counter > tickNext) + { + tickNext = NX_DIV_ROUND_UP(counter, tickDelta) * tickDelta; + } + sbi_set_timer(tickNext); /* Enable the Supervisor-Timer bit in SIE */ SetCSR(sie, SIE_STIE); diff --git a/src/include/base/clock.h b/src/include/base/clock.h index 396d775..37aa1a5 100644 --- a/src/include/base/clock.h +++ b/src/include/base/clock.h @@ -37,6 +37,9 @@ void NX_ClockTickGo(void); NX_Error NX_ClockTickDelay(NX_ClockTick ticks); +NX_U64 NX_ClockGetMicrosecond(void); +NX_Error NX_DelayMicrosecond(NX_TimeVal us); + NX_INLINE NX_TimeVal NX_ClockTickToMillisecond(NX_ClockTick tick) { return NX_TICKS_TO_MILLISECOND(tick); diff --git a/src/time/clock.c b/src/time/clock.c index 21a966f..c29af47 100644 --- a/src/time/clock.c +++ b/src/time/clock.c @@ -82,6 +82,16 @@ NX_Error NX_ClockTickDelay(NX_ClockTick ticks) return NX_EOK; } +NX_Error NX_DelayMicrosecond(NX_TimeVal us) +{ + NX_TimeVal start = NX_ClockGetMicrosecond(); + while (NX_ClockGetMicrosecond() < start + us) + { + /* do nothing to delay */ + } + return NX_EOK; +} + NX_PRIVATE void NX_TimerIrqHandler(void *arg) { NX_TimerGo(); -- Gitee From bcb8625a32afd1b6198d3c13b749e0f216b4c024 Mon Sep 17 00:00:00 2001 From: wupi Date: Sat, 1 Jul 2023 01:17:56 +0800 Subject: [PATCH 3/5] feat(f133): add opensbi.bin --- src/.gitignore | 50 +------------------ src/platform/f133/tools/SBI/opensbi-f133.bin | Bin 0 -> 62008 bytes 2 files changed, 1 insertion(+), 49 deletions(-) create mode 100644 src/platform/f133/tools/SBI/opensbi-f133.bin diff --git a/src/.gitignore b/src/.gitignore index 331b6e1..bb9caa1 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -4,60 +4,12 @@ # Object files *.o -*.ko *.obj -*.elf -*.disasm - -# Linker output -*.ilk -*.map -*.exp - -# Precompiled Headers -*.gch -*.pch - -# Libraries -*.lib -*.a -*.la -*.lo - -# Shared objects (inc. Windows DLLs) -*.dll -*.so -*.so.* -*.dylib - -# Executables -*.exe -*.out -*.app -*.i*86 -*.x86_64 -*.hex - -# Image -*.iso -*.vhd -*.bin - -# Debug files -*.dSYM/ -*.su -*.idb -*.pdb -*.dump # Kernel Module Compile Results *.cmd -.tmp_versions/ -modules.order -Module.symvers -Mkfile.old -dkms.conf +# kernel special fixdep init/rootfs.c build diff --git a/src/platform/f133/tools/SBI/opensbi-f133.bin b/src/platform/f133/tools/SBI/opensbi-f133.bin new file mode 100644 index 0000000000000000000000000000000000000000..5b672910aa26cb7fc301368e684e382bcbf264e5 GIT binary patch literal 62008 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 g=;2Sxn^<38p9t<8 literal 0 HcmV?d00001 -- Gitee From dabae20624b2d4c1186c3530528956db119a58cd Mon Sep 17 00:00:00 2001 From: wupi Date: Sat, 1 Jul 2023 01:51:12 +0800 Subject: [PATCH 4/5] feat(clock): add NX_ClockGetMicrosecond in x86 --- src/arch/x86/port/clock.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/arch/x86/port/clock.c b/src/arch/x86/port/clock.c index 0a99664..015af46 100644 --- a/src/arch/x86/port/clock.c +++ b/src/arch/x86/port/clock.c @@ -134,6 +134,14 @@ enum ctrl_mode_bits #define TIMER_FREQ 1193180 /* clock frequency */ #define COUNTER0_VALUE (TIMER_FREQ / NX_TICKS_PER_SECOND) +/** + * FIXME: support this + */ +NX_U64 NX_ClockGetMicrosecond(void) +{ + return 0; +} + NX_PRIVATE NX_Error ClockHandler(NX_U32 irq, void *arg) { NX_ClockTickGo(); -- Gitee From f94a39a6f3208636fdb6c536bfa11ec382f5e526 Mon Sep 17 00:00:00 2001 From: wupi Date: Sat, 1 Jul 2023 02:38:26 +0800 Subject: [PATCH 5/5] feat: update f133&d1 config --- src/platform/d1/defconfig | 3 +-- src/platform/d1/include/nx_configure.h | 3 +-- src/platform/f133/defconfig | 2 +- src/platform/f133/include/nx_configure.h | 2 +- 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/platform/d1/defconfig b/src/platform/d1/defconfig index 5883ee9..3c1b29a 100644 --- a/src/platform/d1/defconfig +++ b/src/platform/d1/defconfig @@ -32,7 +32,7 @@ CONFIG_NX_THREAD_STACK_SIZE=8192 CONFIG_NX_ENABLE_SCHED=y CONFIG_NX_THREAD_MAX_PRIORITY_NR=16 CONFIG_NX_PORCESS_ENV_ARGS=1024 -CONFIG_NX_TICKS_PER_SECOND=100 +CONFIG_NX_TICKS_PER_SECOND=1000 # end of OS Kernel # @@ -47,7 +47,6 @@ CONFIG_NX_PLATFORM_D1=y CONFIG_NX_DRIVER_CONSOLE=y CONFIG_NX_PRINT_BUF_LEN=256 CONFIG_NX_DRIVER_ROMDISK=y -CONFIG_NX_DRIVER_ROMDISK_HOSTOS_PATH="../../romdisk.cpio" # CONFIG_NX_DRIVER_DUMMY is not set CONFIG_NX_DRIVER_NULL=y CONFIG_NX_DRIVER_ZERO=y diff --git a/src/platform/d1/include/nx_configure.h b/src/platform/d1/include/nx_configure.h index 7d30342..5df72d8 100644 --- a/src/platform/d1/include/nx_configure.h +++ b/src/platform/d1/include/nx_configure.h @@ -17,12 +17,11 @@ #define CONFIG_NX_ENABLE_SCHED 1 #define CONFIG_NX_THREAD_MAX_PRIORITY_NR 16 #define CONFIG_NX_PORCESS_ENV_ARGS 1024 -#define CONFIG_NX_TICKS_PER_SECOND 100 +#define CONFIG_NX_TICKS_PER_SECOND 1000 #define CONFIG_NX_PLATFORM_D1 1 #define CONFIG_NX_DRIVER_CONSOLE 1 #define CONFIG_NX_PRINT_BUF_LEN 256 #define CONFIG_NX_DRIVER_ROMDISK 1 -#define CONFIG_NX_DRIVER_ROMDISK_HOSTOS_PATH "../../romdisk.cpio" #define CONFIG_NX_DRIVER_NULL 1 #define CONFIG_NX_DRIVER_ZERO 1 #define CONFIG_NX_DRIVER_MEMINFO 1 diff --git a/src/platform/f133/defconfig b/src/platform/f133/defconfig index cbdd530..d80166e 100644 --- a/src/platform/f133/defconfig +++ b/src/platform/f133/defconfig @@ -32,7 +32,7 @@ CONFIG_NX_THREAD_STACK_SIZE=8192 CONFIG_NX_ENABLE_SCHED=y CONFIG_NX_THREAD_MAX_PRIORITY_NR=16 CONFIG_NX_PORCESS_ENV_ARGS=1024 -CONFIG_NX_TICKS_PER_SECOND=100 +CONFIG_NX_TICKS_PER_SECOND=1000 # end of OS Kernel # diff --git a/src/platform/f133/include/nx_configure.h b/src/platform/f133/include/nx_configure.h index dfc7ab1..ca65608 100644 --- a/src/platform/f133/include/nx_configure.h +++ b/src/platform/f133/include/nx_configure.h @@ -17,7 +17,7 @@ #define CONFIG_NX_ENABLE_SCHED 1 #define CONFIG_NX_THREAD_MAX_PRIORITY_NR 16 #define CONFIG_NX_PORCESS_ENV_ARGS 1024 -#define CONFIG_NX_TICKS_PER_SECOND 100 +#define CONFIG_NX_TICKS_PER_SECOND 1000 #define CONFIG_NX_PLATFORM_F133 1 #define CONFIG_SOC_SUN20IW1 1 #define CONFIG_DRIVERS_CCMU 1 -- Gitee