| 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;
 
- }
 
 
  |