Опубликован: 24.04.2009 | Уровень: специалист | Доступ: платный
Лекция 8:

Программирование приложений в CE

Вызов функций C/C++ из C#

При использовании C# для разработки приложений существуют тем не менее редкие ситуации, когда необходимо вызывать функции, написанные на неуправляемом коде C/C++.

Для этого используется специальный интерфейс, называемый Process Invoke (P/Invoke), который предоставляет эту возможность. Используемые функции C/C++ должны быть представлены в динамически подключаемой библиотеке (DLL). Следующий код необходимо добавить в определение класса или структуры в C#, чтобы вызвать функцию C/C++ Userfunction в Users.dll:

[DllImport("Users.dll")]
private static extern uint Userfunction( . . .);

Типы данных в C/C++ и C# не совсем совпадают во всех случаях, поэтому при вызове функций с несколькими аргументами различных типов, одномерными массивами, и строками возникают дополнительные трудности, и понадобится консультация в других справочных материалах C# о дополнительных деталях.

Дополнительная информация

  • Учебник, Programming Microsoft Windows CE.Net, Third Edition, Douglas Boling, опубликованный Microsoft Press содержит дополнительную информацию о разработке прикладных программ C/C++ Windows Embedded CE. Глава 23 содержит краткое введение в C#.
  • Оперативная справочная система в Windows Embedded CE содержит описания всех вызовов API и имеет дополнительные примеры кода.
  • Дополнительную информацию о написании программ C# можно найти в книге .NET Compact Framework Programming with C#, написанной Paul Yao и David Durant, а информацию о проектировании форм можно найти в книге Programming Windows with C#, Charles Petzold.
  • Полезный демонстрационный инструмент P/Invoke Wizard доступен по адресу http://www.paulyao.com/resources/tools/pinvoke.asp
  • Сравнение свойств языков C# и Java можно найти в книге The C# Programming Language for Java Developers, доступной в сети по адресу http://msdn.microsoft.com/vstudio/java/gettingstarted/csharpforjava/
  • Справочные руководства по языку ассемблера X86 свободно доступны в Web по адресу www.ece.gatech.edu/~hamblen/Ebox.

Лабораторные упражнения

  1. Модифицируйте программу пример с файловой системой, чтобы файл записывался в долговременную память (флеш-устройство USB, плата CF, или внутренний флеш-диск). Найдите файл на eBox после создания и выведите данные, чтобы проверить, что все работает.
  2. Модифицируйте программу примера с последовательным портом для использования более высокой скорости в бодах 38400 и протестируйте код с eBox, соединенный с ПК, выполняющим HyperTerminal. Просмотрите спецификацию 16550, если требуется дополнительное понимание и настройка делителя частоты.
  3. Модифицируйте пример с потоками, чтобы потоки были полностью синхронизированы, независимо от задержки в вызовах API Sleep. Используйте случайные задержки, как показано в задаче производитель-потребитель и выполните код на eBox.
  4. Модифицируйте второй пример производителя-потребителя для использования критического раздела вместо мьютексного семафора. Проверьте, что он работает, выполняя код на eBox.
  5. Модифицируйте второй пример производителя-потребителя для использования блокировки мьютекса вместо мьютексного семафора для его мьютексной блокировки на общих данных. Проверьте, что он работает, выполняя код на eBox.
  6. Напишите модель C/C++ для классической проблемы обедающих философов, которая использует потоки и семафоры CE. Имеется 5 философов, сидящих за круглым столом. Философы едят или думают (спят). В центре стола находится еда. Всего имеется пять вилок, по одной справа и слева от каждого философа. Так как имеется только пять вилок, философы должны делить свои вилки с философом с каждой стороны от себя. Чтобы есть, философ должен иметь обе вилки. Когда они пытаются есть, они оказываются в постоянном состоянии голода, пока не получат обе вилки. Проблема состоит в том, чтобы создать способ разбора вилок, так чтобы ни один философ не умер от голода. Также философы могут заблокировать друг друга (каждый захватил по одной вилке, и не выпускает ее) без синхронизации. Используйте случайную временную задержку (как в проблеме производитель-потребитель) для событий размышления и еды. Выполните свою модель на eBox в консольном приложении. Вы можете найти все детали этой проблемы в большинстве учебников по ОС в Web.
  7. Повторите предыдущую проблему, но в этот раз используйте C# и любые его встроенные средства синхронизации.
  8. Добавьте подпроект etchasketch в проект MyOS и выполните его на eBox. Исходный код на C для etchasketch можно найти в следующем каталоге C:\WINCE600\PUBLIC\COMMON\OAK\DEMOS\ETCHA. Нарисуйте свое имя на etchasketch и сделайте захват изображения с помощью удаленного инструмента Zoom.
  9. Напишите приложение C# для Web-браузера с именем HelloWeb. Для ввода URL используется текстовое поле. Когда нажимается кнопка, новый URL посылается в браузер (текст из текстового поля). Используйте окно WebBrowser в панели инструментов C#. URL является свойством окна WebBrowser. Настройка очень похожа на код C#, разработанный в учебнике. Проверьте, что он работает, выполняя код на eBox и выводя Web-страницу.
  10. Если доступно устройство вывода LCD Phidgets, разработайте приложение для вывода системного времени eBox на LCD. Проверьте, что оно работает, выполняя код на eBox. Может оказаться полезен вызов API GetLocalTime.
  11. Если доступен датчик Phidgets, разработайте приложение для считывания значения аналогового датчика, преобразования его в десятичное значение, и вывода его на Phidgets LCD. Проверьте, что оно работает, выполняя код на eBox с помощью присоединенных модулей Phidgets.
  12. Если доступен температурный датчик Phidgets, разработайте приложение, которое показывает температуру и функционирует как термореле системы нагрева. Если температура опускается очень низко, включите бит цифрового вывода, чтобы включить нагреватель, и когда он нагреется, выключите бит цифрового вывода. Температурный датчик можно нагреть прикасаясь к нему. Присоедините LED к биту цифрового вывода, чтобы можно было контролировать его состояние. Датчик вращения или скольжения также можно использовать для моделирования температурного датчика. Приложение такого типа не требует на самом деле достаточно быстрой частоты обновления, поэтому можно воспользоваться функцией Sleep. Выведите текущее показание температуры на LCD Phidget или на дисплее eBox.
  13. Добавьте дополнительные свойства в предыдущую проблему с термореле, включая следующее:
    • Биты цифрового входа, соединенные с кнопкой или переключателем, который поднимает или повышает до требуемой температуры. Когда вы нажимаете кнопку, на дисплее на несколько секунд выводится заданное значение температуры, а не текущая температура.
    • Переключатель, который выбирает режим нагревания или охлаждения вместе с другим битом вывода и LED для управления кондиционированием воздуха.
  14. Напишите приложение GUI Windows, которое вычерчивает график самых последних значений датчика Phidgets относительно времени в смещающемся временном окне.
  15. Соберите автономного робота, используя eBox и серво-контроллеры PWM для управления любительским механизмом с дистанционным управлением, который использует стандартный сервомеханизмом с дистанционным управлением. Большинство дешевых игрушек не используют стандартные сервосигналы PWM дистанционного управления. Любительские модели более высокого уровня настраиваются для использования стандартных сигналов PWM для поворотов и управления скоростью. Для механизмов любительского уровня для удаленного управления обычно используется радио, продаваемое отдельно, но воспользуйтесь Phidgets и eBox для настройки приложения беспроводного удаленного управления 802.11 на другом ПК с беспроводной связью. Используйте небольшие скорости, чтобы избежать повреждения механизма. Для eBox потребуется максимум 5V DC 3A регулируемый источник питания на основе батареи.
  16. Добавление других датчиков, таких как ИК датчик расстояния или сонар могут позволить механизму самостоятельно обнаруживать и избегать объекты. Несколько датчиков, возможно даже датчики различного типа, потребуются для надежной работы, и вам придется использовать меньшие скорости механизма, чтобы избежать повреждения.
  17. Используйте плату Cypress PSoC с eBox для управления дешевым дистанционно управляемым игрушечным механизмом, как в двух предыдущих проблемах. Они не используют стандартные сигналы сервомеханизмов PWM дистанционного управления, они просто включают и выключают моторы. Управление скоростью можно добиться пульсируя и изменяя цикл нагрузки цифровых сигналов управления мотором на несколько килогерц. Вы можете подключить к существующему двигателю постоянного тока схемы с мощными транзисторами и использовать их, или можно создать свои собственные. eBox может посылать микроконтроллеру PSoC требуемые значения скорости и он может генерировать требуемые высокочастотные импульсы данных в прошивке. Выберите механизм достаточно большим, чтобы он мог нести eBox и еще одну батарею.
  18. Соедините eBox с базой iRobot Create, используя COM-порт. Напишите код для eBox, который посылает команды базе робота Create, которые заставляют робот перемещаться по квадратам.
Бахтиёр Бутаев
Бахтиёр Бутаев
Таджикистан, Душанбе, Таджикский Технический Университет (ТТУ), 2013
Ярославй Грива
Ярославй Грива
Россия, г. Санкт-Петербург