Шаги, чтобы заставить светодиод мигнуть из программы C/C++?

Обратите внимание, что вашей функции foo в настоящее время требуются две строки, выделенные в куче без необходимости. Вот еще одна версия, которая является более универсальной и эффективной (хотя YMMV, как я опишу далее):

fn foo(x: T, y: &str) -> String
where
    T: Into,
{
    x.into() + y
}

assert_eq!(foo("mobile ", "phones"), "mobile phones");

Конкатенация почти всегда будет требовать выделения памяти где-то, но эта может принимать выделенные для кучи строки как а также произвольные кусочки строк. Он также может избежать перераспределения, если емкость x достаточно велика, хотя это не очень вероятно, учитывая, что x получается из строки, известной во время компиляции. String::insert_str позволили бы нам изменить положение параметра типа, но вставка в начале строки имеет стоимость O (n). Знание первого операнда конкатенации строк априори не очень полезно для компилятора с точки зрения того, какие оптимизации он может использовать.


Предположим, что мы все еще хотим выполнить частичную функцию во время компиляции. Похоже, что это еще один случай использования, когда const generics будет блестеть. С помощью этой функции можно действительно мономорфизировать эту функцию через &'static str с чем-то вроде этого еще не реализованного синтаксиса:

fn foo(y: &str) -> String {
    x.to_string() + y
}

Увы, дженерики const в настоящее время находятся в стадии разработки и не совсем готовы к этому еще. Хотя и менее эргономично, мы можем вместо этого повторить эффект создания одной функции для каждого строкового литерала с макросами на основе правил:

macro_rules! define_foo {
    ($fname: ident, $x: literal) => {
        fn $fname (y: &str) -> String {
            $x.to_string() + y
        }
    }
}

Использование:

define_foo!(bar, "Conan ");

assert_eq!(bar("Osíris"), "Conan Osíris");    

См. Также:

13
задан Brian R. Bondy 16 October 2008 в 18:12
поделиться

7 ответов

Вот учебное руководство при выполнении его с параллельный порт .

, Хотя я рекомендовал бы Ардуино , который может быть куплен очень дешево и только включил бы следующий код:

/* Blinking LED
 * ------------
 *
 * turns on and off a light emitting diode(LED) connected to a digital  
 * pin, in intervals of 2 seconds. Ideally we use pin 13 on the Arduino 
 * board because it has a resistor attached to it, needing only an LED

 * 
 * Created 1 June 2005
 * copyleft 2005 DojoDave <http://www.0j0.org>
 * http://arduino.berlios.de
 *
 * based on an orginal by H. Barragan for the Wiring i/o board
 */

int ledPin = 13;                 // LED connected to digital pin 13

void setup()
{
  pinMode(ledPin, OUTPUT);      // sets the digital pin as output
}

void loop()
{
  digitalWrite(ledPin, HIGH);   // sets the LED on
  delay(1000);                  // waits for a second
  digitalWrite(ledPin, LOW);    // sets the LED off
  delay(1000);                  // waits for a second
}

alt text

http://www.arduino.cc/en/Tutorial/BlinkingLED

17
ответ дан 1 December 2019 в 21:12
поделиться

, Который порт? Параллельный порт является моим любимым выбором, так как он производит +5V (логический уровень TTL) и очень прост к программе. Большинство параллельных портов имеет достаточно власти управлять светодиодом. Важно помнить, что компьютерные порты в целом разработаны, чтобы только произвести сигнальные напряжения а не произвести достаточно тока для на самом деле питания большинство устройств.

, Который компилятор? не имеет значения. Этот вид аппаратного взламывания представляет больший интерес и легкий в соответствии с Linux, тем не менее, таким образом, GCC является хорошим выбором.

, Как я отправляю данные? Зависит от порта и операционной системы. USB является ужасно сложным для простого проекта, поэтому забудьте это. Последовательными и параллельными портами можно управлять через множество различных интерфейсов. Мое предпочтение состоит в том, чтобы использовать ioctl() системный вызов в соответствии с Linux для прямого управления контактами параллельного порта. Вот информация о том, как сделать это: http://www.linuxfocus.org/common/src/article205/ppdev.html

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

(Также: книга Драйверов устройств Linux, доступная бесплатно онлайн, имеет информацию о взаимодействии через интерфейс с простыми электронными устройствами к параллельным портам и записи драйверов ядра для них.)

РЕДАКТИРОВАНИЕ: , кажется, существует крупный беспорядок в этом потоке о том, под чем подразумевает OP, "Мне нужен микропроцессор?" Решительно, один только параллельный порт может управлять светодиодом на основе программного обеспечения в компьютере . Никакой микропроцессор не необходим в устройстве. Однако, если Вы хотите, чтобы устройство было в состоянии управлять собой , не будучи подключенным к компьютеру , микропроцессор или некоторая другая цифровая логика требуются.

6
ответ дан 1 December 2019 в 21:12
поделиться

Это также зависит от ОС. На Linux Вы могли соединить светодиод проводом непосредственно к параллельному порту (с соответствующим токоограничивающим резистором, конечно) и просто использовать функцию C "outb ()" для включения и выключения его.

В Windows, это намного более сложно, потому что ОС не позволяет пользовательским приложениям говорить с портами непосредственно.

0
ответ дан 1 December 2019 в 21:12
поделиться

Вы могли попытаться поместить светодиод, и резистор на 300 Ом на передаче последовательного порта (прикрепите 3) Основываться (прикрепите 5). Тогда отправьте данные для включения его.

последовательный порт может, вероятно, только получить 10mA.

Удача.

1
ответ дан 1 December 2019 в 21:12
поделиться

Самый легкий порт, чтобы сделать это на было бы последовательно или параллельно. Всегда не забывайте помещать резистор последовательно со светодиодом, или Вы сожжете его.

0
ответ дан 1 December 2019 в 21:12
поделиться

Если Вы захотите мигнуть светодиодом без микропроцессора (который не подразумевает C/C++), то простая схема с помощью 555 IC таймера добьется цели. Это общие проекты в книгах по электронике человека, увлеченного своим хобби, новичка или наборах, потому что они действительно просты, и можно получить части в любом типе Radio Shack места:

, Если Вы хотите сделать это в программном обеспечении, как упоминания Vlion , все зависит от используемых аппаратных средств и дизайн схемы, которая поднимает трубку светодиод.

, Если Вы хотите попытаться бездельничать с чем-то на Вашем ПК, вот статья о том, как мигнуть светодиодами, которые сцепляются до контактов на параллельном порте ПК:

2
ответ дан 1 December 2019 в 21:12
поделиться

для быстрых и грязных операций у Вас есть 2 легких опции: последовательный или параллельный порт. Последовательный порт легче, но ограничен в количестве светодиодов.

Для подключения светодиодов Вам нужен коннектор оболочки (DB25/DB9) корректного пола, светодиод и резистор. Необходимо было бы искать значение для резистора сами.

последовательный порт имеет сигналы потока управления, которые находятся под контролем программиста. Это - простой вопрос вывода корректных битов к регистру MCR (после открытия последовательного порта).

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

Вам, вероятно, придется бороться с Вашей ОС для получения контроля над портом.

Используя строку Tx несколько сложно, поскольку выход сигнала является последовательным потоком битов данных, записанных в регистр передачи. Я придерживался бы сигналы DSR и CTS.

Для быстрой-и-грязной отладки, я только что записал в регистры и наблюдал модемные световые сигналы.

1
ответ дан 1 December 2019 в 21:12
поделиться