Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Клуб профессиональных программистов :: Выпуск #122


Клуб профессиональных программистов «Весельчак У»
Информационная рассылка сайта и форума.  Выпуск 122.  18 октября 2011 г.

Здравствуйте, уважаемые читатели!


Введение


Программирование встроенных систем в настоящее время — это спорная пограничная территория между двумя соседними, но не слишком дружественными областями — программирования и оборудования. Эта территория довольно слабо исследована и малолюдна, поскольку пребывание на ней требует одновременного сочетания навыков программирования и схемотехники в одной персоне, что бывает нечасто.

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

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

На нашем форуме неоднократно поднималась тема разработки firmware. Мы рассматривали по отдельности ее различные аспекты:


  • в статьях [1], [2], [3] описывалось средство для модульного тестирования программного кода, написанного на языке C, под названием Unity;
  • в статье [4] рассказано, как применить Unity и TDD для разработки небольшого модуля по заданной спецификации;
  • в [5] описана обработка исключений в программах на ANSI C с использованием CException;
  • в [6] в общих чертах обозревается весь процесс разработки сложного интеллектуального устройства со встроенными микропроцессорами;
  • в [7] рассказывается о применении паттерна проектирования MCH (Model-Conductor-Hardware) для отделения бизнес-логики модуля от аппаратной части и, как следствие, получения кода, который пригоден как для легкого портирования на различные платформы, так и для тщательного тестирования;
  • в [8] показано, как с применением довольно известного трюка под названием «машина Даффа» можно реализовать выполнение сопрограмм на чистом ANSI C без использования плохо портируемых ассемблерных вставок;
  • в [9] тема сопрограмм развивается дальше — до реализации протопотоков (protothread, средства реализации кооперативной многопоточности).

Здесь перечислены не все, а только базовые источники информации по теме. Дополнительные материалы вы можете найти в обзоре литературы по проектированию встроенных систем [10].

Каждая из упомянутых выше статей рассматривает какой-либо отдельно взятый аспект процесса проектирования. Однако их прочтения недостаточно для того, чтобы получить представление о процессе в целом. Мало просто иметь инструмент в своем распоряжении; недостаточно даже знать его назначение и правила пользования. Для эффективного его использования нужно овладеть технологией в целом и понять место инструмента в общей цепочке. Этой цели и посвящена данная статья — собрать все ранее полученные отрывочные знания воедино и провести сквозной цикл разработки по методике Unity и TDD от постановки задачи до готового изделия.


Предварительные условия


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

Перед прочтением данной статьи необходимо ознакомиться с тестовой средой Unity и методикой ее использования для модульного тестирования и TDD.

Предполагается, что читатель имеет навыки программирования на языке ANSI C. Уровень эксперта не потребуется, но уверенное владение языком необходимо.

В качестве основного инструментального средства реализации нашего проекта будет использоваться GCC. Сборку проекта будем производить утилитой GNU make. Поэтому необходимо иметь хотя бы общее представление о формате файлов make, а также параметрах командной строки GCC. Выбор данного инструментария продиктован отнюдь не склонностью автора к аскетизму, а исключительно тем фактом, что имеются доступные реализации GCC с возможностью генерации кода как для IBM PC, так и для микроконтроллеров семейства Mega фирмы Atmel, и мы этим в дальнейшем непременно воспользуемся.

Хоть это и не является обязательным условием, но наличие навыков TDD на каком-либо языке программирования высокого уровня (например, C# или Java) может существенно облегчить понимание материала данной статьи.

Приветствуется знакомство с основами тестирования [11] (в частности, использование подставных объектов), а также понимание принципов непрерывной интеграции [12]. Навыки рефакторинга [13] тоже не будут лишними.


Постановка задачи


При обучении программированию сложилась многолетняя традиция: первая программа должна быть как можно бесполезнее и бестолковее. В наибольшей степени этим строгим критериям соответствует знаменитая программа, выводящая на экран сообщение «Hello World!». Именно она и стала в итоге стандартом компьютерной педагогики де-факто.

Мы тоже не станем отступать от законов жанра. Правда, несколько осложняет дело тот факт, что мы будем разрабатывать программу для микроконтроллера, у которого нет дисплея. Но человека, который твердо решил сделать абсолютно бесполезное устройство, такие мелочи не должны пугать. Среди разработчиков встроенных систем есть своя, не менее славная традиция первой программы: мигать светодиодом (пруфлинки в количестве 198 тыс.). По степени бестолковости такая программа способна даже превзойти легендарную «Hello World!», так что с этой стороны все будет в порядке.

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

Особую изысканность программе придаст то, что светодиод будет мигать не абы как, а со скважностью, равной четырем. Это будет выгодно отличать ее на фоне 198 тыс. имеющихся аналогов.


Процедурные замечания


Управление версиями


...


Полностью прочитать статью можно на нашем сайте, в разделе «Инструменты и технологии проектирования ПО».

  • Программирование :: Неотложка
  • Добрый день.
    Пытаюсь разобраться с Vesa BIOS,но на данный момент даже самые простые действия не получаются,а погуглив ничего толкового не нашел.Надеюсь на подсказки или посылания на полезную информацию,которая поможет мне во всем разобраться.
    Дело такое.
    1)Нужно разместить буфер длиной 256 байт.Этот буфер должен испоьзоваться Vesa BIOS для возврата информации о видео среде.
    2)Нужно вызвать функцию 00h из Vesa BIOS.
    3)Создать новый буфер и вызвать из Vesa BIOS функцию 01h,чтобы получить информацию о поддерживаемых видеорежимах. Используя VideoModePtr,нужно вызывать эту функцию до тех пор,пока не будет найден походящий видео режим.
    Ну и вот по порядку.
    Код:
    #include <conio.h>
    #include <stdio.h>

    int main() {

    char *buf[256];     // 1) Размещаем буфер(этого не делал 100 лет,но вроде бы так это делается)
    unsigned char state1,state2; // переменные для определения результата выполнения 00h

     asm {
           mov AH,0x4F; // 2) Вызов функции 00h. Вход: AH = 4Fh
           mov AL,0x00; // AL = 00h
           ES:DI,buf;     // ES:DI - указатель на буффер (вот тут не уверен,что правильно сделал)
           int 0x10;
           mov state1,AL;
           mov state2,AH;

           }
     if (state1 == 0x4F) // Если AL == 4Fh
     printf("Function is supported\n"); // функция поддерживается
     else
     printf("Function is not supported\n"); // В противном случае - функция не поддерживается

     if (state2 == 0x00) // Если AH == 00h
     printf("Function call was sucsessfull\n"); // Вызов был успешным
     else
     printf("Error in function call\n"); //В противном случае - имеет место ошибка
    getch();
    return 0;
    }
    При попытке компилирования ругается на строку ES:DI,buf.Не могу понять как его правильно задать.
    По третьему вопросу:
    скажем - на входе должно быть CX = номер режима SuperVGA,который должен равняться одному из тех,что были возвращены функцией 0.
    Структура информационного блока функции 0 имеет следующий вид
    Код:
    struct VESAINfo
    {
      char sign[4]; // VESA signature
      unsigned int ver; // VESA BIOS version
      char far *OEM; //Original Equipment Manufacturer
      long cap;
      int far* modeList; //supported modes
      int totalMemory; //int 64K blocks
    }
    Вопросчто здесь является тем самым номером режима SuperVGA,который надо подать на CX?

    Вобщем,подскажите,кто что может.Благодарю.
  • Программирование :: Общий
  • Таблица хранит данные:
    Пользователь на такой-то вопрос дал такой-то ответ.

    Таблицв useranswer:
    Цитата
    id    id_user  id_question    id_answer
    1    1  45  523
    2    1  83  841
    3    2  804  236
    4    1  49  196
    5    2  101  823
    .........etc................................
    Хочу составить запрос, который мне в таблицу usertmp поместит какой же дал ответ пользователь на 45-й вопрос.
    Цитата
    id    id_us  answer
    1    1  [искомое значение]   
    ............................
    Здесь поле id_us хранит ID пользователя.
           
    Сам SQL-запрос:
    Цитата
    UPDATE TABLE usertmp
    SET answer = (SELECT ua.id_answer
      FROM useranswer AS ua, usertmp AS ut
      WHERE ua.id_user = ut.id_us
        AND ua.id_question = 45 )
    Правильно ли составлен?
  • Программирование :: .NET технология от и до
  • Задача заключалась в получении списка процессов системы. Для этого в WinAPI существует TlHelp32.h, где определены функции Process32First и Process32Next, каковые в качестве параметра принимают структуру PROCESSENTRY32.

    Сама эта структура, в общем-то, обычная, но есть внутри неё массив символов, хранящий название процесса. Длина массива составляет MAX_PATH.

    Как известно, в .NET массивы - ссылочные типы, поэтому структуру просто так не объявить: вместо цепочки символов там будет указатель, что в данном случае не надо. Но эта проблема обходится при помощи соответствующего атрибута.

    Итак, на C# усечённый тестовый вариант выглядит следующим образом:
    Код: (csharp)
        class ClrImport
        {
                const int MaxPath = 260;
                const int Th32CsSnapProcess = 0x00000002;

       private struct ProcessEntry32
       {
       public uint dwSize;
                        public uint cntUsage;
                        public uint th32ProcessID;
                        public uint th32DefaultHeapID;
                        public uint th32ModuleID;
                        public uint cntThreads;
                        public uint th32ParentProcessID;
                        public uint pcPriClassBase;
                        public uint dwFlags;
                        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = ClrImport.MaxPath)]
                        public string szExeFile;
                        public uint th32MemoryBase;
                        public uint th32AccessKey;
       };

       [DllImport("kernel32.dll", CallingConvention = CallingConvention.Winapi)]
                private static extern bool Process32First(IntPtr hSnapshot, ref ClrImport.ProcessEntry32 lppe);

                [DllImport("kernel32.dll", CallingConvention = CallingConvention.Winapi)]
                private static extern IntPtr CreateToolhelp32Snapshot(UInt32 dwFlags, UInt32 th32ProcessID);

                [DllImport("kernel32.dll", CallingConvention = CallingConvention.Winapi)]
                private static extern bool CloseHandle(IntPtr hObject);

       public static void Test()
       {
       IntPtr snapshotHandle = ClrImport.CreateToolhelp32Snapshot(ClrImport.Th32CsSnapProcess, 0);

       ClrImport.ProcessEntry32 processEntry = new ClrImport.ProcessEntry32();
       processEntry.dwSize = Convert.ToUInt32(Marshal.SizeOf(typeof(ClrImport.ProcessEntry32)));
       ClrImport.Process32First(snapshotHandle, ref processEntry);

       ClrImport.CloseHandle(snapshotHandle);
       }

        }
    Мучался я с ним полдня.

    Феномен заключается в том, что значения полей структуры начинают "разъезжаться". Не помогает ни замена типов с uint на явный UInt32, ни явное указание кодировки символов, ни явный переход на Unicode, ни Explicit-декларация с явным указанием offset в байтах для каждого поля.

    Заменив string на char[] чисто эмпирически установил, что начало строки с названием процесса "уезжает" вперёд на 8 символов (или 16 байт, несмотря на то, что данные поступают в ANSI-кодировке).

    Феномен не зависит ни от версии .NET, ни от режима Debug/Release. Однако после переписывания этого кода один в один на C++.NET (с поправкой на синтаксис) феномен исчезает. Кроме того, он наблюдается в проектах VS2005 и VS2008, но отсутствует в проектах VS2010.

    Как оказалось, причиной является конфигурация сборки: "Any CPU". Как только конфигурация устанавливается в "x86" - всё становится нормальным.

    Однако другие структуры с полями простых типов (без массивов внутри) нормально работают и в "Any CPU".

    Видимо, в Marshal какой-то баг, касающийся передачи именно внедрённых в структуры массивов.
  • Программирование :: C/C++ :: WinAPI & Visual C++
  • Собственно, потребовалось программным образом переименовывать ком порты. То есть из COM1 в COM3, из COM4 в COM5. Среда разработки - десятая студия, система - Windows Embedded XP. Пока не нашёл даже возможных вариантов.
  • Добрый день!

    Есть класс:
    Код: (cpp)
    class CBytes : public std::vector<BYTE>
      {
      public:
        CBytes()
          {}

        CBytes(const CBytes& str)
          :std::vector<BYTE>(str.begin(), str.end())
          {
          }
        CBytes& operator= (const CBytes& str)
          {
          if (this != &str)
            {
            clear();
            insert(end(), str.begin(), str.end());
            }
          return *this;
          }
      };

    И есть вот этот код:

    Код: (cpp)
    CArray<CBytes , CBytes> testArray;
    CBytes killme;
    testArray.Add (CBytes ());
    killme = testArray[0];
    testArray.Add (CBytes ());
    killme = testArray[0];
       

    если запустить этот код в дебаговой конфигурации – программа падает на последней строчке этого кода killme = testArray[0]

    Если конкретнее - падает внутри operator= на строке insert(end(), str.begin(), str.end());


    кто может объяснить данный феномен?

    У меня Visual Studio 2010, Windows 7 Pro 64

    Пробовал в проекте MFC Dialog-based, Unicode
  • Программирование :: C/C++ :: WinAPI & Visual C++ :: DirectX
  • Есть очень простая строчка кода:
    Код: (cpp)
    HMODULE hModule = LoadLibrary("d3d9.dll");

    И есть у меня немаленькая программа, где она вызывается. Программа включает в себя обычный WinAPI, MFC, CLR.NET и ряд сторонних библиотек (напрямую с DirectX не работающих, однако, к примеру, CUDA конкурирует за ресурсы графической подсистемы).

    Суть в том, что эта строчка кода то работает, то не работает при разных условиях. Не работает она с системной ошибкой 1114 (DllMain вернула FALSE). Когда работает - дальше всё работает нормально.

    Сборка проекта происходит под Win7 x64, VS20080. Сборка под платформу x86. На всех тестируемых машинах нужная версия DirectX установлена.

    Строчка не работает:
    1) На XP, Server 2003 на любых версиях (x86, x64).
    2) На Win7, если программа с нужным окружением установлена через инсталлятор (msi-файл).
    3) При запуске при помощи ярлыка.
    4) При запуске на машине, на которую зашли удалённым столом.

    Строчка работает:
    1) На Win7, если программу с нужным окружением (зависимыми dll-ками, исключая системные и DirectX) просто положить в папку и запускать оттуда.
    2) На Win7, если программа запускается другой программой, запущенной пользователем, если всё это не было пропущено через инсталлятор.
    3) На Win7, если программа запускается сервисом под LocalSystem через ...AsUser с токеном процесса в сессии пользователя и с некоторыми привилегиями, но непременно без удалённого стола, и если вся система из 3-х процессов не была пропущена через инсталлятор.

    Любые комбинации прав, запуск под администратором, режимы совместимости со старыми версиями, прописывание ярлыке рабочего каталога - всё это никакого эффекта не даёт.

    Полностью аналогичная сиутация с ddraw.dll. Либо они вместе загружаются, либо ни одна ни загружается.

    Вопросы:
    1) Знает ли кто-нибудь подробности: при каких обстоятельствах DirectX библиотеки возвращают 1114?
    2) Что такое может делать инсталлятор, что один и тот же exe-шник ведёт себя по-разному без установки и после установки?
    3) Чем, например, d3d9.dll в XP отличается от такой же в Win7?

    Мною экспериментально исключены следующие факторы:
    1) Оптимизаторы компилятора и линкера - всё выключено, никаких изменений.
    2) MTA/STA - без разницы.
    3) Наличие/отсутствие сторонних библиотек, включая CLR.NET - без разницы.
    4) Порядок загрузки dll - без разницы, даже в самом начале WinMain либо грузит, либо нет.
    5) Из каких потоков запускается - аналогично, без разницы.
    6) Памяти (как основной, так и видео) - достаточно.
    7) Другие dll-ки в этом месте загружаются без вопросов - будто бы никакие лимиты не превышаются.

    С какой ещё стороны можно к этому подобраться?
  • Программирование :: Delphi
  • У меня есть таблица с филиалами, каждый находится в каком-то городе, на что указывает поле id_city. Когда все это помещу в грид, то хотелось бы, чтобы был столбец заполненный названиями городов принадлежности филиалов. Используем Lookup-поля.
    (http://i080.radikal.ru/1110/e4/13e1fe7f42bb.jpg)

    На компоненте ADOTableBranch выбрал Fields Editor..., в нем сделап "New Field...".
    Из какого принципа там заполняется поле "Component"  ?

    В поле Key Fields я предполагал, что выберу внешний ключ таблицы, а именно - "id_city". Но как показывает рисунок, там в списке лишь поле name (это поле, хранящее наименование филиала). Почему ?


    Инструкции:
    1. Работа с локальными БД в Delphi. Работа с полями. Использование объектов класса TField. Создание полей выбора данных (Lookup-полей
    2. Работа с DBGrid

    Delphi XE
  • Не создается временная таблица:
    Код: (delphi)
      StringCommandCreate := ' CREATE TEMPORARY TABLE usertmp                 ' +
                             ' (                                              ' +
                             ' id   INT NOT NULL PRIMARY KEY AUTO_INCREMENT,  ' +
                             ' id_us INT NOT NULL )                           ';

      try
        with ADOQuery2 do
        begin
          SQL.Clear;
          SQL.Add(StringCommandCreate);
          ExecSQL;
        end;
      except
         on e:Exception do
      end;

    Это вскроется позже, при каком нибудь SQL-запросе к usertmp.

    Почему?

    Delphi XE / mysql-5.5.16-win32.msi / mysql-connector-odbc-5.1.9-win32.msi
  • У меня в Delphi XE такие вещи:
    (http://forum.shelek.ru/index.php?action=dlattach;attach=6171;image)
    Загружал в комбобокс из базы.
    Если сделать в cmd-консоли SELECT-выборку, то отобразится кириллица нормально.
    В SQL-Front - каракули.
     
    my.ini
    [mysql]
    default-character-set=cp1251


    Что предпринять браза?

    MySQL 5.5, SQL-Front 5.1
  • Программирование :: VisualBasic :: Visual Basic for Applications
  • Здравствуйте, что-то на строке
     Dim MSComm1 As MSComm
     Set MSComm1 = New MSComm 'стал получать ошибку ошибка 429 ACtiveX component can't create object

     В то же время библиотека Microsoft Comm Control 6.0 подключена, как лечить??
     Раньше вроде было гладко
    пробовал разрегистрировать ActiveX, а потом снова зарегистрировать
     Спасибо
  • Программирование :: Программирование 1С
  • Добрый вечер уважаемые. Подскажите плиз справку по web сокету в 1с8.х
  • Программирование :: Программирование 1С :: 1С 8.x
  • Есть документ, в который загружается картинка.
    В поле ПолеВвода1 выбираем картинку из компьютера(папки, диска...) и в ПолеИзображения она отображается.
    Вот код:
    Код:
    Процедура ПолеВвода1НачалоВыбора(Элемент, СтандартнаяОбработка)
    ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
     ДиалогОткрытияФайла.ПредварительныйПросмотр = Истина;
     ДиалогОткрытияФайла.Заголовок = "Выберите файл с фотографией";
     ДиалогОткрытияФайла.ПолноеИмяФайла = "";
     ДиалогОткрытияФайла.Фильтр =
     "Все картинки (*.bmp;*.dib;*.rle;*.jpg;*.jpeg;*.tif;*.gif;*.png;*.ico;*.wmf;*.emf)|*.bmp;*.dib ;*.rle;*.jpg;*.jpeg;*.tif;*.gif;*.png;*.ico;*.wmf;*.emf|"
     + "Все файлы (*.*)|*.*|"
     + "Формат bmp (*.bmp;*.dib;*.rle)|*.bmp;*.dib;*.rle|"
     + "Формат JPEG (*.jpg;*.jpeg)|*.jpg;*.jpeg|"
     + "Формат TIFF (*.tif)|*.tif|"
     + "Формат GIF (*.gif)|*.gif|"
     + "Формат PNG (*.png)|*.png|"
     + "Формат icon (*.ico)|*.ico|"
     + "Формат метафайл (*.wmf;*.emf)|*.wmf;*.emf|"; // картинки

     Если ДиалогОткрытияФайла.Выбрать() Тогда
     ВыбранноеФото = Новый Картинка(ДиалогОткрытияФайла.ПолноеИмяФайла,Истина);
     ЭлементыФормы.ПолеИзображения.Картинка = ВыбранноеФото;
     Фото= Новый ХранилищеЗначения(ВыбранноеФото, Новый СжатиеДанных());
     Иначе
     Возврат;
     КонецЕсли;

     КонецПроцедуры

    Но когда нажимаем ОК, документ сохраняется в журнале, но без картинки.
    Как сделать, чтоб картинка оставалась в документе?
    И как сохранить её адрес, например, чтоб в ПолеВвода2 было написано С:\Документы\Картинка.jpg
  • Программирование :: Программирование 1С :: 1С 8.2: Управляемое приложение
  • Всем здравствуйте. Требуется помощь. В модуле объекта инициирован ком объект. создается он нормально. как его вызвать правильно чтобы использовать.
    делаю так.
    Код:
    Модульные_Переменные = РеквизитФормыВЗначение("Объект");
    Модульные_Переменные.КомОбъект
    У ком объекта "Экспорт" прописан.
    Условие вызова &НаСервере.
  • Доброго всем времени суток!

    Суть в следующем:
    Есть нетиповая конфигурация Бух 8.2.25.5. Обновляю методом сравнения и объединения на следующий релиз 8.2.26.8.
    Снимаю галочку на измененных мной объектах(В новом релизе эти объекты не изменены).
    Объединяю. Заново сравниваю. Почему-то не переносятся некоторые объекты (формы отчетов и документов).
    Режим - взять из файла.

    В чем может быть причина ?
  • Операционные системы :: Windows
  • Итак, ситуация следующая есть программа, которая в данный момент пишется мной, при установке ее на W7 под User требует поставить от Admin (вываливается окошко, в котором нужно ввести пароль администратора). Ставлю от Admin, в папке  C:\Users\Admin\AppData\Roaming создается папка с config.xml, без которого прога не стартует. После установки прога стартует сама, корректно, и чудесно отрабатывает, я ее закрываю и запускаю заново. После перезапуска она стартует некорректно т.к. при установке config.xml записался в appdata к Admin, и даже если я руками скопирую его в appdata к user прога его не видит, ну а у admin ей, естественно, прав не хватает прочитать. Подскажите пожалуйста как красиво выйти из этой ситации и сделать мое приложение рабочим?
  • значится такая проблема:
    в inf файл к своему драйверу, дописал установку сервиса(службы).
    при установке драйвера для моего оборудования - ставится драйвер и копируется и конфигурируется сервис(автостарт).
    однако сервис не запускается, пока машину не перезагрузишь.
    вопрос - может кто с этим разбирался?
    как заставить винду сразу запустить сервис при установке из  inf файла? чего туда еще прописать надо?
  • Винда слетает буквально через день два, симптомы: при загрузке в биосе появляются полоски в произвольных местах, по всему монитору. В конечном итоге зависает на последнем окне приветствия и перезагружается.
    Также при установке новой винды присутствуют полоски.
    xp sp3 ставлю, раньше она же работала больше года, потом вирусы поели (как раз мерцание в биосе появилось), ставил 7, не потянул, сделал полное форматирование диска с очисткой содержания,
    спасибо
  • Операционные системы :: Unix и другие
  • День добрый. Столкнулся с таким неоднозначным результатом в процессе тестирования СОМ порта под Linux Debian Etch. В порт вставляется заглушка RX<->TX, после чего делаю:
    Код:
    cat /dev/ttyS0 > ./log &
    echo "12345" > /dev/ttyS0
    в результате наблюдаю непрерывно растущий файл log, содержимое его выглядидт следующим образом:
    Код:
    12345

    12345


    12345





    и т.д. короче строка постоянно повторяется с всевозрастающим числом переносов строк. Я проверил такую же комбинацию команд на том что было под рукой -  qnx 6.3 - результат нормальный, т.е. в файле log просто строка 12345.
    Интересно что это значит, это такая особенность работы команды cat или что-то еще?
  • Направления программирования :: Drivers
  • Здравствуйте!
    Есть такая задачка: имеется некое устройство, типа клавиатуры. Виндой оно и определяется как HID клавиатура, поэтому и работает вместе с основной клавой(как одна или в один поток). Но хочется, чтобы эта клавиатура работала не всегда, а только тогда, когда ей скажут, то есть в конкретном приложении. В общем все видимо сводится к написанию драйвера.

    Прочитал уже достаточно разного материала, но как то так и не получилось извлечь нужное. Каша в голове)
    Сейчас больше инетересует как получать данные с устройства. DriveEntry и прочие общие понятия вроде как усвоились.

    http://www.e-reading.org.ua/bookreader.php/130090/Tarvo_-_Ispol'zovanie_NuMega_DriverStudio_dlya_napisaniya_WDM-draiiverov.html - вот вроде как хороший пример, но к сожалению DriverStudio не работает на версиях винды старше XP SP2.
    То есть что нить бы подобное под WDK...

    И надо чтобы в итоге это все кончилось какой-нить dll по взаимодействую с этим устройством, ну или в идеале - .NET объектом )
  • Практические разделы :: Программы
  • Доброго времени, совсем измучила меня данная тулза. Не могу найти опцию, что бы в инсталяторе была галочка установить для всех пользователей. Проблема в том, что под W7 ставиться с правами администратора и только для администратора, а для юзера нет. Прошу вашей помощи, кто работал с данной тулзой - отзовитесь.

    П.С. Приношу извинения, если создал тему не в том разделе.
  • Учимся программировать :: Начинающим
  • Какие знания можно получить на курсах С++

А теперь прощаемся с Вами до следующего выпуска.


С уважением, команда Клуба.


В избранное