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? Т.е. надо Преобразовать строку так, что бы каждый символ старой строки отображался шестнадцатеричным значением кода символа в новой?