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