LPC 1768 上的 IAP

Posted

技术标签:

【中文标题】LPC 1768 上的 IAP【英文标题】:IAP on LPC 1768 【发布时间】:2013-11-14 10:29:35 【问题描述】:

我正在尝试使用 IAP(在应用程序编程中)将函数代码从内存空间中的一个点复制到另一个点(我知道这没有任何用处,但这对于我的项目来说绝对至关重要正在努力)。 代码的复制似乎很顺利,但是当我调用复制的函数时,它总是会导致硬故障。我正在复制的函数没有对其他函数或数据的任何引用(它是一个简单的返回函数),因此不存在相对地址错误的问题。 我在下面给出了我的代码以及我得到的输出。

#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

我认为我在调用该函数时做错了。有人可以指出我的错误吗?

谢谢

【问题讨论】:

那么代码段(数组)是可执行的吗? 【参考方案1】:

你忘了在函数地址中设置thumb位:

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

编译器知道在大多数情况下设置它,但它不会直接转换为函数指针。

【讨论】:

我设置了位。但它仍然会进入硬故障。虽然现在故障的地址是(e002)。 copy_code_ram() 可能会因为在函数地址&amp;blink 中设置拇指位而错过第一个代码字节。 是的……就是这样。非常感谢

以上是关于LPC 1768 上的 IAP的主要内容,如果未能解决你的问题,请参考以下文章

LPC1768/1769之CAN控制器概述

我需要帮助构建lpc1768的openvibe源代码

LPC1768系统时钟配置-CPU时钟频率96MHz

LPC1768怎么设置中断(IRQEnable ();)怎么写

为 mbed LPC1768 arm-none-eabi-g++ 构建 protobuf-c、libprotobuf-c

有哪位用LAN8720+LPC1768调过网络模块没?调试没反应,请求高手支援......qq:105