Страница 43 из 386
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср сен 28, 2011 20:07:46
Аlex
до прихода байта или до определенного превышением таймером определенного порога
Может тогда так
?
пока((таймер меньше 100)
И (ничего по усарту не пришло)) зациклить;
Как только одно из условий будет
= false, программа выйдет из цикла и продолжит выполнение.
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт сен 29, 2011 09:00:18
skader
Написать можно 1000 и одним способом, меня более интересует работоспособность и глюкавость первоначальной конструкции.
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт сен 29, 2011 11:43:35
Аlex
skader писал(а):Написать можно 1000 и одним способом, меня более интересует работоспособность и глюкавость первоначальной конструкции.
Выражение, представленное Вами, работоспособно, но не для Вашей задачи. Я не зря спросил что Вы хотите от него получить.
Вам нужно ставить
&& (И), а не
|| (ИЛИ).
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср окт 05, 2011 22:33:47
slavokhire5
подскажите пожалуйста учебник на языке Си для начинающих. только читабельный

Re: Вопросы по С/С++ (СИ)
Добавлено: Ср окт 05, 2011 22:36:28
Arlleex
Б. Керниган. Д. Ричи - Язык программирования Си
Это авторы языка Си.
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт окт 06, 2011 08:45:23
Gudd-Head
Arlleex писал(а):Это авторы языка Си.
А Страуструп?
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт окт 06, 2011 08:46:51
Мастер Ломастер
Gudd-Head писал(а):Arlleex писал(а):Это авторы языка Си.
А Страуструп?
С++
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт окт 06, 2011 08:49:45
Gudd-Head
Мастер Ломастер писал(а):С++
Я так и думал.

Re: Вопросы по С/С++ (СИ)
Добавлено: Чт окт 06, 2011 18:40:39
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. Какой хороший компилятор + отладчик посоветуете для изучения С++ ?
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт окт 07, 2011 10:30:07
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;
(с) Приучен комсомолом и страной застегивать бюстгальтер за спиной.

Re: Вопросы по С/С++ (СИ)
Добавлено: Сб окт 08, 2011 06:34:31
kierto
Здравствуйте люди.

Я почти месяц назад начал изучать AVR и программирование на С. Немного разобрался, написал "мигалку" "пищалку"...
Но у меня изначально была идея написать аудио плеер-семплер, который бы мог проигрывать ВАВки с карты памяти с разными функциями (скорость, направление, loop режим и тд) У меня в голове не укладывается, как организовать такого рода программу
Мне кажется надо разбить ее на подпрограммы - например:
-опрос энкодеров и кнопок
-воспроизведение файла
-вывод информации на дисплей
Но как сделать чтобы они выполнялись вместе и не мешали друг другу?
Посоветуйте пожалуйста блок схему или принцип построения сложных программ.
З.Ы. А возможно ли проигрывать сразу два файла с SD карты микшируя их программно?
Нужно ли заносить файл в оперативку перед проигрыванием или можно играть прям с карты?
Спасибо.
Кстати контроллер ATmega8 пишу в WinAVR
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб окт 08, 2011 10:31:24
IfoR
Ну тут можно организовать псевдомногопоточность. В простейшем случае я это делаю так. Все процессы я оформляю в виде функций, которые, при их вызове, выполняют какую либо свою задачу (например, опрос кнопок). Условие здесь такое: функция не должна выполняться долго, т.к. пока она выполняется, другие процессы ожидают её завершения в своей очереди. Например: у нас есть процесс, который обновляет дисплей. Если полная процедура выполняется слишком долго, то эту процедуру придётся как-то разбивать на части. Как пример: если в процессе используются длительные задержки, то нет смысла их организовывать в виде _delay_ms(); Лучше прервать процесс и продолжить его выполнение с данного этапа через это же время, за которые успеют выполниться несколько других процессов.
Ну это только одна половина. Вторая же состоит в том, что нужно написать обработчик этих процедур, который будет вызывать на обработку нужные процессы в нужно время. В простейшем случае это будет самый бестолковый обработчик в виде бесконечного цикла, в котором по очереди вызываются процессы: while(1) {Process1(); Process2(); Process3(); ...}
Тогда управление каждому процессу будет передаваться в порядке очереди по мере возможности. Более умный обработчик, который я делал ещё на асме, у меня состоял из таких частей:
1) Динамическая таблица процессов, в которой хранились данные о адресе процесса, данные для выдерживания периода запуска процесса (счётчик времени и установленное время), флаги о готовности запуска и одноразового выполнения.
2) Сам обработчик в виде прерывания от таймера. Он обходил список процессов и обновлял счётчики времени для каждого. Если полученное время совпадало с установленным, то ставился флаг о готовности запуска.
3) Сторонняя функция обработчика, которая запускалась не в прерывании, а в главной функции в бесконечном цикле. Она продолжала функциональность обработчика: обходила список процессов и выискивала те, у которых стоял флаг готовности к запуску. Их она по очереди в списке и запускала на выполнения. После этого флаг готовности со счётчиком времени сбрасывался, а если стоял флаг одноразового запуска, то она просто удалялась из списка (в поле адреса для неё вбивался 0, и обработчики, встретив такой 0-ой адрес просто пропускали эту строчку).
4) Всякие функции управления списком процессов (Поиск номера процесса по его адресу (кстати, если передать этой функции в качестве адреса 0, то она возвратит первый попавшийся номер строки, в которой адрес и равняется 0, а эта строка по условию пуста и в неё можно записать какой-нить новый процесс), добавление нового процесса, удаление процесса, изменение параметров процесса (в том числе и адреса)) и функции управления собственно обработчиком (останов и запуск таймера обработчика, для процессов требовательных ко времени: прерывание от таймере может вызваться во время выполнения этого процесса, а обработчик сам тоже занимает некоторое время на обход таблицы процессов).
С таким обработчиком даже на асме управление процессами сводилось к элементарным действиям.
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб окт 08, 2011 17:11:34
kierto
Спасибо. Буду пробовать.
У меня звук, генерируемый ШИМ, искожается от побочных функций. Я генерирую треугольник, все нормально. А когда ставлю прерывания на обработку кнопки (прерывание делаю с предделителем на 1024 по переполнению 0хФФ т.е. редко) Звук поганится при нажимании
Я планирую музыкальный инструмент, а значит звук должен быть ровный хотя бы на слух, а при нажатии кнопки тут происходит "тр р р р... " в тон звучания подмешивается несколько тактов на обработку кнопки(((
Может процессор я выбрал слабый для этих целей - ATmega8 сейчас эксперементирую на частоте 8Mhz.
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб окт 08, 2011 23:10:50
Antifritz
Да, звук будет поганится. Я бы в таком случае использовал два МК: один считывает клавиатуру и работает с дисплеем, а второй отвечает непосредственно за воспроизведение. В такой конфигурации можно вначале что-угодно наклацать, а потом "отправить" его на воспроизведение. При этом воспроизведение ничего не тормознет ибо опрос большой динамической клавиатуры и тем более работа с дисплеями-функции требующие использования задержек.
По поводу воспроизведения файлов
вот примерчик.
Re: Вопросы по С/С++ (СИ)
Добавлено: Вс окт 09, 2011 10:44:58
Мастер Ломастер
да ладно вам, поганится... если программа кривая - поганиться будет все, что угодно. поглядите на пример нормально работающего музыкального инструмента, который ничего не поганит:
http://www.pic24.ru/doku.php/osa/articles/pk2_osa_piano
Re: Вопросы по С/С++ (СИ)
Добавлено: Вс окт 09, 2011 15:38:06
Antifritz
ну так ведь здесь тоже работа с клавиатурой(ничего так система) организована программно, а генерация звука аппаратно, на периферии. Так как воспроизводить файл периферия низких ATMega не может(хотя продвинутые МК могут и со звуком и с видео работать) я предложил сделать "аппаратное" воспроизведение на втором МК.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн окт 10, 2011 08:05:49
IfoR
В принципе, если процессу воспроизведения дать приоритет больше, т.е. написать обработчик так, что бы он первым делом запускал этот процесс, если он готов, и организация времени для других процессов тоже будет хорошая, то искажения будут не такие уж и большие. Ну только тогда, соответственно, будет тормозить всё остальное. Но это в теории. На практике не делал.
Но если нажатие кнопки обрабатывается по прерыванию, то, может быть как вариант решения, поставить где нить отметку о нажатии кнопки, а само прерывание быстро завершить. Саму же кнопку обработать в свободное время.
Ещё путь к "уменьшению" искажений: уменьшение частоты дискретизации. Более верный вариант: повышение частоты кристалла. Возможно: переход на параллельный ЦАП, но думаю, в силу аппаратности ШИМ, это не сильно поможет.
А вообще действительно, лучший вариант, это разделение задач на два кристалла: первый отвечает за синтез звука, второй за всю остальную периферию.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн окт 10, 2011 19:15:11
kierto
Спасибо. Так и думал, что надо несколько МК использовать.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн окт 10, 2011 20:46:36
inkHunter
Как преобразовать строку символов в HEX ?
Re: Вопросы по С/С++ (СИ)
Добавлено: Вт окт 11, 2011 07:30:51
IfoR
Дык, вы бы поконкретнее вопрос бы задали. Это же не форум телепатов-электронщиков. Всмысле строку в HEX? Т.е. надо Преобразовать строку так, что бы каждый символ старой строки отображался шестнадцатеричным значением кода символа в новой?