[STM8] IAR IN_RAM 的函数都报Warning

[复制链接]
4025|2
 楼主| cosxpeach 发表于 2014-6-2 00:08 | 显示全部楼层 |阅读模式
IN_RAM(FLASH_Status_TypeDef FLASH_WaitForLastOperation(FLASH_MemType_TypeDef FLASH_MemType))
IN_RAM(void FLASH_EraseBlock(uint16_t BlockNum, FLASH_MemType_TypeDef FLASH_MemType))
IN_RAM(void FLASH_ProgramBlock(uint16_t BlockNum, FLASH_MemType_TypeDef FLASH_MemType,
                        FLASH_ProgramMode_TypeDef FLASH_ProgMode, uint8_t *Buffer))
stm8s_flash.c这三个函数下的assert_param都报警告。有遇到同样情况的吗?
我看过帖子说是吧assert_param也加上IN_RAM,但警告依旧。
  1. IN_RAM(void FLASH_ProgramBlock(uint16_t BlockNum, FLASH_MemType_TypeDef FLASH_MemType,
  2.                         FLASH_ProgramMode_TypeDef FLASH_ProgMode, uint8_t *Buffer))
  3. {
  4.     uint16_t Count = 0;
  5.     uint32_t startaddress = 0;

  6.     /* Check parameters */
  7.     assert_param(IS_MEMORY_TYPE_OK(FLASH_MemType));
  8.     assert_param(IS_FLASH_PROGRAM_MODE_OK(FLASH_ProgMode));
  9.     if (FLASH_MemType == FLASH_MEMTYPE_PROG)
  10.     {
  11.         assert_param(IS_FLASH_PROG_BLOCK_NUMBER_OK(BlockNum));
  12.         startaddress = FLASH_PROG_START_PHYSICAL_ADDRESS;
  13.     }
  14.     else
  15.     {
  16.         assert_param(IS_FLASH_DATA_BLOCK_NUMBER_OK(BlockNum));
  17.         startaddress = FLASH_DATA_START_PHYSICAL_ADDRESS;
  18.     }

  19.     /* Point to the first block address */
  20.     startaddress = startaddress + ((uint32_t)BlockNum * FLASH_BLOCK_SIZE);

  21.     /* Selection of Standard or Fast programming mode */
  22.     if (FLASH_ProgMode == FLASH_PROGRAMMODE_STANDARD)
  23.     {
  24.         /* Standard programming mode */ /*No need in standard mode */
  25.         FLASH->CR2 |= FLASH_CR2_PRG;
  26.         FLASH->NCR2 &= (uint8_t)(~FLASH_NCR2_NPRG);
  27.     }
  28.     else
  29.     {
  30.         /* Fast programming mode */
  31.         FLASH->CR2 |= FLASH_CR2_FPRG;
  32.         FLASH->NCR2 &= (uint8_t)(~FLASH_NCR2_NFPRG);
  33.     }

  34.     /* Copy data bytes from RAM to FLASH memory */
  35.     for (Count = 0; Count < FLASH_BLOCK_SIZE; Count++)
  36.     {
  37. #if defined (STM8S208) || defined(STM8S207) || defined(STM8S007) || defined(STM8S105) || \
  38.     defined(STM8S005) || defined (STM8AF62Ax) || defined (STM8AF52Ax) || defined (STM8AF626x)
  39.   *((PointerAttr uint8_t*) (uint16_t)startaddress + Count) = ((uint8_t)(Buffer[Count]));
  40. #elif defined(STM8S103) || defined(STM8S003) ||  defined (STM8S903)
  41.   *((PointerAttr uint8_t*) (uint16_t)startaddress + Count) = ((uint8_t)(Buffer[Count]));
  42. #endif      
  43.     }
  44. }
Warning[Ta007]: Call to a non __ramfunc function (assert_failed) from within a __ramfunc function

pofu007 发表于 2014-6-11 10:29 | 显示全部楼层
stm8s.h里面有这么一段话

/* Uncomment the line below to enable the FLASH functions execution from RAM */
#if !defined (RAM_EXECUTION)
/*#define RAM_EXECUTION  (1)*/
#endif /* RAM_EXECUTION */

是不是取消注释#define RAM_EXECUTION  (1)了呢?
zhongquan 发表于 2014-9-30 16:15 | 显示全部楼层
不是#define RAM_EXECUTION这个问题,问题在于你在RAM中的函数去调用了一个在CODE中的函数,虽然这个CODE中的函数是由编译器生成的,你可以查看一下你的汇编代码,看看里面是不是有一条CALL的指令,此CALL指令是否跳到CODE区里了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

54

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部