|
|
  |
Кросс-компиляторный шаблон (EC++, IAR, GCC), Попытка правильного проектирования сверху |
|
|
|
Jul 21 2011, 11:23
|

Участник

Группа: Участник
Сообщений: 31
Регистрация: 5-04-06
Из: Екатеринбург
Пользователь №: 15 809

|
Читать и писать не успеваю. Закоммитил новый "слепок". Доделал я очереди как хотел и походу они работают. Точнее как бы одна очередь. На картинке ниже показан вид экрана в Протеусе для Ревизии 14. Нашёл и исправил досадные баги, из-за которых схема не моделировалась. Ну суть. Правда я беру отладочный образ из IAR, т.к. elf почему-то не хочет работать. Думаю, про большую вложенность функций... пока не знаю точно, поэтому компильте в IARе. (avg-gcc тоже компилится). Итак. Небольшие пояснения. Прежде чем добраться до MODBUS'а мне нужно было сделать проект "лампочки-кнопочки", чтобы была некая интерактивность и было видно, что что-то работает. Кнопочки я ещё не забацал, а вот "лампочки" вроде пашут. Работает это так: Представьте, что тут внутри винда в миниатюре. Есть один поток - WinMain(). Есть одно окно (их может быть много). Есть очередь сообщений как в Windows. Вся обработка событий идёт в функции окна в файле Menu.cpp. Я сделал несколько событий: SW_SHOW, WM_PAINT, WM_TIMER. Они почти как настоящие, но не совсем. Структура та же и поля те же. При запуске контроллера я посылаю в очередь сообщения SW_SHOW и WM_PAINT - окно их отрисовывает, как видно на картинке. При старте контроллера также запускается Таймер 0 на переполнение. Счётчик каждый раз выставляется на 1 мсек. В модуле MCU.cpp я размножаю событие от этого таймера на 4 события: 100мсек, 500 мсек, 1 сек и 5 сек. При этом "рассыльным" служит EI7. Я конфигурирую внешенее прерывание на срабатывание по фронту и программно его эмулирую. Обработчик прерывания проверяет "входящую почту" (это глобальные переменные MSG) и запихивает не пустые в очередь. Дальше всё также - окно получает и отрабатывает. На картинке видно, что отработали три таймера и через некоторое время отработает 5 сек таймер. Очередь более менее настроена. Можно приступать к клаве и работе с эмулируемыми COM-портами для взаимодействия модели с реальным миром.
Цитата По поводу OPC и COM/DCOM в частности, те, кто использовал эти технологии 10 лет назад сейчас активно от них избавляются в пользу веб служб. У DCOM очень большие проблемы обеспечения безопасности в распределённых сетях - админы с него волками воют. COM/DCOM, которые лежат в основе OPC слишком сложные и "замшелые" технологии. То для чего Вы хотите использовать MODBUS + OPC + Android сейчас обычно делается так: Промышленное устройство, которым нам надо управлять удалённо, имеет какой либо стандартный сетевой интерфейс (Ethernet, Wi-fi или еще что-нибудь) и подключено к корпоративной сети. На нём работает веб-служба (не путать в веб пользовательским итерфейсом), позволяющая управлять устройством. Далее, имеется большой и масштабируемый веб-сервер, который знает все устройства в сети и умеет с ними работать. Он предоставляет веб пользовательским итерфейс (WEB-UI), которым работают пользователи. Клиент такой системы может быть на любой платформе - главное, чтоб был браузер, а что это будет не важно - ПК, Android, iPhone, что угодно. Действительно, может быть так оно где-то сейчас и делается. Я не так давно (пару лет назад) работал автоматчиком в прокатном цехе на недавно построенном заводе по выпуску проволоки-катанки. Там прокатный стан в две линии. Да, контроллеры (сименс) имеют выход в промышленную сеть по Ethernet. Только контролируем мы их не WEB-интерфейсом, конечно, а спец ПО - Step7. Операторы на ПК используют также спец ПО - проекты на WinCC и Intouch. Никаких там масштабируемых веб-сервреров и прочих "служб". Чем их меньше - тем лучше. Если процессы быстро-протекающие - в районе нескольких мсек, то фиг их ты заметишь (зарегишь) такими интерфейсами. Все регистраторы работают напрямую по Profibus и т.д. Мой пример вполне может пойти под домашнюю (малую) автоматизацию, т.е. коттеджа, квартиры, где можно будет с такими блоками по 485 через modbus управлять. Развел сетку, поставил контроллеры. Они снимают инфу и передают тебе на комп. А комп уже раздаёт её по OPC. Можно, конечно, что-нить помудрёней придумать, но в качестве примера для домашней разработке и применению - самое то. Можно применить все свои более мелкие проекты типа считывания температуры и управления чем-то в этом проекте. Собрать всё воедино и управлять дома: освещением, вентиляцией... ещё чем-то. Промышленные решения стоят куда дороже, а IDE для разработки под эти решения я вообще молчу.
--------------------
Россия навсегда!
|
|
|
|
|
Jul 22 2011, 06:40
|

Участник

Группа: Участник
Сообщений: 31
Регистрация: 5-04-06
Из: Екатеринбург
Пользователь №: 15 809

|
Ревизия 15. Совместная работа индикатора и клавиатуры. Изменения: В схеме подключена клавиатура (в смысле код обработки написан дополнительно к "железу"). Добавлены сообщения: WM_ACTIVATE, WM_KEYDOWN, WM_KEYUP. Добавлены 10 окон. Код, естессно, доработан: старые ошибки убраны, новые добавлены. Я переход по нажатию делаю. При этом окну посылается сообщение WM_ACTIVATE (см. MSDN). По отпусанию что-то не так работает, хотя событие вроде окну приходит. Надо будет доделать.
Приложил отладочный файл для симуляции:
iccout_ubrof8.zip ( 28.47 килобайт )
Кол-во скачиваний: 81
--------------------
Россия навсегда!
|
|
|
|
|
Jul 22 2011, 13:06
|

Участник

Группа: Участник
Сообщений: 31
Регистрация: 5-04-06
Из: Екатеринбург
Пользователь №: 15 809

|
Оказывается китайцы уже давно (года 4, не меньше) ваяют по такой технологии. Нашёл на просторах инета makefile, который я хотел себе тоже сделать. Ссылка: makefile.old.iarЖаль, я пока не владею этой скриптовой технологией, чтобы переписать этот шаблон под себя. Оказывается, переключение компилятора в Defines.h нафик не нужно. Просто в настройках конфигурации прописываешь нужные директивы и препроцессор подсвечивается как надо (неактивный) в зависимости от выбранной конфигурации (это я про VS2008). Компилить стало гораздо проще, Alt+TAB и F7 и там и там и готово. Надо будет makefile переделать под себя и вообще в среду IAR'а не лезть, кроме как посимулировать чего. Отстал я от жизни... на много. Кстати, по поводу Enterprise Architect. Дело в том, что EA помечает каждый свой сформированный заголовочник индивидуальным GUID'ом, что мне стало интересно. Можно с его помощью организовать уникальную базу данных шаблонного кода, где GUID будет ключом к конкретному исходнику. Т.о., если нужно среди коллег обмениваться инфой по каким-то исходникам, то можно было бы отсылать человека к базе данных исходников (шаблонов) с указанием GUID конкретного заголовочника. Самые популярные решения могли бы висеть в топе такой базы данных и т.о. все бы видели примеры интересных и полезных решений. Пометка GUID'ом выглядит так: Код /////////////////////////////////////////////////////////// // LCD.h // Implementation of the Class CLCD // Created on: 16-июл-2011 6:53:35 // Original author: Слава ///////////////////////////////////////////////////////////
#if !defined(EA_1284B123_896C_4fe7_BEC6_A67623960ADF__INCLUDED_) #define EA_1284B123_896C_4fe7_BEC6_A67623960ADF__INCLUDED_
...
#endif // !defined(EA_1284B123_896C_4fe7_BEC6_A67623960ADF__INCLUDED_) Теперь этот класс прочно закреплён за мной. Я могу развивать его дальше, оставляя этот GUID. Было бы ещё не плохо вставлять автоматически версию.
--------------------
Россия навсегда!
|
|
|
|
|
Jul 22 2011, 15:02
|

Участник

Группа: Участник
Сообщений: 31
Регистрация: 5-04-06
Из: Екатеринбург
Пользователь №: 15 809

|
Ревизия 16. Подключена внешняя SRAM на 32К. До этой ревизии всё делалось на ОЗУ, которая есть на борту кристалла. В принципе для этого проекта ATmega128 хватит выше крыши и больше. Но для порядку почему бы не подключить и внешнюю SRAM? Пусть будет. В коде появилась её инициализация. К сожалению, пока только для IAR'а, т.к. я к своему стыду пока не знаю как сделать то же для gcc. В проекте 10-е окно (клавиша 0) теперь тестирует все 32К байт внешней SRAM, что видно по миганию лампочек в Протеусе. Отладочный файл для Протеуса:
iccout_ubrof8.zip ( 29.51 килобайт )
Кол-во скачиваний: 91
--------------------
Россия навсегда!
|
|
|
|
|
Jul 22 2011, 23:09
|

Участник

Группа: Участник
Сообщений: 31
Регистрация: 5-04-06
Из: Екатеринбург
Пользователь №: 15 809

|
Я сначала не обратил внимания, а оказывается, найденный мной сайт является китайским поисковым движком исходников, литературы и пр. для эмбеддеров. Ещё раз приведу его адрес: http://www.hackchina.comБлин, они буквально воспроизвели мои мысли в прошлом посте. Там можно вбивать строку поиска прямо в броузере, к примеру: Код http://www.hackchina.com/?lang=en&q=modbus или Код http://www.hackchina.com/index.php?lang=en&q=uCOS и вылазит куча найденных доков по теме. Самое интересное посмотреть, чем интересуются китайские товарищи нынче. Последние поисковые запросы в виде тегов размещены ниже на страничке, т.о. что часто ищется - всегда на виду. Давно уже хотел изучать китайский вместо англиского. Видимо пора начинать.
--------------------
Россия навсегда!
|
|
|
|
|
Jul 23 2011, 07:50
|

Участник

Группа: Участник
Сообщений: 31
Регистрация: 5-04-06
Из: Екатеринбург
Пользователь №: 15 809

|
Итак, я исправил проект и вернул его в более менее заданное русло. Ошибки были просто тупыми (в GNUC варианте размещал массивы во флеш, а читал как из ОЗУ за что и был наказан). Ревизия 17. Я попробовал использовать указанную тут мне шаблонную технологию. Она работает, но не совсем так как я бы хотел. Пришлось ввести одно специальное макро, чтобы проще было всем этим делом пользоваться. Вот такое макро для GNUC: Код #define FLASHSTR_DECLARE( type, name, init ) \ PROGMEM type _##name[] = init; \ FlashPtr<type> name(_##name); Теперь я задаю вид окошек так: Код FLASHSTR_DECLARE( char, Line1, "+------------------+" ); FLASHSTR_DECLARE( char, Line2, " Версия: 0.0.0.50 " ); FLASHSTR_DECLARE( char, Line3, " Автор: уни " ); FLASHSTR_DECLARE( char, Line4, "+------------------+" ); Но пришлось сделать два метода в заголовочнике CLCD.h: Код #ifdef __GNUC__ static void WriteLine(uint8_t Line, FlashPtr<char> pString); static void WriteLine(uint8_t Line, char * pString); #elif defined( __ICCAVR__ ) static void WriteLine(uint8_t Line, char __flash * pString); static void WriteLine(uint8_t Line, char * pString); #endif И это мне не нравится. Зато всё компилируется и пашет в обоих вариантах, что не состовляет труда проверить, ибо теперь я предлагаю два файла: 1)
iccout_ubrof8.zip ( 29.57 килобайт )
Кол-во скачиваний: 88 (iccout_ubrof8.d90) 2)
gccout.zip ( 23.43 килобайт )
Кол-во скачиваний: 85 (gccout.elf) Можете поиграться. Вот только с тестом памяти я что-то намудрил. Хоть вроде бы от и проходит, на шине есть изменения, но вот если оторвать пару выводов, то всё завершается успешно всё равно. Где-то я ошибся в логике построения теста.
--------------------
Россия навсегда!
|
|
|
|
|
Jul 23 2011, 11:22
|

Участник

Группа: Участник
Сообщений: 31
Регистрация: 5-04-06
Из: Екатеринбург
Пользователь №: 15 809

|
Ревизия 18. Добавил в шаблон ( SmartPtr.h) от neiver дополнительный оператор: Код inline const T operator []( int value ) { return * Self( _address + value );
} Также пришлось ввести ещё один тип: Для AVR GCC: Код #define FLASHSTR_PTR FlashPtr<char> и для IAR: Код #define FLASHSTR_PTR char __flash * Вот теперь я доволен. Все настройки опять спрятаны в Defines.h. "Типизированные" указатели neiver позволяют делать перегрузку: отдельно для ОЗУ и флеш. А вот про EEPROM я забыл, буду думать как расширить. Всё компилится, можно ехать дальше. Ах да, поскольку я не спец и вообще не шарю в шаблонах, то хотелось бы услышать от товарищей насколько я правильно записал то, что хотел. Телепатия приветствуется. Использование этих конструкций см. в LCD.cpp и LCD.h. Не забываем, что это всё должно одинаково хорошо компилиться в обоих компиляторах.
Сообщение отредактировал uni - Jul 24 2011, 01:42
--------------------
Россия навсегда!
|
|
|
|
|
Jul 24 2011, 15:33
|

Участник

Группа: Участник
Сообщений: 31
Регистрация: 5-04-06
Из: Екатеринбург
Пользователь №: 15 809

|
Ревизия 20. Версия: 0.0.0.74 Добавлена поддержка автоматического изменения версии программы (класс CVersion и скрипты). Давно мечтал о такой фиче, но всё никак руки не доходили. Сделано по мотивам вот этой статьи: IAR EW ARM: автоматическая генерация версии прошивкиПрям скажу, что я написал всё с нуля как всегда. Формат x.x.x.x мне как-то роднее. Как это работает. Нда... Короче, WSH + пре и пост билды, если в двух словах. Для VS2008: Шаг 1. При запуске компиляции отрабатывает команда в Makefile: Код genver: @echo Generating Version.cpp file ... cscript //NoLogo versionfile-gen.js Version version.txt где: Version - это имя для формируемого Version.cpp файла, там будет храниться инфа о версии для проекта, а файл version.txt хранит данные о версии: Код 0 0 0 75 Шаг 2. Скриптом генерится (перезаписывается) файл Version.cpp. Вот он какой: Код /////////////////////////////////////////////////////////// // Version.cpp // Implementation of the Class CVersion // Created on: 24 июля 2011 г. 20:41:08 // Original author: Мезенцев В. Н. ///////////////////////////////////////////////////////////
#include "Version.h"
uint8_t CVersion::Major = 0; uint8_t CVersion::Minor = 0; uint16_t CVersion::Revision = 0; uint16_t CVersion::Build = 74;
uint8_t CVersion::GetMajor(){
return Major;
}
uint8_t CVersion::GetMinor(){
return Minor;
}
uint16_t CVersion::GetBuild(){
return Build; }
uint16_t CVersion::GetRevision(){
return Revision; } Причём дата генерации будет указана свежая  Шаг 3. Компилируется всё это дело. Шаг 4. Если процесс не прервался от досадной ошибки, то выполяется следующая строка Makefile: Код updver: @echo Updating version ... cscript //NoLogo versionfile-update.js version.txt Тут второй скрипт меняет версию. Скрипты: versionfile-gen.js и versionfile-update.js. В коде происходит сборка строки версии следующим образом: Код // Вычисление строки с версией программы utoa( CVersion::GetMajor(), buffer, 10 ); strcat( Version, buffer ); strcat( Version, "." );
utoa( CVersion::GetMinor(), buffer, 10 ); strcat( Version, buffer ); strcat( Version, "." );
utoa( CVersion::GetRevision(), buffer, 10 ); strcat( Version, buffer ); strcat( Version, "." );
utoa( CVersion::GetBuild(), buffer, 10 ); strcat( Version, buffer ); Увы, это не работает в IAR. Пока не придумал как заметить utoa() (sprintf() что-то не пашет). В остальном, меня это решение очень даже устраивает. На индикаторе теперь выводится истинная версия. После каждого успешного билда счётчик накручивается. Нда... похоже придётся весь проект переписывать. После краткого ознакомления с этим ресурсом: KonstantinChizhov / AvrProjects стало как-то уныло от своего стиля кодинга  .
--------------------
Россия навсегда!
|
|
|
|
|
Jul 25 2011, 03:11
|

Участник

Группа: Участник
Сообщений: 31
Регистрация: 5-04-06
Из: Екатеринбург
Пользователь №: 15 809

|
Вот чего я не видел на многочисленных сайтах, так это Обработка Ошибок (Исключительных ситуаций на МК). Я знаю несколько таких технологий, но применяться они должны во всём проекте единообразно.
Есть одна очень интересная и подробная статья на эту тему, которая мне очень понравилась. Сам я потому и выбрал структуру кода интерфейса в виде сообщений как в Windows, т.к. их HRESULT - это практическо то, что можно было бы применить в МК. Можно разбить всю структуру проекта на модули и сделать соглашения о структуре HRESULT и её использовании.
Вот статья: "ftp://82.193.156.30/Документация/Обработка%20ошибок/" .
Мне хотелось бы организовать в коде понятную логику обработки ошибок. Если их посылать некуда, то они уходили бы в null, если не критические, а если критические, то что-то бы делали. Короче давно хотел разобраться в этом вопросе именно для контроллеров. Как управлять ошибками во время отладки? Что будет в релизе и т.д. Как вести журнал, если есть такая возможность и пр.
Сообщение отредактировал uni - Jul 25 2011, 05:07
--------------------
Россия навсегда!
|
|
|
|
|
Nov 23 2012, 13:06
|

Участник

Группа: Участник
Сообщений: 31
Регистрация: 5-04-06
Из: Екатеринбург
Пользователь №: 15 809

|
Ссылка на svn репозиторий: Шаблоны: https://mysvn.ru/avr/templates/Примеры: https://mysvn.ru/avr/examples/Экспортировать из репозитория к себе можно при помощи плагина к проводнику: TortoiseSVN. Шаблоны для микроконтроллеров: ATmega48, ATmega16, ATmega32, ATmega128. Особенности шаблонов: 1. Проекты шаблонов собраны таким образом, что компилируются в двух C++ компиляторах: avr-gcc и iar. 2. Каждый шаблон имеет класс CMCU, который является программной моделью микроконтроллера ATmega. 3. Обработка событий (прерываний) осуществляется через соответствующие методы класса CMCU, которые имеют соответствующие названия. 4. Код максимально самодокументирован, вплоть до отдельных настроечных битов конфигурационных регистров. 5. В каждый проект шаблона включён заголовочный файл с классом CVersion. Этот класс создаётся автоматически перед каждой компиляции проекта (и в iar, и в gcc). Его назначение - автоматически отслеживать номер версии прошивки в стиле: Major.Minor.Revision.Build, где первое число изменяется от 0 до 9, второе от 0 до 99, а последние два от 0 до 9999. Также в классе есть метод, возвращающий дату билда в виде строки. Строка находится во флеш. 6. Первоначально проекты шаблонов настроены для работы с WinAVR-20100110 и IAR 6.10. 7. Каждый шаблон имеет возможность однообразного описания декларации переменных и одномерных массивов, которые должны находится во флеш. При использовании специального C++ шаблона умного указателя (SmartPtr.h) можно забыть про функции типа pgm_read_byte() и eeprom_read_byte(). С++ компилятор автоматически вызовет эти функции для чтения данных из флеш или eeprom. 8. Для тех, кто умеет пользоваться VS2008, в каждой папке есть GCC проект для этой IDE, в котором можно работать над проектом. Сборка идёт через Makefile. Назначение: 1. Переход на объектный C. 2. Небольшие проекты без сильных требований к быстродействию, т.е. там где не нужны в большом количестве ассемблерные вставки. Их можно подключать и в шаблонах, но только в качестве исключения. 3. Для тех, кому нравится ООП или хочет писать с использованием ООП на AVR. Ограничения и недостатки: 1. При использовании двумерных массивов, которые должны находится во флеш, теряется кросс-компиляция. 2. Шаблоны пока ещё не готовы на 100%, в них могут быть неточности в плане описания регистров или битов. Нужно быть внимательными. Пример 1. Проект на основе шаблона ATmega16: freemodbus. Код AVR Memory Usage ---------------- Device: atmega16 Program: 6398 bytes (39.1% Full) (.text + .data + .bootloader) Data: 421 bytes (41.1% Full) (.data + .bss + .noinit) -------- end --------
IAR Universal Linker V5.2.3.14 Copyright 1987-2011 IAR Systems AB. 5 778 bytes of CODE memory (+ 32 range fill ) 484 bytes of DATA memory (+ 25 absolute ) Настройки адреса и регистров находятся в файле Configuration.h: Код #define REG_INPUT_START 1000 #define REG_INPUT_NREGS 4 В проекте определены 4 регистра: Код /** * Главный (основной) поток программы */ HRESULT CMCU::MainThreadProcedure(){
const UCHAR ucSlaveID[] = { 0xAA, 0xBB, 0xCC }; eMBErrorCode eStatus;
eStatus = eMBInit( ::MB_RTU, 0x0A, 0, 9600, ::MB_PAR_NONE );
eStatus = eMBSetSlaveID( 0x34, TRUE, ucSlaveID, 3 );
__enable_interrupt();
// Enable the Modbus Protocol Stack eStatus = eMBEnable();
do {
( void ) eMBPoll();
// Here we simply count the number of poll cycles usRegInputBuf[0] = Value1; usRegInputBuf[1] = Value2; usRegInputBuf[2] = ( USHORT ) CVersion::GetRevision(); usRegInputBuf[3] = ( USHORT ) CVersion::GetBuild();
} while ( true );
// Все проверки прошли успешно, объект в рабочем состоянии return NO_ERROR;
} Value1 изменяется с частотой 1 секунда, а Value2 - 5 секунд.
Пример 2. Проект на основе шаблона ATmega16: uSD с модулем Petit FAT File System. Код AVR Memory Usage ---------------- Device: atmega16 Program: 10238 bytes (62.5% Full) (.text + .data + .bootloader) Data: 461 bytes (45.0% Full) (.data + .bss + .noinit) -------- end --------
IAR Universal Linker V5.2.3.14 Copyright 1987-2011 IAR Systems AB. 8 740 bytes of CODE memory (+ 36 range fill ) 585 bytes of DATA memory (+ 16 absolute ) Размер кода можно изменять включая и выключая части драйвера Petit FS. Подключение флешки к ATmega16: Код // Definitions for MMC/SDC connection #define SD_DI 5 // MOSI #define SD_DO 6 // MISO #define SD_CLK 7 // CLK #define SD_CS 4 // SS #define SD_INS 0 // CD #define SD_WP 1 // WP
Пример 3. Пример проекта на основе шаблона ATmega16: MicroVGA conio/user interface library. Код AVR Memory Usage ---------------- Device: atmega16 Program: 13874 bytes (84.7% Full) (.text + .data + .bootloader) Data: 523 bytes (51.1% Full) (.data + .bss + .noinit) -------- end --------
IAR Universal Linker V5.2.3.14 Copyright 1987-2011 IAR Systems AB. 12 839 bytes of CODE memory (+ 36 range fill ) 625 bytes of DATA memory (+ 19 absolute )
Сообщение отредактировал uni - Nov 23 2012, 13:14
--------------------
Россия навсегда!
|
|
|
|
|
Nov 23 2012, 13:26
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(uni @ Jul 20 2011, 19:41)  форматы обозначения у VS2008 и gcc компиляторов отличаются (это можно полечить, но нужно знать как) Как-то вот так (ближе к концу приведен скрипт для sed) Результат - щелкаем по сообщению, перескакивает на строку в окошке вывода компилятора и в исходниках тоже. За системный подход - респект! Было дело, тоже хотел что-то подобное, во время переползания с иара на гцц, но потом светлая сторона силы возобладала и потребность исчезла. Вместе с иаром.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Nov 23 2012, 14:14
|

Участник

Группа: Участник
Сообщений: 31
Регистрация: 5-04-06
Из: Екатеринбург
Пользователь №: 15 809

|
MrYuran, это просто клад, как же меня заколебало Gtrl + g делать по номерам строк. Я сам пробовал этот потоковый фильтр, но опыта не хватило довести это дело до ума. Наконец-то, я могу спокойно прыгать по исходникам. Спасибо!
--------------------
Россия навсегда!
|
|
|
|
|
Nov 23 2012, 14:46
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(uni @ Nov 23 2012, 18:14)  Спасибо!  Да не за что.. меня вот на студию пересаживают насильственно, так после православных эклипсов/кодеблоксов хочется ругаться матом, причем вслух. Простейшая фича - автодополнение вводимых идентификаторов после 3-4 символов - фигвам! Я уж не говорю об элементарнейшем - автоматически парные скобки вставлять.. Может, подскажете, как это настроить, раз апологет студии.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Nov 23 2012, 14:54
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(MrYuran @ Nov 23 2012, 16:46)  Простейшая фича - автодополнение вводимых идентификаторов после 3-4 символов - фигвам! Я уж не говорю об элементарнейшем - автоматически парные скобки вставлять.. Вроде всё с этим нормально в студии...если не хватает функционала попробуйте Visual Assist X поставить. Цитата(MrYuran @ Nov 23 2012, 16:46)  Да не за что.. меня вот на студию пересаживают насильственно, так после православных эклипсов/кодеблоксов хочется ругаться матом, причем вслух. Такие же впечатления после перехода на eclipse: одного нет, другого нет, акронимов не понимает.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|