Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Мудрый кот
Аватара пользователя
Сообщения: 1812
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

shads писал(а):Если кому то реально нужно параллельно читать 8 датчиков, могу заморочится... мне нравится решать подобные задачки :)...
Если все датчики висят на одном порту, то маской задать нужные биты, далее набираем массив считанных параллельно битов, а потом два цикла (один в другом) чтобы перевести в нормальные байты. Вопрос только в конкретной реализации.
Не знаю как с разбросом временных характеристик у датчиков. Это, пожалуй, единственное с чем могут возникнуть заморочки.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Инженеры ночами не спали, думали - как бы создать протокол и устройства , которые могли бы работать все одновременно на одном проводе - а тут приходят программисты, и давай вешать по датчику на каждую линию 8-битной шины.
Контактная информация:
Реклама
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

Последнее сообщение про 1wire в этой ветке :)...
WiseLord писал(а):Инженеры ночами не спали, думали - как бы создать протокол и устройства , которые могли бы работать все одновременно на одном проводе - а тут приходят программисты, и давай вешать по датчику на каждую линию 8-битной шины.
Чет тон вашего сообщения как то, по моему, не очень правильный...
Во первых - вы ж не запретите программисту программировать просто для удовольствия, то, что может потом и не пригодится... тем более что все программисты тоже проходят этот этап...
Во вторых - данный протокол хоть и рассчитан на параллельное использование датчиков, тем не менее никто не запрещал вешать их на разные линии, тем более если есть хороший запас по ножкам...
Во третьих - не всегда оправдано вешать кучу датчиков на одну линию... например при подключении к разным линиям, отпадает трудность с определением позиций и нумерации конкретных датчиков... а при параллельном подключении нужно как то реализовать привязку датчиков к нумерации.
ks0
Прорезались зубы
Аватара пользователя
Сообщения: 238
Зарегистрирован: Чт фев 28, 2013 14:16:10

Сообщение ks0 »

Gudd-Head писал(а):
Вкусно, но мало. :)
Че-то там фигня какая-то понаписана. Не претендую на истину, с чистым Си, да и вообще, мало дело имел, но все-таки:
1. Глобальные переменные достаточно определить в .h файле и незачем их определять в .с, а потом ссылать на них в .h использую extern.
2. Локальные переменные модуля достаточно определить в .с и слово static для этого не требуется.
3. А вот локальные функции модуля надо определить в .с файле со словом static, тогда они будут недоступны из других файлов.
Реклама
Эиком - электронные компоненты и радиодетали
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18788
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

ks0 писал(а):Че-то там фигня какая-то понаписана. Не претендую на истину, с чистым Си, да и вообще, мало дело имел, но все-таки:
1. Глобальные переменные достаточно определить в .h файле и незачем их определять в .с, а потом ссылать на них в .h использую extern.
2. Локальные переменные модуля достаточно определить в .с и слово static для этого не требуется.
3. А вот локальные функции модуля надо определить в .с файле со словом static, тогда они будут недоступны из других файлов.
ту фигню не читал, а ваш ответ прокомментирую:
1. вы путаете "определение" и "описание". в хидерах все должно ОПИСЫВАТЬСЯ, а ОПРЕДЕЛЯТЬСЯ уже в конкретном модуле. то есть по-хорошему в хидерах не может быть переменных без extern, а в модулях, соответственно, не должно быть переменных с extern.
2. нет, при отсутствии static переменные все равно будут "видимы" из других модулей.
3. вопросов нет.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 20117
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Gudd-Head писал(а):Я думаю, это довольно легко решается за 8*64=512 сдвигов через перенос и дополнительных 64 байт ОЗУ.
Не, не так. Заполняем 64 байта ОЗУ "паралельными" данными и выделяем 8+1 временных регистров. Далее считываем из ОЗУ первый "параллельный" байт и раскидываем его побитно сдвигом через перенос по 8 регистрам. После такого раскидывания первых 8 "параллельных" байт в регистрах у нас будут первые 8 "последовательных" байт, сохраняем их в ОЗУ на место этих самых 8 "параллельных" и проделываем то же самое с байтами 9-16, ..., 56-64. Наверняка кода и времени это займёт немного.

Кстати, слот чтения "0" в 1-Wire не менее 60 мкс, а "1" — 15 мкс. Кто как делает в своих поделках — одинаковое время на чтение "0" и "1", или "1" побыстрее???

И вот ещё один вопрос: где почитать про АСМовские вставки? Как, например, узнать по какому адресу находится та или иная переменная? Как убрать лишнее в конечном коде? И т.п.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Тайм-слот и для "0" и для "1" одинаков по времени, а 60 мкс. - это минимальное его время. Что касается 15-ти мкс. , это время, за которое слейв гарантированно сделает выборку. Т.е. если ты передаёшь "0" и опускаешь линию, то обязан её продержать в этом состоянии минимум 15 мкс, а дальше можешь делать с ней что хочешь. Ну а следующий тайм-слот ты должен начинать только по истечению 60-ти мкс.

По адресам переменных. А для чего знать их адреса ? :dont_know: С переменной можно делать что угодно и не зная её месторасположения.
Друг Кота
Аватара пользователя
Сообщения: 20117
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Аlex писал(а):Т.е. если ты передаёшь "0" и опускаешь линию, то обязан её продержать в этом состоянии минимум 15 мкс, а дальше можешь делать с ней что хочешь. Ну а следующий тайм-слот ты должен начинать только по истечению 60-ти мкс.
Та не. При чтении от слэйва. Т.е. через 15 мкс слэйв выдал "1" — и сразу запускать следующий слот, не ждя ещё 45 мкс.
Аlex писал(а):А для чего знать их адреса ?
Чтобы поизвращаться с ней в АСМовских вставках.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18788
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Gudd-Head писал(а):И вот ещё один вопрос: где почитать про АСМовские вставки? Как, например, узнать по какому адресу находится та или иная переменная? Как убрать лишнее в конечном коде? И т.п.
как всегда, здесь: http://www.simple-devices.ru/articles/7 ... avr-studio последние 2 статьи :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
ks0
Прорезались зубы
Аватара пользователя
Сообщения: 238
Зарегистрирован: Чт фев 28, 2013 14:16:10

Сообщение ks0 »

ARV писал(а): 1. вы путаете "определение" и "описание". в хидерах все должно ОПИСЫВАТЬСЯ, а ОПРЕДЕЛЯТЬСЯ уже в конкретном модуле. то есть по-хорошему в хидерах не может быть переменных без extern, а в модулях, соответственно, не должно быть переменных с extern.
2. нет, при отсутствии static переменные все равно будут "видимы" из других модулей.
Сперва по второму пункту
Пусть есть файл program.c, в нем ссылка #include "module.h"
В module.c объявлена переменная int var=0;
Я утверждаю, что она будет локальной для модуля и не видна из program.c и чтобы её увидеть надо в program.c использовать extern int var;
Вы утверждаете, что ее и так будет видно из program.c?

А по первому, я просто считаю, что объявление переменной это и есть её определение или описание, можно называть как угодно, дважды её объявлять незачем. Но спорить не буду, тем более по терминам.
Держит паяльник хвостом
Аватара пользователя
Сообщения: 960
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда

Сообщение GARMIN »

ks0 писал(а):
ARV писал(а): 1. вы путаете "определение" и "описание".
Пусть есть файл program.c, в нем ссылка #include "module.h"
В module.c объявлена переменная int var=0;
Здесь одновременно и объявление, и определение переменной.
ks0 писал(а):А по первому, я просто считаю, что объявление переменной это и есть её определение или описание, можно называть как угодно, дважды её объявлять незачем. Но спорить не буду, тем более по терминам.
Объявление = указание типа переменной, из него компилятор принимает размер и условия применения переменной:
int s;
char v;
Определение - выделение конкретного места хранения переменной, присвоение ей адреса в памяти.
s = 10;
v = 'h';
Можно совместить полезное в приятным:
int s = 11;
Для внешних переменных не нужно выделять память, достаточно знать их объявления.
Но переменную нужно где-то определить. И *.h файл для этого не место. Иначе везде, где будет включён этот файл, создадутся дубликаты переменной с одним и тем же именем.
Контактная информация:
ks0
Прорезались зубы
Аватара пользователя
Сообщения: 238
Зарегистрирован: Чт фев 28, 2013 14:16:10

Сообщение ks0 »

GARMIN писал(а): Но переменную нужно где-то определить. И *.h файл для этого не место. Иначе везде, где будет включён этот файл, создадутся дубликаты переменной с одним и тем же именем.
А в исходном тексте, на который ссылались на страницу выше, было прописано так:

В module.c
// Глобальные
char GlobalVar1;

А в module.h
// Секция определения глобальных переменных
extern char GlobalVar1;

Все с ног на голову. В .с объявили, в .h че сделали? Переобъявили, чтобы её было видно из файлов, которые включают этот .h?
Из .с объявление выкинуть, а из .h выкинуть extern.
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

GARMIN писал(а):Определение - выделение конкретного места хранения переменной, присвоение ей адреса в памяти.
s = 10;
v = 'h';
На сколько мне известно, это - присваивание переменной значения. А далеко не выделение под переменную памяти.
Или Вы считаете, что одного объявления переменной - int s; не достаточно для выделения ей "места хранения" ?

Какую то Вы, сударь, ерунду тут наговорили... :facepalm:
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

ks0 писал(а):Из .с объявление выкинуть, а из .h выкинуть extern.
:facepalm:
Правильно, нафиг эта переменная вообще нужна - повыкидывать её к чертям, да и делов... :)))
ks0
Прорезались зубы
Аватара пользователя
Сообщения: 238
Зарегистрирован: Чт фев 28, 2013 14:16:10

Сообщение ks0 »

Аlex писал(а):Правильно, нафиг эта переменная вообще нужна - повыкидывать её к чертям, да и делов... :)))
Не домысливайте, объявление char GlobalVar1 оставить, только модификатор extern убрать.
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

ks0 писал(а):объявление char GlobalVar1 оставить, только модификатор extern убрать.
Вы валерьянки что-ли перепили ? Думайте что говорите. Ну или сходите литературку почитайте...

ЗЫ: Товарищи ! Думайте, перед тем, как что-то написать, вас читают начинающие !
ks0
Прорезались зубы
Аватара пользователя
Сообщения: 238
Зарегистрирован: Чт фев 28, 2013 14:16:10

Сообщение ks0 »

Аlex писал(а):Вы валерьянки что-ли перепили ?
Да, аргумент!
А по существу?
Друг Кота
Аватара пользователя
Сообщения: 20117
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Да, а по существу? Да так, чтобы чайникам было понятно :)
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Хорошо, по существу...
Вы предлагаете такой вариант :
Спойлерmodule.h

Код: Выделить всё

char var;     // Без extern

.......
module.c

Код: Выделить всё

include "module.h"

.......
main.c

Код: Выделить всё

include "module.h"

.......
В этом случае, в mai.c и module.c будут созданы отдельные экземпляры переменной var, с разными адресами !
Ибо это равносильно такому варианту :
Спойлерmodule.c

Код: Выделить всё

char var;

.......
main.c

Код: Выделить всё

char var;

.......
Т.к. include - это обычное включение в файл кода, находящегося в другом файле.
ks0
Прорезались зубы
Аватара пользователя
Сообщения: 238
Зарегистрирован: Чт фев 28, 2013 14:16:10

Сообщение ks0 »

Для этого в начале и конце каждого заголовочного файла пишется следующая директива препроцессора

Код: Выделить всё

#ifndef _MODULE_H
#define _MODULE_H

// объявления

#endif
Это гарантирует, что файл обрабатывается компилятором лишь единожды, и никаких дубликатов объявлений не появляется. А без этой конструкции компилятор просто выругается и тоже никаких дубликатов не будет.
Ответить

Вернуться в «Разные вопросы по МК»