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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

до прихода байта или до определенного превышением таймером определенного порога
Может тогда так

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

while ( (TMR1H<100) && (!RCIF) ) continue;
?
пока((таймер меньше 100) И (ничего по усарту не пришло)) зациклить;

Как только одно из условий будет = false, программа выйдет из цикла и продолжит выполнение.
skader
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Чт дек 23, 2010 19:40:47

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

Сообщение skader »

Написать можно 1000 и одним способом, меня более интересует работоспособность и глюкавость первоначальной конструкции.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

skader писал(а):Написать можно 1000 и одним способом, меня более интересует работоспособность и глюкавость первоначальной конструкции.
Выражение, представленное Вами, работоспособно, но не для Вашей задачи. Я не зря спросил что Вы хотите от него получить.
Вам нужно ставить && (И), а не || (ИЛИ).
Аватара пользователя
slavokhire5
Прорезались зубы
Сообщения: 202
Зарегистрирован: Пн сен 26, 2011 13:48:25
Откуда: Харьков

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

Сообщение slavokhire5 »

подскажите пожалуйста учебник на языке Си для начинающих. только читабельный :))
Осилит дорогу идущий
--------------------------
Пишу на Си за еду
Arlleex
Друг Кота
Сообщения: 4435
Зарегистрирован: Сб мар 07, 2009 20:44:36

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

Сообщение Arlleex »

Б. Керниган. Д. Ричи - Язык программирования Си
Это авторы языка Си.
Не умеешь - не берись, но не взявшись не научишься...
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

Arlleex писал(а):Это авторы языка Си.

А Страуструп?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

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

Сообщение Мастер Ломастер »

Gudd-Head писал(а):
Arlleex писал(а):Это авторы языка Си.

А Страуструп?
С++
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

Мастер Ломастер писал(а):С++

Я так и думал. :)
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
inkHunter
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб авг 21, 2010 20:44:27
Откуда: Ростов
Контактная информация:

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

Сообщение inkHunter »

typedef struct st
{
int w;
char q;
}g,*A;

int main()
{

A pA =(A)0x00;
pA->w=1;

return 0;
}


1. *A узказатель на тип А, правильно ?
2. pA переменная типа А, правильно ?
3. Присваеваем pA новый адрес 0x00.
4. Присваеваем переменой поля структуры w=1, которая будет начинаться по адресу 0х00 структурной переменной pA, првильно?
5. Переменная q будет расположена по адресу 0х03 ?

5. Какой хороший компилятор + отладчик посоветуете для изучения С++ ?
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

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

Сообщение urry »

давайте вначале разберем то, что Вы написали.
typedef struct st
{
int w;
char q;
}g,*A;
typedef - синоним объекта с именем st и типом g.
Одновременно как бы выделяется память на неинициализированный указатель на этот объект с именем А.
К этому моменту объект физически не существует, описан его тип.
Можно при создании его проинициализировать какими-то значениями, например, если бы внутри был указатель
на какой-либо объект, неплохо было бы его обнулить.
Ставим конструктор
typedef struct st
{
int w;
char q;
st()
{
w=2;
q='1';
}
}g,*A;

Все, теперь где-то в программе его создаем
g strG; // вот теперь он физически существует
// создаем указатель
A pA;
// инициализируем указатель
pA=&strG;
// пользуемся
pA->w=7;
strG.w=9;
//----------
Забудьте о физических адресах, это не Ваше дело, где оно создано.
Максимум, что Вы можете выбрать, это место, где создать объект - на стеке или в куче.
в куче
A pA = new g();
pA->w=7;
и не забывайте чистить после себя
delete pA;
(с) Приучен комсомолом и страной застегивать бюстгальтер за спиной.
:)
kierto
Родился
Сообщения: 5
Зарегистрирован: Пт окт 07, 2011 18:33:45
Откуда: Санкт-Петербург

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

Сообщение kierto »

Здравствуйте люди. :) Я почти месяц назад начал изучать AVR и программирование на С. Немного разобрался, написал "мигалку" "пищалку"...
Но у меня изначально была идея написать аудио плеер-семплер, который бы мог проигрывать ВАВки с карты памяти с разными функциями (скорость, направление, loop режим и тд) У меня в голове не укладывается, как организовать такого рода программу :dont_know:
Мне кажется надо разбить ее на подпрограммы - например:
-опрос энкодеров и кнопок
-воспроизведение файла
-вывод информации на дисплей
Но как сделать чтобы они выполнялись вместе и не мешали друг другу?
Посоветуйте пожалуйста блок схему или принцип построения сложных программ.

З.Ы. А возможно ли проигрывать сразу два файла с SD карты микшируя их программно?
Нужно ли заносить файл в оперативку перед проигрыванием или можно играть прям с карты?
Спасибо.

Кстати контроллер ATmega8 пишу в WinAVR
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

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

Сообщение IfoR »

Ну тут можно организовать псевдомногопоточность. В простейшем случае я это делаю так. Все процессы я оформляю в виде функций, которые, при их вызове, выполняют какую либо свою задачу (например, опрос кнопок). Условие здесь такое: функция не должна выполняться долго, т.к. пока она выполняется, другие процессы ожидают её завершения в своей очереди. Например: у нас есть процесс, который обновляет дисплей. Если полная процедура выполняется слишком долго, то эту процедуру придётся как-то разбивать на части. Как пример: если в процессе используются длительные задержки, то нет смысла их организовывать в виде _delay_ms(); Лучше прервать процесс и продолжить его выполнение с данного этапа через это же время, за которые успеют выполниться несколько других процессов.
Ну это только одна половина. Вторая же состоит в том, что нужно написать обработчик этих процедур, который будет вызывать на обработку нужные процессы в нужно время. В простейшем случае это будет самый бестолковый обработчик в виде бесконечного цикла, в котором по очереди вызываются процессы: while(1) {Process1(); Process2(); Process3(); ...}
Тогда управление каждому процессу будет передаваться в порядке очереди по мере возможности. Более умный обработчик, который я делал ещё на асме, у меня состоял из таких частей:
1) Динамическая таблица процессов, в которой хранились данные о адресе процесса, данные для выдерживания периода запуска процесса (счётчик времени и установленное время), флаги о готовности запуска и одноразового выполнения.
2) Сам обработчик в виде прерывания от таймера. Он обходил список процессов и обновлял счётчики времени для каждого. Если полученное время совпадало с установленным, то ставился флаг о готовности запуска.
3) Сторонняя функция обработчика, которая запускалась не в прерывании, а в главной функции в бесконечном цикле. Она продолжала функциональность обработчика: обходила список процессов и выискивала те, у которых стоял флаг готовности к запуску. Их она по очереди в списке и запускала на выполнения. После этого флаг готовности со счётчиком времени сбрасывался, а если стоял флаг одноразового запуска, то она просто удалялась из списка (в поле адреса для неё вбивался 0, и обработчики, встретив такой 0-ой адрес просто пропускали эту строчку).
4) Всякие функции управления списком процессов (Поиск номера процесса по его адресу (кстати, если передать этой функции в качестве адреса 0, то она возвратит первый попавшийся номер строки, в которой адрес и равняется 0, а эта строка по условию пуста и в неё можно записать какой-нить новый процесс), добавление нового процесса, удаление процесса, изменение параметров процесса (в том числе и адреса)) и функции управления собственно обработчиком (останов и запуск таймера обработчика, для процессов требовательных ко времени: прерывание от таймере может вызваться во время выполнения этого процесса, а обработчик сам тоже занимает некоторое время на обход таблицы процессов).

С таким обработчиком даже на асме управление процессами сводилось к элементарным действиям.
Последний раз редактировалось IfoR Пн окт 10, 2011 08:09:28, всего редактировалось 1 раз.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
kierto
Родился
Сообщения: 5
Зарегистрирован: Пт окт 07, 2011 18:33:45
Откуда: Санкт-Петербург

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

Сообщение kierto »

Спасибо. Буду пробовать.
У меня звук, генерируемый ШИМ, искожается от побочных функций. Я генерирую треугольник, все нормально. А когда ставлю прерывания на обработку кнопки (прерывание делаю с предделителем на 1024 по переполнению 0хФФ т.е. редко) Звук поганится при нажимании :cry:

Я планирую музыкальный инструмент, а значит звук должен быть ровный хотя бы на слух, а при нажатии кнопки тут происходит "тр р р р... " в тон звучания подмешивается несколько тактов на обработку кнопки(((
Может процессор я выбрал слабый для этих целей - ATmega8 сейчас эксперементирую на частоте 8Mhz.
Аватара пользователя
Antifritz
Прорезались зубы
Сообщения: 222
Зарегистрирован: Чт июл 08, 2010 01:03:40
Откуда: Украина, Киев

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

Сообщение Antifritz »

Да, звук будет поганится. Я бы в таком случае использовал два МК: один считывает клавиатуру и работает с дисплеем, а второй отвечает непосредственно за воспроизведение. В такой конфигурации можно вначале что-угодно наклацать, а потом "отправить" его на воспроизведение. При этом воспроизведение ничего не тормознет ибо опрос большой динамической клавиатуры и тем более работа с дисплеями-функции требующие использования задержек.
По поводу воспроизведения файлов вот примерчик.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

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

Сообщение Мастер Ломастер »

да ладно вам, поганится... если программа кривая - поганиться будет все, что угодно. поглядите на пример нормально работающего музыкального инструмента, который ничего не поганит: http://www.pic24.ru/doku.php/osa/articles/pk2_osa_piano
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
Antifritz
Прорезались зубы
Сообщения: 222
Зарегистрирован: Чт июл 08, 2010 01:03:40
Откуда: Украина, Киев

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

Сообщение Antifritz »

Мастер Ломастер писал(а): пример нормально работающего музыкального инструмента, который ничего не поганит: http://www.pic24.ru/doku.php/osa/articles/pk2_osa_piano

ну так ведь здесь тоже работа с клавиатурой(ничего так система) организована программно, а генерация звука аппаратно, на периферии. Так как воспроизводить файл периферия низких ATMega не может(хотя продвинутые МК могут и со звуком и с видео работать) я предложил сделать "аппаратное" воспроизведение на втором МК.
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

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

Сообщение IfoR »

В принципе, если процессу воспроизведения дать приоритет больше, т.е. написать обработчик так, что бы он первым делом запускал этот процесс, если он готов, и организация времени для других процессов тоже будет хорошая, то искажения будут не такие уж и большие. Ну только тогда, соответственно, будет тормозить всё остальное. Но это в теории. На практике не делал.
Но если нажатие кнопки обрабатывается по прерыванию, то, может быть как вариант решения, поставить где нить отметку о нажатии кнопки, а само прерывание быстро завершить. Саму же кнопку обработать в свободное время.
Ещё путь к "уменьшению" искажений: уменьшение частоты дискретизации. Более верный вариант: повышение частоты кристалла. Возможно: переход на параллельный ЦАП, но думаю, в силу аппаратности ШИМ, это не сильно поможет.

А вообще действительно, лучший вариант, это разделение задач на два кристалла: первый отвечает за синтез звука, второй за всю остальную периферию.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
kierto
Родился
Сообщения: 5
Зарегистрирован: Пт окт 07, 2011 18:33:45
Откуда: Санкт-Петербург

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

Сообщение kierto »

Спасибо. Так и думал, что надо несколько МК использовать.
inkHunter
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб авг 21, 2010 20:44:27
Откуда: Ростов
Контактная информация:

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

Сообщение inkHunter »

Как преобразовать строку символов в HEX ?
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

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

Сообщение IfoR »

Дык, вы бы поконкретнее вопрос бы задали. Это же не форум телепатов-электронщиков. Всмысле строку в HEX? Т.е. надо Преобразовать строку так, что бы каждый символ старой строки отображался шестнадцатеричным значением кода символа в новой?
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Ответить

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