Implement threads on Zephyr (#19156)

* 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>
This commit is contained in:
Jaremy Creechley 2021-11-23 00:13:03 -08:00 • committed by GitHub
commit 7772ca303c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 36 additions and 9 deletions

View file

@ -681,6 +681,15 @@ nimMemAlignTiny
Sets `MemAlign` to `4` bytes which reduces the memory alignment Sets `MemAlign` to `4` bytes which reduces the memory alignment
to better match some embedded devices. 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 Nim for realtime systems
======================== ========================

View file

@ -153,6 +153,8 @@ else:
proc pthread_attr_init(a1: var Pthread_attr): cint {. proc pthread_attr_init(a1: var Pthread_attr): cint {.
importc, header: pthreadh.} 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 {. proc pthread_attr_setstacksize(a1: var Pthread_attr, a2: int): cint {.
importc, header: pthreadh.} importc, header: pthreadh.}
proc pthread_attr_destroy(a1: var Pthread_attr): cint {. proc pthread_attr_destroy(a1: var Pthread_attr): cint {.

View file

@ -47,13 +47,22 @@
when not declared(ThisIsSystem): when not declared(ThisIsSystem):
{.error: "You must not import this module explicitly".} {.error: "You must not import this module explicitly".}
const when defined(zephyr) or defined(freertos):
const
nimThreadStackSize {.intdefine.} = 8192
nimThreadStackGuard {.intdefine.} = 128
StackGuardSize = nimThreadStackGuard
ThreadStackSize = nimThreadStackSize - nimThreadStackGuard
else:
const
StackGuardSize = 4096 StackGuardSize = 4096
ThreadStackMask = ThreadStackMask =
when defined(genode): when defined(genode):
1024*64*sizeof(int)-1 1024*64*sizeof(int)-1
else: else:
1024*256*sizeof(int)-1 1024*256*sizeof(int)-1
ThreadStackSize = ThreadStackMask+1 - StackGuardSize ThreadStackSize = ThreadStackMask+1 - StackGuardSize
#const globalsSlot = ThreadVarSlot(0) #const globalsSlot = ThreadVarSlot(0)
@ -321,7 +330,14 @@ else:
when hasSharedHeap: t.core.stackSize = ThreadStackSize when hasSharedHeap: t.core.stackSize = ThreadStackSize
var a {.noinit.}: Pthread_attr var a {.noinit.}: Pthread_attr
doAssert pthread_attr_init(a) == 0 doAssert pthread_attr_init(a) == 0
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) let setstacksizeResult = pthread_attr_setstacksize(a, ThreadStackSize)
when not defined(ios): when not defined(ios):
# This fails on iOS # This fails on iOS
doAssert(setstacksizeResult == 0) doAssert(setstacksizeResult == 0)