diff --git a/doc/ChangeLog.md b/doc/ChangeLog.md
index 0fb43b862..97ad4e28c 100644
--- a/doc/ChangeLog.md
+++ b/doc/ChangeLog.md
@@ -1,3 +1,15 @@
+# Phytium Standalone SDK 2024-05-15 ChangeLog
+
+Change Log since 2024-05-14
+
+## example
+
+- add spinlock in amp_tools_example
+
+## soc
+
+- fix spinlock bug in fspin
+
# Phytium Standalone SDK 2024-05-14 ChangeLog
Change Log since 2024-05-14
diff --git a/example/system/amp/amp_tools_example/amp/README.md b/example/system/amp/amp_tools_example/amp/README.md
index 4ec3153b7..84d3fa7e6 100644
--- a/example/system/amp/amp_tools_example/amp/README.md
+++ b/example/system/amp/amp_tools_example/amp/README.md
@@ -4,7 +4,10 @@
> ``介绍例程的用途,使用场景,相关基本概念,描述用户可以使用例程完成哪些工作 `
`
-本例程示范了standalone环境下的工程模板。本例程作为AMP打包部署的主例程,主要起到运行脚本,编译打包其他例程的作用,您也可在其他例程中按照上层目录README.md的描述配置主例程
+- 本例程作为AMP打包部署的主例程,主要起到运行脚本,编译打包其他例程的作用,您也可在其他例程中按照上层目录README.md的描述配置主例程
+- 本例程与其他例程测试多核自旋锁,通过串口打印信息测试可以验证standalone环境下多核自旋锁的正确性。
+- 注意多个核心自旋锁的FSPIN_LOCK_ADDR地址需要保持一致,并且使用地址避免与其他镜像加载以及运行地址冲突,否则会导致自旋锁失效。
+- spinlock用于在多核环境下,确保同一时刻只有核心可以访问共享资源,比如使用FSPIN_LOCK_ADDR位置的自旋锁保护串口1打印,其他核心当使用串口1前,需要判断其他核心是否存在占有。本机测试通过串口打印信息验证多核自旋锁的正确性,当一个core拿到自旋锁后,其他核只能等待当前拿到自旋锁的core释放自旋锁后才能拿到自旋锁,保证了打印信息的正确性。
## 2. 如何使用例程
@@ -13,6 +16,7 @@
本例程需要以下硬件,
- E2000D/Q Demo,D2000,FT2000/4,PhytiumPi
+- 串口连接电脑,USB转串口模块
### 2.1 硬件配置方法
@@ -26,13 +30,9 @@
- 本例子已经提供好具体的编译指令,以下进行介绍:
- 1. make 将目录下的工程进行编译
- 2. make clean 将目录下的工程进行清理
- 3. make image 将目录下的工程进行编译,并将生成的elf 复制到目标地址
- 4. make list_kconfig 当前工程支持哪些配置文件
- 5. make load_kconfig LOAD_CONFIG_NAME=`` 将预设配置加载至工程中
- 6. make menuconfig 配置目录下的参数变量
- 7. make backup_kconfig 将目录下的sdkconfig 备份到./configs下
+ 1. make clean 将目录下的工程进行清理
+ 2. make menuconfig 配置目录下的参数变量
+ 3. make backup_kconfig 将目录下的sdkconfig 备份到./configs下
- 本例程提供AMP相关的命令:
@@ -49,10 +49,10 @@
- 在host侧完成配置
-> 配置成E2000D,如E2000d 32位,根据amp_config.conf文件的配置,为config3:
+> 配置成E2000Q,如E2000Q 64位,根据amp_config.conf文件的配置,为config0:
```
-$ make amp_make AMP_CONFIG=config3
+$ make amp_make AMP_CONFIG=config0
```
- host侧设置重启host侧tftp服务器
@@ -79,6 +79,9 @@ bootelf -p 0x90100000
![template_test](./fig/template_test.png)
+- 通过串口查看多核自旋锁的输出,可以看到打印信息,在图中红色框内,各个核心拿到自旋锁后打印信息,然后释放自旋锁,各个核打印信息交替出现。
+- 结束自旋锁打印阶段后,各个核打印信息出现了相互抢占串口的现象。
+
## 3. 如何解决问题
> ``主要记录使用例程中可能会遇到的问题,给出相应的解决方案 `
`
diff --git a/example/system/amp/amp_tools_example/amp/fig/template_test.png b/example/system/amp/amp_tools_example/amp/fig/template_test.png
index f5685ac4c..1dc394781 100644
Binary files a/example/system/amp/amp_tools_example/amp/fig/template_test.png and b/example/system/amp/amp_tools_example/amp/fig/template_test.png differ
diff --git a/example/system/amp/amp_tools_example/amp/main.c b/example/system/amp/amp_tools_example/amp/main.c
index 2399e7242..640a60d47 100644
--- a/example/system/amp/amp_tools_example/amp/main.c
+++ b/example/system/amp/amp_tools_example/amp/main.c
@@ -31,18 +31,42 @@
#include
#include "fcpu_info.h"
#include "fsleep.h"
+#include "fcache.h"
+#include "fspin.h"
+#include "fatomic.h"
+#define PRINT_CNT 10
+#define FSPIN_LOCK_ADDR 0xC0000000 /* 锁地址 */
+
+static FCpuLock *lock_private = (FCpuLock *)FSPIN_LOCK_ADDR;
int main()
{
+ /* 按照混合异构部署的启动逻辑amp_config.json,此核心首先启动,所以对FSPIN_LOCK_ADDR的锁进行初始化操作 */
+ FATOMIC_UNLOCK(lock_private->v);/* initialize, unlock the lock */
u32 cpu_id ;
+ u32 cnt = 0 ;
GetCpuId(&cpu_id);
-
- fsleep_seconds(1);
- /* if shell command is not enabled, run example one by one */
- printf("\n\n*********************************************************\n");
- printf("core[%d] Hello 0, Phytium Standalone SDk!\r\n",cpu_id);
- printf("*********************************************************\n");
+ fsleep_millisec(10) ;/* 等待10ms,确保其他核心启动完毕,避免打印收到干扰 */
+
+ while (cnt < PRINT_CNT)
+ {
+ while(FATOMIC_LOCK(lock_private->v,1));/* 等待锁空闲,再进行上锁操作 */
+ printf("lock test core[%d] Hello %d, Phytium Standalone SDk!\r\n",cpu_id,cnt);
+ cnt ++ ;
+ FATOMIC_UNLOCK(lock_private->v);
+ }
+
+ fsleep_millisec(100) ;/* 等待100ms,确保其他核心自旋锁阶段打印完毕 */
+
+ cnt = 0;
+ while (cnt < PRINT_CNT)
+ {
+ printf("not lock test core[%d] Hello %d, Phytium Standalone SDk!\r\n",cpu_id,cnt);
+ cnt ++ ;
+ }
+ printf("core[%d] test is over **********\n",cpu_id);
+
return 0;
}
\ No newline at end of file
diff --git a/example/system/amp/amp_tools_example/amp1/main.c b/example/system/amp/amp_tools_example/amp1/main.c
index 1e0c73495..c77e82a74 100644
--- a/example/system/amp/amp_tools_example/amp1/main.c
+++ b/example/system/amp/amp_tools_example/amp1/main.c
@@ -31,19 +31,39 @@
#include
#include "fcpu_info.h"
#include "fsleep.h"
+#include "fcache.h"
+#include "fspin.h"
+#include "fatomic.h"
+#define PRINT_CNT 10
+#define FSPIN_LOCK_ADDR 0xC0000000 /*与 ../amp/main.c 中的地址保持一致*/
+
+static FCpuLock *lock_private = (FCpuLock *)FSPIN_LOCK_ADDR;
int main()
{
u32 cpu_id ;
+ u32 cnt = 0 ;
GetCpuId(&cpu_id);
-
- fsleep_seconds(2);
+ fsleep_millisec(10) ;/* 等待10ms,确保核心启动完毕,避免打印收到干扰 */
- /* if shell command is not enabled, run example one by one */
- printf("\n\n*********************************************************\n");
- printf("core[%d] Hello 1, Phytium Standalone SDk!\r\n",cpu_id);
- printf("*********************************************************\n");
+ while (cnt < PRINT_CNT)
+ {
+ while(FATOMIC_LOCK(lock_private->v,1));
+ printf("lock test core[%d] Hello %d, Phytium Standalone SDk!\r\n",cpu_id,cnt);
+ cnt ++ ;
+ FATOMIC_UNLOCK(lock_private->v);
+ }
+ fsleep_millisec(50) ;/* 等待50ms,确保打印任务都执行完毕,因为是第二个启动核心,所以延时缩短,确保能其他核心的打印任务冲突 */
+
+ cnt = 0;
+ while (cnt < PRINT_CNT)
+ {
+ printf("not lock test core[%d] Hello %d, Phytium Standalone SDk!\r\n",cpu_id,cnt);
+ cnt ++ ;
+ }
+ printf("core[%d] test is over **********\n",cpu_id);
+
return 0;
}
\ No newline at end of file
diff --git a/example/system/amp/amp_tools_example/amp2/main.c b/example/system/amp/amp_tools_example/amp2/main.c
index 1da5d65f8..5ba4a7c88 100644
--- a/example/system/amp/amp_tools_example/amp2/main.c
+++ b/example/system/amp/amp_tools_example/amp2/main.c
@@ -31,19 +31,40 @@
#include
#include "fcpu_info.h"
#include "fsleep.h"
+#include "fcache.h"
+#include "fspin.h"
+#include "fatomic.h"
+#define PRINT_CNT 10
+#define FSPIN_LOCK_ADDR 0xC0000000 /*与 ../amp/main.c 中的地址保持一致*/
+
+static FCpuLock *lock_private = (FCpuLock *)FSPIN_LOCK_ADDR;
int main()
{
u32 cpu_id ;
+ u32 cnt = 0 ;
GetCpuId(&cpu_id);
-
- fsleep_seconds(3);
- /* if shell command is not enabled, run example one by one */
- printf("\n\n*********************************************************\n");
- printf("core[%d] Hello 2, Phytium Standalone SDk!\r\n",cpu_id);
- printf("*********************************************************\n");
+ fsleep_millisec(10) ;/* 等待10ms,确保核心启动完毕,避免打印收到干扰 */
+
+ while (cnt < PRINT_CNT)
+ {
+ while(FATOMIC_LOCK(lock_private->v,1));
+ printf("lock test core[%d] Hello %d, Phytium Standalone SDk!\r\n",cpu_id,cnt);
+ cnt ++ ;
+ FATOMIC_UNLOCK(lock_private->v);
+ }
+ /* 无等待,因为是第三个启动核心,确保能与其他核心的打印任务冲突 */
+
+ cnt = 0;
+ while (cnt < PRINT_CNT)
+ {
+ printf("not lock test core[%d] Hello %d, Phytium Standalone SDk!\r\n",cpu_id,cnt);
+ cnt ++ ;
+ }
+ printf("core[%d] test is over **********\n",cpu_id);
+
return 0;
}
\ No newline at end of file
diff --git a/lib/libc/system_call.c b/lib/libc/system_call.c
index f508723c9..e5967f943 100644
--- a/lib/libc/system_call.c
+++ b/lib/libc/system_call.c
@@ -34,7 +34,6 @@
#include
#include "fearly_uart.h"
#include "sdkconfig.h"
-#include "fspin.h"
#include "ftypes.h"
/* _exit - Simple implementation. Does not return.
@@ -454,8 +453,6 @@ __attribute__((weak)) s32 _write(s32 fd, char *buf, s32 nbytes)
char *LocalBuf = buf;
(void)fd;
- SpinLock();
-
for (i = 0; i < nbytes; i++)
{
if (LocalBuf != NULL)
@@ -477,7 +474,6 @@ __attribute__((weak)) s32 _write(s32 fd, char *buf, s32 nbytes)
}
}
- SpinUnlock();
return (nbytes);
#else
(void)fd;
diff --git a/soc/common/fspin.c b/soc/common/fspin.c
index 68bbf9f45..4dca26b0d 100644
--- a/soc/common/fspin.c
+++ b/soc/common/fspin.c
@@ -29,10 +29,6 @@
#include "fatomic.h"
-typedef struct
-{
- int v;
-}FCpuLock;
static FCpuLock *_lock = NULL;
@@ -56,5 +52,5 @@ _WEAK void SpinInit(void)
void SpinlLockSet(uintptr addr)
{
_lock = (FCpuLock *)addr ;
- _lock->v = 0;
+ FATOMIC_UNLOCK(_lock->v);
}
diff --git a/soc/common/fspin.h b/soc/common/fspin.h
index a68115378..53cd6ed2c 100644
--- a/soc/common/fspin.h
+++ b/soc/common/fspin.h
@@ -34,6 +34,12 @@ extern "C"
{
#endif
+typedef struct
+{
+ int v;
+}FCpuLock;
+
+
void SpinInit(void);
void SpinLock(void);
void SpinUnlock(void);
diff --git a/tools/build/boot_code/sdkconfig b/tools/build/boot_code/sdkconfig
index b448a0281..93398361b 100644
--- a/tools/build/boot_code/sdkconfig
+++ b/tools/build/boot_code/sdkconfig
@@ -10,8 +10,8 @@ CONFIG_ARCH_NAME="armv8"
#
# Arm architecture configuration
#
-# CONFIG_ARCH_ARMV8_AARCH64 is not set
-CONFIG_ARCH_ARMV8_AARCH32=y
+CONFIG_ARCH_ARMV8_AARCH64=y
+# CONFIG_ARCH_ARMV8_AARCH32 is not set
#
# Compiler configuration
@@ -19,28 +19,22 @@ CONFIG_ARCH_ARMV8_AARCH32=y
CONFIG_ARM_GCC_SELECT=y
# CONFIG_ARM_CLANG_SELECT is not set
CONFIG_TOOLCHAIN_NAME="gcc"
-CONFIG_TARGET_ARMV8_AARCH32=y
-CONFIG_ARCH_EXECUTION_STATE="aarch32"
-
-#
-# Fpu configuration
-#
-CONFIG_CRYPTO_NEON_FP_ARMV8=y
-# CONFIG_VFPV4 is not set
-# CONFIG_VFPV4_D16 is not set
-# CONFIG_VFPV3 is not set
-# CONFIG_VFPV3_D16 is not set
-CONFIG_ARM_MFPU="crypto-neon-fp-armv8"
-CONFIG_MFLOAT_ABI_HARD=y
-# CONFIG_MFLOAT_ABI_SOFTFP is not set
-CONFIG_ARM_MFLOAT_ABI="hard"
-# end of Fpu configuration
+CONFIG_TARGET_ARMV8_AARCH64=y
+CONFIG_ARCH_EXECUTION_STATE="aarch64"
+CONFIG_ARM_NEON=y
+CONFIG_ARM_CRC=y
+CONFIG_ARM_CRYPTO=y
+CONFIG_ARM_FLOAT_POINT=y
+# CONFIG_GCC_CODE_MODEL_TINY is not set
+CONFIG_GCC_CODE_MODEL_SMALL=y
+# CONFIG_GCC_CODE_MODEL_LARGE is not set
# end of Compiler configuration
CONFIG_USE_CACHE=y
CONFIG_USE_L3CACHE=y
CONFIG_USE_MMU=y
-CONFIG_USE_AARCH64_L1_TO_AARCH32=y
+CONFIG_BOOT_WITH_FLUSH_CACHE=y
+# CONFIG_MMU_DEBUG_PRINTS is not set
CONFIG_FPEN=y
# end of Arm architecture configuration
# end of Arch configuration
@@ -48,7 +42,11 @@ CONFIG_FPEN=y
#
# Soc configuration
#
-
+# CONFIG_TARGET_PHYTIUMPI is not set
+# CONFIG_TARGET_E2000Q is not set
+# CONFIG_TARGET_E2000D is not set
+# CONFIG_TARGET_E2000S is not set
+# CONFIG_TARGET_FT2004 is not set
CONFIG_F32BIT_MEMORY_ADDRESS=0x80000000
CONFIG_F32BIT_MEMORY_LENGTH=0x80000000
CONFIG_F64BIT_MEMORY_ADDRESS=0x2000000000
@@ -62,7 +60,6 @@ CONFIG_DEFAULT_DEBUG_PRINT_UART1=y
#
# Board Configuration
#
-CONFIG_BOARD_NAME="demo"
#
# IO mux configuration when board start up
@@ -72,7 +69,7 @@ CONFIG_BOARD_NAME="demo"
#
# Build project name
#
-CONFIG_TARGET_NAME="template"
+CONFIG_TARGET_NAME="boot"
# end of Build project name
# end of Board Configuration
@@ -214,14 +211,10 @@ CONFIG_DEFAULT_LINKER_SCRIPT=y
CONFIG_IMAGE_LOAD_ADDRESS=0xb0120000
CONFIG_IMAGE_MAX_LENGTH=0x2000000
CONFIG_HEAP_SIZE=1
-CONFIG_SVC_STACK_SIZE=0x1000
-CONFIG_SYS_STACK_SIZE=0x1000
-CONFIG_IRQ_STACK_SIZE=0x1000
-CONFIG_ABORT_STACK_SIZE=0x1000
-CONFIG_FIQ_STACK_SIZE=0x1000
-CONFIG_UNDEF_STACK_SIZE=0x1000
+CONFIG_STACK_SIZE=0x400
+CONFIG_FPU_STACK_SIZE=0x1000
# end of Linker Options
# end of Build setup
-CONFIG_SOC_NAME="e2000"
-CONFIG_TARGET_TYPE_NAME="q"
+CONFIG_SOC_NAME="phytiumpi"
CONFIG_SOC_CORE_NUM=4
+CONFIG_BOARD_NAME="firefly"
diff --git a/tools/build/boot_code/sdkconfig.h b/tools/build/boot_code/sdkconfig.h
index d359a0b59..1db0213c9 100644
--- a/tools/build/boot_code/sdkconfig.h
+++ b/tools/build/boot_code/sdkconfig.h
@@ -10,40 +10,40 @@
/* Arm architecture configuration */
-/* CONFIG_ARCH_ARMV8_AARCH64 is not set */
-#define CONFIG_ARCH_ARMV8_AARCH32
+#define CONFIG_ARCH_ARMV8_AARCH64
+/* CONFIG_ARCH_ARMV8_AARCH32 is not set */
/* Compiler configuration */
#define CONFIG_ARM_GCC_SELECT
/* CONFIG_ARM_CLANG_SELECT is not set */
#define CONFIG_TOOLCHAIN_NAME "gcc"
-#define CONFIG_TARGET_ARMV8_AARCH32
-#define CONFIG_ARCH_EXECUTION_STATE "aarch32"
-
-/* Fpu configuration */
-
-#define CONFIG_CRYPTO_NEON_FP_ARMV8
-/* CONFIG_VFPV4 is not set */
-/* CONFIG_VFPV4_D16 is not set */
-/* CONFIG_VFPV3 is not set */
-/* CONFIG_VFPV3_D16 is not set */
-#define CONFIG_ARM_MFPU "crypto-neon-fp-armv8"
-#define CONFIG_MFLOAT_ABI_HARD
-/* CONFIG_MFLOAT_ABI_SOFTFP is not set */
-#define CONFIG_ARM_MFLOAT_ABI "hard"
-/* end of Fpu configuration */
+#define CONFIG_TARGET_ARMV8_AARCH64
+#define CONFIG_ARCH_EXECUTION_STATE "aarch64"
+#define CONFIG_ARM_NEON
+#define CONFIG_ARM_CRC
+#define CONFIG_ARM_CRYPTO
+#define CONFIG_ARM_FLOAT_POINT
+/* CONFIG_GCC_CODE_MODEL_TINY is not set */
+#define CONFIG_GCC_CODE_MODEL_SMALL
+/* CONFIG_GCC_CODE_MODEL_LARGE is not set */
/* end of Compiler configuration */
#define CONFIG_USE_CACHE
#define CONFIG_USE_L3CACHE
#define CONFIG_USE_MMU
-#define CONFIG_USE_AARCH64_L1_TO_AARCH32
+#define CONFIG_BOOT_WITH_FLUSH_CACHE
+/* CONFIG_MMU_DEBUG_PRINTS is not set */
#define CONFIG_FPEN
/* end of Arm architecture configuration */
/* end of Arch configuration */
/* Soc configuration */
+/* CONFIG_TARGET_PHYTIUMPI is not set */
+/* CONFIG_TARGET_E2000Q is not set */
+/* CONFIG_TARGET_E2000D is not set */
+/* CONFIG_TARGET_E2000S is not set */
+/* CONFIG_TARGET_FT2004 is not set */
#define CONFIG_F32BIT_MEMORY_ADDRESS 0x80000000
#define CONFIG_F32BIT_MEMORY_LENGTH 0x80000000
#define CONFIG_F64BIT_MEMORY_ADDRESS 0x2000000000
@@ -56,15 +56,13 @@
/* Board Configuration */
-#define CONFIG_BOARD_NAME "demo"
-
/* IO mux configuration when board start up */
/* CONFIG_CUS_DEMO_BOARD is not set */
/* Build project name */
-#define CONFIG_TARGET_NAME "template"
+#define CONFIG_TARGET_NAME "boot"
/* end of Build project name */
/* end of Board Configuration */
@@ -192,16 +190,12 @@
#define CONFIG_IMAGE_LOAD_ADDRESS 0xb0120000
#define CONFIG_IMAGE_MAX_LENGTH 0x2000000
#define CONFIG_HEAP_SIZE 1
-#define CONFIG_SVC_STACK_SIZE 0x1000
-#define CONFIG_SYS_STACK_SIZE 0x1000
-#define CONFIG_IRQ_STACK_SIZE 0x1000
-#define CONFIG_ABORT_STACK_SIZE 0x1000
-#define CONFIG_FIQ_STACK_SIZE 0x1000
-#define CONFIG_UNDEF_STACK_SIZE 0x1000
+#define CONFIG_STACK_SIZE 0x400
+#define CONFIG_FPU_STACK_SIZE 0x1000
/* end of Linker Options */
/* end of Build setup */
-#define CONFIG_SOC_NAME "e2000"
-#define CONFIG_TARGET_TYPE_NAME "q"
+#define CONFIG_SOC_NAME "phytiumpi"
#define CONFIG_SOC_CORE_NUM 4
+#define CONFIG_BOARD_NAME "firefly"
#endif