Преглед изворни кода

!153 修正每个lwp线程实例的内核态栈大小不一致的问题
Merge pull request !153 from jesven/fix_lwp_stack_size

bernard пре 4 година
родитељ
комит
8d613901fa

+ 57 - 1
bsp/qemu-vexpress-a9/.config

@@ -335,6 +335,7 @@ CONFIG_RT_LWIP_USING_PING=y
 # CONFIG_RT_USING_UTEST is not set
 CONFIG_RT_USING_LWP=y
 CONFIG_RT_LWP_MAX_NR=30
+CONFIG_LWP_TASK_STACK_SIZE=16384
 # CONFIG_RT_USING_GDBSERVER is not set
 CONFIG_RT_CH_MSG_MAX_NR=1024
 CONFIG_RT_LWP_SHM_MAX_NR=64
@@ -464,6 +465,7 @@ CONFIG_LWP_TID_MAX_NR=64
 # CONFIG_PKG_USING_QRCODE is not set
 # CONFIG_PKG_USING_ULOG_EASYFLASH is not set
 # CONFIG_PKG_USING_ULOG_FILE is not set
+# CONFIG_PKG_USING_LOGMGR is not set
 # CONFIG_PKG_USING_ADBD is not set
 # CONFIG_PKG_USING_COREMARK is not set
 # CONFIG_PKG_USING_DHRYSTONE is not set
@@ -480,6 +482,8 @@ CONFIG_LWP_TID_MAX_NR=64
 # CONFIG_PKG_USING_GBK2UTF8 is not set
 # CONFIG_PKG_USING_VCONSOLE is not set
 # CONFIG_PKG_USING_KDB is not set
+# CONFIG_PKG_USING_WAMR is not set
+# CONFIG_PKG_USING_MICRO_XRCE_DDS_CLIENT is not set
 
 #
 # system packages
@@ -519,7 +523,12 @@ CONFIG_LWP_TID_MAX_NR=64
 # CONFIG_PKG_USING_UC_MODBUS is not set
 # CONFIG_PKG_USING_PPOOL is not set
 # CONFIG_PKG_USING_OPENAMP is not set
-# CONFIG_PKG_USING_RT_PRINTF is not set
+# CONFIG_PKG_USING_RT_KPRINTF_THREADSAFE is not set
+# CONFIG_PKG_USING_RT_MEMCPY_CM is not set
+# CONFIG_PKG_USING_QFPLIB_M0_FULL is not set
+# CONFIG_PKG_USING_QFPLIB_M0_TINY is not set
+# CONFIG_PKG_USING_QFPLIB_M3 is not set
+# CONFIG_PKG_USING_LPM is not set
 
 #
 # peripheral libraries and drivers
@@ -631,6 +640,53 @@ CONFIG_LWP_TID_MAX_NR=64
 # CONFIG_PKG_USING_TETRIS is not set
 # CONFIG_PKG_USING_LWGPS is not set
 # CONFIG_PKG_USING_TENSORFLOWLITEMICRO is not set
+# CONFIG_PKG_USING_STATE_MACHINE is not set
+
+#
+# Privated Packages of RealThread
+#
+# CONFIG_PKG_USING_CODEC is not set
+# CONFIG_PKG_USING_PLAYER is not set
+# CONFIG_PKG_USING_MPLAYER is not set
+# CONFIG_PKG_USING_PERSIMMON_SRC is not set
+# CONFIG_PKG_USING_JS_PERSIMMON is not set
+# CONFIG_PKG_USING_JERRYSCRIPT_WIN32 is not set
+
+#
+# Network Utilities
+#
+# CONFIG_PKG_USING_MDNS is not set
+# CONFIG_PKG_USING_UPNP is not set
+# CONFIG_PKG_USING_WICED is not set
+# CONFIG_PKG_USING_CLOUDSDK is not set
+# CONFIG_PKG_USING_POWER_MANAGER is not set
+# CONFIG_PKG_USING_RT_OTA is not set
+# CONFIG_PKG_USING_RDBD_SRC is not set
+# CONFIG_PKG_USING_RTINSIGHT is not set
+# CONFIG_PKG_USING_SMARTCONFIG is not set
+# CONFIG_PKG_USING_RTX is not set
+# CONFIG_RT_USING_TESTCASE is not set
+# CONFIG_PKG_USING_NGHTTP2 is not set
+# CONFIG_PKG_USING_AVS is not set
+# CONFIG_PKG_USING_ALI_LINKKIT is not set
+# CONFIG_PKG_USING_STS is not set
+# CONFIG_PKG_USING_DLMS is not set
+# CONFIG_PKG_USING_AUDIO_FRAMEWORK is not set
+# CONFIG_PKG_USING_ZBAR is not set
+# CONFIG_PKG_USING_MCF is not set
+# CONFIG_PKG_USING_URPC is not set
+# CONFIG_PKG_USING_BSAL is not set
+# CONFIG_PKG_USING_DCM is not set
+# CONFIG_PKG_USING_EMQ is not set
+# CONFIG_PKG_USING_CFGM is not set
+# CONFIG_PKG_USING_RT_CMSIS_DAP is not set
+# CONFIG_PKG_USING_SMODULE is not set
+# CONFIG_PKG_USING_SNFD is not set
+# CONFIG_PKG_USING_UDBD is not set
+# CONFIG_PKG_USING_BENCHMARK is not set
+# CONFIG_PKG_USING_UBJSON is not set
+# CONFIG_PKG_USING_DATATYPE is not set
+# CONFIG_PKG_USING_FASTFS is not set
 CONFIG_SOC_VEXPRESS_A9=y
 CONFIG_RT_USING_UART0=y
 CONFIG_RT_USING_UART1=y

+ 7 - 0
bsp/qemu-vexpress-a9/rtconfig.h

@@ -230,6 +230,7 @@
 
 #define RT_USING_LWP
 #define RT_LWP_MAX_NR 30
+#define LWP_TASK_STACK_SIZE 16384
 #define RT_CH_MSG_MAX_NR 1024
 #define RT_LWP_SHM_MAX_NR 64
 #define LWP_CONSOLE_INPUT_BUFFER_SIZE 1024
@@ -280,6 +281,12 @@
 
 /* games: games run on RT-Thread console */
 
+
+/* Privated Packages of RealThread */
+
+
+/* Network Utilities */
+
 #define SOC_VEXPRESS_A9
 #define RT_USING_UART0
 #define RT_USING_UART1

+ 5 - 0
components/lwp/Kconfig

@@ -14,6 +14,11 @@ if RT_USING_LWP
         default 30
 endif
 
+config LWP_TASK_STACK_SIZE
+    int "The lwp thread kernel stack size"
+    default 16384
+    depends on RT_USING_LWP
+
 config RT_USING_GDBSERVER
     bool "Using gdbserver"
     default y

+ 1 - 1
components/lwp/lwp.c

@@ -946,7 +946,7 @@ pid_t lwp_execve(char *filename, int argc, char **argv, char **envp)
         thread_name = thread_name ? thread_name + 1 : filename;
 
         thread = rt_thread_create(thread_name, lwp_thread_entry, RT_NULL,
-                               1024 * 16, 25, 200);
+                LWP_TASK_STACK_SIZE, 25, 200);
         if (thread != RT_NULL)
         {
             struct rt_lwp *self_lwp;

+ 5 - 5
components/lwp/lwp_syscall.c

@@ -1302,7 +1302,7 @@ long sys_clone(void *arg[])
     thread = rt_thread_create((const char *)"pthread",
             RT_NULL,
             RT_NULL,
-            ALLOC_KERNEL_STACK_SIZE,
+            self->stack_size,
             self->init_priority,
             self->init_tick);
     if (!thread)
@@ -1493,7 +1493,7 @@ int sys_fork(void)
     thread = rt_thread_create((const char *)thread_name,
             RT_NULL,
             RT_NULL,
-            ALLOC_KERNEL_STACK_SIZE,
+            self_thread->stack_size,
             self_thread->init_priority,
             self_thread->init_tick);
     if (!thread)
@@ -1523,15 +1523,15 @@ int sys_fork(void)
     rt_hw_interrupt_enable(level);
 
     /* copy origin stack */
-    rt_memcpy(thread->stack_addr, self_thread->stack_addr, ALLOC_KERNEL_STACK_SIZE);
+    rt_memcpy(thread->stack_addr, self_thread->stack_addr, self_thread->stack_size);
     lwp_tid_set_thread(tid, thread);
 
     level = rt_hw_interrupt_disable();
     user_stack = lwp_get_user_sp();
     rt_hw_interrupt_enable(level);
 
-    tid = lwp_set_thread_context((void *)((char *)thread->stack_addr + ALLOC_KERNEL_STACK_SIZE),
-            (void *)((char *)self_thread->stack_addr + ALLOC_KERNEL_STACK_SIZE), user_stack, &thread->sp, tid);
+    tid = lwp_set_thread_context((void *)((char *)thread->stack_addr + thread->stack_size),
+            (void *)((char *)self_thread->stack_addr + self_thread->stack_size), user_stack, &thread->sp, tid);
     if (tid)
     {
         level = rt_hw_interrupt_disable();

+ 15 - 15
components/lwp/lwp_user_mm.c

@@ -502,21 +502,21 @@ int lwp_user_accessable(void *addr, size_t size)
     addr_start = addr;
     addr_end = (void*)((char*)addr + size);
 
-    #ifdef ARCH_RISCV64
-        if(addr_start < (void *)USER_VADDR_START)
-        {
-            return 0;
-        }
-    #else
-        if (addr_start >= (void*)KERNEL_VADDR_START)
-        {
-            return 0;
-        }
-        if (addr_start > (void *)KERNEL_VADDR_START)
-        {
-            return 0;
-        }
-    #endif
+#ifdef ARCH_RISCV64
+    if(addr_start < (void *)USER_VADDR_START)
+    {
+        return 0;
+    }
+#else
+    if (addr_start >= (void*)KERNEL_VADDR_START)
+    {
+        return 0;
+    }
+    if (addr_end > (void *)KERNEL_VADDR_START)
+    {
+        return 0;
+    }
+#endif
 
     mmu_info = &lwp->mmu_info;
     next_page = (void *)(((size_t)addr_start + ARCH_PAGE_SIZE) & ~(ARCH_PAGE_SIZE - 1));