Jump to content

    

Allregia

Свой
  • Content Count

    1153
  • Joined

  • Last visited

Everything posted by Allregia


  1. А размер блока при считываении одинаковый? От него скорость очень сильно зависит.
  2. Этим не я а другие занимаются, но насколько я помню, там есть только настройка насчет динамических переменных, т.е использовать malloc/calloc или нет. Много локальных переменных внутри функций он объявляет статическими но многи нет - они и жрут стек.
  3. ИМХО тоже, но обясните это Матлабу.
  4. Совершенно согласен, вот я и его проклинаю :) С удовоьльствием, если кто-нибудь научит, как этому научить Матлаб....
  5. Да, М7, точнее STM32H7A3. Каким образом?
  6. Еще вопрос - если выделить для стека, ну к примеру 16К, но стек растет сверзу, а остальная память заполняется обычно снизу, и медду ними есть "дырка", не исползльзуемое пространство. Т.е. вполне реальна ситуация, когда стек используется бОльшего размера чем ему сказано. Но пока он щанимает только эту "дырку", и не налазит на занятую память - все работает. Так ведь? Придется тогда в самом деле водяными знаками, потому как при выделении стека в большом (почти 1М) банке памяти, где переменными занята пока лишь треть, все работает. А при выделении всего банка в 64К - через некоторое время получам HF.
  7. Очень длинные, там почти 400 килобайт текста.... Вот пример парочки функций: static void median(const float x[1419], float y[3]) { int j; int k; float xv[473]; int exitg1; int ipiv; int ia; int ib; int ilast; int oldnv; boolean_T checkspeed; boolean_T isslow; boolean_T exitg2; float vref; float vk; float f2; boolean_T guard1 = false; int c; int ngroupsof5; int nlast; for (j = 0; j < 3; j++) { for (k = 0; k < 473; k++) { xv[k] = x[j + k * 3]; } k = 0; do { exitg1 = 0; if (k < 473) { if (rtIsNaNF(xv[k])) { y[j] = rtNaNF; exitg1 = 1; } else { k++; } } else { ipiv = 236; ia = 0; ib = 472; ilast = 472; oldnv = 473; checkspeed = false; isslow = false; exitg2 = false; while ((!exitg2) && (ia + 1 < ib + 1)) { vref = xv[ipiv]; xv[ipiv] = xv[ib]; xv[ib] = vref; ilast = ia; ipiv = -1; for (k = ia + 1; k <= ib; k++) { vk = xv[k - 1]; f2 = xv[k - 1]; if (f2 == vref) { xv[k - 1] = xv[ilast]; xv[ilast] = vk; ipiv++; ilast++; } else { if (f2 < vref) { xv[k - 1] = xv[ilast]; xv[ilast] = vk; ilast++; } } } xv[ib] = xv[ilast]; xv[ilast] = vref; guard1 = false; if (237 <= ilast + 1) { if (237 >= ilast - ipiv) { exitg2 = true; } else { ib = ilast - 1; guard1 = true; } } else { ia = ilast + 1; guard1 = true; } if (guard1) { c = (ib - ia) + 1; if (checkspeed) { isslow = (c > oldnv / 2); oldnv = c; } checkspeed = !checkspeed; if (isslow) { while (c > 1) { ngroupsof5 = c / 5; nlast = c - ngroupsof5 * 5; c = ngroupsof5; for (k = 0; k < ngroupsof5; k++) { ipiv = (ia + k * 5) + 1; ipiv = thirdOfFive(xv, ipiv, ipiv + 4) - 1; ilast = ia + k; vref = xv[ilast]; xv[ilast] = xv[ipiv]; xv[ipiv] = vref; } if (nlast > 0) { ipiv = (ia + ngroupsof5 * 5) + 1; ipiv = thirdOfFive(xv, ipiv, (ipiv + nlast) - 1) - 1; ilast = ia + ngroupsof5; vref = xv[ilast]; xv[ilast] = xv[ipiv]; xv[ipiv] = vref; c = ngroupsof5 + 1; } } } else { if (c >= 3) { ipiv = ia + (c - 1) / 2; if (xv[ia] < xv[ipiv]) { if (xv[ipiv] < xv[ib]) { } else if (xv[ia] < xv[ib]) { ipiv = ib; } else { ipiv = ia; } } else if (xv[ia] < xv[ib]) { ipiv = ia; } else { if (xv[ipiv] < xv[ib]) { ipiv = ib; } } if (ipiv + 1 > ia + 1) { vref = xv[ia]; xv[ia] = xv[ipiv]; xv[ipiv] = vref; } } } ipiv = ia; ilast = ib; } } y[j] = xv[ilast]; exitg1 = 1; } } while (exitg1 == 0); } } static void merge(int idx[257], float x[257], int offset, int np, int nq, int iwork[257], float xwork[257]) { int n_tmp; int iout; int p; int i6; int q; int exitg1; if ((np == 0) || (nq == 0)) { } else { n_tmp = np + nq; for (iout = 0; iout < n_tmp; iout++) { i6 = offset + iout; iwork[iout] = idx[i6]; xwork[iout] = x[i6]; } p = 0; q = np; iout = offset - 1; do { exitg1 = 0; iout++; if (xwork[p] >= xwork[q]) { idx[iout] = iwork[p]; x[iout] = xwork[p]; if (p + 1 < np) { p++; } else { exitg1 = 1; } } else { idx[iout] = iwork[q]; x[iout] = xwork[q]; if (q + 1 < n_tmp) { q++; } else { q = iout - p; for (iout = p + 1; iout <= np; iout++) { i6 = q + iout; idx[i6] = iwork[iout - 1]; x[i6] = xwork[iout - 1]; } exitg1 = 1; } } } while (exitg1 == 0); } }
  8. Зачем тогда пишут не array[] a array[ххх] ? Например: static void fft(const float x[128], creal32_T y[512]) P.S. Я пытаюсь разоброаться, чего нагенерил Матлаб, точнее что им нагенерили наши алгоритмисты.... А он нагенерил такое, что ни в какой стек не влазит....
  9. Для ссылок то понятно - они для того и передаются ссылками. чтобы можно было менять исходный параметр, например чтобы функция могоа возвращать больше одного значения.
  10. Возник вопрос о передаче параметров в функции, даже несколко вопросов. Вопрос 1. func( int a){..} и func(const int a){..} Я в курсе что это означает, но не могу понять логику - ведь передается не указатель на переменную а создается копия этой переменной. Так какая разница, меняется она внутри функции или нет, если при выходе из функции копия все равно потеряется а исходная переменная останется без именений? Вопрос 2. переменная, массив: float MyArray[1000]; функция: func( float data[1000]); вызываем: func(MyArra) - передается ведь указатель, а не весь массив в стек запихивается? чем тогда это отличается, если аргументм функции явно написать указатель на массив? func(* flat data[1000]) ? а если функция определена как func(const float data[1000]), то комплилятор при этом проверяет, чтоы внтури функции, данные по тому указателюбыли только ReadOnly?
  11. С хипом и стеком - отбой, там причина оказалась совсем в другом. То, о чем изначало спрашивалсь - все работает.
  12. Статуса при хардфолте? А где его сомтреть? Мне как-то раньше не приходилось. В любом случае, это уже на той неделе - железка не у меня сейчас а у напарника.
  13. STM32H7A3RIT P.S. Вообще, код переносится (с необходимыми изменениями, конечно) из предыдущего варианта, который был на F722.
  14. Не найду. Если Вы про п. 2.7.8, то он вроде тут не причем, хотя может я чего-то и не понимаю -там-же про OCTOSPI, кторого у меня нет..Но кроме него, поиск по файлу слова "AXI" ничего не находит. Эррата от 16 октября.
  15. Смотрел когда-то, сейчас еще гляну. Ааа, если Вы про 20-й бит в еррате про DMA+UART - то да, применено было сразу. Без него я и не пробовал, но они пишут без него там просто останавливается работа DMA, небязательно-же при этом в хардфолт уходить. И какое оно имеет отношение к тому, где расположены стек и хип?
  16. Что-то этот F7A3 меня до кондрашки доведет. Значитю у него 4 банка ОЗУ: 0-й - 64К DTCM, самый быстрый, с 0х2000..., некешируемый, но нет доступа обычным DMA (а что такое MDMA и BDMA я пока "ниасилил") 1-й - ~1M "большая AXI SRAM" с 0х24..., есть доступ от всего, реально она там внутри еще на 3 банка разбита. 2- и 3-й - AHB SRAM, по 64К, доступ от всего, сидят соотюв с 0х300... и 0х380... Сую я все буфера, где DMA работает во 2-й банк (0х30), и через MPU говорю ему чтобы не кешировал и т.д. Стек и хип, разумнее всего в 0-й, как самый быстрый, ну и все остальное - в большой первый. Делаю такой скаттер: ; ************************************************************* LR_IROM1 0x08000000 0x00200000 { ; load region size_region ER_IROM1 0x08000000 0x00200000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } ARM_LIB_STACK 0x20010000 -0x2000 ; STACK in IRAM1 (DTCM) { .ANY(STACK) } ARM_LIB_HEAP 0x20000000 0x4000 { .ANY(HEAP) } RW_IRAM2 0x24000000 0x00100000 ; RW data in IRAM2 (AXI SRAM) { .ANY (+RW +ZI) } RW_IRAM3 0x30000000 0x00004000 ; DM buffers in AHB SRAM { *(dmasect) } } В отдельном файле, обявляю буфера для DMA, типа так: __align(32) __attribute__((used)) __attribute__((section("dmasect"))) volatile uint16_t ADCBuf[2000]; В программе закольцованно работает АЦП на 2 канала, складывает в буфер. В прерываниях от заполнения половины и целого буфера, он переписывается в другой буфер и передается через уарт наружу. Если я не определяю в скаттере те секции для стека и хипа (т.е. не использую IRAM1, DTCM)- все ОК. Как только включаю стеки и хип в скаттере - работать начинает явно быстрее, но примерно через минуту работы валится в хардфолт. Может у меня в скаттере что-то не корректно? (хип вообще про запас, никаких маллоков в программе нет).
  17. О блин, слона-то я и не заметил! Спасибо! Правда, оно так не заработало. Отрезал кусок для dmasect не от IRAM1 а от IRAM2 - тогда заработало, IRAM1 остался не использованным.
  18. Help! Пытаюсь распределить память в H7, но видимо. что-то "не так" делаю. В проце два региона - IRAM1 IRAM2, по дефолту включены обы на вкладке Target. Я на влкдке линкера снимаю чекбокс "брать распределени с таргета" и даю ему свой скаттер-файл. Дефотный был такой: ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* LR_IROM1 0x08000000 0x00200000 { ; load region size_region ER_IROM1 0x08000000 0x00200000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x20000000 0x00020000 { ; RW data .ANY (+RW +ZI) } RW_IRAM2 0x24000000 0x00080000 { .ANY (+RW +ZI) } } Теперь я делаю две вещи, первая - новый скаттер: ; My Scatter: LR_IROM1 0x08000000 0x00200000 { ; load region size_region ER_IROM1 0x08000000 0x00200000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x20000000 0x0001C000 { ; RW data .ANY(+RW +ZI) } RW_IRAM11 0x2001C000 0x00004000 { ; data for DMA .ANY(+RW +ZI) } RW_IRAM2 0x24000000 0x00080000 { .ANY (+RW +ZI) } } Т.е я отрезал от IRAM1 кусочек. и назвал его IRAM11 второе что я делаю, обьявляю переменную: vu16 ADC_Buf[2] __attribute__((section("RW_IRAM11"))); Компилю, смотрю мап-файл - IRAM1 и IRAM11 выкинуты, все запихнуто в IRAM2. Ладно, второй вариант - переношу эту переменную в отлдельный фал adc_buf.c, а в скаттере пишу: RW_IRAM11 0x2001C000 0x00004000 { ; data for DMA adc_buf.o(+RW +ZI) } Все замечательно, теперь эта переменная в IRAM11. Но все остальные переменный проекта - в IRAM2. Т.е. во 1-х, вся область IRAM1 пропадает зря. Во 2-х - полчается что во втором варианте, атрибут с именем секции в определении этой переменной можно убрать, т..е все переменные, определенные в этом файле и так будут в IRAM11, а в первом варианте почему линкер плевать на него хотел, с высокой колокольни? P.S. Если кому интерено, для чего весь этот геморрой - чтобы сделать IRAM11 не кешируемой, через MPU. Т.е чтобы масивы, с которыми идет работа по ПДП была без D-кэша.
  19. STM32F723Z - UFBGA, 7x7 mm Вот и поменьше: STM32F723V - WLCSP100, 4.7x4.2 mm 216MHz, RAM 276k.
  20. Наверное тем, что вопрос был про UAC, причем UAC1.
  21. BorisBritwa - там HID а не UAC.
  22. STM32F446 SAI SPDIF OUT

    А есть где-то пример именно входа через USB?