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

winipuh

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

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

  • Посещение

Сообщения, опубликованные winipuh


  1. А кто нибудь вообще использует Альтеровский SoC в реальных проектах? На Zynq'e уже видел в интернете железяки, а вот на C5(А5) SOC - нет. :laughing:

    Регулярно смотрю 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;
    }
    

    post-74189-1386087693_thumb.jpg

  3. В файл пишется ерунда всякая, но не то что ожидалось...
    А что именно Вы ожидали? Тут телепатов нет :)

     

    Для начала

    ampvol_ch1*sin(i*pi*period_ch1)

    1) Есть понятие кол-во отсчетов в секунду — SampleRate (1/SampleRate — это интервал дискретизации)

    2) Есть частота генерируемого синуса — Frequency (1/Frequency — это период синуса)

    Итого — i-ый отсчет синуса выражается так: A * sin(2 * PI * Freq * i / SampleRate)

     

    Дело за малым:

    1) Перевести эту формулу в С/С++

    2) Подумать/подправить структуры данных, функции и т.д. (чтобы не засрать исходник)...

    :laughing:

  4. #define SbitP(Port,Nbit)    GPIO##Port->BSRR=GPIO_BSRR_BS##Nbit

    вместо Port подставляем букву порта, второй параметр - номер пина. И ничего править не надо.

    Вы меня не поняли! :(

     

    Все бывает в первый раз:

    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); // вкл.строба записи

     

    Вопрос:

    1. Что будете делать, если Вам потребуется перенести пины с GPIOA на GPIOB?
    2. Что будете делать, если Вам потребуется использовать для строба записи на Pin5, а напр. Pin8?

    Правильный вариант — это когда для этого нужно открыть некий h-файл и поправить там несколько строчек.

    В вашем случае - править придется все места, где вызываются макросы SbitP, RbitP и т.д. И в этом случае (при всем уважении) Ваши макросы — просто какая-то обертка, чтобы писать меньше букв кода. Преимущество, мягко говоря, весьма сомнительное...

     

  6. Теперь ругается на обьявление chn channel; пишет что ранее обьявлен мог быть...

    А Вы приведите тут варнинг как он есть, на английском.

     

    Попутно

    1. А Вы там с union не перемудрили? Надо то и всего Massine = ch[0] | ((unsigned int)ch[1] << 8) ...
    2. Зачем используете int для Massine, если на каждый сэмпл используется только 2 байта (по байту на канал).

      Оставшиеся 4000 байт врагу подарите? :)

    3. float pi = 3.14 — это не наш метод! Про дефайн "M_PI" в хедере math.h знаете?
    4. Как насчет такого кода (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. Теперь розничная цена в России ~401 доллар с НДС.

    У кого, например? :)

    На efind таких предложений что-то пока не нашел (там либо без цены, либо с ценой > 25000 руб.)

     

  8. по порядку:

    1) Во первых Keil 4.7 не дает инлайнить функции.

    :blink: Да? Может у него что-то свое есть специфическое... типа __inline__ и т.п.?

     

    2) Не ясен смысла записи GPIOB->BSRR = 1 << (LCD_WR1_pin + value?0:16);

    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. #define LCD_WR1_pin 4
    static inline void LCD_wr1(const char value)
    {
      GPIOB->BSRR = 1 << (LCD_WR1_pin + value?0:16);
    }

    Всего два вопроса:

    1. А зачем у аргумента функции квалификатор const? Тут же параметр не по ссылке передается, а по значению. :blink:
    2. 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. Да нет, не проигнорирован. Правду говоря, то всё и началось от того, что увидел LPC4370. Но основной вопрос - успеет ли микроконтроллер (LPC43xx или какой нибудь другой) дрыгать пинами на такой частоте так и остается не отвеченным...

    А ЦАП какой? Ссылку на даташит можете скинуть?

     

    Из STM32F4xx получится, у него макс частота GPIO 180MHz на 10пФ.

    Главное чтобы хватило внутренней скорости. Это-же надо читать 160Mbyte/sec и выдавать с такой-же скоростью.

    Возможно получится нахимичить с FSMC взяв 16-разрядные ЦАП, RAM и регистр, т.е. контроллер выдает адрес, память выставляет данные, которые защелкиваются в регистре и по синхросигналу с МК ЦАП считывает их с регистра.

    Тут еще вопрос какой допустимый джиттер с выставлением сэмплов?

     

     

    Хотел было еще про PSoC 5 вспомнить, но... цена у них... дешевле мк + нормальная fpga

  14. 1. Через USB закачать до 8-ми мегабаит данных на SDRAM;

    2. Читать данные из SDRAM и проигрывать их на 16 GPIO, тактовая частота - 80MHz.

    3. LAN;

    4. GCC компилятор. Так как идея - Open Source.

    Может посмотреть в сторону техасовских ситар с PRUSS-модулями? AM18xx например (но не AM17xx - у этих PRUSS доступа пинам не имеют).

     

    Кстати тут уже предлагали LPC43xx. Принцип такой же - cm0 пинами дрыгает, cm4 - в буфер подкидывает + USB/LAN.

    Мне кажется этот вариант был несправедливо проигнорирован. :)

  15. Дык наверно так делают, чтобы получить любое кол-во копируемых байт, а не кратно 4м. Например, как такой операцией скопировать 5 или 6 байт? 32х бытовое копирование запросит как минимум 8, а если память выделена только под 5?

    Если уж так важна скорость, и объемы копирования не 10 байт, а значительно больше - используйте DMA в 32х битном режиме...

    Да Вы чего? :wacko: Гляньте исходники 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 - этого я не знаю. :)

     

     

    vim + ctags

    Попутно вопросик.

    Вот Eclipse в редакторе enum-ы выделяет (подсветка + курсивом). Как это в виме сделать? :)

  17. to Ixt

    Ну так то в каком-то дижикее, а то в наших реалиях. Изменения в ценах доходят с задержкой
    На тамошние цены ориентироваться можно и даже нужно. Разница в цене на несколько баксов и не в пользу LPC2000 (это помимо того, что DMIPS-ов у кортексов поболее).

    Если Вы работаете не в коммерческой компании, а в каком-нибудь ФГУП-е, то я Вас хорошо понимаю. Там деньги не считают, да и живут в других реалиях.

    И не стоит со счетов списывать стоимость средств для разработки.
    А что внезапно LPC1768 требует иных средств разрабоки, нежели LPC2468? :biggrin:

    И вообще - реальные пацаны юзают GCC ;)

     

     

    to ДЕЙЛ

    Ещё вопрос. Если покупать вот эту плату http://starterkit.ru/html/index.php?name=s...6&word=lpc1 , то к нему нужен ещё и вот этот переходник http://starterkit.ru/html/index.php?name=s...=view&id=16 ? Т.е. в сумме уже будет не 2500, а 4500?
    И? :)

    Преимущество покупки демоборды со встроенной отладкой - только если борда дешевая.

    А так:

    1) Иметь JTAG отдельно имхо удобнее. Борда - это Вам не девушка. Первой и единственной тут не бывает.

    2) Если пересядете на RTOS, то JTAG станет практически бесполезен (в случае ARM7 - однозначно). Будете printf-ами дебажить.

     

    а насчёт FreeRTOS как? Вроде как операционка реального времени. Её тут прилепить можно будет? Могу какую-нибудь глупость сморозить, т.к. мой стаж работы по этой теме на сегодняшний день ровно 4 дня. :smile3046:
    Да нет, не глупость.

    FreeRTOS, TNKernel, uCOS, RTEMS, ECOS, ... тысячи их.

     

    Так понимаю, что территориально http://starterkit.ru находится где-то в Ижевске, судя по контактным телефонам. В Москве где можно купить тоже самое? В Терраэлектронике, чипдипе и платане пока ничего не нашёл.
    Без проблем покупается у стартеркита - почтой наложенным платежом, по карточке (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) и проч.

     

    Как видите - материала много. Ни в одну книгу не влезет. Если очень хочется Мартина - ну своруйте из инета и почитайте пару дней. А потом - уже через мануалы, по-взрослому! :)

     

     

     

     

    ARM7 контроллеры по-прежнему живы и какое-то время ещё точно поживут. Имхо, их стоит применять только для тех задач, где нужно минимизировать цену

    Что-то я очень сильно в этом сомневаюсь.

    Совсем недавно сравнивал на дижикее ценники на LPC24xx и LPC17xx - ощущение прямо противоположное.

  19. Мышой таскать, кидать на середину окошка, с которым нужно сгруппировать.

    В индиго можно перетаскивать, в джуне и кеплере — нет :(

    Интересно, что именно является багом - возможность перетаскивания или невозможность? :)

     

    Снять птичку "Connect process input & output to a terminal" в меню "Run - Run configurations".

    Узнать бы как эту птичку снять. Она неактивная (серого цвета)... Как решить ребус — пока так не нагуглил...

    Мне очень нравится индексатор в эклипсе, но из-за этой с консолью шняги пока приходится кое-какие вещи дебажить в visual studio...

    Так шо как грица "ай нид хелп"!

     

    Показать его вручную (Window - Show view - Console), затем мышой запарковать куда удобно.

    Нет, я вот о чем спрашивал:

    Эклипс-Европа - Запускаю билд. Вылазит окошко с логом. Билд проходит - окошко остается. Дочитал, кликнул мышкой в редакторе - окошко свернулось.

    Эклипс-Кеплер - аналогично.

    Эклипс-Джуно - Билд проходит и окошко тут же само сворачивается. Прочитать не успел... Снова щелкаем мышкой - открываем, читаем...

     

    Как эта штука управляется/настраивается - я так и непонял...

     

     

    Кстати еще вопрос.

    В старом эклипсе европа когда наводишь мышку на дефайн - всплывает окошко с его описанием.

    Например

    #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. Вы, видимо, имеете в виду Visual Studio или нечто подобное? Такого не имею. Keil uVision4 - на нем можно? :rolleyes:

    Шутите? :)

    Мне казалось, что у каждго эмбеддера должен быть и "десктопный" тулчейн.

    В конце концов можно спокойно и аккуратно отдебажить какие-нибудь алгоритмы (прям на чистом Си), а потом исходники просто и без всяких изменений можно переносить в "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. С

    можно посчитать отдельно, в Matlab...

    Хотел было на constexpr (C++11) наживку закинуть :)

    Но видимо не понял вопроса...

     

    Написать на С программку, которая сгенерирует си-файл с инициализированным const массивом - дело 5 минут (stdio.h + math.h).

    В чем вопрос то? :)

    Боитесь, что инициализированный const массив все равно будет размещен в ОЗУ?

  23. Допустим, размещаю в ОЗУ массив коэффициентов для БПФ, по формуле:

          for (uint32_t i = 0; i < FFT_N; i++) {
            *pSigRe++ = 0.5 * (1 - cos(2 * PI / (FFT_N - 1) * i));
          }

    Можно ли это сделать при компиляции, расположив массив во flash?

    На всякий случай - язык цэ или плюсы? :)

×
×
  • Создать...