Efficient Embedded Programming Techniques

Calculating Sturcture Member Size

#include <stdio.h>

// Get size of struct member
#define MEMBER_SIZE(type, member) sizeof(((type*)0)->member)

// Get offset of struct member
#define MEMBER_OFFSET(type, member) ((size_t)(&(((type*)0)->member)))

typedef struct {
    char x;
    char y;
    char z;
} coord_t;

typedef struct {
    char a;
    char c;
    short b;
    int d;
    coord_t e;
} data_t;

int main() {
    printf("MEMBER_SIZE(data_t, a) = %lu\n", MEMBER_SIZE(data_t, a));
    printf("MEMBER_SIZE(data_t, c) = %lu\n", MEMBER_SIZE(data_t, c));
    printf("MEMBER_SIZE(data_t, b) = %lu\n", MEMBER_SIZE(data_t, b));
    printf("MEMBER_SIZE(data_t, d) = %lu\n", MEMBER_SIZE(data_t, d));
    printf("MEMBER_SIZE(data_t, e) = %lu\n", MEMBER_SIZE(data_t, e));
    printf("data_t size = %lu\n", sizeof(data_t));

    printf("MEMBER_OFFSET(a): %lu\n", MEMBER_OFFSET(data_t, a));
    printf("MEMBER_OFFSET(c): %lu\n", MEMBER_OFFSET(data_t, c));
    printf("MEMBER_OFFSET(b): %lu\n", MEMBER_OFFSET(data_t, b));
    printf("MEMBER_OFFSET(d): %lu\n", MEMBER_OFFSET(data_t, d));
    printf("MEMBER_OFFSET(e): %lu\n", MEMBER_OFFSET(data_t, e));

    return 0;
}

File Operations Wrapper

#include <stdio.h>

int file_write(const char* filename, void* data, size_t size) {
    FILE* fp = fopen(filename, "wb");
    if (!fp) return -1;
    
    size_t written = fwrite(data, 1, size, fp);
    fclose(fp);
    
    return (written == size) ? 0 : -1;
}

int file_read(const char* filename, void* buffer, size_t size) {
    FILE* fp = fopen(filename, "rb");
    if (!fp) return -1;
    
    size_t read = fread(buffer, 1, size, fp);
    fclose(fp);
    
    return (read == size) ? 0 : -1;
}

Progress Bar Implementation

#include <stdio.h>
#include <unistd.h>

void show_progress(int current, int total) {
    int percent = current * 100 / total;
    printf("[");
    for (int i = 0; i < 100; i++) {
        printf(i < percent ? "=" : " ");
    }
    printf("] %d%%\r", percent);
    fflush(stdout);
}

Logging System

#include <stdio.h>

typedef enum {
    LOG_DEBUG,
    LOG_INFO,
    LOG_WARN,
    LOG_ERROR
} log_level_t;

void logger(log_level_t level, const char* msg, const char* file, int line) {
    const char* levels[] = {"DEBUG", "INFO", "WARN", "ERROR"};
    printf("%s: %s (%s:%d)\n", levels[level], msg, file, line);
}

#define LOG(level, msg) logger(level, msg, __FILE__, __LINE__)

Tags: embedded programming Optimization C

Posted on Thu, 02 Jul 2026 16:07:32 +0000 by Syranide