Du musst sowohl den Zeiger auf die struct als auch die Länge der struct 
mit übergeben, dann kann deine Funktion die Inhalte übergeben.
Der Prototyp sieht dann so aus:
1  | void writeParam(void* param, size_t size, uint32_t address);
  | 
Innerhalb von writeParam() darfst du dann natürlich nirgends mehr ein 
"struct1" oder so stehen haben. Das heißt, deine temporäre Struktur 
kannst du irgendwie so zusammenbauen:
1  | void writeParam(void* param, size_t size, uint32 address)
  | 
2  | {
 | 
3  |   __attribute__((packed)) struct s_write
  | 
4  |   {
 | 
5  |     uint16 checkSumme;
  | 
6  |     uint16 free;
  | 
7  |     uint8_t param[];
  | 
8  |   };
  | 
9  | 
  | 
10  |   size_t writesz = size + 4;
  | 
11  |   struct s_write* write = (struct s_write*)alloca(writesz);
  | 
12  |   
  | 
13  |   memcpy(&write->param, param, size);
  | 
14  |   write->free = 0xFFFF;
  | 
15  |   write->checkSumme = calcChecksumme((uint8_t*)param, size);
  | 
16  |   
  | 
17  |   eepromWrite(adress, (uint8*)write, writesz)
  | 
18  | }
  | 
Bugs sind meine, ich hab den Code hier im Forum geschrieben. Betrachte 
es als Ideengrundlage. :-)