Перейти к содержанию
    

winipuh

Участник
  • Постов

    126
  • Зарегистрирован

  • Посещение

Весь контент winipuh


  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. Мне кажется этот вариант был несправедливо проигнорирован. :)
  15. Да Вы чего? Гляньте исходники newlib, bionic... Оптимизированная версия memcpy проверяет выравнивание src и dst и выбирает вариант - копирование LDM/STM блоками по 4 слова, копирование в loop-е по словам, по полусловам, по байтам. У Cortex-A помимо этого еще есть плюшки с Neon-ом... Полагаю, что ТС прекрасно знает это и без нас. И вопрос его, надо полагать, заключается в том, что "WTF? Зачем тупо выбирать самый пессимистичный вариант?" (с учетом того, что эта версия memcpy откуда-то там из линуксового ядра, стало быть писал ее не дурак)... Хотя, надо отметить, что в том же newlib-е подобный вариант тоже присутствует: #if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__) while (len0--) { *dst++ = *src++; }
  16. Eclipse в этом смысле молодец. Навигация по коду там просто замечательная. windows/linux ... Про FreeBSD - этого я не знаю. :) Попутно вопросик. Вот Eclipse в редакторе enum-ы выделяет (подсветка + курсивом). Как это в виме сделать? :)
  17. to Ixt На тамошние цены ориентироваться можно и даже нужно. Разница в цене на несколько баксов и не в пользу LPC2000 (это помимо того, что DMIPS-ов у кортексов поболее). Если Вы работаете не в коммерческой компании, а в каком-нибудь ФГУП-е, то я Вас хорошо понимаю. Там деньги не считают, да и живут в других реалиях. А что внезапно LPC1768 требует иных средств разрабоки, нежели LPC2468? И вообще - реальные пацаны юзают GCC ;) to ДЕЙЛ И? :) Преимущество покупки демоборды со встроенной отладкой - только если борда дешевая. А так: 1) Иметь JTAG отдельно имхо удобнее. Борда - это Вам не девушка. Первой и единственной тут не бывает. 2) Если пересядете на RTOS, то JTAG станет практически бесполезен (в случае ARM7 - однозначно). Будете printf-ами дебажить. Да нет, не глупость. FreeRTOS, TNKernel, uCOS, RTEMS, ECOS, ... тысячи их. Без проблем покупается у стартеркита - почтой наложенным платежом, по карточке (paypal), через киви... Подробности см. на их сайте. Терра раньше приторговывала этими бордами. Сейчас нет. Но есть масса других, диапазон ценников - на выбор. Серия плат STM32 Discovery - для ограниченного бюджета вариант имхо идеальный... Да и на LPC13xx также есть весьма дешевые варианты
  18. Совсем не перспективно. Устарели. Предпочтительнее изучение Cortex-M0/3/4 - LPC17xx/18xx/43xx (NXP), STM32Fxxx (STMicroelectronics), SAM3/4xxx (Atmel), Tiva (Texas Instruments)... тысячи их :) Или даже (если не страшно) - Cortex-A5/8/9 (Sitara, IMX.5/6, SAMA5D3x) Если хочется именно LPC2368 - вот плата 1500 р + JTAG-отладчик 2000 р. Итого - 3500 А если что-то другое - вот например (500 р) и т.п. Cortex-A8 - beaglebone Если интересуют только изданные на русском языке, то нет. Есть знаменитая книга Редькина, но пользуется дурной лавой... Есть книжки на английском - например на сайте Hitex (по LPC24xx), Definitive Guide to ARM Cortex-M3... Однако! Так или иначе придется почитать: - ARM Architecture Reference Manual; - User Manual (Reference Manual, Programmers Manual и т.д.) на используемый камень; - Application notes на камень (примеры настройки периферии, примеры портирования библиотек и т.п.) - Errata Sheet на камень (когда припечет ...) - Работа с периферией потребует понимания, которое придется почерпнуть из соответствующей документации... - Программирование само по себе также требует чтения литературы - язык СИ, общие правила разработки ПО, документация на используемый тулчейн (IAR/Keil/GCC) и проч. Как видите - материала много. Ни в одну книгу не влезет. Если очень хочется Мартина - ну своруйте из инета и почитайте пару дней. А потом - уже через мануалы, по-взрослому! :) Что-то я очень сильно в этом сомневаюсь. Совсем недавно сравнивал на дижикее ценники на LPC24xx и LPC17xx - ощущение прямо противоположное.
  19. В индиго можно перетаскивать, в джуне и кеплере — нет :( Интересно, что именно является багом - возможность перетаскивания или невозможность? :) Узнать бы как эту птичку снять. Она неактивная (серого цвета)... Как решить ребус — пока так не нагуглил... Мне очень нравится индексатор в эклипсе, но из-за этой с консолью шняги пока приходится кое-какие вещи дебажить в visual studio... Так шо как грица "ай нид хелп"! Нет, я вот о чем спрашивал: Эклипс-Европа - Запускаю билд. Вылазит окошко с логом. Билд проходит - окошко остается. Дочитал, кликнул мышкой в редакторе - окошко свернулось. Эклипс-Кеплер - аналогично. Эклипс-Джуно - Билд проходит и окошко тут же само сворачивается. Прочитать не успел... Снова щелкаем мышкой - открываем, читаем... Как эта штука управляется/настраивается - я так и непонял... Кстати еще вопрос. В старом эклипсе европа когда наводишь мышку на дефайн - всплывает окошко с его описанием. Например #define BLOCK_SIZE 32 #define NUM_BLOCKS 4 #define BUF_SIZE BLOCK_SIZE * NUM_BLOCKS Если навести на BUF_SIZE, то в всплывающем окошке будет #define BUF_SIZE BLOCK_SIZE * NUM_BLOCKS Пробовал на других версиях эклипса - в окошке выводится то, что в итоге получится - #define BUF_SIZE 128. Мне удобнее, чтобы выводилось как в первом варианте. Как это настроить?
  20. Добрый вечер! Решил попробовать Eclipse Juno + MinGW (Windows 7). Можно ли в эклипсе настроить, чтобы при запуске программы ввод/вывод осуществлялся через системную консоль винды, а не через встроенную в эклипсе? А то как оказалось нужен вот такой "костыль": setvbuf(stdout, NULL, _IONBF, 0); setvbuf(stderr, NULL, _IONBF, 0); Да и вообще как-то привычнее, чтобы при запуске появлялось черное окошко cmd.exe. Плюс с кодировкой проблемы - при использовании system("pause") абракадабра выводится :( Плюс появилась еще пара мелких вопросов: 1) Хочу, чтобы в окошке текстового редактора когда щелкаю мышкой на номере строки выделялась вся строка. Как это настроить? 2) Как сгруппировать значки fast view (Outline, Call Hierarchy, Tasks и т.п.)? 3) Настроил, чтобы запуске Build автоматически открывалось окошко build console. Как настроить, что окошко не закрывалось сразу же после завершения билда? А то прочитать не успеваю. :) И самое главное - а вы каким эклипсом пользуетесь? Мне нужен в связке с codesourcery для embedd-а и в связке с MinGW для простеньких консольных приложений. Есть ли смысл переходить на Juno, Kepler?
  21. Шутите? :) Мне казалось, что у каждго эмбеддера должен быть и "десктопный" тулчейн. В конце концов можно спокойно и аккуратно отдебажить какие-нибудь алгоритмы (прям на чистом Си), а потом исходники просто и без всяких изменений можно переносить в "embedd" проект... Есессно имею ввиду что-то из Visual Studio Express, CodeBlocks + MinGW или MinGW + плюс "ВашЛюбимыйРедактор"... Все это абсолютно бесплатно, в использовании интуитивно просто и понятно. Трабл то в чем? Не знаете где взять/как установить? Или места на HDD совсем нет? :) Всего навсего нужно написать маленькую консольную прогу, которая сгенерит файл (напр. "fft_table.c") например такого содержания: const int fft_table[] = { 1, 2, 3, 4 }; Ну или static const... Это как удобнее. Файл просто инклюдите у себя в исходниках (#include "fft_table.c"). Компилятор этот const массив поместит в секцию .rodata, которая должна быть в ROM-памяти (во флеше). Требуется только знание Си (который Вы и так уже знаете), плюс немного из стандартной библиотеки - stdio.h (fopen, fclose, fprintf) + math.h (cos, sin). Работы на 5 минут... :) Если что-то подзабыли - откройте справочник по Си Г. Шилдта. Потратите еще 5-10 минут, не более... Финальная стадия - консольную прогу сохраняете в каталоге проекта, в make-файле добавляете fft_table.c в список файлов и добавляете новую цель fft_table.c (зависимостей нет, команда для запуска - запуск этой самой консольной проги, с параметрами или без - это как прогу напишите)... fft_table.c: @fft_generator.exe Вот как-то так...
  22. Хотел было на constexpr (C++11) наживку закинуть :) Но видимо не понял вопроса... Написать на С программку, которая сгенерирует си-файл с инициализированным const массивом - дело 5 минут (stdio.h + math.h). В чем вопрос то? :) Боитесь, что инициализированный const массив все равно будет размещен в ОЗУ?
  23. Шутите? :) #include <math.h> ... tetha = (-R0*A + sqrt((R0*A) * (R0*A) - 4*R*B*(R0-R))) / (2*R0*B);
×
×
  • Создать...