12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- #include <pb_encode.h>
- #include <pb_decode.h>
- #include <string.h>
- #include <assert.h>
- #include <stdio.h>
- #include "stackusage.pb.h"
- static uint8_t g_msgbuf[256];
- static size_t g_msglen;
- /* This is a hacky way to measure actual stack usage of functions.
- * It works by copying the stack to a global variable, and then
- * finding the lowest location that has been modified.
- * Currently this assumes that the platform uses a descending stack.
- */
- #define MAX_STACK_ENTRIES 1024
- static uint32_t g_stackbuf[MAX_STACK_ENTRIES];
- static volatile uint32_t *g_stackptr;
- void start_stack_measuring()
- {
- uint32_t i = 0;
- g_stackptr = (volatile uint32_t*)((uintptr_t)&i - MAX_STACK_ENTRIES * sizeof(uint32_t));
- for (i = 0; i < MAX_STACK_ENTRIES; i++)
- {
- g_stackbuf[i] = g_stackptr[i];
- }
- }
- int end_stack_measuring()
- {
- uint32_t i = 0;
- for (i = 0; i < MAX_STACK_ENTRIES; i++)
- {
- if (g_stackbuf[i] != g_stackptr[i])
- {
- return (MAX_STACK_ENTRIES - i) * sizeof(uint32_t);
- }
- }
- assert(false);
- return 0;
- }
- void do_encode()
- {
- pb_ostream_t stream = pb_ostream_from_buffer(g_msgbuf, sizeof(g_msgbuf));
- SettingsGroup msg = SettingsGroup_init_zero;
- bool status;
- msg.has_settings = true;
- msg.settings.id = 1;
- strcpy(msg.settings.name, "abcd");
- msg.settings.en = true;
- msg.settings.has_begin = true;
- msg.settings.begin.label = 1234;
- msg.settings.begin.properties_count = 1;
- msg.settings.begin.properties[0].which_field = Property_DeviceA_Mode_tag;
- msg.settings.begin.properties[0].field.DeviceA_Mode = 2;
- status = pb_encode(&stream, SettingsGroup_fields, &msg);
- g_msglen = stream.bytes_written;
- assert(status);
- assert(g_msglen > 10);
- }
- void do_decode()
- {
- pb_istream_t stream = pb_istream_from_buffer(g_msgbuf, g_msglen);
- SettingsGroup msg = SettingsGroup_init_zero;
- bool status;
- status = pb_decode(&stream, SettingsGroup_fields, &msg);
- assert(status);
- assert(msg.settings.begin.properties[0].field.DeviceA_Mode == 2);
- }
- int main()
- {
- int stack_encode, stack_decode;
- start_stack_measuring();
- do_encode();
- stack_encode = end_stack_measuring();
- start_stack_measuring();
- do_decode();
- stack_decode = end_stack_measuring();
- /* Print machine-readable to stdout and user-readable to stderr */
- printf("%d %d\n", stack_encode, stack_decode);
- fprintf(stderr, "Stack usage: encode %d bytes, decode %d bytes\n",
- stack_encode, stack_decode);
- return 0;
- }
|