Перейти к содержанию
    

Как пользоваться потоками в С?

Господа!

Только начал разбираться с С на IAR, сразу возник вопрос: как организовать связь потока с последовательным портом или вообще с каким-либо оборудованием? Где происходит вызов обработчика устройства, как передаются данные?

В примерах у ИАРа нашел вывод через печать в строку, а затем - вывод ее через свою специальную процедурку. А как это сделать с использованием потоков?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Господа!

Только начал разбираться с С на IAR, сразу возник вопрос: как организовать связь потока с последовательным портом или вообще с каким-либо оборудованием? Где происходит вызов обработчика устройства, как передаются данные?

В примерах у ИАРа нашел вывод через печать в строку, а затем - вывод ее через свою специальную процедурку. А как это сделать с использованием потоков?

 

Нужен третий элемент - ОС. :)

Потоки живут там. (Но все их гордо называют задачами :cranky: )

А вот выбор ОС - довольно интимная вещь. В любом случае нужно внимательно изучить ОСиную ветку форума. После этого уже можно будет конкретно обсуждать "портирование" и "драйверописание" для конкретной ОСи.

Что касается "поточной" связи железа с софтом, как правило применяют сервисы ОС - события, ящики, каналы ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

читай внимательно доку на цомпилер, по умолчанию потоки stdin подключены к функции getchar, а потоки stdout и stderr подключены к функции putchar...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Господа!

В примерах у ИАРа нашел вывод через печать в строку, а затем - вывод ее через свою специальную процедурку. А как это сделать с использованием потоков?

 

Нужен третий элемент - ОС. :)

Потоки живут там. (Но все их гордо называют задачами :cranky: )

А вот выбор ОС - довольно интимная вещь. В любом случае нужно внимательно изучить ОСиную ветку форума. После этого уже можно будет конкретно обсуждать "портирование" и "драйверописание" для конкретной ОСи.

Что касается "поточной" связи железа с софтом, как правило применяют сервисы ОС - события, ящики, каналы ...

 

Не, в ОС не те потоки. В ОС - это thread'ы. А вопрошающего интересуют те, которые stream'ы. Т.е. потоки ввода/вывода. Которые реализуются на put_char/get_char. И делать их можно как на задачах, так без оных. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за ответ.

Попробую изложить свое видение вопроса.

В начале программы, после инита аппаратуры, мы организуем поток при помощи стандартных функций типа open. После этого, получив указатель на структуру типа файл, получаем указатель (адрес в смысле) на буфер ввода-вывода и все атрибуты файла и указатели буфера. В основной петле имеем процедурку, которая собственно и работает с аппаратурой и кладет/забирает данные буфера ввода-вывода и модифицирует указатели буфера.

После этого основной процесс, обращаясь к потоку, получит все, что нужно.

 

Я правильно понимаю вопрос, или что-то не так? И еще: в доке на ИАР написано, что программа не должна модифицировать поля переменной типа File. Как же быть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну так и не надо их модифицировать самому, ведь для этого и есть функции стандартной библиотеки fopen, fclose, ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нужно модифицировать функции __read и __write в файлах

...\arm\config\template\project\dlib\read.c и write.c;

В конечном счете именно эти функции вызываются из printf, fprintf, puts, gets, scanf и т.п.

 

Если ввод или вывод происходит не через stdin, stdout или stderr - то нужно модифицировать __open, чтобы вернуть handle по которому делать проверку в __read и __write

 

Еще очень полезно ознакомиться с FILE *_Files[FOPEN_MAX];

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

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

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...