#include <string.h>
#include <stdint.h>
#include "ProgramVector.h"
#include "ServiceCall.h"
#include "device.h"
#include "main.h"
#include "heap.h"
#include "message.h"
#ifdef STARTUP_CODE
extern char _sbss[];
extern char _ebss[];
extern char _sidata[];
extern char _sdata[];
extern char _edata[];
extern "C" void __libc_init_array();
#endif
ProgramVector programVector __attribute__ ((section (".pv")));
extern "C" {
void vApplicationMallocFailedHook( void ){
error(OUT_OF_MEMORY_ERROR_STATUS, "Memory overflow");
}
}
int main(void){
#ifdef STARTUP_CODE
memcpy(_sidata, _sdata, _sdata-_edata); memset(_sbss, 0, _ebss-_sbss); #endif
ProgramVector* pv = getProgramVector();
HeapRegion_t regions[5];
if(pv->checksum >= PROGRAM_VECTOR_CHECKSUM_V13 && pv->heapLocations != NULL){
int cnt = 0;
MemorySegment* seg = pv->heapLocations;
while(seg != NULL && seg->location != NULL && cnt < 5){
regions[cnt++] = { seg->location, seg->size };
seg++;
}
regions[cnt] = {NULL, 0}; }else{
extern char _fastheap, _fasteheap; extern char _eprogram, _eram; extern char _heap, _eheap; int cnt = 0;
regions[cnt++] = { (uint8_t*)&_fastheap, (size_t)(&_fasteheap - &_fastheap) };
regions[cnt++] = { (uint8_t*)&_eprogram, (size_t)(&_eram - &_eprogram) };
regions[cnt++] = { (uint8_t*)&_heap, (size_t)(&_eheap - &_heap) };
regions[cnt] = {NULL, 0}; }
vPortDefineHeapRegions(regions);
#ifdef STARTUP_CODE
__libc_init_array(); #endif
if(pv->checksum >= PROGRAM_VECTOR_CHECKSUM_V12){
pv->buttonChangedCallback = onButtonChanged;
}else if(pv->checksum >= PROGRAM_VECTOR_CHECKSUM_V11){
}else{
error(CHECKSUM_ERROR_STATUS, "ProgramVector checksum error");
return -1;
}
size_t before = xPortGetFreeHeapSize();
setup(pv);
pv->heap_bytes_used = before - xPortGetFreeHeapSize();
run(pv); return 0;
}