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

 
 
> Как в 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
Ответов (1 - 12)
Палыч
сообщение Nov 14 2011, 08:16
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



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

Цитата(smk @ Nov 14 2011, 12:03) *
...как чтоб в него посредством printf ?
Загляните в пример "Hello World" и сделайте по-подобию
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Nov 14 2011, 09:01
Сообщение #3


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

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



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

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


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

C:\Keil\ARM\Examples\Hello\


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
smk
сообщение Nov 14 2011, 11:47
Сообщение #4


Гуру
******

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



Даю map. Как я понял массивы в ОЗУ.
Прикрепленный файл  110592.7z ( 5.09 килобайт ) Кол-во скачиваний: 94


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


Гуру
******

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



Цитата(smk @ Nov 14 2011, 15:47) *
Даю map. Как я понял массивы в ОЗУ.

Нет, не в ОЗУ.
Go to the top of the page
 
+Quote Post
Allregia
сообщение Nov 14 2011, 12:29
Сообщение #6


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

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



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


Гуру
******

Группа: Свой
Сообщений: 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
smk
сообщение Nov 14 2011, 12:51
Сообщение #8


Гуру
******

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



Цитата(aaarrr @ Nov 14 2011, 14:18) *
Нет, не в ОЗУ.

Спасибо. Вероятно я что-то напутал.


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


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

Группа: Свой
Сообщений: 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
Сообщение #10


Гуру
******

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



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

Ну, можно и так, конечно. Только при сопровождении и переносе будут неизбежно возникать вопросы.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Nov 14 2011, 14:20
Сообщение #11


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



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

А static const не помогает?
Go to the top of the page
 
+Quote Post
Allregia
сообщение Nov 14 2011, 15:09
Сообщение #12


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

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



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


Так потому я и спрашивал "как надо".....
Go to the top of the page
 
+Quote Post
smk
сообщение Nov 15 2011, 06:28
Сообщение #13


Гуру
******

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



Цитата(esaulenka @ Nov 14 2011, 11:01) *
C:\Keil\ARM\Examples\Hello\

Спасибо. Все получилось.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post

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

 


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


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