Suga koubou
/
DynamicLoad
dynamic load and run users binary file. self write the flash memory.
main.cpp@0:f8cf4fdf6ab4, 2011-12-26 (annotated)
- Committer:
- okini3939
- Date:
- Mon Dec 26 15:42:50 2011 +0000
- Revision:
- 0:f8cf4fdf6ab4
- Child:
- 1:fbb938b95cef
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
okini3939 | 0:f8cf4fdf6ab4 | 1 | /* |
okini3939 | 0:f8cf4fdf6ab4 | 2 | dynamic load the binary file. |
okini3939 | 0:f8cf4fdf6ab4 | 3 | binary -> Flash 0x00078000 & run |
okini3939 | 0:f8cf4fdf6ab4 | 4 | |
okini3939 | 0:f8cf4fdf6ab4 | 5 | lpc17xx.ld |
okini3939 | 0:f8cf4fdf6ab4 | 6 | IROM (rx) : ORIGIN = 0x00078000, LENGTH = 32k |
okini3939 | 0:f8cf4fdf6ab4 | 7 | IRAM0 (rwx) : ORIGIN = 0x10002000, LENGTH = 24k |
okini3939 | 0:f8cf4fdf6ab4 | 8 | |
okini3939 | 0:f8cf4fdf6ab4 | 9 | startup_LPC17xx.c |
okini3939 | 0:f8cf4fdf6ab4 | 10 | //void Reset_Handler(void) __attribute__((__interrupt__)); |
okini3939 | 0:f8cf4fdf6ab4 | 11 | void Reset_Handler(void); |
okini3939 | 0:f8cf4fdf6ab4 | 12 | |
okini3939 | 0:f8cf4fdf6ab4 | 13 | compiled.bin --> test.dat |
okini3939 | 0:f8cf4fdf6ab4 | 14 | */ |
okini3939 | 0:f8cf4fdf6ab4 | 15 | #include "mbed.h" |
okini3939 | 0:f8cf4fdf6ab4 | 16 | #include "IAP.h" |
okini3939 | 0:f8cf4fdf6ab4 | 17 | #include <new> |
okini3939 | 0:f8cf4fdf6ab4 | 18 | |
okini3939 | 0:f8cf4fdf6ab4 | 19 | #define MEM_SIZE 256 |
okini3939 | 0:f8cf4fdf6ab4 | 20 | #define TARGET_SECTOR 29 |
okini3939 | 0:f8cf4fdf6ab4 | 21 | |
okini3939 | 0:f8cf4fdf6ab4 | 22 | LocalFileSystem local("local"); |
okini3939 | 0:f8cf4fdf6ab4 | 23 | |
okini3939 | 0:f8cf4fdf6ab4 | 24 | void memdump( char *p, int n ); |
okini3939 | 0:f8cf4fdf6ab4 | 25 | int isprint( int c ); |
okini3939 | 0:f8cf4fdf6ab4 | 26 | |
okini3939 | 0:f8cf4fdf6ab4 | 27 | IAP iap; |
okini3939 | 0:f8cf4fdf6ab4 | 28 | |
okini3939 | 0:f8cf4fdf6ab4 | 29 | extern "C" |
okini3939 | 0:f8cf4fdf6ab4 | 30 | void Default_Handler() { |
okini3939 | 0:f8cf4fdf6ab4 | 31 | printf("Default Handler!\n"); |
okini3939 | 0:f8cf4fdf6ab4 | 32 | exit(-1); |
okini3939 | 0:f8cf4fdf6ab4 | 33 | } |
okini3939 | 0:f8cf4fdf6ab4 | 34 | |
okini3939 | 0:f8cf4fdf6ab4 | 35 | extern "C" |
okini3939 | 0:f8cf4fdf6ab4 | 36 | void HardFault_Handler() { |
okini3939 | 0:f8cf4fdf6ab4 | 37 | printf("Hard Fault!\n"); |
okini3939 | 0:f8cf4fdf6ab4 | 38 | exit(-1); |
okini3939 | 0:f8cf4fdf6ab4 | 39 | } |
okini3939 | 0:f8cf4fdf6ab4 | 40 | |
okini3939 | 0:f8cf4fdf6ab4 | 41 | void no_memory () { |
okini3939 | 0:f8cf4fdf6ab4 | 42 | printf("panic: can't allocate to memory!\r\n"); |
okini3939 | 0:f8cf4fdf6ab4 | 43 | exit(-1); |
okini3939 | 0:f8cf4fdf6ab4 | 44 | } |
okini3939 | 0:f8cf4fdf6ab4 | 45 | |
okini3939 | 0:f8cf4fdf6ab4 | 46 | int jump (int vect) { |
okini3939 | 0:f8cf4fdf6ab4 | 47 | void (*func)(); |
okini3939 | 0:f8cf4fdf6ab4 | 48 | unsigned int *p; |
okini3939 | 0:f8cf4fdf6ab4 | 49 | |
okini3939 | 0:f8cf4fdf6ab4 | 50 | p = (unsigned int *)(sector_start_adress[ TARGET_SECTOR ] + 4 * vect); |
okini3939 | 0:f8cf4fdf6ab4 | 51 | func = (void (*)())*p; |
okini3939 | 0:f8cf4fdf6ab4 | 52 | printf( "func %08x (%d)\r\n", (unsigned int)func, vect); |
okini3939 | 0:f8cf4fdf6ab4 | 53 | func(); |
okini3939 | 0:f8cf4fdf6ab4 | 54 | return 0; |
okini3939 | 0:f8cf4fdf6ab4 | 55 | } |
okini3939 | 0:f8cf4fdf6ab4 | 56 | |
okini3939 | 0:f8cf4fdf6ab4 | 57 | void SysTick_Handler(void) { |
okini3939 | 0:f8cf4fdf6ab4 | 58 | jump(15); |
okini3939 | 0:f8cf4fdf6ab4 | 59 | } |
okini3939 | 0:f8cf4fdf6ab4 | 60 | |
okini3939 | 0:f8cf4fdf6ab4 | 61 | int main() { |
okini3939 | 0:f8cf4fdf6ab4 | 62 | FILE *fp; |
okini3939 | 0:f8cf4fdf6ab4 | 63 | int i, r, s; |
okini3939 | 0:f8cf4fdf6ab4 | 64 | char buf[MEM_SIZE]; |
okini3939 | 0:f8cf4fdf6ab4 | 65 | char *heap; |
okini3939 | 0:f8cf4fdf6ab4 | 66 | |
okini3939 | 0:f8cf4fdf6ab4 | 67 | set_new_handler(no_memory); // new handler function |
okini3939 | 0:f8cf4fdf6ab4 | 68 | |
okini3939 | 0:f8cf4fdf6ab4 | 69 | printf( "device-ID = 0x%08X, serial# = 0x%08X, CPU running %dkHz\r\n", iap.read_ID(), iap.read_serial(), SystemCoreClock / 1000 ); |
okini3939 | 0:f8cf4fdf6ab4 | 70 | printf( "user reserved flash area: start_address=0x%08X, size=%d bytes\r\n", iap.reserved_flash_area_start(), iap.reserved_flash_area_size() ); |
okini3939 | 0:f8cf4fdf6ab4 | 71 | |
okini3939 | 0:f8cf4fdf6ab4 | 72 | r = iap.blank_check( TARGET_SECTOR, TARGET_SECTOR ); |
okini3939 | 0:f8cf4fdf6ab4 | 73 | printf( "blank check result = 0x%08X\r\n", r ); |
okini3939 | 0:f8cf4fdf6ab4 | 74 | |
okini3939 | 0:f8cf4fdf6ab4 | 75 | // erase sector, if required |
okini3939 | 0:f8cf4fdf6ab4 | 76 | |
okini3939 | 0:f8cf4fdf6ab4 | 77 | if ( r == SECTOR_NOT_BLANK ) { |
okini3939 | 0:f8cf4fdf6ab4 | 78 | iap.prepare( TARGET_SECTOR, TARGET_SECTOR ); |
okini3939 | 0:f8cf4fdf6ab4 | 79 | r = iap.erase( TARGET_SECTOR, TARGET_SECTOR ); |
okini3939 | 0:f8cf4fdf6ab4 | 80 | printf( "erase result = 0x%08X\r\n", r ); |
okini3939 | 0:f8cf4fdf6ab4 | 81 | } |
okini3939 | 0:f8cf4fdf6ab4 | 82 | |
okini3939 | 0:f8cf4fdf6ab4 | 83 | // copy File to Flash |
okini3939 | 0:f8cf4fdf6ab4 | 84 | fp = fopen("/local/test.dat", "r"); |
okini3939 | 0:f8cf4fdf6ab4 | 85 | if (fp) { |
okini3939 | 0:f8cf4fdf6ab4 | 86 | iap.prepare( TARGET_SECTOR, TARGET_SECTOR ); |
okini3939 | 0:f8cf4fdf6ab4 | 87 | s = 0; |
okini3939 | 0:f8cf4fdf6ab4 | 88 | for (i = 0;; i ++) { |
okini3939 | 0:f8cf4fdf6ab4 | 89 | r = fread(buf, sizeof(char), MEM_SIZE, fp); |
okini3939 | 0:f8cf4fdf6ab4 | 90 | if (r <= 0) break; |
okini3939 | 0:f8cf4fdf6ab4 | 91 | s = s + r; |
okini3939 | 0:f8cf4fdf6ab4 | 92 | r = iap.write(buf, sector_start_adress[TARGET_SECTOR] + MEM_SIZE * i, MEM_SIZE); |
okini3939 | 0:f8cf4fdf6ab4 | 93 | 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 ); |
okini3939 | 0:f8cf4fdf6ab4 | 94 | } |
okini3939 | 0:f8cf4fdf6ab4 | 95 | fclose(fp); |
okini3939 | 0:f8cf4fdf6ab4 | 96 | printf("writable %d bytes. (%d)\r\n", s, i); |
okini3939 | 0:f8cf4fdf6ab4 | 97 | } |
okini3939 | 0:f8cf4fdf6ab4 | 98 | |
okini3939 | 0:f8cf4fdf6ab4 | 99 | memdump( sector_start_adress[ TARGET_SECTOR ], 16); |
okini3939 | 0:f8cf4fdf6ab4 | 100 | |
okini3939 | 0:f8cf4fdf6ab4 | 101 | heap = (char*)malloc(2); |
okini3939 | 0:f8cf4fdf6ab4 | 102 | printf("stack %08x, heap %08x\r\n", (unsigned int)&heap, (unsigned int)heap); |
okini3939 | 0:f8cf4fdf6ab4 | 103 | |
okini3939 | 0:f8cf4fdf6ab4 | 104 | { |
okini3939 | 0:f8cf4fdf6ab4 | 105 | register unsigned int _control __asm("control"); |
okini3939 | 0:f8cf4fdf6ab4 | 106 | register unsigned int _msp __asm("msp"); |
okini3939 | 0:f8cf4fdf6ab4 | 107 | register unsigned int _psp __asm("psp"); |
okini3939 | 0:f8cf4fdf6ab4 | 108 | printf("MSP %08x, PSP %08x, CONTROL %x\r\n", _msp, _psp, _control & 3); |
okini3939 | 0:f8cf4fdf6ab4 | 109 | } |
okini3939 | 0:f8cf4fdf6ab4 | 110 | |
okini3939 | 0:f8cf4fdf6ab4 | 111 | jump(1); |
okini3939 | 0:f8cf4fdf6ab4 | 112 | |
okini3939 | 0:f8cf4fdf6ab4 | 113 | printf("exit\r\n"); |
okini3939 | 0:f8cf4fdf6ab4 | 114 | return 0; |
okini3939 | 0:f8cf4fdf6ab4 | 115 | } |
okini3939 | 0:f8cf4fdf6ab4 | 116 | |
okini3939 | 0:f8cf4fdf6ab4 | 117 | |
okini3939 | 0:f8cf4fdf6ab4 | 118 | void memdump( char *base, int n ) { |
okini3939 | 0:f8cf4fdf6ab4 | 119 | unsigned int *p; |
okini3939 | 0:f8cf4fdf6ab4 | 120 | |
okini3939 | 0:f8cf4fdf6ab4 | 121 | printf( " memdump from 0x%08X for %d bytes", (unsigned long)base, n ); |
okini3939 | 0:f8cf4fdf6ab4 | 122 | |
okini3939 | 0:f8cf4fdf6ab4 | 123 | p = (unsigned int *)((unsigned int)base & ~(unsigned int)0x3); |
okini3939 | 0:f8cf4fdf6ab4 | 124 | |
okini3939 | 0:f8cf4fdf6ab4 | 125 | for ( int i = 0; i < (n >> 2); i++, p++ ) { |
okini3939 | 0:f8cf4fdf6ab4 | 126 | if ( !(i % 4) ) |
okini3939 | 0:f8cf4fdf6ab4 | 127 | printf( "\r\n 0x%08X :", (unsigned int)p ); |
okini3939 | 0:f8cf4fdf6ab4 | 128 | |
okini3939 | 0:f8cf4fdf6ab4 | 129 | printf( " %08X", *p ); |
okini3939 | 0:f8cf4fdf6ab4 | 130 | } |
okini3939 | 0:f8cf4fdf6ab4 | 131 | |
okini3939 | 0:f8cf4fdf6ab4 | 132 | printf( "\r\n" ); |
okini3939 | 0:f8cf4fdf6ab4 | 133 | } |