

Allregia
Свой-
Content Count
1153 -
Joined
-
Last visited
Content Type
Profiles
Forums
Calendar
Everything posted by Allregia
-
А размер блока при считываении одинаковый? От него скорость очень сильно зависит.
-
Передача параметров в функции.
Allregia replied to Allregia's topic in ARM, 32bit
Этим не я а другие занимаются, но насколько я помню, там есть только настройка насчет динамических переменных, т.е использовать malloc/calloc или нет. Много локальных переменных внутри функций он объявляет статическими но многи нет - они и жрут стек. -
Передача параметров в функции.
Allregia replied to Allregia's topic in ARM, 32bit
ИМХО тоже, но обясните это Матлабу. -
Передача параметров в функции.
Allregia replied to Allregia's topic in ARM, 32bit
Совершенно согласен, вот я и его проклинаю :) С удовоьльствием, если кто-нибудь научит, как этому научить Матлаб.... -
Передача параметров в функции.
Allregia replied to Allregia's topic in ARM, 32bit
Они все четыре такие. -
Передача параметров в функции.
Allregia replied to Allregia's topic in ARM, 32bit
Какого из? -
Передача параметров в функции.
Allregia replied to Allregia's topic in ARM, 32bit
Да, М7, точнее STM32H7A3. Каким образом? -
Передача параметров в функции.
Allregia replied to Allregia's topic in ARM, 32bit
Еще вопрос - если выделить для стека, ну к примеру 16К, но стек растет сверзу, а остальная память заполняется обычно снизу, и медду ними есть "дырка", не исползльзуемое пространство. Т.е. вполне реальна ситуация, когда стек используется бОльшего размера чем ему сказано. Но пока он щанимает только эту "дырку", и не налазит на занятую память - все работает. Так ведь? Придется тогда в самом деле водяными знаками, потому как при выделении стека в большом (почти 1М) банке памяти, где переменными занята пока лишь треть, все работает. А при выделении всего банка в 64К - через некоторое время получам HF. -
Передача параметров в функции.
Allregia replied to Allregia's topic in ARM, 32bit
Очень длинные, там почти 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); } } -
Передача параметров в функции.
Allregia replied to Allregia's topic in ARM, 32bit
Зачем тогда пишут не array[] a array[ххх] ? Например: static void fft(const float x[128], creal32_T y[512]) P.S. Я пытаюсь разоброаться, чего нагенерил Матлаб, точнее что им нагенерили наши алгоритмисты.... А он нагенерил такое, что ни в какой стек не влазит.... -
Передача параметров в функции.
Allregia replied to Allregia's topic in ARM, 32bit
Для ссылок то понятно - они для того и передаются ссылками. чтобы можно было менять исходный параметр, например чтобы функция могоа возвращать больше одного значения. -
Передача параметров в функции.
Allregia posted a topic in ARM, 32bit
Возник вопрос о передаче параметров в функции, даже несколко вопросов. Вопрос 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? -
С хипом и стеком - отбой, там причина оказалась совсем в другом. То, о чем изначало спрашивалсь - все работает.
-
Статуса при хардфолте? А где его сомтреть? Мне как-то раньше не приходилось. В любом случае, это уже на той неделе - железка не у меня сейчас а у напарника.
-
STM32H7A3RIT P.S. Вообще, код переносится (с необходимыми изменениями, конечно) из предыдущего варианта, который был на F722.
-
Не найду. Если Вы про п. 2.7.8, то он вроде тут не причем, хотя может я чего-то и не понимаю -там-же про OCTOSPI, кторого у меня нет..Но кроме него, поиск по файлу слова "AXI" ничего не находит. Эррата от 16 октября.
-
Смотрел когда-то, сейчас еще гляну. Ааа, если Вы про 20-й бит в еррате про DMA+UART - то да, применено было сразу. Без него я и не пробовал, но они пишут без него там просто останавливается работа DMA, небязательно-же при этом в хардфолт уходить. И какое оно имеет отношение к тому, где расположены стек и хип?
-
Что-то этот 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)- все ОК. Как только включаю стеки и хип в скаттере - работать начинает явно быстрее, но примерно через минуту работы валится в хардфолт. Может у меня в скаттере что-то не корректно? (хип вообще про запас, никаких маллоков в программе нет).
-
О блин, слона-то я и не заметил! Спасибо! Правда, оно так не заработало. Отрезал кусок для dmasect не от IRAM1 а от IRAM2 - тогда заработало, IRAM1 остался не использованным.
-
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-кэша.
-
STM32F723Z - UFBGA, 7x7 mm Вот и поменьше: STM32F723V - WLCSP100, 4.7x4.2 mm 216MHz, RAM 276k.
-
АЦП в STM32H7
Allregia replied to Allregia's topic in ARM, 32bit
Может 0х8000 ? -
Наверное тем, что вопрос был про UAC, причем UAC1.
-
BorisBritwa - там HID а не UAC.
-
А есть где-то пример именно входа через USB?