Suga koubou
/
DynamicLoad
dynamic load and run users binary file. self write the flash memory.
Diff: main.cpp
- Revision:
- 1:fbb938b95cef
- Parent:
- 0:f8cf4fdf6ab4
- Child:
- 2:c56b5e682f0c
diff -r f8cf4fdf6ab4 -r fbb938b95cef main.cpp --- a/main.cpp Mon Dec 26 15:42:50 2011 +0000 +++ b/main.cpp Tue Dec 27 16:55:24 2011 +0000 @@ -3,38 +3,36 @@ binary -> Flash 0x00078000 & run lpc17xx.ld - IROM (rx) : ORIGIN = 0x00078000, LENGTH = 32k + IROM (rx) : ORIGIN = 0x00040000, LENGTH = 256k IRAM0 (rwx) : ORIGIN = 0x10002000, LENGTH = 24k startup_LPC17xx.c //void Reset_Handler(void) __attribute__((__interrupt__)); void Reset_Handler(void); + // SystemInit(); compiled.bin --> test.dat */ -#include "mbed.h" -#include "IAP.h" +#include "mbed.h" +#include "IAP.h" #include <new> -#define MEM_SIZE 256 -#define TARGET_SECTOR 29 +#define BUF_SIZE 512 +#define TARGET_SECTOR 22 +#define TARGET_SECTOR_NUM 8 LocalFileSystem local("local"); void memdump( char *p, int n ); -int isprint( int c ); IAP iap; extern "C" -void Default_Handler() { - printf("Default Handler!\n"); - exit(-1); -} - -extern "C" void HardFault_Handler() { - printf("Hard Fault!\n"); + register unsigned int _msp __asm("msp"); + printf("Hard Fault! %x (%x)\r\n", SCB->HFSR, *((unsigned int *)(_msp + 24))); + printf(" - %x\r\n", (*(volatile uint32_t*)0xe000ed24)); +// printf("Hard Fault! %x\r\n", SCB->HFSR); exit(-1); } @@ -43,62 +41,88 @@ exit(-1); } -int jump (int vect) { +void jump (int vect) { void (*func)(); unsigned int *p; - p = (unsigned int *)(sector_start_adress[ TARGET_SECTOR ] + 4 * vect); + p = (unsigned int *)(sector_start_adress[TARGET_SECTOR] + 4 * vect); func = (void (*)())*p; - printf( "func %08x (%d)\r\n", (unsigned int)func, vect); - func(); - return 0; +// printf("jump vector %d (%08x)\r\n", vect, func); + if ((char*)*p >= sector_start_adress[TARGET_SECTOR] && (char*)*p < sector_start_adress[TARGET_SECTOR] + FLASH_SECTOR_SIZE_16_TO_29 * TARGET_SECTOR_NUM) { + func(); + } } -void SysTick_Handler(void) { - jump(15); +int loadbinary (char *filename) { + int i, r, num, sector, size = 0; + FILE *fp; + char buf[BUF_SIZE]; + + fp = fopen(filename, "r"); + if (! fp) return -1; + + for (sector = TARGET_SECTOR; sector < TARGET_SECTOR + TARGET_SECTOR_NUM; sector ++) { + if (iap.blank_check(sector, sector) == SECTOR_NOT_BLANK) { + iap.prepare(sector, sector); + r = iap.erase(sector, sector); + if (r) { + printf("iap.erase (%d) %d %x\r\n", r, sector, i); + goto error; + } + printf("iap erase %d\r\n", sector); + } + + for (i = 0; i < FLASH_SECTOR_SIZE_16_TO_29; i += BUF_SIZE) { + num = fread(buf, sizeof(char), BUF_SIZE, fp); + if (num <= 0) { + // EOF + goto exit; + } + + // write Flash + r = iap.prepare(sector, sector); + if (r) { + printf("iap.prepare (%d) %d %x\r\n", r, sector, i); + goto error; + } + r = iap.write(buf, sector_start_adress[sector] + i, BUF_SIZE); + if (r) { + printf("iap.write (%d) %d %x\r\n", r, sector, i); + goto error; + } + r = iap.compare(buf, sector_start_adress[sector] + i, BUF_SIZE); + if (r) { + printf("iap.compare (%d) %d %x\r\n", r, sector, i); + goto error; + } + size += num; + } + } + +exit: + printf("write %d bytes, end sector %d\r\n", size, sector); + fclose(fp); + return 0; + +error: + printf("write error\r\n"); + fclose(fp); + return r; } int main() { - FILE *fp; - int i, r, s; - char buf[MEM_SIZE]; char *heap; set_new_handler(no_memory); // new handler function printf( "device-ID = 0x%08X, serial# = 0x%08X, CPU running %dkHz\r\n", iap.read_ID(), iap.read_serial(), SystemCoreClock / 1000 ); - printf( "user reserved flash area: start_address=0x%08X, size=%d bytes\r\n", iap.reserved_flash_area_start(), iap.reserved_flash_area_size() ); - r = iap.blank_check( TARGET_SECTOR, TARGET_SECTOR ); - printf( "blank check result = 0x%08X\r\n", r ); - - // erase sector, if required - - if ( r == SECTOR_NOT_BLANK ) { - iap.prepare( TARGET_SECTOR, TARGET_SECTOR ); - r = iap.erase( TARGET_SECTOR, TARGET_SECTOR ); - printf( "erase result = 0x%08X\r\n", r ); - } + loadbinary("/local/test.dat"); - // copy File to Flash - fp = fopen("/local/test.dat", "r"); - if (fp) { - iap.prepare( TARGET_SECTOR, TARGET_SECTOR ); - s = 0; - for (i = 0;; i ++) { - r = fread(buf, sizeof(char), MEM_SIZE, fp); - if (r <= 0) break; - s = s + r; - r = iap.write(buf, sector_start_adress[TARGET_SECTOR] + MEM_SIZE * i, MEM_SIZE); - printf( "copied: File(0x%08X)->Flash(0x%08X) for %d bytes. (result=0x%08X)\n", buf, sector_start_adress[ TARGET_SECTOR ] + MEM_SIZE * i, MEM_SIZE, r ); - } - fclose(fp); - printf("writable %d bytes. (%d)\r\n", s, i); - } +// memdump( sector_start_adress[ TARGET_SECTOR ], 48 * 4); - memdump( sector_start_adress[ TARGET_SECTOR ], 16); - - heap = (char*)malloc(2); + heap = new char(2); + delete[] heap; printf("stack %08x, heap %08x\r\n", (unsigned int)&heap, (unsigned int)heap); { @@ -111,6 +135,11 @@ jump(1); printf("exit\r\n"); + + heap = new char(2); + delete[] heap; + printf("stack %08x, heap %08x\r\n", (unsigned int)&heap, (unsigned int)heap); + return 0; }