Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Generate tables for libcanard table coding system #30

Open
wants to merge 8 commits into
base: master
Choose a base branch
from

Conversation

tpwrules
Copy link
Contributor

Please see individual commit messages for details.

Please also see the main discussion at libcanard.

This allows the entry point to be inlined at the caller site, paving the
way for various optimizations.

<msg>_encode now calls the non-inlined _<msg>_encode function in the .c
file which does the preliminary work then calls __<msg>_encode to encode
the actual type, if compound (or e.g. canardEncodeScalar).
Allows the processing of 0-length messages (which is true of some
important ones in the DSDL) to be optimized away.
If the message structure is compatible, the compiler generates a table
which describes the structure. If enabled, an interpreter in libcanard
is then used to follow the table description and encode or decode the
message. This occupies substantially fewer bytes per message as the
table is much smaller than the C function previously used. This
translates to a large reduction in program memory usage, especially if
many different message types need to be coded.

The call to the interpreter (along with a pointer to the message and the
associated table) is inlined whereever e.g. <msg>_encode is called. The
existing function to encode/decode is still generated in case table
coding is not enabled in libcanard or the structure is not compatible.

This commit sets up all the hooks to generate the tables and call the
interpreter functions. However, no tables are generated as the
generation function is a simple stub that always fails.
Each table has a four byte header, plus some number of entries (4
bytes). Each field consumes one entry.

The maximum encoded message length in bytes, size of the C message
struct in chars, and number of table entries all are limited to 65535
for table coding to be possible.
There is no additional overhead for nesting.
Static arrays have a 2-entry header (8 bytes), plus the entries
describing the contents of the array.

Array contents cannot consist of more than 256 entries (including header
entries and entries describing nested types). The array length cannot
exceed 65535.
Dynamic arrays have a 3-entry header (12 bytes), plus the entries
describing the contents of the array.

Array contents cannot consist of more than 256 entries (including header
entries and entries describing nested types). The maximum array length
cannot exceed 65535.
Unions have a 2-entry header (8 bytes), plus 1 entry for each field,
plus the entries describing each field.

The maximum number of fields is 255. Each field cannot consist of more
than 255 entries (including header entries and entries describing nested
types).

This completes the list of DSDL types.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant