summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--doc/nimc.rst9
-rw-r--r--lib/system/threadlocalstorage.nim2
-rw-r--r--lib/system/threads.nim34
3 files changed, 36 insertions, 9 deletions
diff --git a/doc/nimc.rst b/doc/nimc.rst
index d35dad6c2..6be4c204e 100644
--- a/doc/nimc.rst
+++ b/doc/nimc.rst
@@ -681,6 +681,15 @@ nimMemAlignTiny
 Sets `MemAlign` to `4` bytes which reduces the memory alignment
 to better match some embedded devices.
 
+Thread stack size 
+=================
+
+Nim's thread API provides a simple wrapper around more advanced
+RTOS task features. Customizing the stack size and stack guard size can
+be done by setting `-d:nimThreadStackSize=16384` or `-d:nimThreadStackGuard=32`.
+
+Currently only Zephyr and FreeRTOS support these configurations. 
+
 Nim for realtime systems
 ========================
 
diff --git a/lib/system/threadlocalstorage.nim b/lib/system/threadlocalstorage.nim
index e772f270c..cea9abb42 100644
--- a/lib/system/threadlocalstorage.nim
+++ b/lib/system/threadlocalstorage.nim
@@ -153,6 +153,8 @@ else:
 
   proc pthread_attr_init(a1: var Pthread_attr): cint {.
     importc, header: pthreadh.}
+  proc pthread_attr_setstack*(a1: ptr Pthread_attr, a2: pointer, a3: int): cint {.
+    importc, header: pthreadh.}
   proc pthread_attr_setstacksize(a1: var Pthread_attr, a2: int): cint {.
     importc, header: pthreadh.}
   proc pthread_attr_destroy(a1: var Pthread_attr): cint {.
diff --git a/lib/system/threads.nim b/lib/system/threads.nim
index 0e5198035..ac727be0a 100644
--- a/lib/system/threads.nim
+++ b/lib/system/threads.nim
@@ -47,14 +47,23 @@
 when not declared(ThisIsSystem):
   {.error: "You must not import this module explicitly".}
 
-const
-  StackGuardSize = 4096
-  ThreadStackMask =
-    when defined(genode):
-      1024*64*sizeof(int)-1
-    else:
-      1024*256*sizeof(int)-1
-  ThreadStackSize = ThreadStackMask+1 - StackGuardSize
+when defined(zephyr) or defined(freertos):
+  const
+    nimThreadStackSize {.intdefine.} = 8192 
+    nimThreadStackGuard {.intdefine.} = 128
+
+    StackGuardSize = nimThreadStackGuard 
+    ThreadStackSize = nimThreadStackSize - nimThreadStackGuard 
+else:
+  const
+    StackGuardSize = 4096
+    ThreadStackMask =
+      when defined(genode):
+        1024*64*sizeof(int)-1
+      else:
+        1024*256*sizeof(int)-1
+
+    ThreadStackSize = ThreadStackMask+1 - StackGuardSize
 
 #const globalsSlot = ThreadVarSlot(0)
 #sysAssert checkSlot.int == globalsSlot.int
@@ -321,7 +330,14 @@ else:
     when hasSharedHeap: t.core.stackSize = ThreadStackSize
     var a {.noinit.}: Pthread_attr
     doAssert pthread_attr_init(a) == 0
-    let setstacksizeResult = pthread_attr_setstacksize(a, ThreadStackSize)
+    when defined(zephyr):
+      var
+        rawstk = allocShared0(ThreadStackSize + StackGuardSize)
+        stk = cast[pointer](cast[uint](rawstk) + StackGuardSize)
+      let setstacksizeResult = pthread_attr_setstack(addr a, stk, ThreadStackSize)
+    else:
+      let setstacksizeResult = pthread_attr_setstacksize(a, ThreadStackSize)
+
     when not defined(ios):
       # This fails on iOS
       doAssert(setstacksizeResult == 0)