Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как в Keil разместить массив во флеш чтоб не висел в ОЗУ
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
smk
Есть массив

Код
const unsigned char rf_fram_table[][3]={
   {0x30,0x98,0x00},{0x31,0xff,0x0F},{0x32,0x80,0x28},{0x33,0x80,0x56},    
   {0x34,0x4E,0xF6},{0x35,0xF6,0xF5},{0x36,0x18,0x5C},{0x37,0xD6,0x51},
   {0x38,0x44,0x04},{0x39,0xE0,0x00}
};


Используется он один раз при инициализации. Их таких одноразовых несколько. Нужно сделать так чтобы содержимое этих массивов не висело в ОЗУ и не занимало место бесцельно. Как это сделать?

И еще нужно настроить printf на вывод через usart0 LPC2103. Собственно usart0 настроил, а как чтоб в него посредством printf ? Спасибо.
Палыч
Цитата(smk @ Nov 14 2011, 12:03) *
Как это сделать?
Добавить спецификатор типа памяти. К сожалению, эти спецификаторы - нестандартные и для Вашего МК нужно смотреть в документации. Для МК51, например, такой спецификатор - code.

Цитата(smk @ Nov 14 2011, 12:03) *
...как чтоб в него посредством printf ?
Загляните в пример "Hello World" и сделайте по-подобию
esaulenka
Цитата(smk @ Nov 14 2011, 12:03) *
Есть массив
Используется он один раз при инициализации. Их таких одноразовых несколько. Нужно сделать так чтобы содержимое этих массивов не висело в ОЗУ и не занимало место бесцельно. Как это сделать?

А что, разве по умолчанию оно в ОЗУ? map-файл покажите.
У меня так получается, что линкер самостоятельно догадывается, что const надо во флеш класть...


Цитата(smk @ Nov 14 2011, 12:03) *
И еще нужно настроить printf на вывод через usart0 LPC2103. Собственно usart0 настроил, а как чтоб в него посредством printf ? Спасибо.

C:\Keil\ARM\Examples\Hello\
smk
Даю map. Как я понял массивы в ОЗУ.
Нажмите для просмотра прикрепленного файла
aaarrr
Цитата(smk @ Nov 14 2011, 15:47) *
Даю map. Как я понял массивы в ОЗУ.

Нет, не в ОЗУ.
Allregia
Немного вопрос в сторону - а как эти массивы определить чтобы они не только во флеше а не в ОЗУ были, но чтобы их можно было переписывать?
Выделять линкером сегмент ("стираемая единица" во флеше), и там размещать, я полагаю, но как это в Кейле описывается?
aaarrr
Цитата(Allregia @ Nov 14 2011, 16:29) *
Выделять линкером сегмент ("стираемая единица" во флеше), и там размещать, я полагаю, но как это в Кейле описывается?

В C-файле #pragma arm section, в scatter'е прописать соответствующую секцию по нужному адресу.
smk
Цитата(aaarrr @ Nov 14 2011, 14:18) *
Нет, не в ОЗУ.

Спасибо. Вероятно я что-то напутал.
Allregia
Цитата(aaarrr @ Nov 14 2011, 14:38) *
В C-файле #pragma arm section, в scatter'е прописать соответствующую секцию по нужному адресу.


Спасибо, я так и думал. но - я сижу разбираюсь с чужим исходником, вот выделил кусок ко всему этому относящемуся:
Код
// Save/Load Config

#define DMA_BUF_A        0x2007C000            
#define CFG_ADDR        0x00078000

//
#define IAP_ADDRESS 0x1FFF1FF1

#define cmdPrepareSector  50
#define cmdCpyRAM2FLASH   51
#define cmdEraseSector    52

#define CMD_SUCCESS       0

//
uint32_t cmd[5];
uint32_t res[5];
//
BYTE *IAPBuffer    = (BYTE *) (DMA_BUF_A);
BYTE *Cfg_flash = (BYTE *) (CFG_ADDR);


//================================================================================
==============

void iap_entry(unsigned int param_tab[], unsigned int result_tab[])
{
    void (*iap)(unsigned [],unsigned []);

    iap = (void (*)(unsigned [],unsigned []))IAP_ADDRESS;
    iap(param_tab,result_tab);
}
//--------------------------------------------------------------------------------------------------
// config >> flash

int SaveConfig(void){
  uint32_t WaitTime;

    memcpy(IAPBuffer, &config, sizeof(config));

    __disable_irq();
        cmd[0] = cmdPrepareSector;  
        cmd[1] = 29;
        cmd[2] = 29;
        cmd[3] = 96000;
        iap_entry (cmd, res);
        if (res[0] != CMD_SUCCESS) return 0;
                        
        cmd[0] = cmdEraseSector;  
        cmd[1] = 29;
        cmd[2] = 29;
        cmd[3] = 96000;
        iap_entry (cmd, res);
        if (res[0] != CMD_SUCCESS) return 0;

        cmd[0] = cmdPrepareSector;
        cmd[1] = 29;
        cmd[2] = 29;
        cmd[3] = 96000;
        iap_entry (cmd, res);
        if (res[0] != CMD_SUCCESS) return 0;

        cmd[0] = cmdCpyRAM2FLASH;  
        cmd[1] = CFG_ADDR;
        cmd[2] = DMA_BUF_A;
        cmd[3] = 256;
        cmd[4] = 96000;
        iap_entry (cmd, res);
        if (res[0] != CMD_SUCCESS) return 0;

        WaitTime = 0x027FFFFF;
        while(WaitTime--);
    __enable_irq();

    return 1;
}
//---------------------------------------------------
// config << flash
void Load_Config(void){
    memcpy(&config, Cfg_flash, sizeof(config));
    return;
}

//================================================================================
=================


никакого scatter файла я в проекте не нашел. более того - я ни одной pragma, (кроме тех, что были в core_cm3.c и lpc17xx.h) в файлах проекта не нашел.
Проект работает, но помоему аффтор просто взял кусок флеша, заведомо выше программы, и все!
aaarrr
Цитата(Allregia @ Nov 14 2011, 17:43) *
Проект работает, но помоему аффтор просто взял кусок флеша, заведомо выше программы, и все!

Ну, можно и так, конечно. Только при сопровождении и переносе будут неизбежно возникать вопросы.
ViKo
Цитата(smk @ Nov 14 2011, 11:03) *
Нужно сделать так чтобы содержимое этих массивов не висело в ОЗУ и не занимало место бесцельно. Как это сделать?

А static const не помогает?
Allregia
Цитата(aaarrr @ Nov 14 2011, 16:10) *
Ну, можно и так, конечно. Только при сопровождении и переносе будут неизбежно возникать вопросы.


Так потому я и спрашивал "как надо".....
smk
Цитата(esaulenka @ Nov 14 2011, 11:01) *
C:\Keil\ARM\Examples\Hello\

Спасибо. Все получилось.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.