Jump to content

    

winipuh

Участник
  • Content Count

    126
  • Joined

  • Last visited

Community Reputation

0 Обычный

About winipuh

  • Rank
    Частый гость

Контакты

  • Сайт
    Array
  • ICQ
    Array
  1. Регулярно смотрю Avnet, Digikey, Arrow и проч. ZYNQ на складах есть. И цена на них уже упала до 50-60$ (год назад на самые младшие кристаллы в превью было от 150-200). А вот SoC V там нет! Есть позиция. Цены с хилыми синхронизируют. Но 'Quote' везде по нулям...
  2. Злой код

    Без обид, но... Вам сколько лет? :) #include <iostream> #include <fstream> #define _USE_MATH_DEFINES #include <math.h> class SinGen { float amp; float phase_inc; public: SinGen(float amplitude, float frequency, unsigned int rate = 8000) { amp = amplitude; phase_inc = (float(2 * M_PI) * frequency) / rate; } unsigned char getSample(int i) { return 128u + (unsigned char)(amp * sin(phase_inc * i)); } }; typedef union { unsigned short data; struct { unsigned char left; unsigned char right; } chan; } stereo_sample_t; static void sine_test(stereo_sample_t *buf, int num_samples) { SinGen left_ch(65, 10); SinGen right_ch(45, 20); for(int i = 0; i < num_samples; i++) { buf[i].chan.left = left_ch.getSample(i); buf[i].chan.right = right_ch.getSample(i); } } int main(void) { using namespace std; enum {BUF_SIZE = 8000}; stereo_sample_t sine_buf[bUF_SIZE]; sine_test(sine_buf, BUF_SIZE); ofstream SinDataFile; SinDataFile.open("sin.txt"); for (int i = 0; i < BUF_SIZE; i++) { SinDataFile << i << '\t'; SinDataFile << (unsigned)sine_buf[i].chan.left << '\t' << (unsigned)sine_buf[i].chan.right; SinDataFile << endl; } SinDataFile.close(); return 0; }
  3. Злой код

    А что именно Вы ожидали? Тут телепатов нет :) Для начала 1) Есть понятие кол-во отсчетов в секунду — SampleRate (1/SampleRate — это интервал дискретизации) 2) Есть частота генерируемого синуса — Frequency (1/Frequency — это период синуса) Итого — i-ый отсчет синуса выражается так: A * sin(2 * PI * Freq * i / SampleRate) Дело за малым: 1) Перевести эту формулу в С/С++ 2) Подумать/подправить структуры данных, функции и т.д. (чтобы не засрать исходник)... :laughing:
  4. Вы меня не поняли! :( Все бывает в первый раз: 1) Пришлось корректировать разводку — как следствие поменялись функции пинов GPIO... 2) Пришлось добавить новую модель изделия. Немного другая разводка (другие функции пинов). Дерево исходников общее. Собираем либо под одно железо, либо под другое... Имеем например: SbitP(A,5); // вкл.строба записи Допустим теперь строб записи не на GPIOA(Pin_5) а на GPIOB(Pin_12) ... Как будете править исходники? Еще хуже — если править их придется кому-то другому... :( Придется пройтись по сишным файлам и везде строчку SbitP(A,5) поменять на SbitP(B,12). ... Можно, но сложно и некрасиво... А собирать из одного дерева под разное железо - задача в Вашем случае вообще непосильная... :smile3046: Ок? :) Макросы пишутся для того, чтобы обойти эту проблему... Ваши макросы (при все уважении) проблему эту не решают. Теперь объясните — зачем же Вы их придумали? Понял. :)
  5. Возможно Вы удивитесь, но на этапе компиляции не то-что инлайн — даже статические функции разворачиваются в конечное выражение не хуже макросов. Пожалуйста: // СИ: extern void my_func(unsigned int x); static unsigned int my_value(unsigned int n) { return n ? 0x80 : 0x8000; } void call_func(n) { my_func(value(4)); // на самом деле все это вычисляется на этапе компиляции } // ASM: stmfd sp!, {r3, lr} mov r0, #128 // и в итоге получается my_func(0x80) ( 0x80 = 128 ) bl my_func ldmfd sp!, {r3, lr} bx lr .size call_func, .-call_func .ident "GCC: (Sourcery CodeBench Lite 2013.05-23) 4.7.3" Ну и наверное сочту своим долгом повторить еще раз то, что Вам уже говорил MrYuran А так вот что имеем: RbitP(A,7); // вкл. на запись адреса A0=0 SbitP(A,5); // вкл.строба записи Вопрос: Что будете делать, если Вам потребуется перенести пины с GPIOA на GPIOB? Что будете делать, если Вам потребуется использовать для строба записи на Pin5, а напр. Pin8? Правильный вариант — это когда для этого нужно открыть некий h-файл и поправить там несколько строчек. В вашем случае - править придется все места, где вызываются макросы SbitP, RbitP и т.д. И в этом случае (при всем уважении) Ваши макросы — просто какая-то обертка, чтобы писать меньше букв кода. Преимущество, мягко говоря, весьма сомнительное...
  6. Злой код

    А Вы приведите тут варнинг как он есть, на английском. Попутно А Вы там с union не перемудрили? Надо то и всего Massine = ch[0] | ((unsigned int)ch[1] << 8) ... Зачем используете int для Massine, если на каждый сэмпл используется только 2 байта (по байту на канал). Оставшиеся 4000 байт врагу подарите? :) float pi = 3.14 — это не наш метод! Про дефайн "M_PI" в хедере math.h знаете? Как насчет такого кода (ver.2): #include <stdio.h> #include <stdlib.h> #define _USE_MATH_DEFINES // это нужно только для VisualStudio #include <math.h> typedef union { unsigned short data; struct { unsigned char left; unsigned char right; } chan; } stereo_sample_t; struct sine_param { float amp_vol; float period; }; static unsigned char get_sine_sample(const struct sine_param *p, int i) { return 128u + (unsigned char)(p->amp_vol * sin(M_PI * p->period * i)); } static void sine_test(stereo_sample_t buf[], int num_samples) { struct sine_param left_ch = {65, 20}; struct sine_param right_ch = {45, 30}; int i; for(i = 0; i < num_samples; i++) { buf[i].chan.left = get_sine_sample(&left_ch, i); buf[i].chan.right = get_sine_sample(&right_ch, i); } } int main(void) { stereo_sample_t Massine[8000]; sine_test(Massine, sizeof(Massine) / sizeof(Massine[0])); return 0; } Так вот немного приятнее...
  7. У кого, например? :) На efind таких предложений что-то пока не нашел (там либо без цены, либо с ценой > 25000 руб.)
  8. :blink: Да? Может у него что-то свое есть специфическое... типа __inline__ и т.п.? BSRR - управляет 16-тью пинками GPIO. Младшие 16 бит отвечают за установку пинов в "1", старшие 16 - за установку в "0". Можно одной записью одновременно установить и сбросить несколько разных пинов... А вышеприведенная (и, возможно, местами изъебисто написанная) конструкция буквально означает следующее: // n - номер GPIO-пина (от 0 до 15) #define SET_PIN(n) (0x0001 << (n)) #define CLR_PIN(n) (0x0100 << (n)) // ну или так — (0x0001 << ((n) + 16)) // какой-то конкретный пин #define LCD_wr1_pin 4 // Функция для установки/сброса какого-то конкретного пина static inline void LCD_wr1(const char value) { if (value) GPIOB->BSRR = SET_PIN(LCD_wr1_pin); else GPIOB->BSRR = CLR_PIN(LCD_wr1_pin); }
  9. Борда появилась в каталоге Терры. Но тоже pre-order. И ценой 20к рублей (2 х 249$)... :( Не подскажете, эти дешевые киты на CycloneV/Zynq уже более-менее стабильно продаются? Или везде их только анонсируют?
  10. Я не придраться :( Просто уже и раньше кое-где встречал наподобие void func(const int x) { .... } Например, в исходниках scmRTOS. Теперь вот и у Паши (уважаемого, надо сказать, человека :)). Вот я и спрашиваю... Вдруг в этом есть какой-то глубокий смысл, а я и не в курсе... :laughing:
  11. Всего два вопроса: А зачем у аргумента функции квалификатор const? Тут же параметр не по ссылке передается, а по значению. :blink: 1 << (LCD_WR1_pin + value ? 0 : 16); <— Вы тут часом скобочки не забыли? :) Я о том, что приоритет операции "+" выше, чем у тернарной операции "?:" Надо бы так: 1 << (LCD_WR1_pin + (value ? 0 : 16));
  12. Так или иначе, а между перед ЦАП-ом нужно FIFO, данные из которого читаются по внешнему клоку (от ЦАП-а) строго каждые 12.5 ns, а пишутся более-менее регулярно burst-ами. Полагаю на МК такое хрен сделаешь. Даже если прерываниями дергать DMA чтобы он записывал в GPIO OUT - сэмплы все равно будут выставляться с джиттером не менее 20-30 ns из-за коллизий на внутренней шине данных. На PRUSS кстати тоже видимо не получится (по той же причине — двухпортовой памяти там кажется нет). Так что можно не парится и сразу переходить к варианту "Б" - на FPGA. Тем более, что напр. у Spartan-6 SDRAM-контроллер уже есть встроенный. xlx_s6_lx9_microboard_pb040811.pdf :bb-offtopic: А что это за opensource-проект будет? :)
  13. А ЦАП какой? Ссылку на даташит можете скинуть? Тут еще вопрос какой допустимый джиттер с выставлением сэмплов? Хотел было еще про PSoC 5 вспомнить, но... цена у них... дешевле мк + нормальная fpga
  14. Может посмотреть в сторону техасовских ситар с PRUSS-модулями? AM18xx например (но не AM17xx - у этих PRUSS доступа пинам не имеют). Кстати тут уже предлагали LPC43xx. Принцип такой же - cm0 пинами дрыгает, cm4 - в буфер подкидывает + USB/LAN. Мне кажется этот вариант был несправедливо проигнорирован. :)