User Area

The user area is a small RAM region for task local non-stack storage. It is basically used like variables.

The address of an user variable is built from two numbers: the user area base address and an offset. The effective address is the sum of both numbers. The user area base address is stored in the user pointer UP. It can read with the up@ operation and can be modified with the up! with immediate effect.

The user pointer is different for each task. The user area size is a parameter for task creation.

The offset handled by the developer. There is a system defined area starting at offset 0 that is used by various amforth words. The size of this area may change from version to version. Each architecture directory has a file user.inc that contains the current settings.

Customize

The default amforth built does not provide application specific user area space. To get some, the application master file has to be changed with a proper setting for the APPUSERSIZE variable. This setting defines the bytes allocated in addition to the default system user space.

With this new setting, new hexfiles need to be generated and uploaded.

Use

To create a user variable, the offset number and the name is required.

> 42 user answer
ok
> 44 user question
ok
> 48 user foo

This sequence alocates a 2 byte (1 cell) space for the user variable answer, 4 bytes (2 cells) for the user variable question and an unspecified number of bytes (since it’s the last definition) for the user variable foo. the settings for the APPUSERSIZE shall be at least cover the offset 49. That is is has to be at least 49 - SYSUSERSIZE.

The variables itself work with the normal RAM operations

> 42 answer !
ok
> answer @ u.
42 ok
> 2424. question 2!
ok
> foo c@
ok

Operations like fill work as well.

The file defer.frt adds support for defers in the user area. They are used exactly like normal defers, but store the XT in the user area.

> 42 Udefer answer
ok
> ' ver is answer
ok
> answer
amforth 6.8 RV32IM ok
>

Some system words like emit, key? and source are in fact user defers and can thus be redefined on a per task basis.

The file value.frt adds support for values in the user area. They store their value in the user area (instead of the EEPROM an AVR8), but behave identically. The definition requires both the intial value and the offset:

> 0 42 Uvalue answer
ok
> answer u.
0 ok
> 42 to answer
ok
> answer u.
42 ok
>