1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00

sys/shell: reduce overhead of XFA shell commands

We do not need to add an array of pointers to the shell commands, just
an array of shell commands is sufficient. This reduced the overhead of
XFA by `sizeof(void *)` per command.
This commit is contained in:
Marian Buschsieweke 2024-11-06 18:22:56 +01:00
parent 2be92b5e55
commit a7e251509d
No known key found for this signature in database
GPG Key ID: 758BD52517F79C41
2 changed files with 10 additions and 12 deletions

View File

@ -302,15 +302,14 @@ int shell_parse_file(const shell_command_t *commands,
* ```
*/
#define SHELL_COMMAND(cmd, help, func) \
XFA_USE_CONST(shell_command_xfa_t*, shell_commands_xfa); \
XFA_USE_CONST(shell_command_xfa_t, shell_commands_xfa_v2); \
static FLASH_ATTR const char _xfa_ ## cmd ## _cmd_name[] = #cmd; \
static FLASH_ATTR const char _xfa_ ## cmd ## _cmd_desc[] = help; \
static const shell_command_xfa_t _xfa_ ## cmd ## _cmd = { \
XFA_CONST(shell_command_xfa_t, shell_commands_xfa_v2, 0) _xfa_ ## cmd ## _cmd = { \
.name = _xfa_ ## cmd ## _cmd_name, \
.desc = _xfa_ ## cmd ## _cmd_desc, \
.handler = &func \
}; \
XFA_ADD_PTR(shell_commands_xfa, cmd, cmd, &_xfa_ ## cmd ## _cmd)
};
#endif /* __cplusplus */
#ifdef __cplusplus

View File

@ -36,7 +36,6 @@
#include <assert.h>
#include <errno.h>
#include "kernel_defines.h"
#include "xfa.h"
#include "shell.h"
#include "shell_lock.h"
@ -47,7 +46,7 @@
#endif
/* define shell command cross file array */
XFA_INIT_CONST(shell_command_xfa_t*, shell_commands_xfa);
XFA_INIT_CONST(shell_command_xfa_t, shell_commands_xfa_v2);
#define ETX '\x03' /** ASCII "End-of-Text", or Ctrl-C */
#define EOT '\x04' /** ASCII "End-of-Transmission", or Ctrl-D */
@ -102,10 +101,10 @@ static shell_command_handler_t search_commands(const shell_command_t *entry,
static shell_command_handler_t search_commands_xfa(char *command)
{
unsigned n = XFA_LEN(shell_command_t*, shell_commands_xfa);
unsigned n = XFA_LEN(shell_command_t, shell_commands_xfa_v2);
for (unsigned i = 0; i < n; i++) {
const volatile shell_command_xfa_t *entry = shell_commands_xfa[i];
const volatile shell_command_xfa_t *entry = &shell_commands_xfa_v2[i];
if (flash_strcmp(command, entry->name) == 0) {
return entry->handler;
}
@ -147,7 +146,7 @@ static void print_commands_json(const shell_command_t *cmd_list)
}
}
unsigned n = XFA_LEN(shell_command_xfa_t*, shell_commands_xfa);
unsigned n = XFA_LEN(shell_command_xfa_t, shell_commands_xfa_v2);
for (unsigned i = 0; i < n; i++) {
if (first) {
first = false;
@ -155,7 +154,7 @@ static void print_commands_json(const shell_command_t *cmd_list)
else {
printf(", ");
}
const volatile shell_command_xfa_t *entry = shell_commands_xfa[i];
const volatile shell_command_xfa_t *entry = &shell_commands_xfa_v2[i];
printf("{\"cmd\": \"%s\", \"desc\": \"%s\"}", entry->name, entry->desc);
}
puts("]}");
@ -170,9 +169,9 @@ static void print_commands(const shell_command_t *entry)
static void print_commands_xfa(void)
{
unsigned n = XFA_LEN(shell_command_xfa_t*, shell_commands_xfa);
unsigned n = XFA_LEN(shell_command_xfa_t, shell_commands_xfa_v2);
for (unsigned i = 0; i < n; i++) {
const volatile shell_command_xfa_t *entry = shell_commands_xfa[i];
const volatile shell_command_xfa_t *entry = &shell_commands_xfa_v2[i];
printf("%-20" PRIsflash " %" PRIsflash "\n",
entry->name, entry->desc);
}