skader писал(а):Написать можно 1000 и одним способом, меня более интересует работоспособность и глюкавость первоначальной конструкции.
Выражение, представленное Вами, работоспособно, но не для Вашей задачи. Я не зря спросил что Вы хотите от него получить.
Вам нужно ставить && (И), а не || (ИЛИ).
1. *A узказатель на тип А, правильно ?
2. pA переменная типа А, правильно ?
3. Присваеваем pA новый адрес 0x00.
4. Присваеваем переменой поля структуры w=1, которая будет начинаться по адресу 0х00 структурной переменной pA, првильно?
5. Переменная q будет расположена по адресу 0х03 ?
5. Какой хороший компилятор + отладчик посоветуете для изучения С++ ?
давайте вначале разберем то, что Вы написали.
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;
(с) Приучен комсомолом и страной застегивать бюстгальтер за спиной.
Здравствуйте люди. Я почти месяц назад начал изучать AVR и программирование на С. Немного разобрался, написал "мигалку" "пищалку"...
Но у меня изначально была идея написать аудио плеер-семплер, который бы мог проигрывать ВАВки с карты памяти с разными функциями (скорость, направление, loop режим и тд) У меня в голове не укладывается, как организовать такого рода программу
Мне кажется надо разбить ее на подпрограммы - например:
-опрос энкодеров и кнопок
-воспроизведение файла
-вывод информации на дисплей
Но как сделать чтобы они выполнялись вместе и не мешали друг другу?
Посоветуйте пожалуйста блок схему или принцип построения сложных программ.
З.Ы. А возможно ли проигрывать сразу два файла с SD карты микшируя их программно?
Нужно ли заносить файл в оперативку перед проигрыванием или можно играть прям с карты?
Спасибо.
Ну тут можно организовать псевдомногопоточность. В простейшем случае я это делаю так. Все процессы я оформляю в виде функций, которые, при их вызове, выполняют какую либо свою задачу (например, опрос кнопок). Условие здесь такое: функция не должна выполняться долго, т.к. пока она выполняется, другие процессы ожидают её завершения в своей очереди. Например: у нас есть процесс, который обновляет дисплей. Если полная процедура выполняется слишком долго, то эту процедуру придётся как-то разбивать на части. Как пример: если в процессе используются длительные задержки, то нет смысла их организовывать в виде _delay_ms(); Лучше прервать процесс и продолжить его выполнение с данного этапа через это же время, за которые успеют выполниться несколько других процессов.
Ну это только одна половина. Вторая же состоит в том, что нужно написать обработчик этих процедур, который будет вызывать на обработку нужные процессы в нужно время. В простейшем случае это будет самый бестолковый обработчик в виде бесконечного цикла, в котором по очереди вызываются процессы: while(1) {Process1(); Process2(); Process3(); ...}
Тогда управление каждому процессу будет передаваться в порядке очереди по мере возможности. Более умный обработчик, который я делал ещё на асме, у меня состоял из таких частей:
1) Динамическая таблица процессов, в которой хранились данные о адресе процесса, данные для выдерживания периода запуска процесса (счётчик времени и установленное время), флаги о готовности запуска и одноразового выполнения.
2) Сам обработчик в виде прерывания от таймера. Он обходил список процессов и обновлял счётчики времени для каждого. Если полученное время совпадало с установленным, то ставился флаг о готовности запуска.
3) Сторонняя функция обработчика, которая запускалась не в прерывании, а в главной функции в бесконечном цикле. Она продолжала функциональность обработчика: обходила список процессов и выискивала те, у которых стоял флаг готовности к запуску. Их она по очереди в списке и запускала на выполнения. После этого флаг готовности со счётчиком времени сбрасывался, а если стоял флаг одноразового запуска, то она просто удалялась из списка (в поле адреса для неё вбивался 0, и обработчики, встретив такой 0-ой адрес просто пропускали эту строчку).
4) Всякие функции управления списком процессов (Поиск номера процесса по его адресу (кстати, если передать этой функции в качестве адреса 0, то она возвратит первый попавшийся номер строки, в которой адрес и равняется 0, а эта строка по условию пуста и в неё можно записать какой-нить новый процесс), добавление нового процесса, удаление процесса, изменение параметров процесса (в том числе и адреса)) и функции управления собственно обработчиком (останов и запуск таймера обработчика, для процессов требовательных ко времени: прерывание от таймере может вызваться во время выполнения этого процесса, а обработчик сам тоже занимает некоторое время на обход таблицы процессов).
С таким обработчиком даже на асме управление процессами сводилось к элементарным действиям.
Последний раз редактировалось IfoR Пн окт 10, 2011 08:09:28, всего редактировалось 1 раз.
Спасибо. Буду пробовать.
У меня звук, генерируемый ШИМ, искожается от побочных функций. Я генерирую треугольник, все нормально. А когда ставлю прерывания на обработку кнопки (прерывание делаю с предделителем на 1024 по переполнению 0хФФ т.е. редко) Звук поганится при нажимании
Я планирую музыкальный инструмент, а значит звук должен быть ровный хотя бы на слух, а при нажатии кнопки тут происходит "тр р р р... " в тон звучания подмешивается несколько тактов на обработку кнопки(((
Может процессор я выбрал слабый для этих целей - ATmega8 сейчас эксперементирую на частоте 8Mhz.
Да, звук будет поганится. Я бы в таком случае использовал два МК: один считывает клавиатуру и работает с дисплеем, а второй отвечает непосредственно за воспроизведение. В такой конфигурации можно вначале что-угодно наклацать, а потом "отправить" его на воспроизведение. При этом воспроизведение ничего не тормознет ибо опрос большой динамической клавиатуры и тем более работа с дисплеями-функции требующие использования задержек.
По поводу воспроизведения файлов вот примерчик.
да ладно вам, поганится... если программа кривая - поганиться будет все, что угодно. поглядите на пример нормально работающего музыкального инструмента, который ничего не поганит: http://www.pic24.ru/doku.php/osa/articles/pk2_osa_piano
битва с дураками проиграна, победители торжествуют. слава победителям!
ну так ведь здесь тоже работа с клавиатурой(ничего так система) организована программно, а генерация звука аппаратно, на периферии. Так как воспроизводить файл периферия низких ATMega не может(хотя продвинутые МК могут и со звуком и с видео работать) я предложил сделать "аппаратное" воспроизведение на втором МК.
В принципе, если процессу воспроизведения дать приоритет больше, т.е. написать обработчик так, что бы он первым делом запускал этот процесс, если он готов, и организация времени для других процессов тоже будет хорошая, то искажения будут не такие уж и большие. Ну только тогда, соответственно, будет тормозить всё остальное. Но это в теории. На практике не делал.
Но если нажатие кнопки обрабатывается по прерыванию, то, может быть как вариант решения, поставить где нить отметку о нажатии кнопки, а само прерывание быстро завершить. Саму же кнопку обработать в свободное время.
Ещё путь к "уменьшению" искажений: уменьшение частоты дискретизации. Более верный вариант: повышение частоты кристалла. Возможно: переход на параллельный ЦАП, но думаю, в силу аппаратности ШИМ, это не сильно поможет.
А вообще действительно, лучший вариант, это разделение задач на два кристалла: первый отвечает за синтез звука, второй за всю остальную периферию.
Дык, вы бы поконкретнее вопрос бы задали. Это же не форум телепатов-электронщиков. Всмысле строку в HEX? Т.е. надо Преобразовать строку так, что бы каждый символ старой строки отображался шестнадцатеричным значением кода символа в новой?