Easyelectronics.ru

Электроника для всех
Текущее время: 20 фев 2019, 10:37

Часовой пояс: UTC + 5 часов




Начать новую тему Ответить на тему  [ Сообщений: 17 ] 
Автор Сообщение
 Заголовок сообщения: Экономия RAM.
СообщениеДобавлено: 08 мар 2016, 16:09 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 216
Камень STM32f107VC. получил неприятный сюрприз – закончился RAM. а я еще даже не начал писать.
в связи с этим хотел задать несколько вопросов.
1. если я объявил глобальную переменную uint8_t под нее все равно выделиться регистр?
2. если я засунул стринг или какую нибудь переменную во флэш - при обращении к нему он копируется в RAM или я обращаюсь в область text?
3. может есть какие нибудь трюки позволяющие экономить RAM?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Экономия RAM.
СообщениеДобавлено: 08 мар 2016, 16:28 
Старожил

Зарегистрирован: 10 апр 2013, 17:41
Сообщения: 266
Выкладывайте map файл. В общем случае под uint8 будет занят один байт.

_________________
Стиль: "G&P"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Экономия RAM.
СообщениеДобавлено: 08 мар 2016, 16:39 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 216
45893569365 писал(а):
Выкладывайте map файл. В общем случае под uint8 будет занят один байт.

ну у меня там есть проблемное место - я выделяю массив структур конечного размера. он отжирает 10 кило. если даже я потом создал один элемент все поле занято под массив. просто не хочу пользоваться динамическим выделением памяти. и потом LWIP делает алокацию памяти немалую.

а если я создал в глобальной структуре переменную uint8_t? без выравниания она займет регистр?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Экономия RAM.
СообщениеДобавлено: 08 мар 2016, 16:45 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 643
jenya77 писал(а):
3. может есть какие нибудь трюки позволяющие экономить RAM?


Самый простой и очевидный - создаём задачу, юзаем, убиваем задачу. Можно отдельно динамически выделять память, но с определённого момента сложности проекта - следить за этим зоопарком становится всё сложнее и сложнее. И наступит момент когда уже непонятно, чего собственно делает этот кусок памяти, и отчего без него всё падает.

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Экономия RAM.
СообщениеДобавлено: 08 мар 2016, 16:53 
Старожил
Аватара пользователя

Зарегистрирован: 03 сен 2010, 22:46
Сообщения: 5423
Откуда: Москва
У вас 64 килобайта памяти. Очень странно, что вы столкнулись с этой проблемой, даже при том что используется LWIP. Сдается мне, что у вас в коде или в самом подходе что-то фундаментально не так.

Но вообще, как правило усилия по оптимизации памяти не стоят того на малых сериях, дешевле взять камень с большим количеством памяти на борту, или поставить отдельный чип памяти.

Может быть стоит выложить код?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Экономия RAM.
СообщениеДобавлено: 08 мар 2016, 16:59 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 216
AVI-crak писал(а):
jenya77 писал(а):
3. может есть какие нибудь трюки позволяющие экономить RAM?


Самый простой и очевидный - создаём задачу, юзаем, убиваем задачу. Можно отдельно динамически выделять память, но с определённого момента сложности проекта - следить за этим зоопарком становится всё сложнее и сложнее. И наступит момент когда уже непонятно, чего собственно делает этот кусок памяти, и отчего без него всё падает.

я думал об этом - хранить задачи на SD карте. но считывание и парсинг займут много времени.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Экономия RAM.
СообщениеДобавлено: 08 мар 2016, 17:03 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 216
akatenev писал(а):
У вас 64 килобайта памяти. Очень странно, что вы столкнулись с этой проблемой, даже при том что используется LWIP. Сдается мне, что у вас в коде или в самом подходе что-то фундаментально не так.

Но вообще, как правило усилия по оптимизации памяти не стоят того на малых сериях, дешевле взять камень с большим количеством памяти на борту, или поставить отдельный чип памяти.

Может быть стоит выложить код?

не знаю много ли видно из кода
Код:
int main(void)
{
    /* Setup STM32 system (clock, PLL and Flash configuration) */
    SystemInit();

    GPIO_Setup();
    USART2_Setup();
    SPI3_Setup();
    I2C1_Setup();
    UB_USB_CDC_Init();

    check = RTC_Setup();
    if (check)
        sys_errors |= RTC_ERROR;

     
     /* Initialize the LwIP stack */
    LwIP_Init();
   
    //configure SysTick for delay function
    SysTick->CTRL |= BIT2;  //1 - processor clock.
    SysTick->CTRL &= ~0x01; //disable

    #if SD_ENA
    status = disk_initialize(0);
    if (status == RES_OK)
    {
        result = f_mount(&FATFS_Obj, "0", 1);
        if (result == FR_OK)
        {
               result = XML_SetFile();
               if (result != FR_OK)
                  sys_errors |= XML_ERROR;
               else
                  sys_status |= XMLFILE_READY;
        }
        else
        {
           sys_errors |= SD_ERROR;
        }
    }
   #endif

   print_out = 1;

  DateUpdate(17,1,2016);
  TimeUpdate(0,0,0);

    TASKER_Program();

  /* Infinite loop */
  while (1)
  {
     //every second interrupt
     if (rtc_sec_int)
     {
        rtc_sec_int = 0;

                  //FOR BEBUG ONLY
        temperature += 1;
        humidity += 1;

        if(TASKER_EvaluateTask(&dailyTask[0]))
        {
           DisplayParam(dailyTask[0].taskParams[0]);
           DisplayParam(dailyTask[0].taskParams[1]);
        }
     }

         if (rx2_ready)
     {
        rx2_ready = 0;
        PARSER_ParseCommand(pc_rx_buf);
     }
     

           if(UB_USB_CDC_GetStatus()==USB_CDC_CONNECTED)
     {
         // USB -> UART
         check=UB_USB_CDC_ReceiveString(usb_string_buf);
         if(check==RX_READY)
         {
            check = RX_EMPTY;
             //UB_USB_CDC_SendString(usb_string_buf,LFCR);
            PARSER_ParseCommand(usb_string_buf);
         }
     }

  }
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Экономия RAM.
СообщениеДобавлено: 08 мар 2016, 17:32 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 643
Задачи на sd карте, это в raw массиве чтоли??? экстрим однако.
Моём понимании задача является компактным исходным кодом, которая уже в процессе своей работы размещает данные в памяти. Данные как таковые лучше хранить в W25Qxx флеш памяти. SD карта с неизвестным временем жизни - для таких операций не подходит, она больше предназначена для пользовательских данных.

То-есть получается так:
Все задачи в флешь мк, вся графика во внешней W25Qxx, всё с чем работает пользователь - на внешней sd карте. Неинициализированные и нулевые данные - просто адрес в флешке мк, размером с один адрес.

Я сталкивался критической нехваткой флешь памяти мк всего один раз, пришлось размещать часть кода в W25Qxx. Самостоятельно написать миллионы строчек кода -просто нереально, даже в моём случае это был чужой код. Отчего моё изумление безгранично. (данные и графика не в счёт)

Код... И это всё???
Инсталл должен быть в отдельной секции до майна.
Размеры массивов не видны, есть подозрение что они огромны.

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Экономия RAM.
СообщениеДобавлено: 08 мар 2016, 20:37 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 216
спасибо за информацию. буду думать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Экономия RAM.
СообщениеДобавлено: 08 мар 2016, 21:44 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2114
jenya77 писал(а):
я думал об этом - хранить задачи на SD карте. но считывание и парсинг займут много времени.


Тоже думал об этом (но не в контексте экономии RAM).
Хочу в прошивке реализовать некое API с основными функциями, а саму логику программы - на SD карте.
Либо скрипт, либо байт-код.
Интересно попробовать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Экономия RAM.
СообщениеДобавлено: 08 мар 2016, 21:57 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 572
Доброго времени суток !
1) проверьте, чтоб у Вас временные переменные не были объявлены как глобальные (к примеру структуры инициализации периферии)
2) просмотрите Ваш map файл, выглядит он примерно так: (см прикрепленный файл)
там есть секции которые хранятся во флешь.( в данном случае .text:).
все переменные которые у Вас не изменяемые - то есть могут храниться во флешь должны быть объявлены с префиксом const пример: const char str[] = {"Hello world !!!"}; или можно указать явно секцию: char str[] __attribute__ ((section(.text))) = {"Hello world !!!"};
в этих случаях переменная str будет указывать на адрес во флешь а не в ОЗУ.

В общем где то так.
PS:Извини не могу добавить файл так как .ld, .map и без расширения - "Расширение запрещено администратором." В чем прикол - я не понял.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Экономия RAM.
СообщениеДобавлено: 09 мар 2016, 08:13 
Старожил

Зарегистрирован: 10 апр 2013, 17:41
Сообщения: 266
А зазиповать нельзя?

_________________
Стиль: "G&P"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Экономия RAM.
СообщениеДобавлено: 09 мар 2016, 13:28 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 216
Pingvin писал(а):
jenya77 писал(а):
я думал об этом - хранить задачи на SD карте. но считывание и парсинг займут много времени.


Тоже думал об этом (но не в контексте экономии RAM).
Хочу в прошивке реализовать некое API с основными функциями, а саму логику программы - на SD карте.
Либо скрипт, либо байт-код.
Интересно попробовать.

это по моему самое то http://we.easyelectronics.ru/STM32/prik ... stm32.html


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Экономия RAM.
СообщениеДобавлено: 09 мар 2016, 13:32 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 216
void1509 писал(а):
Доброго времени суток !
1) проверьте, чтоб у Вас временные переменные не были объявлены как глобальные (к примеру структуры инициализации периферии)
2) просмотрите Ваш map файл, выглядит он примерно так: (см прикрепленный файл)
там есть секции которые хранятся во флешь.( в данном случае .text:).
все переменные которые у Вас не изменяемые - то есть могут храниться во флешь должны быть объявлены с префиксом const пример: const char str[] = {"Hello world !!!"}; или можно указать явно секцию: char str[] __attribute__ ((section(.text))) = {"Hello world !!!"};
в этих случаях переменная str будет указывать на адрес во флешь а не в ОЗУ.

В общем где то так.
PS:Извини не могу добавить файл так как .ld, .map и без расширения - "Расширение запрещено администратором." В чем прикол - я не понял.

доступ к константам во флэш медленее чем в RAM как я понимаю. тут у нас trade-off возникает скрость - место.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Экономия RAM.
СообщениеДобавлено: 09 мар 2016, 16:17 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 572
это нужно смотреть параметры камня - у stm32f2 флешь на частоте ядра, без тактов ожидания.
Зы подсмотрел про 1xx:
Bits2:0 LATENCY:Latency
These bits represent the ratio of the SYSCLK (system clock) period to the Flash access time.
000 Zero wait state, if 0 < SYSCLK≤ 24 MHz
001 One wait state, if 24 MHz < SYSCLK ≤ 48 MHz
010 Two wait states, if 48 MHz < SYSCLK ≤72 MHz

Получается при частотах выше 24 флешь медленнее ОЗУ, но я думаю в любом случае быстрее чем SD. Да и доступ удобней ;)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Экономия RAM.
СообщениеДобавлено: 09 мар 2016, 21:31 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 216
void1509 писал(а):
это нужно смотреть параметры камня - у stm32f2 флешь на частоте ядра, без тактов ожидания.
Зы подсмотрел про 1xx:
Bits2:0 LATENCY:Latency
These bits represent the ratio of the SYSCLK (system clock) period to the Flash access time.
000 Zero wait state, if 0 < SYSCLK≤ 24 MHz
001 One wait state, if 24 MHz < SYSCLK ≤ 48 MHz
010 Two wait states, if 48 MHz < SYSCLK ≤72 MHz

Получается при частотах выше 24 флешь медленнее ОЗУ, но я думаю в любом случае быстрее чем SD. Да и доступ удобней ;)

хм... это интересно. если останеться место во флэше это вариант. спасибо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Экономия RAM.
СообщениеДобавлено: 10 мар 2016, 00:40 
Старожил
Аватара пользователя

Зарегистрирован: 04 окт 2011, 10:19
Сообщения: 1626
Есть вмзуализатор elf файлов - посмотрите им. Хотя из map тоже видно всё - хоть и буквами.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 17 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB