|
ОЗУ у f1611 |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Nov 1 2007, 23:44
|
Гуру
     
Группа: Свой
Сообщений: 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, там написано.
|
|
|
|
|
Nov 2 2007, 00:01
|

Частый гость
 
Группа: Участник
Сообщений: 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 а структуру я сразу же после описания инициализирую. теперь у меня забота. как структуру в пзу загнать =(
|
|
|
|
|
Nov 2 2007, 00:29
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(CAHTA_1939 @ Nov 2 2007, 05:01)  спасибо за информацию. но всеже у меня просто данные в озу не вмешаются... наверное. Цитата 8 024 bytes of DATA memory (+ 20 absolute ) 8024 байта вроде как меньше, чем 10240 байт. Или нет?  Цитата(CAHTA_1939 @ Nov 2 2007, 05:01)  а структуру я сразу же после описания инициализирую. Да без разницы инициализируете ли вы глобальную структуру конкретными значениями или сам компилятор в соответствии со стандартом Си инициализирует ее нулями. Инициализация структуры выполняется стартапом до начала выполнения вашей программы. Нулями или любым другим, но одинаковым для всех переменных значением даже быстрее получаться должно. Естественно я про глобальные структуры переменных, а не констант. Константы компилятор по-умолчанию в сегменте CONST размещает, который в свою очередь во Flash записывается. P.S. кстати, попробуйте в опциях проекта убрать чекбокс с Run to main. Options->Debugger->Setup-> Run to->main. Тогда дебаггер позволит вам "увидеть" и "прошагать" всю программу, включая стартап, который выполняется до main.
|
|
|
|
|
Nov 2 2007, 01:33
|

Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Nov 2 2007, 08:20
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Nov 3 2007, 11:16
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|