将功能从IAR stm32f2 / f4闪存复制到RAM并运行它



我想将一个函数从闪存复制到RAM并运行它。

我知道IAR包含允许您在RAM中定义函数的函数的__ramfunc类型,但我不想使用它,原因有两个:

    RAM
  • 功能正在使用我仅在初始化时使用的 RAM 内存
  • 升级 2 倍代码(我正在做固件更新系统)后,__ramfunc给了我一个错误的位置。

基本上我想要的是将函数声明为 flash,然后在运行时将其复制到内存并运行它。我有下一个代码:

   void (*ptr)(int size);
   ptr=(void (*)(int size))&CurrentFont;
   memset((char *) ptr,0xFF,4096);
   Debugprintf("FLASH FUNC %X",GrabarFirmware);
   Debugprintf("RAM FUNC %X",ptr);
   char *ptr1=(char *)ptr,*ptr2=(char *)GrabarFirmware;
   //Be sure that alignment is right 
   unsigned int p=(int )ptr2;
   p&=0xFFFFFFFE;
   ptr2=(char *)p;
   for(int i=0;i<4096;i++,ptr1++,ptr2++)
      *ptr1=*ptr2;
   FLASH_Unlock();
   // Clear pending flags (if any)
   FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |      FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR);
   ptr(*((unsigned int *)(tempptrb+8)));

作为详细信息:

  • 函数的大小不起作用
  • 链接器向我返回了错误的函数地址(奇数地址)。使用调试工具检查时,我注意到它是错误的,这就是我执行 &0xFFFFFFFE 的原因。

在此代码之后,该函数被完美地复制到RAM,完全相同的代码,但是当我用这个运行它时:

   ptr(*((unsigned int *)(tempptrb+8)));

我HardFault_Handler得到一个例外。经过大量测试,我无法修复此硬故障异常。

检查asm代码时,我注意到对__ramfunc和正常闪存功能的调用是不同的,这可能是获得HardFault异常的原因。

这是定义为闪存时的调用方式:

   4782             ptr(*((unsigned int *)(tempptrb+8)));
      000000C6   0x6820             LDR      R0,[R4, #+0]
      000000C8   0x6880             LDR      R0,[R0, #+8]
      000000CA   0x47A8             BLX      R5
   4783             //(*ptr)();

现在,如果我直接调用,它将代码定义为__ramfunc并直接调用它:

   4786             GrabarFirmware(*((unsigned int *)(tempptrb+8)));
      0000007A   0x6820             LDR      R0,[R4, #+0]
      0000007C   0x6880             LDR      R0,[R0, #+8]
      0000007E   0x.... 0x....      BL       GrabarFirmware

异常的原因可能是我从闪存跳到 RAM,可能是皮层保护,但在使用 __ramfunc 修饰符时,我也这样做了,并逐步调试,它不会跳转到 RAM 中的函数,一旦我调用函数就直接跳转到异常。

跳过此操作的一种方法是"转到"RAM内存。我尝试将 C 中的 C 和 ASM 与 asm("...") 函数混合,但出现错误,可能会遇到硬故障异常。

欢迎任何提示。

ptr 是 EVEN 地址,处理器要做的第一件事是 FAULT,您必须跳转到 ODD 地址以指示它是 16 位拇指代码,而不是 32 位 ARM 代码。

这也是这里的问题,但不容易找到,因为它引用了董事会。感谢 imbearr 找到它。

在stm32官方论坛中,您可以找到有关此内容的更多信息

最新更新