#include <stdio.h>
#include <stdint.h>

typedef struct {
	char f1[30]; // строка - 30 байт, т.е. до 29 символов.
	uint32_t f2; // число, 4 байта.
	uint16_t f3; // число, 2 байта.
} example_TypeDef;

void print_st(example_TypeDef *st) {
	printf("%s %hu %u \n", st->f1, st->f2, st->f3);
}

int main(void) {
	// Две переменные - структуры. Для примера заполняем их чем-нибудь.
	example_TypeDef a = {"Asdf1", 11, 22};
	example_TypeDef b = {"Zxxvc", 33, 44};
	// Два указателя.
	uint8_t *a_mem;
	uint8_t *b_mem;
	// Массив, котрый имитирует флешку.
	uint8_t flash_mem[100];
	
	// Выводим количество байт в структуре.
	// Получилось 40 байт из-за выравнивания.
	printf("sizeof: %ld\n", sizeof(example_TypeDef));
	// Выводим содержимое структур, должно совпасть с тем что записали в них ранее.
	printf("a = "); print_st(&a);
	printf("b = "); print_st(&b);
	
	printf("copy b <- a\n");
	// Тут получаем адреса структур в виде указателя на uint8_t (можно на char).
	a_mem = (uint8_t *)(&a);
	b_mem = (uint8_t *)(&b);
	// Записываем на флешку кусочек памяти, занимаемый структурой "a".
	for (int i = 0; i < sizeof(example_TypeDef); i++) {
		flash_mem[i] = a_mem[i];
	}
	
	// Читаем из флешки байты и пишем их в структуру "b".
	for (int i = 0; i < sizeof(example_TypeDef); i++) {
		b_mem[i] = flash_mem[i];
	}
	
	// В результате содержимое структуры "a" должно скопироваться в структуру "b".
	// Выводим содержимое структур для того чтобы убедиться что все скопировалось.
	printf("a = "); print_st(&a);
	printf("b = "); print_st(&b);
	
	return 0;
}
