Jump to content

    

CC2541 (8051MCU) перенести библиотечные функции в ОЗУ

Добрый день,

Необходимо запускать все функции из SRAM, так как надо перезаписать флешь с кодом. Проблема в том, что функция, вызываемая из SRAM, обращается к служебным  функциям, сидящим во флеше. Как перенести все функции в SRAM?

 

 

 

Share this post


Link to post
Share on other sites
11 минут назад, Алексей ВМ сказал:

Необходимо запускать все функции из SRAM, так как надо перезаписать флешь с кодом. Проблема в том, что функция, вызываемая из SRAM, обращается к служебным  функциям, сидящим во флеше. Как перенести все функции в SRAM?

Создать отдельную программу. В отдельном проекте. Так и делают бутлоадеры.

Share this post


Link to post
Share on other sites

Это и есть отдельная программа. Она копируется из ROM в SRAM и оттуда запускается, но при  этом происходит обращение к служебным функциям, например LCALL ?BANKED_ENTER_XDATA, которые находятся во флеше.

 

#pragma default_function_attributes = @ "RAMCODE"
void UpdateFirmware(void)
{        
    buf[0] = 0xBE;
    buf[1] = 0xEF;
    buf[2] = 0xDE;
    buf[3] = 0xAD;  
    

    HalFlashWriteRAM(TEST_ADDR, buf, 1);
  
    LED_ON
      
    for(;;);
}


void HalFlashWriteRAM(uint16 addr, uint8 *buf, uint16 cnt)
{        
    halDMADesc_t *ch = HAL_NV_DMA_GET_DESC();
    
    HAL_DMA_SET_SOURCE(ch, buf);
    HAL_DMA_SET_DEST(ch, &FWDATA);
    HAL_DMA_SET_VLEN(ch, HAL_DMA_VLEN_USE_LEN);
    HAL_DMA_SET_LEN(ch, (cnt * HAL_FLASH_WORD_SIZE));
    HAL_DMA_SET_WORD_SIZE(ch, HAL_DMA_WORDSIZE_BYTE);
    HAL_DMA_SET_TRIG_MODE(ch, HAL_DMA_TMODE_SINGLE);
    HAL_DMA_SET_TRIG_SRC(ch, HAL_DMA_TRIG_FLASH);
    HAL_DMA_SET_SRC_INC(ch, HAL_DMA_SRCINC_1);
    HAL_DMA_SET_DST_INC(ch, HAL_DMA_DSTINC_0);
    // The DMA is to be polled and shall not issue an IRQ upon completion.
    HAL_DMA_SET_IRQ(ch, HAL_DMA_IRQMASK_DISABLE);
    HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS);
    HAL_DMA_SET_PRIORITY(ch, HAL_DMA_PRI_HIGH);
    HAL_DMA_CLEAR_IRQ(HAL_NV_DMA_CH);
    HAL_DMA_ARM_CH(HAL_NV_DMA_CH);

    FADDRL = (uint8)addr;
    FADDRH = (uint8)(addr >> 8);
    FCTL |= 0x02;         // Trigger the DMA writes.
    while (FCTL & 0x80);  // Wait until writing is done.
    
    //LED_ON
      
    //for(;;);
}
#pragma default_function_attributes =

Например, вызов функции HalFlashWriteRAM(TEST_ADDR, buf, 1); порождает вызов LCALL ?BANKED_ENTER_XDATA

Edited by Алексей ВМ

Share this post


Link to post
Share on other sites
21 минуту назад, Алексей ВМ сказал:

Это и есть отдельная программа. Она копируется из ROM в SRAM и оттуда запускается, но при  этом происходит обращение к служебным функциям, например LCALL ?BANKED_ENTER_XDATA, которые находятся во флеше.

Например, вызов функции HalFlashWriteRAM(TEST_ADDR, buf, 1); порождает вызов LCALL ?BANKED_ENTER_XDATA

Ну значит часть этой программы у Вас слинковалась во флешь. Например - все эти функции типа HAL_DMA_...() где находятся?

Share this post


Link to post
Share on other sites

Это макросы. Насколько я понял, служебные функции вызываются при использовании параметров в вызове функции. Если тело функции HalFlashWriteRAM() использовать в функции UpdateFirmware(), то все работает отлично.

Edited by Алексей ВМ

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now