aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/command.c13
-rw-r--r--src/command.h51
-rw-r--r--src/ctr.h17
-rw-r--r--src/declfunc.lds.S7
4 files changed, 43 insertions, 45 deletions
diff --git a/src/command.c b/src/command.c
index 44de070d..f96cee62 100644
--- a/src/command.c
+++ b/src/command.c
@@ -112,7 +112,7 @@ static uint8_t in_sendf;
// Encode a message and transmit it
void
-_sendf(uint8_t parserid, ...)
+_sendf(const struct command_encoder *ce, ...)
{
if (readb(&in_sendf))
// This sendf call was made from an irq handler while the main
@@ -120,8 +120,7 @@ _sendf(uint8_t parserid, ...)
return;
writeb(&in_sendf, 1);
- const struct command_encoder *cp = &command_encoders[parserid];
- uint8_t max_size = READP(cp->max_size);
+ uint8_t max_size = READP(ce->max_size);
char *buf = console_get_output(max_size + MESSAGE_MIN);
if (!buf)
goto done;
@@ -129,10 +128,10 @@ _sendf(uint8_t parserid, ...)
if (max_size) {
char *maxend = &p[max_size];
va_list args;
- va_start(args, parserid);
- uint8_t num_params = READP(cp->num_params);
- const uint8_t *param_types = READP(cp->param_types);
- *p++ = READP(cp->msg_id);
+ va_start(args, ce);
+ uint8_t num_params = READP(ce->num_params);
+ const uint8_t *param_types = READP(ce->param_types);
+ *p++ = READP(ce->msg_id);
while (num_params--) {
if (p > maxend)
goto error;
diff --git a/src/command.h b/src/command.h
index 180031e5..609becd9 100644
--- a/src/command.h
+++ b/src/command.h
@@ -1,10 +1,9 @@
#ifndef __COMMAND_H
#define __COMMAND_H
-#include <stdarg.h> // va_list
-#include <stddef.h> // size_t
+#include <stddef.h>
#include <stdint.h> // uint8_t
-#include "compiler.h" // __section
+#include "ctr.h" // DECL_CTR
// Declare a function to run when the specified command is received
#define DECL_COMMAND(FUNC, MSG) \
@@ -25,7 +24,7 @@
// Declare a message type and transmit it.
#define sendf(FMT, args...) \
- _sendf(_DECL_PARSER(FMT) , ##args)
+ _sendf(_DECL_ENCODER(FMT) , ##args )
// Shut down the machine (also declares a static string to transmit)
#define shutdown(msg) \
@@ -34,7 +33,8 @@
sched_try_shutdown(_DECL_STATIC_STR(msg))
// command.c
-void _sendf(uint8_t parserid, ...);
+struct command_encoder;
+void _sendf(const struct command_encoder *ce, ...);
// out/compile_time_request.c (auto generated file)
struct command_encoder {
@@ -50,41 +50,30 @@ enum {
PT_uint32, PT_int32, PT_uint16, PT_int16, PT_byte,
PT_string, PT_progmem_buffer, PT_buffer,
};
-extern const struct command_encoder command_encoders[];
extern const struct command_parser * const command_index[];
extern const uint8_t command_index_size;
extern const uint8_t command_identify_data[];
extern const uint32_t command_identify_size;
+const struct command_encoder *ctr_lookup_encoder(const char *str);
+const struct command_encoder *ctr_lookup_output(const char *str);
+uint8_t ctr_lookup_static_string(const char *str);
-// Compiler glue for DECL_COMMAND macros above.
#define _DECL_COMMAND(FUNC, FLAGS, MSG) \
- char __PASTE(_DECLS_ ## FUNC ## _, __LINE__) [] \
- __visible __section(".compile_time_request") \
- = "_DECL_COMMAND " __stringify(FUNC) " " __stringify(FLAGS) " " MSG; \
- void __visible FUNC(uint32_t*)
+ DECL_CTR("_DECL_COMMAND " __stringify(FUNC) " " __stringify(FLAGS) " " MSG)
-#define _DECL_CONSTANT(NAME, VALUE) \
- char __PASTE(_DECLC_ ## NAME ## _, __LINE__) [] \
- __visible __section(".compile_time_request") \
- = "_DECL_CONSTANT " __stringify(NAME) " " __stringify(VALUE)
+#define _DECL_CONSTANT(NAME, VALUE) \
+ DECL_CTR("_DECL_CONSTANT " __stringify(NAME) " " __stringify(VALUE))
-// Create a compile time request and return a unique (incrementing id)
-// for that request.
-#define _DECL_REQUEST_ID(REQUEST, ID_SECTION) ({ \
- static char __PASTE(_DECLS_, __LINE__)[] \
- __section(".compile_time_request") = REQUEST; \
- asm volatile("" : : "i"(__PASTE(_DECLS_, __LINE__))); \
- static char __PASTE(_DECLI_, __LINE__) \
- __section(".compile_time_request." ID_SECTION); \
- (size_t)&__PASTE(_DECLI_, __LINE__); })
+#define _DECL_ENCODER(FMT) ({ \
+ DECL_CTR("_DECL_ENCODER " FMT); \
+ ctr_lookup_encoder(FMT); })
-#define _DECL_PARSER(FMT) \
- _DECL_REQUEST_ID("_DECL_PARSER " FMT, "parsers")
+#define _DECL_OUTPUT(FMT) ({ \
+ DECL_CTR("_DECL_OUTPUT " FMT); \
+ ctr_lookup_output(FMT); })
-#define _DECL_OUTPUT(FMT) \
- _DECL_REQUEST_ID("_DECL_OUTPUT " FMT, "parsers")
-
-#define _DECL_STATIC_STR(FMT) \
- _DECL_REQUEST_ID("_DECL_STATIC_STR " FMT, "static_strings")
+#define _DECL_STATIC_STR(MSG) ({ \
+ DECL_CTR("_DECL_STATIC_STR " MSG); \
+ ctr_lookup_static_string(MSG); })
#endif // command.h
diff --git a/src/ctr.h b/src/ctr.h
new file mode 100644
index 00000000..3396644c
--- /dev/null
+++ b/src/ctr.h
@@ -0,0 +1,17 @@
+#ifndef __CTR_H
+#define __CTR_H
+// Definitions for creating compile time requests. The DECL_CTR macro
+// produces requests (text strings) that are placed in a special
+// section of the intermediate object files. The requests are then
+// extracted during the build and passed to scripts/buildcommand.py.
+// The scripts/buildcommand.py code then generates
+// out/compile_time_request.c from these requests.
+
+#include "compiler.h" // __section
+
+// Declare a compile time request
+#define DECL_CTR(REQUEST) \
+ static char __PASTE(_DECLS_, __LINE__)[] __attribute__((used)) \
+ __section(".compile_time_request") = (REQUEST)
+
+#endif // ctr.h
diff --git a/src/declfunc.lds.S b/src/declfunc.lds.S
index 1f178643..ba564bbf 100644
--- a/src/declfunc.lds.S
+++ b/src/declfunc.lds.S
@@ -24,11 +24,4 @@ SECTIONS
DECLWRAPPER(taskfuncs)
DECLWRAPPER(initfuncs)
DECLWRAPPER(shutdownfuncs)
-
- .compile_time_request.static_strings 0 (INFO) : {
- *( .compile_time_request.static_strings )
- }
- .compile_time_request.parsers 0 (INFO) : {
- *( .compile_time_request.parsers )
- }
}