Skip to content

Commit

Permalink
Implement threads on Zephyr (#19156)
Browse files Browse the repository at this point in the history
* pthreads setup for zephyr

- enable tweak stack size
- update lib/system/threads.nim
- Fix int/uint in casting pointer.

* add documentation and tweak flag names

* add documentation and tweak flag names

* fix configuration flag names

* fix configuration flag names

* cleanup

Co-authored-by: Jaremy Creechley <jaremy.creechley@panthalassa.com>
(cherry picked from commit 7772ca3)
  • Loading branch information
elcritch authored and narimiran committed Mar 24, 2022
1 parent 8aa0458 commit 4877caa
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 9 deletions.
9 changes: 9 additions & 0 deletions doc/nimc.rst
Original file line number Diff line number Diff line change
Expand Up @@ -704,6 +704,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
========================

Expand Down
2 changes: 2 additions & 0 deletions lib/system/threadlocalstorage.nim
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,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 {.
Expand Down
34 changes: 25 additions & 9 deletions lib/system/threads.nim
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit 4877caa

Please sign in to comment.