C#. NET Ошибка Core IoT для встроенной платы ARM: необработанное исключение. System.IO.IOException: устройство или ресурс занят - PullRequest
4 голосов
/ 18 июня 2020

Я хочу использовать . NET базовую библиотеку IoT для запуска C# кода для моей SAMA5D27 SOM1 EK1 ARM встроенной платы .

. NET core IoT github

Я собрал это. NET основной проект, составленный из project.cs исходный файл:

using System;
using System.Device.Gpio;
using System.Threading;

namespace led_blink
{
    class Program
    {
        static void Main(string[] args)
        {
            var pin = 81;
            var lightTimeInMilliseconds = 1000;
            var dimTimeInMilliseconds = 200;
            
            Console.WriteLine($"Let's blink an LED!");
            using (GpioController controller = new GpioController())
            {
                controller.OpenPin(pin, PinMode.Output);
                Console.WriteLine($"GPIO pin enabled for use: {pin}");

                Console.CancelKeyPress += (object sender, ConsoleCancelEventArgs eventArgs) =>
                {
                    controller.Dispose();
                };

                while (true)
                {
                    Console.WriteLine($"Light for {lightTimeInMilliseconds}ms");
                    controller.Write(pin, PinValue.High);
                    Thread.Sleep(lightTimeInMilliseconds);
                    Console.WriteLine($"Dim for {dimTimeInMilliseconds}ms");
                    controller.Write(pin, PinValue.Low);
                    Thread.Sleep(dimTimeInMilliseconds);
                }
            }
        }
    }
}

А это .csproj файл:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Iot.Device.Bindings" Version="1.0.0" />
    <PackageReference Include="System.Device.Gpio" Version="1.0.0" />
  </ItemGroup>

</Project>

Как видите, код используется для мигания светодиода, который находится на PIN 81 , что соответствует Порт C контакт 17 на моей плате. Я собираю проект, чтобы использовать его на плате arm- linux.

Во-первых, чтобы проверить, работает ли контакт, я использовал библиотеку libgpiod и включил светодиод pin81 с использованием gpioset gpiochip0 81=1, и он работает хорошо.

Кроме того, я проверил свой GP IOs с помощью команды gpioinfo, и это результат желаемого контакта:

 line  81:       "PC17"       unused   input  active-high

Но когда я пытаюсь запустить код C#, он терпит неудачу с выводом следующего сообщения:

Let's blink an LED!
Unhandled exception. System.IO.IOException: Device or resource busy
   at System.IO.FileStream.WriteNative(ReadOnlySpan`1 source)
   at System.IO.FileStream.FlushWriteBuffer()
   at System.IO.FileStream.FlushInternalBuffer()
   at System.IO.FileStream.Flush(Boolean flushToDisk)
   at System.IO.FileStream.Flush()
   at System.IO.StreamWriter.Flush(Boolean flushStream, Boolean flushEncoder)
   at System.IO.StreamWriter.Dispose(Boolean disposing)
   at System.IO.TextWriter.Dispose()
   at System.IO.File.WriteAllText(String path, String contents)
   at System.Device.Gpio.Drivers.SysFsDriver.OpenPin(Int32 pinNumber)
   at System.Device.Gpio.GpioController.OpenPin(Int32 pinNumber)
   at System.Device.Gpio.GpioController.OpenPin(Int32 pinNumber, PinMode mode)
   at led_blink.Program.Main(String[] args) in /home/ubuntu/netcore/Program.cs:line 23
Aborted

Это дерево устройств моей платы:

device_tree

PS: Я удалил узел IS C, который использует PC17 GPIO из дерева устройств, чтобы освободить контакт

ISC_DeviceTree_node

Почему мой код не запускается? любая помощь, пожалуйста!

Ответы [ 2 ]

0 голосов
/ 27 июня 2020

Наконец я нашел решение. Вы должны использовать драйвер LibGpioD вместо интерфейса SysFs на вашей платформе Linux и вашем коде C#.

0 голосов
/ 18 июня 2020

ОК. Работаю со встраиваемыми системами 45 лет. Сначала я думал, что ошибка исходит от P C, подключенного к плате. Теперь я понимаю, что у вас последовательный порт консоли устройства.

Устройство загружается с eprom и сначала настраивает консоль для отладки. Далее устройство пытается смонтировать операционную систему с диска. В вашем устройстве есть смарт-карта, подключенная к USB-порту. Я читал ваш исходный код и думал, что USB - это RS-232, но из литературы по устройствам USB используется для смарт-карты. Ошибка выглядит так, будто это может быть код запуска для смарт-карты. Таким образом, либо карта не вставлена, не отформатирована, либо на ней нет операционной системы.

Возможно, вам не понадобится смарт-карта в зависимости от ваших требований. Я использую на работе встроенную карту Xilinx и не использую смарт-карту, поэтому для работы со смарт-картой необходимо отключить параметр загрузки. Нам также пришлось запрограммировать Xilinx перед использованием. Я предполагаю, что у Atmel есть аналогичные варианты.

...