Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ОЗУ у f1611
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
CAHTA_1939
не подскажете, как можно узнать, сколько программа ест ОЗУ?
а то я сейчас пишу на этом контроллере с граф. индикатором менюшку, и у меня такое ошушение что оператива вот вот кончится.... иногда заливаться не хочет.
rezident
Какой компилятор используете? Если IAR, то он результат компиляции в окно диагностики Messages выдает. Вот пример такого сообщения.

Цитата
IAR Universal Linker V4.60K/386
Copyright 1987-2007 IAR Systems. All rights reserved.

3 362 bytes of CODE memory
217 bytes of DATA memory (+ 44 absolute )
130 bytes of CONST memory (+ 46 absolute )

Errors: none
Warnings: none


Total number of errors: 0
Total number of warnings: 0
CAHTA_1939
прошу прошения. забыл написать. да, я использую IAR. сейчас посмотрю...

неа. ничего подобного в сообшениях нет. в других окнах посмотрел - тоже нет. у меня IAR 3,42а
Сергей Борщ
Цитата(CAHTA_1939 @ Nov 2 2007, 01:04) *
неа. ничего подобного в сообшениях нет. в других окнах посмотрел - тоже нет. у меня IAR 3,42а
Где-то в настройках указывалось, выводить all messages или что-то подобное. Если не найдете - корифеи подскажут точнее. А пока они не подтянулись - можете включить в настройках линкера генерацию .map - файла, в нем в конце такая же таблица. Не забудьте еще про стек (под него выделяется сколько скажете, а вот хватит ли этого объема - компилятор не проверяет, ибо не всегда задача просто решаема).
CAHTA_1939
и вот еше. у меня есть большая структура... точне перы структур со вложенными структурами. я их забиваю данными и компилирую. вот только наступает такой момент, может я просто много записываю, что после прошития контроллера на панельке управления( там где кнопки зупуска программы, остановки и другой фигни =) достыпно только STOP =(
если я объем данных уменьшу, то все ОК.

вот фиг его знает что такое.

почти все денные у меня типа const. даже и не знаю, чем могло так засориться 10кб озу =(


посчитал вручную все байты, которые я сую в структуру. получилось 11.5 -(

хочется эту структуру засунуть в пзу, но... там есть данные которые изменяются по ходу работы программы.
как лучьше поступить? подскажи те пожалуйста
SSerge
Посмотрите установки в IDE Tools->Options->Messages->Show build messages->All.

P.S. Именно с F1611 есть ещё такие грабли: если есть много данных, требующих инициализации, в том числе и неинициализированные массивы (они заполняются нулями если не указано __no_init) то инициализация не успевает выполниться - раньше срабатывает вотчдог.
Приходится или писать __no_init для больших массивов или настраивать скорость и вотчдог сразу после старта, до начала инициализации, в функции __low_level_init().
rezident
Цитата(CAHTA_1939 @ Nov 2 2007, 03:04) *
неа. ничего подобного в сообшениях нет. в других окнах посмотрел - тоже нет. у меня IAR 3,42а

В свойствах IDE выберите All там где генерация диагностичесих сообщений.
Tools->Options->Messages->Show build message->All. Кроме того проверьте в свойствах проекта, что разрешена генерация диагностической информации - закладка Diagnostics.
Цитата(CAHTA_1939)
и вот еше. у меня есть большая структура... точне перы структур со вложенными структурами. я их забиваю данными и компилирую. вот только наступает такой момент, может я просто много записываю, что после прошития контроллера на панельке управления( там где кнопки зупуска программы, остановки и другой фигни =) достыпно только STOP =(
если я объем данных уменьшу, то все ОК.

Есть некоторая проблема при очистке глобальных структур большого объема, а они чистятся в соответствии со стандартом Си. Проблема стоит в том, что после сброса MSP430 стартует от генератора DCO (MCLK=DCOCLK) на частоте примерно 1МГц. Работа WDTimer по-умолчанию тоже разрешена. Период срабатывания WDTimer (с имеющимися у него после сброса установками) порядка 32 мс. Т.е. если WDT программно не выключить или не пересбросить, то он вызовет PUC-условие через указанный интервал времени и программа перезапустится. А время, которое занимает очистка глобальных структур большого объема при тактировании от DCO превышает указанный интервал срабатывания WDT. На на кристаллах с 2кБ ОЗУ этот эффект вроде не проявляется, но у F1611 размер ОЗУ 10кБ и описанная ситуация весьма возможна. Чтобы избежать этого нужно либо создавать неинициализируемые глобальные структуры и чистить их самостоятельно в самом начале программы, либо "рихтовать" функцию _low_level_init (включать туда команду останова WDT), которая вызывается до очистки глобальных переменных и структур и до вызова функции main. В общем читайте User's Manual и IAR Help, там написано.
CAHTA_1939
спасибо за информацию. но всеже у меня просто данные в озу не вмешаются... наверное.

вот то что мне компилятор в мессагах выдал
Код
Building configuration: main_slave - Debug
Updating build tree...

main.cpp

   IAR MSP430 C/C++ Compiler V3.42A/W32  [Evaluation]
   Copyright 1996-2006 IAR Systems. All rights reserved.  
  
2 760 bytes of CODE  memory (+  4 bytes shared)
4 211 bytes of CONST memory (+  2 bytes shared)
3 956 bytes of DATA  memory (+ 20 bytes shared)

Errors: none
Warnings: none

Linking

     IAR Universal Linker V4.60C/386
     Copyright 1987-2006 IAR Systems. All rights reserved.

3 308 bytes of CODE  memory
8 024 bytes of DATA  memory (+ 20 absolute )
4 194 bytes of CONST memory

Errors: none
Warnings: none


Total number of errors: 0
Total number of warnings: 0


а структуру я сразу же после описания инициализирую.

теперь у меня забота. как структуру в пзу загнать =(
rezident
Цитата(CAHTA_1939 @ Nov 2 2007, 05:01) *
спасибо за информацию. но всеже у меня просто данные в озу не вмешаются... наверное.

Цитата
8 024 bytes of DATA memory (+ 20 absolute )

8024 байта вроде как меньше, чем 10240 байт. Или нет? wink.gif
Цитата(CAHTA_1939 @ Nov 2 2007, 05:01) *
а структуру я сразу же после описания инициализирую.

Да без разницы инициализируете ли вы глобальную структуру конкретными значениями или сам компилятор в соответствии со стандартом Си инициализирует ее нулями. Инициализация структуры выполняется стартапом до начала выполнения вашей программы. Нулями или любым другим, но одинаковым для всех переменных значением даже быстрее получаться должно. Естественно я про глобальные структуры переменных, а не констант. Константы компилятор по-умолчанию в сегменте CONST размещает, который в свою очередь во Flash записывается.
P.S. кстати, попробуйте в опциях проекта убрать чекбокс с Run to main. Options->Debugger->Setup-> Run to->main. Тогда дебаггер позволит вам "увидеть" и "прошагать" всю программу, включая стартап, который выполняется до main.
CAHTA_1939
почитал про _low_level_init ... занятно. но вот проблемма! структуру я инициализирую сразу после описания... и в функцию инициализацию не хочу вставлять.

а вот про WDT ....
вставил в программу до main
Код
int __low_level_init(void)
{
   WDTCTL = WDTPW + WDTHOLD;             //Stop watchdog timer to prevent time out reset
   return (1);
}


но эффект такойже. с разницей в том, что после прошивки достыпны кнопки запуска программы , пошагового прохода и т.д.

но сама программа не работает =(
хотя есть данные немного укоротить, то все ок!

насчет const.

у меня структура, в ней есть еше одна. вложенная

Код
struct sMENU_WIN  {
                     byte **labelname;            // строка меню.
                     byte i_labelname;            // длина labelname.
                     bool f_flag;                 // поддержка флага.
                     bool flag;                   // состояние флага.
                     bool f_goto;                 // поддержка перехода.
                     byte ptr_fgoto;              // "переход"
                  };


struct _window_   {

                   const  struct sMENU_WIN _win[20];

                  };


если я сделаю как приведено выше, то при компиляции выдается предупреждение...

Код
Warning[Pe368]: class "_window_" defines no constructor to initialize the following: J:\нии\msp430_progs\Slave\_dialog.h 41
            const member "_window_::_win"


инициализирую структуру я след способом

Код
struct _window_ _menu_ = { ... }
rezident
В плюсах я к сожалению не силен sad.gif Так, помаленьку в plain C кодирую. Так что пусть кто-то другой, более сведующий в C++ совет даст.
CAHTA_1939
эм... да я на С пишу. сам удивился при чем там класс , если я структуру юзаю
Сергей Борщ
Цитата(CAHTA_1939 @ Nov 2 2007, 04:55) *
эм... да я на С пишу. сам удивился при чем там класс , если я структуру юзаю
Возможно, у вас в настройках компилятора включен режим С++. Но это не страшно. Смотрите внимательно:
Код
struct _window_   {
                   const  struct sMENU_WIN _win[20];
                  };
Вы объявили новый тип _window_, в котором есть константный член. С точки зрения С, константный - это значит "только для чтения". В то время как сами структуры типа _window_ могут быть объявлены как неконстантные. Компилятор предупреждает: а как, собственно, вы будете инициализировать члены read-only? Вам надо объявить члены без const, а const указать именно для каждой объявляемой переменной типа _window_:
Код
struct _window_  
{
    sMENU_WIN _win[20];
};
_window_ const Win1 =
{
    {.....},  // _win[0]
    {     },  // _win[1]
};
В режиме С вы должны получить примерно аналогичные предупреждения. И еще - если вы пишете на С, лучше использовать запись typedef struct { fields } my_type; в С++ - или такую же с typedef или ее эквивалент struct mytype { fields };, таким образом вы заводите новый самостоятельный тип, и в дальнейшем вам достаточно писать просто mytype variable, вместо struct mytype variable.

Еще раз про const: стандарт С про флеш-память не знает. Его задача - положить константные данные в сегмент констант. На архитектурах с одним адресным пространством (MSP, ARM) можно разместить сегмент констант непосредственно по адресам флеш. Для архитектур с разными адресными пространствами (AVR) приходится вводить дополнительные расширения (__flash), чтобы указать что данные располагаются во флеш и что для доступа к ним нужны другие ассемблерные команды.
для MSP имеем:
обычная глобальная переменная (int i;)- расположена в ОЗУ, ее можно читать и писать. Компилятор группирует все такие переменные в сегмент DATA_Z и перед запуском main() одним циклом записывает 0x00 во все ячейки сегмента. Таким образом все глобальные переменные оказываются обнулены.
обычная глобальная переменная, объявленная с квалификатором __no_init (__no_init int i;)- расположена в ОЗУ, ее можно читать и писать. Компилятор группирует все такие переменные в сегмент DATA_N. Этот сегмент перед стартом main() не трогается.
обычная глобальная переменная, инициализированная значением ( int i = 0; )- расположена в ОЗУ, ее можно читать и писать. Компилятор группирует все такие переменные в сегмент DATA_I. Все начальные значения компилятор группирует в том же порядке в сегмент DATA_ID. Перед запуском main(), одним циклом содержимое DATA_ID копируется в DATA_I. Таким образом сразу инициализируются все инициализированные глобальные переменные. Именно такая переменная у вас получится, если вы объявите неконстантную структуру, у которой часть членов будет константной.
глобальная константная проинициализированная переменная ( int const i = 0; ) - ее можно только читать. Все такие переменные компилятор группирует в сегмент DATA_C. Для MSP вы можете в файле линкера указать размещение этого сегмента во флеш (и так и сделано в файлах, которые идут с компилятором). Для AVR сегмент DATA_C будет расположен в ОЗУ, при старте в него будут скопированы из флеш начальные значения (как и в варианте с парой DATA_I, DATA_ID) и компилятор будет следить, чтобы вы не попытались изменить эти значения. Если на AVR вы хотите, чтобы данные располагались только во флеш и брались сразу оттуда - надо использовать расширение компилятора - ключевое слово __flash. Сделано так потому, что согласно стандарту вы можете указателю на константный тип присвоить указатель на неконстантный такой же тип, и это будет говорить лишь о том, что данные через этот указатель нельзя изменить.
Несколько сумбурно, но, надеюсь, понятно.
CAHTA_1939
нее. это издевательство. пишу const перед переменной. а из логов всеравно видно, что в озу пишется.
DATA memory увеличивается а CONST остается неизменной.
и потом. у мен после DATA memory написанно (+ 19 absolute ) , это что такое?
Сергей Борщ
Цитата(CAHTA_1939 @ Nov 3 2007, 00:33) *
нее. это издевательство. пишу const перед переменной. а из логов всеравно видно, что в озу пишется.
Нее, издевательство - это призывы заняться телепатией. Делайте проект из одного файла, в котором пара-тройка объявлений, иллюстрирющих проблему, выкладывайте, будем искать
CAHTA_1939
помогите. возникла проблема при выделении динамической памяти под структуру.

вот сама структура
Код
struct sMENU_WIN  {
                      byte **labelname;            // строка меню.
                      byte i_labelname;            // длина labelname.
                      bit  f_flag;                 // поддержка флага.
                      bit  flag;                   // состояние флага.
                      bit  f_goto;                 // поддержка перехода.
                      byte ptr_fgoto;              // "переход"
                      bit  f_func_exe;
                      byte *ptr_func_exe;
                  };

struct _window_   {
                     struct sMENU_WIN *_win;
                  };

struct sMENU      {
                     byte PP;                       //
                     byte *stack;                   //
                     byte *stack_1;                 //
                    
                     struct _window_ ss0;           //window#0
                     struct _window_ ss1;           //window#1
                  };
                    
struct _window_ *p_window_[2];                      //кол-во окон!
struct sMENU _menu_;                                //


это я делаю для удобства.
Код
void ini_p_window(&_menu_);

void ini_p_window(struct sMENU *p)
{
   p_window_[0] = &p->ss0; // main
   p_window_[1] = &p->ss1; // window 1
}



а вот сама функция для выделения памяти и инициализации
Код
void ini_struct(&_menu_);

void ini_struct(struct sMENU *ptr)
{

...

   (*p_window_[0])._win = (struct sMENU_WIN*)malloc(13*sizeof(struct sMENU_WIN));
  
   if((*p_window_[0])._win == NULL){ _puts(1, 0, mem_err); return;}
   else                            { _puts(1, 0, OK); }

...


при выделении до (6*sizeof(struct sMENU_WIN) все работает нормально. а если больше 6, то возникает ошибка.

если в структуре вместо struct sMENU_WIN *_win; написать struct sMENU_WIN _win[13];
то все будет работать хорошо. но мне нужно чтобы выделялась динамически
Сергей Борщ
Цитата(CAHTA_1939 @ Nov 7 2007, 15:10) *
при выделении до (6*sizeof(struct sMENU_WIN) все работает нормально. а если больше 6, то возникает ошибка.
Так посмотрите, сколько памяти вы отвели под HEAP. И посчитайте, сколько запрашиваете. Еще учтите, что кроме выделения вам N байт памяти резервируется несколько служебных для поддержания кучи, т.е. память под кучу надо резервировать с запасом.
CAHTA_1939
угу, уже посмотрел. там по стандаргу выделенно чтото около 80. я поставил 2048... откуда будет отниматься эта память из озу или из пзу?
Сергей Борщ
Цитата(CAHTA_1939 @ Nov 7 2007, 16:42) *
угу, уже посмотрел. там по стандаргу выделенно чтото около 80. я поставил 2048... откуда будет отниматься эта память из озу или из пзу?
По какому стандарту? 07.gif Что-то я не слышал, чтобы объекты динамически размещались в ПЗУ. Кончно из ОЗУ. Загляните в .xcl - там это все указывается.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.