реклама на сайте
подробности

 
 
> Как в Keil разместить массив во флеш чтоб не висел в ОЗУ, и как настроить printf чтоб вывод через usart?
smk
сообщение Nov 14 2011, 08:03
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Есть массив

Код
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 ? Спасибо.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Allregia
сообщение Nov 14 2011, 12:29
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Немного вопрос в сторону - а как эти массивы определить чтобы они не только во флеше а не в ОЗУ были, но чтобы их можно было переписывать?
Выделять линкером сегмент ("стираемая единица" во флеше), и там размещать, я полагаю, но как это в Кейле описывается?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 14 2011, 12:38
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Allregia @ Nov 14 2011, 16:29) *
Выделять линкером сегмент ("стираемая единица" во флеше), и там размещать, я полагаю, но как это в Кейле описывается?

В C-файле #pragma arm section, в scatter'е прописать соответствующую секцию по нужному адресу.
Go to the top of the page
 
+Quote Post
Allregia
сообщение Nov 14 2011, 13:43
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Цитата(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) в файлах проекта не нашел.
Проект работает, но помоему аффтор просто взял кусок флеша, заведомо выше программы, и все!
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 14 2011, 14:10
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Allregia @ Nov 14 2011, 17:43) *
Проект работает, но помоему аффтор просто взял кусок флеша, заведомо выше программы, и все!

Ну, можно и так, конечно. Только при сопровождении и переносе будут неизбежно возникать вопросы.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 15:47
Рейтинг@Mail.ru


Страница сгенерированна за 0.0142 секунд с 7
ELECTRONIX ©2004-2016