-
Постов
1 240 -
Зарегистрирован
-
Посещение
-
Победитель дней
9
Сообщения, опубликованные VladislavS
-
-
Сделать чтобы компилятор оптимизировал как-то гарантировано невозможно. Нужен асм. Функцию на асме проще всего начать написав её на С, скомпилировать её и вытащить листинг. В этом листинге будет вся "обязательная обвязка". Внутренности правьте как надо.
И всё же, при наличии много памяти, я бы на DMA попробовал. Скорее всего получите ту же скорость, но сильно проще алгоритмически.
-
Ваш код действительно даст 2 такта на запись, но сколько будет стоит подготовка к этой записи? Сомневаюсь, что вам 256 раз надо одно и то же выводить.
SECTION `.text`:CODE:NOROOT(2) THUMB // 7 void RunRealExcitationOne() // 8 { unsigned int A0=0x22a20002; _Z20RunRealExcitationOnev: PUSH {R4-R11,LR} // 9 unsigned int A1=0x22860002; // 10 unsigned int A2=0x2a840002; // 11 unsigned int A3=0x0a940002; // 12 unsigned int A4=0x0a150002; // 13 unsigned int A5=0x18150002; // 14 unsigned int A6=0x18510002; // 15 unsigned int A7=0x11510002; // 16 unsigned int A8=0x11490002; // 17 unsigned int A9=0x15480002; // 18 unsigned int A10=0x05680002; // 19 unsigned int A11=0x052a0002; // 20 unsigned int A12=0x242a0002; // 21 unsigned int A13=0x24a20002; // 22 unsigned char i=255; LDR.N R1,??DataTable3 LDR.N R2,??DataTable3_1 LDR R1,[R1, #+4] LDR.N R3,??DataTable3_2 LDR.N R4,??DataTable3_3 LDR.N R5,??DataTable3_4 LDR.N R6,??DataTable3_5 LDR.W R11,??DataTable3_6 LDR.W R12,??DataTable3_7 LDR.W LR,??DataTable3_8 LDR.W R8,??DataTable3_9 LDR.W R9,??DataTable3_10 LDR.W R10,??DataTable3_11 MOVS R0,#+255 // 23 do // 24 { *GPIO6=A0; ??RunRealExcitationOne_0: STR R10,[R1, #+0] // 25 *GPIO6=A1; STR R9,[R1, #+0] // 26 *GPIO6=A2; STR R8,[R1, #+0] // 27 *GPIO6=A3; STR LR,[R1, #+0] // 28 *GPIO6=A4; STR R12,[R1, #+0] // 29 *GPIO6=A5; STR R11,[R1, #+0] // 30 *GPIO6=A6; STR R6,[R1, #+0] // 31 *GPIO6=A7; STR R5,[R1, #+0] // 32 *GPIO6=A8; STR R4,[R1, #+0] // 33 *GPIO6=A9; STR R3,[R1, #+0] // 34 *GPIO6=A10; STR R2,[R1, #+0] // 35 *GPIO6=A11; // 36 *GPIO6=A12; // 37 *GPIO6=A13; // 38 i--; // 39 } while(i); SUBS R0,R0,#+1 LDR.N R7,??DataTable3_12 STR R7,[R1, #+0] LDR.N R7,??DataTable3_13 STR R7,[R1, #+0] LDR.N R7,??DataTable3_14 STR R7,[R1, #+0] BNE.N ??RunRealExcitationOne_0 // 40 } POP {R4-R11,PC}
Регистров таки не хватило
-
Вот смотрите.
constexpr uint32_t buf[] = { 0x22a20002, 0x22860002, 0x2a840002, 0x0a940002, 0x0a150002, 0x18150002, 0x18510002, 0x11510002, 0x11490002, 0x15480002, 0x05680002, 0x052a0002, 0x242a0002, 0x24a20002 }; // У меня нет такого контроллера, адрес порта пальцем в небо volatile uint32_t *GPIO6 = (uint32_t *)0x1000'0000; void foo() { *GPIO6 = buf[0]; *GPIO6 = buf[1]; *GPIO6 = buf[2]; *GPIO6 = buf[3]; *GPIO6 = buf[4]; *GPIO6 = buf[5]; *GPIO6 = buf[6]; *GPIO6 = buf[7]; *GPIO6 = buf[8]; *GPIO6 = buf[9]; *GPIO6 = buf[10]; *GPIO6 = buf[11]; *GPIO6 = buf[12]; *GPIO6 = buf[13]; }
И в лучшем случае, вы можете надеяться, что копилятор это оптимизирует вот так
//foo(); LDR.N R1,??DataTable2 LDR R0,[R1, #+4] LDR.N R2,??DataTable2_1 STR R2,[R0, #+0] LDR.N R2,??DataTable2_2 STR R2,[R0, #+0] LDR.N R2,??DataTable2_3 STR R2,[R0, #+0] LDR.N R2,??DataTable2_4 STR R2,[R0, #+0] LDR.N R2,??DataTable2_5 STR R2,[R0, #+0] LDR.N R2,??DataTable2_6 STR R2,[R0, #+0] LDR.N R2,??DataTable2_7 STR R2,[R0, #+0] LDR.N R2,??DataTable2_8 STR R2,[R0, #+0] LDR.N R2,??DataTable2_9 STR R2,[R0, #+0] LDR.N R2,??DataTable2_10 STR R2,[R0, #+0] LDR.N R2,??DataTable2_11 STR R2,[R0, #+0] LDR.N R2,??DataTable2_12 STR R2,[R0, #+0] LDR.N R2,??DataTable2_13 STR R2,[R0, #+0] LDR.N R2,??DataTable2_14 STR R2,[R0, #+0]
Понятно, что никакого одного такта на запись тут не может быть. Смотрите в сторону DMA.
-
Надеюсь, вы понимаете, что запись числа в порт просходит через загрузку адреса порта в регистр процессора, загрузки числа в другой регистр процессора, пересылка данных в порт командой STR. И каждая из этих составляющих выпол6яется далеко не один такт.
Максимум, что вы можете сделать, завести массив констант и из него в порт последоаательно элементы писать. Тогда код оптисизируется до последовательности LDR, STR, LDR, STR. Ещё можно переслать с помощтю DMA, если контроллер умеет.
-
Я ни в чём не ошибся. А вот вы ошиблись с местом получения информации. Ответы на ваши вопросы английским по белому написаны в RM.
-
1 час назад, do_not_know_Linux сказал:
таким образом же можно вызвать обработчик прерываний?
Вот про это что в RM пишут?
-
А что в RM по этому поводу пишут?
-
Раньше такое бывало. После копирований как-бы мультивставка. Было очень редко, а сейчас вообще не бывает.
-
Разрешите спросить, с целью
поржатьповышения образованности, а зачем благородные доны в опкоды лезут? За всю практику ни разу не приходилось. Может я что не так делаю? -
А что про это в схеме платы нарисовано?
-
2 часа назад, KoGIch сказал:
но я не могу рассказать накой мне сдались эти нули. Просто поверьте эти нули там нужны.
Всё больше убеждаюсь, что они там даром не нужны. Скорее всего, между данными есть промежутки. В бинарнике эти места забиты нулями, ибо нет механизма сделать в нём дырки. А в хексе их просто не пишут. Вам же советовали map-файл смотреть. Присоединяюсь к совету.
2 часа назад, KoGIch сказал:Если можете помогите разобраться где прописаны правила сборки при отладке
Извини, с VS Code не работаю.
-
- Петька, прибор?
- Прибор 14!
- Что 14?
- А что прибор?
-
Вы не то лечить пытаетесь. Лучше объясните зачем в бинарнике, эльфе или хексе вам нули понадобились? Иницализация нулями секций данных, предполагающих такую инициализацию, происходит при старте контроллера в стартапе. Придумать зачем пихать секции с нулями во флэшь с ходу не получается.
-
9 часов назад, dimka76 сказал:
И ножка BOOT в этом случае, для доступа по SWD не поможет.
Поможет. Она отключает прошивку, которая занимает ноги swd.
-
Пардон, код для ETH был. Перепутал с USB.
-
Атмел + ИАР были задолго до моды на стм32.
-
Проблема DMA с настоящим кэшем всегда была. Я с ней впервые ещё в 2005-ом на ARM920T ядре столкнулся. На махровом AT91RM9200.
-
А почему 8 байт дескриптора, когда хост просит 64?
-
20 минут назад, Vladimir_T сказал:
1. Будут ли корректно работать на ПК две среды MDK Keil (4.70 и 5.20)? Это нужно, чтобы и прежний проект поддерживать (для 405-го).
2. MDK Keil 5.20 будет компилировать проект версии 4.70? В проекте используются только стандартные библиотеки CMSIS.
Скорее всего, обе версии будут работать. Но я бы не плодил зоопарк и собрал всё в новом Keil.
22 минуты назад, Vladimir_T сказал:3. Если проект хорошо отлажен и работает на 405-м будет ли он нормально работать на 722-м?
Не будет никак работать.
-
1 час назад, Eddy_Em сказал:
народ гоняет туда-сюда всякие непонятные структуры, пишет дикие портянки кода…
Чем вам структуры не угодили? Они заполняются константными данными, оптимизатор с ними разбирается на раз два. Пример
struct PORTS { uint32_t port_a; uint32_t port_b; uint32_t port_c; }; void foo(PORTS *ports) { if(ports->port_a > 10) GPIOA->ODR = ports->port_a; if(ports->port_b < 10) GPIOB->ODR = ports->port_b; GPIOC->ODR = ports->port_c; } int main() { PORTS x; x.port_a = 0; x.port_b = 1; x.port_c = 2; foo(&x); }
Листинг
// 22 PORTS x; // 23 x.port_a = 0; // 24 x.port_b = 1; // 25 x.port_c = 2; // 26 foo(&x); MOVS R0,#+1 LDR R1,??main_0 STR R0,[R1, #+0] MOVS R4,#+2 LDR R0,??main_0+0x4 STR R4,[R0, #+0] ??main_0: DATA32 DC32 0x50000414 DC32 0x50000814
-
2 часа назад, do_not_know_Linux сказал:
почему регистр масок ? о каких масках идет речь?
А о каких регистрах идёт речь вас почему не интересует?
-
Тип контроллера в свойствах проекта указывается. Эта настройка и на компиляцию, и на отладку влияет.
-
13 часов назад, MDD сказал:
Вас сильно удивит, что во времена 4051 было немало "человеков-оркестров"?
Кто мешает им ещё и прошивать все выпускаемые устройства и никому не давать прошивку?
-
Над разработкой устроиства трудятся схемотехники, топологи, констукторы, технологи и т.д. И только хитрожопые программисты, даже неспособные защитить прошивку, почему-то хотят "всю жизнь получать гонорар". Я пониааю, когда голое ПО, которое без защиты больше одного раза не продашь. Но прошивка с каждой железкой продаётся. И програмист имет (или не имет, тут дело труового договора) точно такие же права как остальные разработчики.
Быстрый GPIO
в NXP
Опубликовано · Пожаловаться
Это же Cortex-M7, если я правильно помню? Не думаю что у него такое возможно. Вы же видели, что ваш код, состоящий из последовательных STR разных регистров даёт 2 такта. Со STR выше не прыгнешь.
Еще у вашего процессора fpu есть, там тоже хранить что-то можно.