Перейти к содержанию
    

не подскажете, как можно узнать, сколько программа ест ОЗУ?

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

Изменено пользователем CAHTA_1939

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Какой компилятор используете? Если 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

прошу прошения. забыл написать. да, я использую IAR. сейчас посмотрю...

 

неа. ничего подобного в сообшениях нет. в других окнах посмотрел - тоже нет. у меня IAR 3,42а

Изменено пользователем CAHTA_1939

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

неа. ничего подобного в сообшениях нет. в других окнах посмотрел - тоже нет. у меня IAR 3,42а
Где-то в настройках указывалось, выводить all messages или что-то подобное. Если не найдете - корифеи подскажут точнее. А пока они не подтянулись - можете включить в настройках линкера генерацию .map - файла, в нем в конце такая же таблица. Не забудьте еще про стек (под него выделяется сколько скажете, а вот хватит ли этого объема - компилятор не проверяет, ибо не всегда задача просто решаема).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

и вот еше. у меня есть большая структура... точне перы структур со вложенными структурами. я их забиваю данными и компилирую. вот только наступает такой момент, может я просто много записываю, что после прошития контроллера на панельке управления( там где кнопки зупуска программы, остановки и другой фигни =) достыпно только STOP =(

если я объем данных уменьшу, то все ОК.

 

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

 

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

 

 

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

 

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

как лучьше поступить? подскажи те пожалуйста

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посмотрите установки в IDE Tools->Options->Messages->Show build messages->All.

 

P.S. Именно с F1611 есть ещё такие грабли: если есть много данных, требующих инициализации, в том числе и неинициализированные массивы (они заполняются нулями если не указано __no_init) то инициализация не успевает выполниться - раньше срабатывает вотчдог.

Приходится или писать __no_init для больших массивов или настраивать скорость и вотчдог сразу после старта, до начала инициализации, в функции __low_level_init().

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

неа. ничего подобного в сообшениях нет. в других окнах посмотрел - тоже нет. у меня IAR 3,42а

В свойствах IDE выберите All там где генерация диагностичесих сообщений.

Tools->Options->Messages->Show build message->All. Кроме того проверьте в свойствах проекта, что разрешена генерация диагностической информации - закладка Diagnostics.

и вот еше. у меня есть большая структура... точне перы структур со вложенными структурами. я их забиваю данными и компилирую. вот только наступает такой момент, может я просто много записываю, что после прошития контроллера на панельке управления( там где кнопки зупуска программы, остановки и другой фигни =) достыпно только 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, там написано.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

спасибо за информацию. но всеже у меня просто данные в озу не вмешаются... наверное.

 

вот то что мне компилятор в мессагах выдал

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

 

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

 

теперь у меня забота. как структуру в пзу загнать =(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

спасибо за информацию. но всеже у меня просто данные в озу не вмешаются... наверное.

8 024 bytes of DATA memory (+ 20 absolute )

8024 байта вроде как меньше, чем 10240 байт. Или нет? ;)

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

Да без разницы инициализируете ли вы глобальную структуру конкретными значениями или сам компилятор в соответствии со стандартом Си инициализирует ее нулями. Инициализация структуры выполняется стартапом до начала выполнения вашей программы. Нулями или любым другим, но одинаковым для всех переменных значением даже быстрее получаться должно. Естественно я про глобальные структуры переменных, а не констант. Константы компилятор по-умолчанию в сегменте CONST размещает, который в свою очередь во Flash записывается.

P.S. кстати, попробуйте в опциях проекта убрать чекбокс с Run to main. Options->Debugger->Setup-> Run to->main. Тогда дебаггер позволит вам "увидеть" и "прошагать" всю программу, включая стартап, который выполняется до main.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

почитал про _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_ = { ... }

Изменено пользователем CAHTA_1939

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В плюсах я к сожалению не силен :( Так, помаленьку в plain C кодирую. Так что пусть кто-то другой, более сведующий в C++ совет даст.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

эм... да я на С пишу. сам удивился при чем там класс , если я структуру юзаю

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

эм... да я на С пишу. сам удивился при чем там класс , если я структуру юзаю
Возможно, у вас в настройках компилятора включен режим С++. Но это не страшно. Смотрите внимательно:
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. Сделано так потому, что согласно стандарту вы можете указателю на константный тип присвоить указатель на неконстантный такой же тип, и это будет говорить лишь о том, что данные через этот указатель нельзя изменить.

Несколько сумбурно, но, надеюсь, понятно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

нее. это издевательство. пишу const перед переменной. а из логов всеравно видно, что в озу пишется.

DATA memory увеличивается а CONST остается неизменной.

и потом. у мен после DATA memory написанно (+ 19 absolute ) , это что такое?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

нее. это издевательство. пишу const перед переменной. а из логов всеравно видно, что в озу пишется.
Нее, издевательство - это призывы заняться телепатией. Делайте проект из одного файла, в котором пара-тройка объявлений, иллюстрирющих проблему, выкладывайте, будем искать

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...