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

lamerok

Свой
  • Постов

    130
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные lamerok


  1. В чем то подходит HART протокол, но он только для совсем простых устройств, которые выдают на гора лишь 1 или 2 параметра.

     

    33 команда HART протокола до 250 динамических праметров можете прочитать...

    правда долго :)

  2. Может понадобится климатическая камера тепло-холод-влага для испытания прибора. Нужно испытать ящик размером 4,4Вx48Шx48Г. Кто, с чем имел дело? Что посоветуйте?

    Имел дело с камерами WT120, WT11, Espec и Sigma

     

    Weiss WT(1..2 градуса/мин) самые неприхотливые, с GPIB и RS232, Espec тоже нормальная, но медленная и только c GPIB.

    Sigma - Хрень еще та, но быстрая 5 град/мин.

     

    Рекомендую WT. http://www.wut.com/en/schunk01.c.11575.de/...productsarticle

  3. Поскольку явно произошло выделение Ебурга в отдельный город, где

    есть желающие провести локальный съездик, предлагаю создать отдельную тему и там

    отметиться для начала всем жедающим, и каждому определить предпочтение в датах-времени.

    Тему сейчас создам по соседству.

     

    Что-то мало народу....В Ебург... получилось 3 чела?

  4. Доброго времени суток. Проблема в следующем: при отладке программы ИАР ругается на переполнение стека: (The stack 'Stack' is filled to 100% (80 bytes used out of 80). The warning threshold is set to 90%)

     

    Используемый процессор - MSP430FG4618, версия ИАРА 3.42А. Если в окне register смотреть указатель стека, то он находится в пределах нормы (1100-30FF). Где косяк может быть?

     

    Это сообщение показывается, когда за время работы ИАР обнаружил что указатель стека ВЫВАЛИВАЛСЯ за пределы..Т.е. В тот момент когда вы смотрите указатель может быть в пределах нормы, а до этого момента он когда-то был вне предела.

    Увеличьте стек. Предупреждение можно поставить и на меньшее количество, например на 90% или 80 % размера стека.

  5. Готов поучаствовать. Насчет кафе тоже без разницы. Давайте сразу определимся, что хочется:

    1) просто посидеть, кофе, пироженые и т.д.

    2) поесть, например, салат, второе и т.д.

    3) то же что 2, но с алкоголем

    4) что-нибудь другое (не могу придумать)

    Также надо определиться: в помещении или на открытом воздухе. Кстати температура на 8 июня не очень теплая - это я для справки :)

     

     

    Выбираю третье...

    О! Нас уже трое!

    Насчет кафе, мне по-барабану, лишь бы музыка сильно громко не играла, а то вас не слышно будет.. Еще похоже погода будет не очень.... предварительно прогноз посмотрел. ИМХО, Так что лучше внутри здания..

    Кафе выбирете пожалуйста... если на этой неделе договримся,... то хорошо, если нет, то по опыту не собиремся никогда :)

  6. После кучи экспериментов пришел к выводу:

    1. Можно получить код с подстановкой непосредственно числа

    2. Но трудно так как:

    а) Обращение к static const члену должно быть в одном *.cpp файле

    б) Зависит от кода.... Т.е., например, я обращаюсь к static const члену в конструкторе, в теле конструктора, перед обращение, куча условий. Если эти условия заремить или часть из них, или изменить порядок, то компилятор подставляет число, иначе Подставляется адрес static const члена.

    в) Если обращаться к static const члену в двух и более *.cpp файлах, то в том файле в котором прошла инициализация члена идет подстановка числа в зависимоти от пункта б), в других тупое чтение с адреса члена.

    3. Компилятор всегда располагает static const член в одном из сегментов памяти, либо NEAR_I, либо NEAR_C в зависимости от настроек компилятора.

    4. Линкер, если не видит, что компилятор где то еще(кроме как в объявлении) использует ссылку на этот член, не резервируте под него память.

    5. Если NEAR_C находится в сегменте CODE, то компилятор об этом не знает и читает с ОЗУ (как была сказано Сергеем)

    6 Так лучше не делать :) Можно тупо воспользоваться #define, либо как было сказано, использовать __flash (но тогда будет команда чтения из флеша).

    Спасибо всем за помощь.

    Да все это касательно floating point.

  7. Конечно здорово, что Rational Software Architect проблему с мерджем решает, но ведь не бесплатная :) . Понятно, что можно warez использовать, но это дело такое... не надёжное... Скажите, а какова цена?

     

    Цена 3999 зеленых за локальную лицензию, и около 10000 за сетевую...

     

    А вот если привязать UML-project к Java-project, то после, например, переименования классов в Java-project, диаграммы UML безвозвратно разваливаются :(

     

    На сколько я понял из знакомнства с Rational Software Architect - Java Там поддерживается не плохо, но я не специалист в Java, поэтому со 100% увереностью сказать не могу...

    Вы можете скачать триальную версию с сайта IBM - Это примерно 4 Гига :) Кстати сделана она на движке Eclipse

    Про разваливаются, вы совершенно правы, поэтому мы стараемся:

    1. Для каждого проекта стандарт названия классов, методов, атрибутов, стандарт кодирования.

    2. После каждого чиха (например, часть архитектуры, класс или несколько классов) устраиваем ревью, все программеры просматривют архитектуру персонально, делают замечания. Автор собирает все замечания, потом уже командой по каждому замечанию проходимся... и в итоге в 95% случаев, проблем с поздним переименовыванием уже нет. Есть небольшие проблемы с доработкой.

    В основном вначале правиться UML, потом уже код.

    3. Соответственно, также просматривается код (все в команде просматривют код другого программериста) на соответствие стандрату кодирования, UML диаграмме и спецификации функции.

  8. Заранее извиняюсь перед теми кто скажет что тема не в этот раздел, но так как сам работаю с ARMами то и решил разместить здесь. Кто какие системы контроля версий использует, или не использует?.. Сам дела с ними не имел, но чувствую что вот-вот жизнь заставит :) Еще хотелось бы узнать, использует ли кто встроенный в IAR интерфейс к CVS и как это выглядит в работе.

    Выглядит это примерно так:

    post-88-1179724195_thumb.jpg

  9. А теперь вспомните, в каком порядке происходит построение программы: сначала компилятор компилирует файл, и для обращения ко всем переменным без квалификатора __flash использует команды доступа в ОЗУ (LD, LDS, ST, STS). Именно квалификатором __flash вы указываете ему, что переменная( :) ) будет лежать во флеш и ее нужно читать через LPM.

     

    Проверил на 4.21А - Правда ваша.

    На 4.12А, о чудо - работает так как я хочу... т.е. подставка числа, не резервирует память под static const член класса. В map файле ни слова про них (initialVoltValueRange и т.д.).

  10. Правильно понимаю, что для диаграмм UML используйте Rational Rose? Может кто искал оптимальный редактор для UML? Что посоветуйте? Сам для прикладного ПО использую Java, среда от Sun: NetBeans 5.5. Она поддерживает UML, но модуль UML только beta версия, глючный.

     

    не забудьте поделиться впечатлением.

    В данный момент используем MS Visio... но есть одна проблема с мерджем Visio файла в ClearCase (получается что править диаграмму в один момент времени может только один человек), попробывали Rational Software Architect, так как продукты ClearCase и Rational Software Architect от одной конторы (IBM Rational Rose), то таких проблем там нет и можно одновременно работать над одним документом.

    Пока попробывали триальную версию на 1 месяц. Немного непревычно после Visio, но думаю привыкнуть можно...

    Есть еще Visual UML, говорят неплохая штука.

     

    Дело в том, что из-за особенностей встроенного С++, не всегда можно из UML диаграммы сделать заготовку класса (для использования). Поэтому вначале разрабатывается архитектура, затем детальная архитектура (Все классы, все функции, статические диаграммы, диаграммы взаимодействия, описываются все функции), а затем по ним пишется код, Для этой задачи Visio подходит очень хорошо..

    Повторюсь проблема только с мерджем...

  11. Используем Для контроля версий и совместной разработки Rational ClearCase (UCM) для отслеживания багов (bag tracking) ClearQuest.

    Документация на UML. Планируем на Ration Software Architect перейти. Используем только C++

    Это для встроенного ПО (AVR, PIC, MSP430).

     

    ДЛя верхнего ПО клинеты- MS Visual Studio Team Suite SW Architect 2005, MS Visual Studio Team Suite Developer 2005, MS Visual Studio Team Suite Tester 2005,

    Сервер MS Visual Studio Team Suite.

  12. Вот есть еще такой вариант (для ИАРа в остальных средах я не работал):

     

    1. Слинковать библиотеку типа rtos.d90.

    2. Подключить её к проекту

    3. Сделать класс сRTOS - C++ обертку библиотеки. И использовать его во всех своих С++ проектах.

  13. А что, от заполнения свободного места прошивки нулями вместо 0xFFFF ее размер сильно сохранится?

    Чвободное место заполняю нулями для

    1. Как вы и сказали, чтобы и ИАР и я 0 принимали за 0....

    2. Косвенная проверка что вся флеш не битая....

     

    Ну и контрольная сумма проверяется постоянно в Идле задаче, поэтому, время при загрузке не отнимает... т.е. проверяется вся память FLASH все время во время работы устройства..

  14. Что ж вы все никак не поймете, что если вы завели в классе нестатический член, то размер класа должен (обязан) увеличиться на размер этого члена (плюс выравнивание), даже если этот член read-only (константный).

    Дак как раз это я почти пойму..... Компилятор (IAR 4.21A)этого не поймет. Побробуйте скомпилить вот это... и проверить размер класса сClassDirector

    // Class.h
    class cClass
    {
         public:
          float getInternalVoltRange(void) const { return internalVoltRange; }
          float getInternalCurRange(void) const { return internalCurRange; }
          float getInternalTest(void) const { return internalTest; }
    
       private:
          float internalVoltRange;
          float internalCurRange;
          float internalTest;
    
    
          const float initialVoltValueRange  = 800.0f;  // Что за вата??? Почему так можно вообще делать???
          const float initialCurValueRange  = 0.40f;   
          const float initialTestValue  = 0.0f;
    };

     

    а потом вот это

    // ClassDirtector.h
    class cClassDirector
    {
       public:
          float getInternalVoltRange(void) const { return internalVoltRange; }
          float getInternalCurRange(void) const { return internalCurRange; }
          float getInternalTest(void) const { return internalTest; }
    
       private:
          float internalVoltRange;
          float internalCurRange;
          float internalTest;
    
    
         static const float initialVoltValueRange;
         static const float initialCurValueRange;   
         static const float initialTestValue;
    };

     

    Размер класса одинаковый в обоих случаях.

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

    Согласен, но только, если статический член - константа не floating point. Что выяснилось сегодня :) (Спасибо IgorKossak)

     

    Это гарантирует, что во всех .cpp, в которые вы включите определение этого класса константа будет иметь одно и то же значение. Из этого же следует, что значение этого статического константного члена известно компилятору в момент компиляции каждой единицы компиляции и этот факт дает возможность компилятору (но не обязывает) подставить куда надо значение этого члена не резервируя память. Или же вы только объявляете статический константный член в объявлении класса а определяете и инициализируете его где-то в другом месте (.cpp) и тогда компилятор безусловно выделит под него память, но внутри этого файла с момента когда значение константы ему известно может использовать значение инициализирующей константы не читая перемеенную.

    Хммм... Почти согласен ... проведу еще пару экперементов.... подумаю...

     

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

    Согласен, компилятор просто не позволяет этого сделать. Пишет что он уже проинициализирован.

     

     

    Ещё раз повторяю, NEAR_C расположен не в КОДЕ сегменте, а в DATA сегменте. Как это обычно заявлено в командном файле

    Ну специально задал

    -Z(CODE)NEAR_C=_..X_INTVEC_SIZE-_..X_FLASH_END

    Чтобы все константы сувались в CODE

  15. Еще раз: Если в этом диапазоне будут пустоты, то линкер считает, что там 0. А программа в реал-тайме находит там 0xFF. Сумма не совпадает. Чтобы этого избежать, надо указать линкеру заполнить свободное место константой, а это не всегда приемлемо.Это уже частности. Важно, что считается определенный диапазон, адреса которого фиксированы независимо от размера прошивки. Ибо подсчет (у меня) делает загрузчик, а он понятия не имеет о реальном размере прошивки, он только знает какая область под нее выделена.

    Именно поэтому делаем в *.xcl вот так

     

    // fill empty code space with 0x00
    -H00
    // generate a 2-byte crc16 checksum
    -J2,crc16

  16. NEAR_C это сегмент данных-констант, лежащий как раз там, где ему указано лежать линкером. А это может быть во внешней ПЗУ/ЕЕПРОМ/ФЛЕШ/и как ни странно ОЗУ. Проверьте настройки командного файла линкера.

    Хочу чтобы константы лежали во ФЛЕШЕ. Но компилятор сам расположил в КОДЕ сегменте(ФЛЕШЕ), а читает из ОЗУ.. непорядок...

    Согласен, я могу добиться, чтобы все было во флеше, поставив keyword __flash. Перед объявлением константных членов класса. И компилятор верно прочитает из ФЛЕШ. Код приводить не буду.. но читает из флеш по адресу статических констант членов класса.

     

    Могу добится чтобы они были в ОЗУ. Просто убрал в настройках компилятора --string_literals_in_flash и компилятор верно расположил все в ОЗУ и прочитал из ОЗУ.

    Но не пойму что мешает компилятору заменить все на просто число..???.Зачем нужно выделять под static const память, не важно где(в ОЗУ или флеше)...Для каких целей???

    Ведь он позволяет сделать это для nonstatic constant (подставить число). (Что запрещено стандартом (проинициализировать их в декларации класса))

     

    В любом случае доступ к ней как к памяти данных, а не программы, потому и через Z.

    В выделенном Вами разделе речь идёт об интегральных (т. е. целых) и перечислимых типах, но никак не о плавающей точке.

    Это многое объясняет... Все верно... получается флоат нельзя инициализировать в объявление класса.

    Спасибо, в споре рождается истина.

  17. Чтобы не толочь дальше воду в ступе, приведите выдержку из стандарта.

    Явно в стандарте не указано что так делать нельзя... нельзя значит можно...

     

    Такое в С++ делать можно. Раз вы этого не знаете - последуйте своему совету:

    См картинку раздел 4........

     

    Внимание, вопрос: откуда компилятор, компилируя другой .cpp - файл знает, какое значение вы присвоили этому члену?

    Ну опять в разных файлах можно завадать разные значения const float cClass::initialTestValue = 8.0f; в одном скажем и const float cClass::initialTestValue = 10.0f; в другом, если они объявлены статиком

    И... Так как мы в каждом *.cpp файле подключаем один и тот же хидер, то компилятор должен увидеть что initialTestValue это статический член, да еще и константа, и никакой не external - память под него выделяТь не надо!!!!!!.

    post-88-1179303492_thumb.jpg

  18. Вот что получается... в мар файле Мои переменные лежат в коде сегменте

    NEAR_C
      Relative segment, address: CODE 00000406 - 00000411 (0xc bytes), align: 0
      Segment part 9.             Intra module refs:   cClassDirector::cClassDirector()
               ENTRY                   ADDRESS         REF BY
               =====                   =======         ======
               cClassDirector::initialVoltValueRange
                                       0000040A 
               cClassDirector::initialCurValueRange
                                       0000040E 
               cClassDirector::initialTestValue
                                       00000406

     

    а в ассемблере берутся из ОЗУ....

     

    internalVolt = initialUSLValue;
       \   000000D8   ....               LDI     R30, LOW(??initialVoltValueRange)
       \   000000DA   ....               LDI     R31, (??initialVoltValueRange) >> 8
       \   000000DC   8100               LD      R16, Z
       \   000000DE   8111               LDD     R17, Z+1
       \   000000E0   8122               LDD     R18, Z+2
       \   000000E2   8133               LDD     R19, Z+3
       \   000000E4   01FC               MOVW    R31:R30, R25:R24
       \   000000E6   5AE6               SUBI    R30, 166
       \   000000E8   4FFF               SBCI    R31, 255
       \   000000EA   8300               ST      Z, R16
       \   000000EC   8311               STD     Z+1, R17
       \   000000EE   8322               STD     Z+2, R18
       \   000000F0   8333               STD     Z+3, R19

     

    И что это ИАР сделал, то что я ему написал:)

  19. Не должен!!! Потому что значение статического члена должно быть определено только в одном cpp-файле. Не путайте константную переменную и константный член. Это константная переменная может в разных файлалх иметь одинаковое имя и разное значение.

    Почему в одном месте???? Стандарт не воспрещает этого...

    Проверил на других компиляторах, везде один и тот же результат, подстановка конктретного числа.

    Например, на 4.12А лицензионном прокатило...

    Может быть опции у компилятора, какие нибудь нужно поставить???? ЧТобы он воспринимал это как надо???

     

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

     

    Полностью согласен, тогда чего же ИАР мне позволил инициализацию (не статика) сделать не в конструкторе??? И заменл все это числом????

     

     

     

    P.S. Машина - дура (ИАР тоже), это не подвергается сомнению. Но не потому, что не делает то, что вы хотите, а наоборот, потому что вместо этого тупо делает именно то, что вы ему написали. Если то, что вы хотите и то, что вы написали - разные вещи, то при чем здесь ИАР?

     

    Когда я инициализирую константу в хидере класса... не савля статик (Такого делать вообще нельзя) ИАР делает то чтоя задумал сделать со статиком..... ТОгда какого хрена он не делает тоже самое со статиком????

     

    Самое интересное другое... Все это не работает только с флоатом... с интом16, инт8, инт 32 все прекрасно канает на всех компиляторах.

     

    И кстати в любом случае результат действия:

    internalVoltRange = initialVoltValueRange;

    в internalVoltRange должнен стать 800.0f верно???

     

    А в случае когда статик инициализируется в *.cpp

    такого не происхит... так как

  20. Внимание, вопрос: откуда компилятор, компилируя другой .cpp - файл знает, какое значение вы присвоили этому члену?

    Логично, если компилер должен в одном *.cpp файле подставить значение которе определено в том *.сpp, а в другом *.cpp которое в том *.cpp. Так как компилер компилт последовательно все *.cpp файлы.

     

    Кто бы сомневался, один lamerok д'Артаньян :biggrin:

     

    Если ИАР не причем,тогда встречный вопрос. ИАР вот такую конструкцию (опять повторюсь):

    // Class.h
    class cClass
    {
       public:
          float getInternalVoltRange(void) const { return internalVoltRange; }
          float getInternalCurRange(void) const { return internalCurRange; }
          float getInternalTest(void) const { return internalTest; }
    
       private:
          float internalVoltRange;
          float internalCurRange;
          float internalTest;
    
    
          const float initialVoltValueRange  = 800.0f;  // Что за вата??? Почему так можно вообще делать???
          const float initialCurValueRange  = 0.40f;   
          const float initialTestValue  = 0.0f;
    };
    
    
    // Class.cpp
    ...
    //const float cClassDirector::initialVoltValueRange = 800.0f;
    //const float cClassDirector::initialCurValueRange =  0.5f;
    //const float cClassDirector::initialTestValue = 8.0f;
    
    cClass::cClass(void)    
    {
    
        internalVoltRange = initialVoltValueRange;
        internalCurRange = initialCurValueRange;
        internalTest = initialTestValue;
    }

     

    воспринимает как я и задумал, но только почемуто без static

     

    И делает подставку числа:

    internalVoltRange = initialVoltValueRange;
       \   000000C0   E000               LDI     R16, 0  //00h 00h 73h 68h = 800.0f
       \   000000C2   E428               LDI     R18, 72
       \   000000C4   E434               LDI     R19, 68

     

    Класс у меня синглтон. Но что будет делать ИАР, если я сделаю класс не синглтон, а создам потом два экземпляра этого класса.

    ЧТО будет подставлять ИАР вместо атрибута const tF32 initialVoltValueRange?????? ОН не статик и по сути они различаться у разных объектов.

    На сколько я понимаю, ИАР как раз в этом случае должен создавать атрибуты у каждого объекта, которые будут занимать память, т.е. что я получил когда сделал их static ...... . Таким образом ИАР делает все наоборот.

    (Кстати инициализировать, не статические атрибуты можно только в консрукторе, но только не для ИАР!!!) А если они конст (но не статик), то ИАР должен следить за тем, чтобы я их не поменял потом, но уж точно не делать подмену на число.

     

    Кстати к вопросу о ИАР багах... Синглетон у меня сделан макросом только из-за того, что вот такая конструкция компилируется в ИАР 4.21А, но убивает симулятор. А в 4.12А убивает компилятор.

    //singleton.h
    #include <new>    
    
    template <class T>
    class cSingleton
    {
       public:
          _Pragma("inline=forced")
          inline static T* getInstance(void) { return pInstance; }
       protected:
          static void create(void)
          {
             pInstance = new(nothrow) cSingleton();
          }
    
          cSingleton(void);
       private:
          cSingleton(const T& other);
          const T& operator=(const T& other);
          static T* pInstance;
    };
    
    //singleclass.h
    #include "singleton.h"
    
    class cSingleClass : public cSingleton<cSingleClass>
    {
      public:
        static void runTest() {};
      private:
        tF32 test;
    };
    
    //main.cpp
    #include "singleclass.h"
    
    int main()
    {
      cSingleClass::runTest();
      return 0;
    }

     

    Если убрать new, то все хорошо.

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