Просмотр сообщений
Страниц: [1] 2 3 ... 12
1  Общее / Ошибки в QNX 6 / Re: Сборка приложения в Momentics : Октября 24, 2017, 06:33:23 am
А никто не знает, как заставить моментикс в QNX 6.3 без SP3 прекратить анализировать код в редакторе (я так понимаю, именно из-за этого и все тормоза при работе)? Дело в том, что у меня в проекте добавились файлы и их теперь больше трёхсот. А эта IDE сходит с ума. Это проявляется в том, что она перестаёт компилировать, выводить сообщения об ошибках, импортировать новые проекты. Приходится стирать папку workspace - тогда заново начинает работать. Но с тормозами (я так понимаю, она базу анализа кода создаёт что ли?). Вчера два часа всего прожила от инициализации до сбоев.
2  Разработка / Программирование под QNX / Re: Работа через USB с FlirOne Gen 2 : Октября 18, 2017, 06:55:23 pm
Цитировать
До тех пор пока вы планируете использовать это оборудование только совместно со своими программами и игнорировать версионность (развитие программ и оборудования) - до тех пор вы будете правы.

А так оно, обычно, и происходит. Покупая оборудование даже одного производителя (я сейчас говорю о высокоточном и сложном оборудовании с ценой из многих нулей - что в массовом сегменте я не знаю), все модификации работают только со своими компонентами и поставляются как единое целое. Заменять компоненты без доработки производителем нельзя. Часто такое оборудование имеет протоколы обмена для дистанционного управления - там часто даже не заморачиваются с проверкой целостности команд/данных. Как пример, приборы фирмы Agilent (а это классные приборы с  часто удивительными возможностями) - обычный COM-порт и текстовый протокол. Если цифра будет искажена, мы об этом не узнаем. Поэтому тут нюанс в том, что есть "как оно было бы универсально" и то, "как это сделано почти всегда на самом деле с учётом не нужной избыточности".

Цитировать
Вам вряд-ли понадобятся unit-тесты. Подозреваю что этот подход идет в разрез с вашими представлениями о разработке (если вас не беспокоит версионность протокола, и возможность проверки пост и пред -условий).

Нет. Smiley У меня есть версионные протоколы в моих программах. Но не для оборудования, которое мы сами жёстко задаём, а для обмена клиент-серверных приложений между собой, где действительно часты обновления возможностей программ.

Цитировать
Проверяем общий результат - даем оценку о том удачное изменение или нет.

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

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

Дело в том, что после очередного рефакторинга хорошо бы выполнить проверку в автоматическом режиме, что и позволяют Unit-тесты. Smiley А том получается так, что я кардинально перестроил отношения классов и теперь не уверен, что не забыл в каком-либо классе о каком-либо нюансе.
3  Разработка / Программирование под QNX / Re: Работа через USB с FlirOne Gen 2 : Октября 18, 2017, 12:14:47 pm
Цитировать
Ну, с 11-го стандарта у языка все стало проще

Ну, inttype.h уже давно в Си компиляторах типа Keil и IAR лежат. Нет только с плавающей точкой и bool.

Цитировать
Вот с этим не согласен, но в вашем случае вам же решать.

Когда работа идёт с оборудованием, этот протокол чем-то напоминает внутрипрограммный обмен - вы же почти никогда ("почти" - потому что есть случаи, когда передаёте - например, Win32API такое практикует именно по причине разных версий Windows и одних и тех же программ) не передаёте в функцию версию передаваемой структуры/объекта и её размер?

Кстати, спрошу ещё кое-что. Что бывают unit-тесты я давным-давно знаю. Но вот как их делать - без понятия. В статьях, обычно, они как-то как сами собой разумеющиеся идут (моки и стабы там всякие и т.п.). Я, обычно, такими вещами не занимаюсь и делаю всегда интеграционное тестирование (потому что почти 100% ошибки не в конкретных функциях и классах, а в их взаимодействии между собой - скажем, не в том порядке захвачены мюьтексы в разных объектах и произошла взаимоблокировка. Ну или просто не предусмотрена некая ситуация в программе в принципе, а она случилась.). Отсюда вопросы:
1) Unit-тест - это отдельная программа или они встраиваются в основное приложение (что странно, на мой взгляд)?
2) Если это отдельная программа, то делают на каждый тест одну программу или всё тестирует одна программа?
3) Вот есть у меня класс кодирования/декодирования принятых/отправленных данных. Чтобы его протестировать, нужно написать тест, который будет размером в пять таких классов (ведь то же самое кодирование/декодирование потребуется реализовать в программе теста). И нет никакой гарантии, что в тесте не будет ошибки. Да и как, например, убедиться, что все состояния покрыты тестом? Передаваться-то может просто тьма самых различных данных.
4) Ряд вещей вообще непонятно как проверять - например, передачу через сокеты/CAN/USB - там всё завязано на функции ОС и работы с аппаратурой напрямую.
5) Не получится ли тест программы сложнее и объёмнее самой программы раз в 5? По моим прикидкам, так и получится. Smiley
4  Разработка / Программирование под QNX / Re: Работа через USB с FlirOne Gen 2 : Октября 17, 2017, 07:29:17 pm
Цитировать
В том то и дело что НЕ ВСЕГДА.

Это я не верно интерпретировал, что у Подбельского написано. Там написано, что они все inline, но фраза несколько неудачно построена, и я решил что ограничения на обычные inline-функции на эти функции не действуют (за исключением рекурсии, конечно).

Цитировать
Я понимаю что так проще и привычнее. Но до тех пор, когда протокол имеет фиксированную структуру/пакеты, пока нет версионности и пока не окажется что в разных протоколах нужны разные порядки сохранения/чтения данных.

Всё вы верно говорите, но случаи бывают разные. В данном случае такое делать просто нецелесообразно. Протокол после отладки больше не меняется никогда. Он жёстко зашивается в устройство и всё.

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

Нет-нет, я настройки не передаю. Передаётся другое. Просто в этих настройках нужны константы и в другом тоже они же нужны.

Цитировать
Вся гарантия размеров типов в С++ сводится к этому

Отвратительно. Для языка тесно связанного с низкоуровневым программированием (я имею в виду Си) иметь гарантии в стиле "не меньше" просто идиотизм. Жаль. В книжках, вроде как, чётко пишут разрядность чисел, упоминая вот то, что я перечислил. А оказывается, гарантии в стиле "не меньше".

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

Не всегда это нужно. Протоколы работы с оборудованием низкоуровневые и версионности не имеют практически никогда - она бесполезна. Как пример, протокол обмена по USB вот этого вот тепловизора. Всё жёстко задано и для тепловизора следующего поколения протокол другой.
5  Разработка / Программирование под QNX / Re: Работа через USB с FlirOne Gen 2 : Октября 16, 2017, 08:43:02 pm
Цитировать
Кстати вообще нет никакой прямой связи что будет собираться встраиваемо а что нет. Метод может быть и встраиваемым даже если его реализация внутри cpp-модуля (яркий пример лямбды)

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

Цитировать
Но могу предположить, что в упрощенном варианте ваш объект может хранить/ссылаться на разные наборы "констант"

Нет, это, к счастью, не потребуется. Smiley

Цитировать
Проблемы среды разработки - это только проблема среды разработки, а не языка.

Не спорю. Но забавно видеть, когда компилятор падает от написанного. Smiley

Цитировать
Если же вы хотели обеспечить контракт вызова - то следовало вероятно сделать конст-метод. Это когда const в конце объявления метода

Я знаю, как это делается. Smiley А зачем я возвращаю как const? Да просто это больше информация для компилятора  - так, на всякий случай.

Цитировать
Ну вы же в курсе что вектор от вашего массива отличатся будет незначительно. У вектора можно запросить указатель на данные которые будут представлены в точь точь как если бы данные хранились в вашем массиве.

Касаемо вектора - я где-то прочёл, что это не всегда так (я имею в виду, предложенный вами мне когда-то вариант с &vect[0]). В ранних стандартах порядок хранения в контейнерах не регламентирован. Это только сейчас так. Я понятия не имею, что умеет в QNX 6.3 компилятор и стандартные библиотеки.
А в структуре, которая передаётся как поток байтов, вектора внутри быть не должно - требуется ведь передать его содержимое, а не внутреннюю структуру вектора.
Я имею в виду:
Код:
struct SData
{
 unsigned long Size;
 struct SUnit
 {
  unsigned char Data[128];
 }
 vector<SUnit> vector_SUnit;
} sData;

Translate(&sData,sizeof(SData));

Translate(&sData,sizeof(SData)); - будет передан ведь вовсе не SUnit[заданное количество] внутри.

Цитировать
По-тому что, в ++ нет гарантий к размеру всех типов

По-моему, только int и long double могут иметь машинозависимую длину. Char имеет компиляторозависимый знак. Float мог быть произвольный - в старых компиляторах не по стандарту IEEE. Порядок же кодирования big или little-endian может меняться, это да. Остальные стандартные типы заданы жёстко (ну, может, double ещё схож с float). Про допкод не уверен, но, думаю, что он гарантируется.
Вообще, тут уже действует соглашение на протокол обмена по устройствам, где порядок данных описан как little-endian, допкод для переменных. Все устройства у которых это не так должны сами перекодировать данные.
Исключение составили разработчики из ЛОМО - они у нас отличились и вляпали свои числа в... прямом коде. Говорят, вояки всегда с ним работают. Заставить переделать не удалось. Ну и ладно - хоть один урод в списке аппаратуры комплекса непременно должен быть. Smiley

Цитировать
Кроме того - создав отдельный метод сереализации/десереализации - всегда можно контролировать правильный порядок байт (иногда есть большая разница как данные должны хранится оптимально и как передаваться/сохранятся по протоколу)

Это будет редкий *дец. Smiley Структура состояния устройств с подструктурами по типам принятых данных это около 500 строк. Их передача/приём с разложением на байты породит большущий код. Но... зачем?
6  Разработка / Программирование под QNX / Re: Работа через USB с FlirOne Gen 2 : Октября 16, 2017, 06:40:35 pm
Спасибо за ответ. Smiley Я и не сомневался, кто из присутствующих тут напишет. Smiley

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

Просто приятно, когда всё собрано в обном месте - в данном случае, в классе. Я, может быть, потом часть констант из констант переведу в загружаемые из файла параметры. С классом удобно. Почему в заголовочном файле - по двум причинам: и лень было реализацию писать отдельно, и наглядно - все описания рядышком, и всё как встраиваемые функции соберётся.

Цитировать
С таким классом как ваш (который не содержит данные, а обеспечивает доступ к константам через методы) - достаточно в каждом модуле объявить свой объект cConst.

Можно, конечно. Только в чём же будет выгода, всесто extern сделать статический объект для каждого модуля?

Цитировать
И лучше это сделать непосредственно в момент вызова (так как создание объекта по сути ничего не стоит - он пустой).

Вы имеете в виду, использовать как временный объект при получении каждой константы? Конечно, можно и так. Просто, а... зачем?  Shocked

Цитировать
Но опять же, вы из всех путей нашли самый извращенный ))

О, таких путей Си++ предлагает просто множество. Smiley Грех не воспользоваться. А как приятно видеть в IDE Momentics после автоматической замены во всех файлах макроса на такой объект ( с ошибочной заменой в ряде мест - заменяемая фраза оказалась частью большей) "неизвестная ошибка компилятора номер..." и ссылку на сайт для скидывания информации о том, как мне удалось эту ошибку сделать. Grin Я долго не мог понять, а что произошло-то, пока не обнаружил неверную замену.

Цитировать
при этом возвращаете как константный объект, а сам метод не константный

Да просто с вероятностью 100% не буду я никогда этот объект cConst никуда как константный передавать (он глобальный - у меня всё-таки есть пара глобальных объектов на всю программу). Да и вообще, я просто от нечего делать решил небольшой рефакторинг сделать. Ну и так, из интереса, заменить ряд структур на классы, да и макросы на классы тоже. Всё-таки программу три года я не улучшал, и накопились неудачные на текущий момент решения, мешающие её развивать дальше.

Цитировать
Классом который оперирует и вычисляет/возвращает свои значения в рантайме - воспользоватся не получится. Для этого вами придется использовать constexpr методы/значения - они вычисляться на этапе компиляции.

Увы, это достаточно новый оператор и IDE Momentics с её компилятором его вряд знает.

Цитировать
Так вот, возвращая по значению - вы тем самым уже гарантируете что внутренне значение снаружи изменено быть не может. А значит вполне можно было сделать и так:

Ну да, ну да. Можно было, конечно. Я ещё не решил, что мне нравится больше (да, есть фразы комментариев и текст, который просто вызывает какое-то отторжение, а есть наоборот). Smiley

Цитировать
Начните программировать в стиле C++. Все структуры как и классы можно (в большинстве случаев - даже нужно) инициализировать с помощью механизмов конструкторов.

Проблема в том, что SSettings не единственный, кому требуются эти самые константы. Его-то можно так инициализировать и вектор ему поставить. А вот есть структуры протоколов обмена - они целиком по сети пойдут один-в-один. А часть кода вообще кусок на чистом Си - эта часть вставляется потом в микроконтроллер один-в-один. А кстати, надо глянуть, не попадёт ли туда часть констант из этого класса.
7  Разработка / Программирование под QNX / Re: Работа через USB с FlirOne Gen 2 : Октября 13, 2017, 07:41:36 pm
А вот интересно, я сделал отдельный класс для констант CConsts:

Код:
class CConsts
{
 protected:
 public:  
  //конструктор
  CConsts(void) {};
  //деструктор
  ~CConsts() {};
 public:
  //количество точек сигнала оптических датчиков
  const unsigned long GetSignalPointAmount(void) {static const unsigned long ret=128; return(ret);}
  //время паузы в циклах ожидания данных, нc
  const unsigned long GetPauseTimeNSec(void) {static const unsigned long ret=1000; return(ret);}
  //время добавления точек диаграммы, секунды
  const unsigned long GetDiagramTimeSec(void) {static const unsigned long ret=600; return(ret);}
  //максимальное количество точек диаграммы  
  const unsigned long GetDiagramMaxPointsAmount(void) {static const unsigned long ret=1000; return(ret);}
  //начальное максимальное время записи диаграммы
  const unsigned long GetDiagramInitMaxTimeSec(void) {static const unsigned long ret=10*60*60; return(ret);}
  //рабочая частота  
  const unsigned long GetWorkingFrequencyHZ(void) {static const unsigned long ret=32; return(ret);}
  //количество гироблоков
  const unsigned long GetUnitAmount(void) {static const unsigned long ret=3; return(ret);}
  //сколько тактов допустимо пропустить устройству, чтобы считать его ещё работающим
  const unsigned long GetUnitEnabledCounterMaxValue(void) {static const unsigned long ret=3*GetWorkingFrequencyHZ(); return(ret);}
  //сколько тактов допустимо пропустить АКУ, чтобы считать его ещё работающим
  const unsigned long GetACUEnabledCounterMaxValue(void) {static const unsigned long ret=3*GetWorkingFrequencyHZ(); return(ret);}
  //сколько тактов допустимо пропустить акселерометру, чтобы считать его ещё работающим
  const unsigned long GetAcsEnabledCounterMaxValue(void) {static const unsigned long ret=3*GetWorkingFrequencyHZ(); return(ret);}
  //сколько тактов допустимо пропустить БВФКП, чтобы считать его ещё работающим
  const unsigned long GetBWFKPEnabledCounterMaxValue(void) {static const unsigned long ret=3*GetWorkingFrequencyHZ(); return(ret);}
  //время аварийного торможения в тактах
  const unsigned long GetAlarmCounterMaxValue(void) {static const unsigned long ret=4*60*GetWorkingFrequencyHZ(); return(ret);}
  //сколько тактов отсутствут электропитание, чтобы считать это за аварию
  const unsigned long GetPowerOffCounterMaxValue(void) {static const unsigned long ret=60*GetWorkingFrequencyHZ(); return(ret);}
  //максимальное значение счётчика для принудительного сохранения данных (1 такт - 10 мс)
  const unsigned long GetSaveChacheCounterMaxValue(void) {static const unsigned long ret=100*60; return(ret);}
  //количество точек в графиках сигналов
  const unsigned long GetTrendSignalsPointsAmount(void) {static const unsigned long ret=350; return(ret);}
  //количество точек в графиках углов
  const unsigned long GetTrendAnglesPointsAmount(void) {static const unsigned long ret=350; return(ret);}
  //количество точек в графиках углов в неподвижном основании
  const unsigned long GetTrendStillAnglesPointsAmount(void) {static const unsigned long ret=295; return(ret);}
  //какой такт добавлять в график углов в неподвижном основании
  const unsigned long GetTrendStillVoidCycle(void) {static const unsigned long ret=12; return(ret);}
  //бесконечно малое
  const double GetZeroEPS(void) {static const double ret=0.00000000001; return(ret);}
  //точность задания углов ПАК, угловые секунды
  const float GetPAKAngleSecEPS(void) {static const float ret=10; return(ret);}
};

И использовал этот класс для задания структуры с вложенной структурой внутри, вида
struct SSettings
{
 long Port;//порт сервера
 struct SUnit
 {
  //....что-то тут
 } sUnit[cConst.GetUnitAmount()];// !!!!!Вот в чём проблема!!!!!
 bool EnabledPowerMonitor;//разрешение контроля питания
};

И вот компилятор IDE Momentics теперь ругается - он позволяет задавать Port (sSettings.Port=...), но не позволяет задавать EnabledPowerMonitor. Пишет, что структура переменного размера. Э... Ну, логично - размер ведь задан в другом модуле, а про него компилятор ничего не знает. Только вот как это обойти?  Roll Eyes
8  Разработка / Программирование под QNX / Re: Работа через USB с FlirOne Gen 2 : Октября 06, 2017, 10:45:12 pm
Экспериментальная альфа-версия прошивки микроконтроллера STM32F407 платы STM32F4Discovery для работы с тепловизором Flir One Gen 2 через USB: ссылка на репозиторий

Из особенностей:
1) Проект создан в Cube MX для Keil 5 - без Cube MX запустить USB с уровня HAL или CMSIS было бы ооочень непросто.
2) Весь объём кода от Cube MX для поддержки процессора в комплекте. Здравствуйте мегабайтные *.h-файлы CMSIS и такого же размера библиотеки HAL в *.c-файлах для работы с периферией.
3) Если три секунды нет картинки, процессор перезагружается, и процесс энумерации начинается заново.

Подключён дисплей 320x240 на контроллере HX8347D.
Через FSMC запуск не удался (возможно, мешают устройства на плате),поэтому контакты дисплея были заново подключены так:
D0-D7 - PE4-PE11
CS - PE12
RD - PE13
RW - PE14
RS - PE15
RST - PE2

А вот так работает: https://youtu.be/-elBzHRjZxo
9  Разработка / Перенос приложений в QNX / Re: Git под QNX 6.5 : Сентября 15, 2017, 08:20:42 pm
Я вот тоже сегодня эти архивы скачал. Распаковал в QNX 6.3. И... а что с ними дальше делать?  Roll Eyes Там есть всякие скрипты типа INSTALL. Но этот скрипт при запуске ругается на строку с shift 2. Что это значит, я не знаю. Если эту строчку удалить, то скрипт просто завершает свою работу и всё. Ничего не происходит. Такая же фигня с приложениями из каталогов bin. Они ничего не делают.  Embarrassed Просто завершаются и всё. Если им скормить произвольные строчки, то бывает и завершаются аварийно. Копирование всего этого добра в штатные папки каталога /usr ничего не изменило - как не работало, так и не работает.
Вот что с этой фигнёй делать-то нужно?  Undecided Или она принципиально только для QNX 6.5 и на 6.3 и не запустится вовсе?
10  Разработка / Программирование под QNX / Re: Работа через USB с FlirOne Gen 2 : Сентября 06, 2017, 03:10:17 pm
Понятно, в чём дело. 64 - максимальный размер пакета для LowSpeed и FullSpeed. А для HeighSpeed максимальны размер 512.
11  Разработка / Программирование под QNX / Re: Работа через USB с FlirOne Gen 2 : Сентября 05, 2017, 09:22:02 pm
А не знает ли кто, как может сложиться следующая ситуация: я подключил этот тепловизор к stm32f4 Discovery к USB-Host. Проект я создал в CubeMX. То есть, вся обвязка USB там точно верная. Проблема в том, что тепловизор в дескрипторе конечной точки передаёт wMaxPacketSize=0x40. И это не управляющие точки. Однако, операционным системам тепловизор по usb -vvv и lsusb -vvv сообщает о конечных точках вот что:


Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass    240
      bInterfaceProtocol      1
      iInterface              6 com.flir.rosebud.fileio
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x83  EP 3 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
       wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x04  EP 4 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               1

То есть, операционным системам тепловизор рапортует о 512 байтах. А микроконтроллеру о 64. Это вообще как так может быть? Я обыскал всю библиотеку USB для STM32 и не нашёл ничего такого, что могло бы так повлиять на решение тепловизора выдавать такие параметры. Там обычная энумерация с получение дескрипторов конфигураций и устройства и задание адреса устройства. Но что-то же заставило тепловизор выдать 64, а не 512 байт? Использую я режим USB Full Speed, 12 МБ/c. Кстати, а никто не знает, запрос SET_DESCRIPTOR позволит изменить параметры конечной точки (и вообще, для чего он применяется? В инете его что-то не используют). Я бы оставил бы это всё без внимания, но на 64 байтах я не успеваю принять все данные, хотя у контроллера аж 168 МГц частота и он вроде бы должен успевать (хотя тут и PC пропускал кадры с радостью под Linux). А конечная точка в 512 байт, думаю, позволила бы пропускать кадры гораздо реже.
12  Разработка / Программирование под QNX / Re: Странности при отработке ф-ции system() : Августа 14, 2017, 09:10:49 pm
Цитировать
Не могу с Вами согласиться насчет "ошибок в QNX".

Напрасно. Я помню, они точно были. Smiley Не помню только, что именно. Но вот в данном случае система твердит вам о повторном открытии незакрытого сокета - но такого быть не должно точно при любых операциях через QNet.
13  Разработка / Программирование под QNX / Re: Странности при отработке ф-ции system() : Августа 12, 2017, 12:06:27 pm
Я так понимаю, вам просто интересно, почему так, и реальной проблемы нет? Grin
Возможно, просто ошибка в системе. В QNX тоже должны быть ошибки - куда ж без них?
14  Разработка / Программирование под QNX / Re: Странности при отработке ф-ции system() : Августа 12, 2017, 07:26:15 am
А если файл закрыть?
15  Установка и настройка / Установка и настройка / Re: QNX и GPT : Августа 05, 2017, 07:27:31 pm
А вот тут ( http://forum.kpda.ru/ ) ответа не знают?
Страниц: [1] 2 3 ... 12