Skip to content

Commit 92d6fb8

Browse files
elcritchJaremy Creechley
andauthored
Enable customizing PageShift to set PageSize for embedded targets (#19129)
* Enable customizing PageSize (via PageShift). This enables adjusting PageSize for embedded targets without abusing cpu16. * copy nimPageXYZ settings for mmpaptest * add docs for Nim manual * add docs for Nim manual * docs tweaks Co-authored-by: Jaremy Creechley <[email protected]>
1 parent 309ec71 commit 92d6fb8

File tree

3 files changed

+36
-5
lines changed

3 files changed

+36
-5
lines changed

doc/nimc.rst

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -656,6 +656,30 @@ is not available but C's `malloc` is. You can use the `nimAllocPagesViaMalloc`
656656
define to use `malloc` instead of `mmap`. `nimAllocPagesViaMalloc` is currently
657657
only supported with `--gc:arc` or `--gc:orc`. (Since version 1.6)
658658

659+
nimPage256 / nimPage512 / nimPage1k
660+
===================================
661+
662+
Adjust the page size for Nim's GC allocator. This enables using
663+
`nimAllocPagesViaMalloc` on devices with less RAM. The default
664+
page size requires too much RAM to work.
665+
666+
Recommended settings:
667+
668+
- < 32 kB of RAM use `nimPage256`
669+
670+
- < 512 kB of RAM use `nimPage512`
671+
672+
- < 2 MB of RAM use `nimPage1k`
673+
674+
Initial testing hasn't shown much difference between 512B or 1kB page sizes
675+
in terms of performance or latency. Using `nimPages256` will limit the
676+
total amount of allocatable RAM.
677+
678+
nimMemAlignTiny
679+
===============
680+
681+
Sets `MemAlign` to `4` bytes which reduces the memory alignment
682+
to better match some embedded devices.
659683

660684
Nim for realtime systems
661685
========================

lib/system/bitmasks.nim

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,18 @@
1010
# Page size of the system; in most cases 4096 bytes. For exotic OS or
1111
# CPU this needs to be changed:
1212
const
13-
PageShift = when defined(cpu16): 8 else: 12 # \
14-
# my tests showed no improvements for using larger page sizes.
13+
PageShift = when defined(nimPage256) or defined(cpu16): 8
14+
elif defined(nimPage512): 9
15+
elif defined(nimPage1k): 10
16+
else: 12 # \ # my tests showed no improvements for using larger page sizes.
17+
1518
PageSize = 1 shl PageShift
1619
PageMask = PageSize-1
1720

1821

1922
MemAlign = # also minimal allocatable memory block
20-
when defined(useMalloc):
23+
when defined(nimMemAlignTiny): 4
24+
elif defined(useMalloc):
2125
when defined(amd64): 16
2226
else: 8
2327
else: 16

tests/mmaptest.nim

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,11 @@ proc `+!!`(p: pointer, size: int): pointer {.inline.} =
1919
result = cast[pointer](cast[int](p) + size)
2020

2121
const
22-
PageShift = when defined(cpu16): 8 else: 12 # \
23-
# my tests showed no improvements for using larger page sizes.
22+
PageShift = when defined(nimPage256) or defined(cpu16): 8
23+
elif defined(nimPage512): 9
24+
elif defined(nimPage1k): 10
25+
else: 12 # \ # my tests showed no improvements for using larger page sizes.
26+
2427
PageSize = 1 shl PageShift
2528

2629
var p = osAllocPages(3 * PageSize)

0 commit comments

Comments
 (0)