mirror of
https://github.com/apache/nuttx.git
synced 2026-10-08 14:55:18 +00:00
The documentation grew one page at a time, so the tree follows the
history of who wrote what and not the shape of NuttX. Scheduling is
spread over three places, a driver page can sit above the subsystem
that owns it, and the front page lists everything at the same level.
That is a lot to face when all you want to know is where the scheduler
lives.
This change files every page under the code it describes. It is a move,
not a rewrite: outside the ten pages named below, every page keeps the
text that is already in master, and no page's text is deleted.
What it does:
* Groups the table of contents into nine chapters.
* Moves the OS subsystems under os/: scheduling, memory, drivers,
filesystem, networking, IPC, interrupts, libs, time.
* Renames the platform pages to the names the source tree uses, and
derives their tags from the tree instead of by hand.
* Splits guides/ by subject.
* Adds Documentation/redirects.py, with a rule for every page that left
its old path, so old URLs keep working. The redirect page also carries
a link's #anchor across to the new page.
Ten pages have text that is new or rewritten. Nine of them are the
landing page of a chapter, which has to exist for the new structure:
index the front page
os/index OS Design
os/scheduling/index Scheduling
os/interrupts/index Interrupts
os/ipc/index IPC
os/time/index Time and timers
about/index About
developing/index Developing NuttX
ReleaseNotes/index Release notes
The tenth is os/libs/libbuiltin, the only page here with technical
content: libs/libbuiltin/ had no page at all. Five SVG diagrams come
with these pages, hand-written XML with no editor metadata.
Nothing outside Documentation/ is touched.
How it was checked:
* Sphinx builds with -W: no warnings, and no document left outside a
toctree.
* A script, offered in the PR, proves the narrow claim this rests on.
For every page outside the ten named above it erases what a move
touches -- link target, path, tag line, toctree block, table border --
from the whole old text and the whole new text, and requires the two
to be byte for byte identical. It also requires every sentence of a
deleted page to turn up somewhere, and every page that left its old
path to have a redirect, from a URL that existed, to where its content
went. It exits non-zero and names the page if any of that is not true,
and it tests added pages too, so forgetting to declare one cannot make
it pass.
* An independent audit checked 133 factual claims on these ten pages
against the tree, one shell command per claim: 130 confirmed, 1
refuted and fixed here, 2 not checkable.
* tools/checkpatch.sh is clean over the range.
The diff is large because moving a page changes every link that points
to it. Most of it is pure renames, and board pages that gained one tag
line.
Assisted-by: Claude:claude-opus-5
181 lines
5.7 KiB
ReStructuredText
181 lines
5.7 KiB
ReStructuredText
lib_bsprintf
|
|
============
|
|
|
|
This function is mainly used to output the contents of the input
|
|
structure. Supports standard formats for printf and scanf. For detailed
|
|
parameters, see: 1. https://en.cppreference.com/w/c/io/fprintf 2.
|
|
https://en.cppreference.com/w/c/io/fscanf
|
|
|
|
- **special**:
|
|
|
|
1. Float use %hf, “%f” or “%lf” is double, “%Lf” is long double.
|
|
2. The char array is specified with %.xs. for example: “char t[30]”
|
|
is specified with “%.30s”, char a [20] - " %.20s "
|
|
3. “%u” is unsigned int.
|
|
4. “%d” is int.
|
|
5. When using %f to format a double data type, the double is
|
|
truncated to 6 decimal places by default.
|
|
6. It is recommended that the “char[]” array be placed at the end of
|
|
the structure to prevent parameter configuration errors such as
|
|
“%.20s” from causing problems in parsing the entire buffer.
|
|
|
|
- **demo**
|
|
|
|
1. **struct**:
|
|
|
|
::
|
|
|
|
begin_packed_struct
|
|
struct test
|
|
{
|
|
uint8_t a;
|
|
uint16_t b;
|
|
uint32_t c;
|
|
int8_t d;
|
|
int16_t e;
|
|
int32_t f;
|
|
float g;
|
|
double h;
|
|
char i[32];
|
|
uint64_t j;
|
|
int64_t k;
|
|
char l;
|
|
unsigned char m;
|
|
short int n;
|
|
unsigned short int o;
|
|
int p;
|
|
unsigned int q;
|
|
long r;
|
|
unsigned long s;
|
|
long long t;
|
|
unsigned long long u;
|
|
size_t v;
|
|
long double w;
|
|
}end_packed_struct;
|
|
|
|
1. **format string**:
|
|
|
|
::
|
|
|
|
const char* sg = " uint8_t:[%hhu]\n" \
|
|
" uint16_t:[%hu]\n" \
|
|
" uint32_t:[%u]\n" \
|
|
" int8_t:[%hhd]\n" \
|
|
" int16_t:[%hd]\n" \
|
|
" int32_t:[%d]\n" \
|
|
" float:[%hf]\n" \
|
|
" double:[%f]\n" \
|
|
" char[]:[%.32s]\n" \
|
|
" uint64_t:[%lu]\n" \
|
|
" int64_t:[%ld]\n" \
|
|
" char:[%hhd]\n" \
|
|
" unsigned char:[%hhu]\n" \
|
|
" short int:[%hd]\n" \
|
|
"unsigned short int:[%hu]\n" \
|
|
" int:[%d]\n" \
|
|
" unsigned int:[%u]\n" \
|
|
" long:[%ld]\n" \
|
|
" unsigned long:[%lu]\n" \
|
|
" long long:[%lld]\n" \
|
|
"unsigned long long:[%llu]\n" \
|
|
" size_t:[%uz]\n" \
|
|
" long double:[%Lf]\n";
|
|
|
|
1. **use**:
|
|
|
|
- output to terminal:
|
|
|
|
::
|
|
|
|
#ifdef CONFIG_FILE_STREAM
|
|
struct lib_stdoutstream_s stdoutstream;
|
|
|
|
lib_stdoutstream(&stdoutstream, stdout);
|
|
|
|
flockfile(stdout);
|
|
lib_bsprintf(&stdoutstream.common, sv, &test_v);
|
|
lib_bsprintf(&stdoutstream.common, sg, &test_g);
|
|
funlockfile(stdout);
|
|
#else
|
|
struct lib_rawoutstream_s rawoutstream;
|
|
struct lib_bufferedoutstream_s outstream;
|
|
|
|
lib_rawoutstream(&rawoutstream, STDOUT_FILENO);
|
|
lib_bufferedoutstream(&outstream, &rawoutstream.common);
|
|
|
|
lib_bsprintf(&outstream.common, sv, &test_v);
|
|
lib_bsprintf(&outstream.common, sg, &test_g);
|
|
|
|
lib_stream_flush(&outstream.common);
|
|
#endif
|
|
|
|
lib_bscanf
|
|
==========
|
|
|
|
This function adds a formatted standard scanf string to the
|
|
structure(lib_bscanf). 1. https://zh.cppreference.com/w/c/io/fscanf
|
|
|
|
- **special**:
|
|
|
|
1. Please use %lf for double precision, “%hf” or “%f” for float, long
|
|
double (“%Lf”) is not supported.
|
|
2. Please use %hhd or %hhu for a single char or unsigned char.
|
|
3. Use %hd or %hu for short int or unsigned short int.
|
|
4. When using %s or %c, please specify the length of the char array,
|
|
such as %32s, %32c.
|
|
5. %s will check the string for spaces. When there are spaces in the
|
|
string, it will be truncated. If you want to use string with
|
|
spaces, please use %{length}c, but make sure that the length of
|
|
the string can fill the array, otherwise an error will occur.
|
|
6. %[] collection and %n are not supported.
|
|
|
|
- **demo**
|
|
|
|
1. **struct**: Same as above
|
|
2. **format string**:
|
|
|
|
::
|
|
|
|
#define TOSTR(str) #str
|
|
#define TONNAME(name) TOSTR(name)
|
|
|
|
#define v_uint8_t 97
|
|
#define v_uint16_t 19299
|
|
#define v_uint32_t 22155
|
|
|
|
......
|
|
|
|
#define v_l_double -9299.9299929912122464755474
|
|
|
|
char bflag[] = "%hhu%hu%u%hhd%hd%d%f%lf%32s%llu%lld%hhd%hhu%hd%hu%d%u%ld%lu%lld%llu%zu%ld";
|
|
|
|
char binput[] = TONNAME(v_uint8_t) \
|
|
" " TONNAME(v_uint16_t) \
|
|
" " TONNAME(v_uint32_t) \
|
|
" " TONNAME(v_int8_t) \
|
|
" " TONNAME(v_int16_t) \
|
|
" " TONNAME(v_int32_t) \
|
|
" " TONNAME(v_float) \
|
|
" " TONNAME(v_double) \
|
|
" " TONNAME(v_char_arr) \
|
|
" " TONNAME(v_uint64_t) \
|
|
" " TONNAME(v_int64_t) \
|
|
" " TONNAME(v_char) \
|
|
" " TONNAME(v_u_char) \
|
|
" " TONNAME(v_s_int) \
|
|
" " TONNAME(v_u_s_int) \
|
|
" " TONNAME(v_int) \
|
|
" " TONNAME(v_u_int) \
|
|
" " TONNAME(v_long) \
|
|
" " TONNAME(v_u_long) \
|
|
" " TONNAME(v_l_l) \
|
|
" " TONNAME(v_u_l_l) \
|
|
" " TONNAME(v_size_t) \
|
|
" " TONNAME(v_l_double);
|
|
|
|
3. **use**:
|
|
|
|
::
|
|
|
|
struct test vg;
|
|
ret = lib_bscanf(binput, bflag, &vg);
|