Перейти к содержанию
    

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

Добрый день,

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

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 минут назад, Алексей ВМ сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это и есть отдельная программа. Она копируется из 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

Изменено пользователем Алексей ВМ

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 минуту назад, Алексей ВМ сказал:

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Изменено пользователем Алексей ВМ

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...