2013-11-03 16 views
0

我想用IAP(在应用程序编程中)将一个函数的代码从内存空间中的一个点复制到另一个(我知道这没有任何用处,但这对于一个我正在研究的项目)。 代码的复制似乎可以顺利进行,但是当我调用复制的函数时,它总是会导致硬错误。我正在复制的函数没有任何其他函数或数据的引用(这是一个简单的返回函数),所以不存在相对地址错误的问题。 我已经给出了我的代码以及我得到的输出。在LPC上的IAP 1768

#include "mbed.h" 
#include "IAP.h" 

#define TARGET_SECTOR  14 


char code[1024]; 
IAP  iap; 
char val = 0; 


typedef int (*function)(); 
function blinkfunction; 

MPU_Type mpu; 


extern "C" 
void HardFault_Handler() { 
    register unsigned int _msp __asm("msp"); 
    printf("Hard Fault! %x (%x)\r\n", SCB->HFSR, *((unsigned int *)(_msp + 24))); 
    printf("HFSR: 0x%X\n\r", SCB->HFSR); 
    printf("MMFAR: 0x%X\tMMFSR: 0x%X\n\r", SCB->MMFAR, SCB->CFSR); 
    printf("BFAR: 0x%X\tBFSR: 0x%X\n\r", SCB->BFAR, SCB->CFSR); 
    printf(" - %x\r\n", (*(volatile uint32_t*)0xe000ed24)); 
// printf("Hard Fault! %x\r\n", SCB->HFSR); 

     printf("*********** MPU Settings *************\n\r"); 
     printf("TYPE: 0x%X\n\r", mpu.TYPE); 
     printf("CTRL: 0x%X\n\r", mpu.CTRL); 
    exit(-1); 
} 




int blink() { 
    int a = 1, b = 1; 
    return a + b; 
} 



void copy_code_ram() { 

    char *charptr; 

    charptr = (char *)&blink; 
    int i; 
    for(i = 0; i <200 ; i++) { 
     code[i] = *charptr; 
     charptr++; 
    } 
}  



void print_function(char *ptr, int num) { 
    for(; num > 0; num--) { 
     printf("0x%X ", *ptr); 
     ptr++; 
    } 
} 


int main() { 
    int r; 

    printf("blink code:\n"); 
    print_function((char *)&blink, 100); 


    printf("\n\r\n\r\n\r"); 
    copy_code_ram(); 

    //Print sector 
    print_function(sector_start_adress[TARGET_SECTOR], 100); 
    printf("\n\r\n\r\n\r"); 

    iap.prepare(TARGET_SECTOR, TARGET_SECTOR); 
    iap.erase (TARGET_SECTOR, TARGET_SECTOR); 
    iap.prepare(TARGET_SECTOR, TARGET_SECTOR); 
    r = iap.write(code, sector_start_adress[TARGET_SECTOR], 256); 

    printf("\n\r\n\r\n\r"); 
    printf("copied: SRAM(0x%08X)->Flash(0x%08X) for %d bytes. (result=0x%08X)\r\n", code, sector_start_adress[ TARGET_SECTOR ], 1024, r); 
    printf("\n\r\n\r\n\r"); 

    blinkfunction = (function) (sector_start_adress[TARGET_SECTOR]); 

    printf("\n\r\n\r\n\r"); 
     print_function((char *)blinkfunction, 100); 

    r = 0; 
    r = blink(); 
    printf("The return value from blink is %d\n\r", r); 

    r = blinkfunction(); 
    printf("The return value from blinkfunction is %d\n\r", r); 

    while(1) { 


    } 
} 

这里是输出:

Hard Fault! 4000000 (e000) 
HFSR: 0x400000000 
MMFAR: 0xE000ED34 MMFSR: 0x20000 
BFAR: 0xE000ED38 BFSR: 0x20000 

我觉得我做错了什么在调用该函数。有人能指出我的错误吗?

感谢

+0

所以代码段(数组)是可执行的? – auselen

回答

1

你忘了设定函数地址的thumb位:

blinkfunction = (function) (sector_start_adress[TARGET_SECTOR] | 1); 

编译器知道设置这个在大多数情况下,但它不是直接投给一个函数指针。

+0

我设置了位。但它仍然陷入硬性故障。虽然现在的故障地址是(e002)。 – user1971707

+0

'copy_code_ram()'可能会因功能地址'&blink'中的拇指位被设置而错过第一个代码字节。 –

+0

你......就是这样。非常感谢 – user1971707