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

 
 
> ОЗУ у f1611
CAHTA_1939
сообщение Nov 1 2007, 20:46
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 142
Регистрация: 11-08-07
Пользователь №: 29 713



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

Сообщение отредактировал CAHTA_1939 - Nov 1 2007, 20:55
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
rezident
сообщение Nov 1 2007, 21:53
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Какой компилятор используете? Если 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
Go to the top of the page
 
+Quote Post
CAHTA_1939
сообщение Nov 1 2007, 22:04
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 142
Регистрация: 11-08-07
Пользователь №: 29 713



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

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

Сообщение отредактировал CAHTA_1939 - Nov 1 2007, 22:10
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 1 2007, 22:29
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
CAHTA_1939
сообщение Nov 1 2007, 23:26
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 142
Регистрация: 11-08-07
Пользователь №: 29 713



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

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

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


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

хочется эту структуру засунуть в пзу, но... там есть данные которые изменяются по ходу работы программы.
как лучьше поступить? подскажи те пожалуйста
Go to the top of the page
 
+Quote Post
SSerge
сообщение Nov 1 2007, 23:26
Сообщение #6


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

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



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

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


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 1 2007, 23:44
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(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, там написано.
Go to the top of the page
 
+Quote Post
CAHTA_1939
сообщение Nov 2 2007, 00:01
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 142
Регистрация: 11-08-07
Пользователь №: 29 713



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

вот то что мне компилятор в мессагах выдал
Код
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


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

теперь у меня забота. как структуру в пзу загнать =(
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 2 2007, 00:29
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(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.
Go to the top of the page
 
+Quote Post
CAHTA_1939
сообщение Nov 2 2007, 01:33
Сообщение #10


Частый гость
**

Группа: Участник
Сообщений: 142
Регистрация: 11-08-07
Пользователь №: 29 713



почитал про _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 - Nov 2 2007, 01:34
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 2 2007, 01:50
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



В плюсах я к сожалению не силен sad.gif Так, помаленьку в plain C кодирую. Так что пусть кто-то другой, более сведующий в C++ совет даст.
Go to the top of the page
 
+Quote Post
CAHTA_1939
сообщение Nov 2 2007, 01:55
Сообщение #12


Частый гость
**

Группа: Участник
Сообщений: 142
Регистрация: 11-08-07
Пользователь №: 29 713



эм... да я на С пишу. сам удивился при чем там класс , если я структуру юзаю
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 2 2007, 08:20
Сообщение #13


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
CAHTA_1939
сообщение Nov 2 2007, 22:33
Сообщение #14


Частый гость
**

Группа: Участник
Сообщений: 142
Регистрация: 11-08-07
Пользователь №: 29 713



нее. это издевательство. пишу const перед переменной. а из логов всеравно видно, что в озу пишется.
DATA memory увеличивается а CONST остается неизменной.
и потом. у мен после DATA memory написанно (+ 19 absolute ) , это что такое?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 3 2007, 11:16
Сообщение #15


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(CAHTA_1939 @ Nov 3 2007, 00:33) *
нее. это издевательство. пишу const перед переменной. а из логов всеравно видно, что в озу пишется.
Нее, издевательство - это призывы заняться телепатией. Делайте проект из одного файла, в котором пара-тройка объявлений, иллюстрирющих проблему, выкладывайте, будем искать


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

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

 


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


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