AHTOXA 18 15 февраля, 2019 Опубликовано 15 февраля, 2019 · Жалоба 1 час назад, Forger сказал: МК от этого не будет медленнее работать, не будет тупить или дольше "загружаться". От этого НИЧЕГО не изменится. Никто не говорил, что МК от большего расхода ОЗУ будет медленнее работать (хотя, как мы уже видели, латентность прерываний ухудшится). Речь шла о том, что в ряде случаев придётся взять МК с бОльшим количеством ОЗУ. Так что КОЕ-ЧТО очень даже изменится. 1 час назад, Forger сказал: Переходим на плюсы с виртуальным методами, RTTI, исключениями и т. п. - накладных расходов не избежать. С другой стороны можно по-прежнему как аборигены сидеть на голом С, бить себя "пяткой в грудь" Я не против применения C++ в МК. Я очень даже за. Но я против того, чтобы бездумно тащить ВСЁ из плюсов в МК. Я считаю, что исключения, RTTI и ещё некоторые подобные вещи в МК неуместны. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 15 февраля, 2019 Опубликовано 15 февраля, 2019 · Жалоба 22 minutes ago, AHTOXA said: в ряде случаев придётся взять МК с бОльшим количеством ОЗУ. И часто это вам приходилось делать - на грани сотни другой байт балансировать с объемом ОЗУ? Просто ради интереса соберите статистику по своим проектам и посмотрите RAM usage. Уверен, что редко где будет более 50%. Quote (хотя, как мы уже видели, латентность прерываний ухудшится). Если начнете вызывать из прерываний С++ функции, любые, то разницы никакой не будет. А то и вовсе наоборот. Quote Я не против применения C++ в МК. Я очень даже за. Но я против того, чтобы бездумно тащить ВСЁ из плюсов в МК. Я считаю, что исключения, RTTI и ещё некоторые подобные вещи в МК неуместны. Ваше мнение понятно. Раньше и я разделял это мнение, но времена меняются, проекты становятся сложнее, камни - толще... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 15 февраля, 2019 Опубликовано 15 февраля, 2019 · Жалоба 1 час назад, Forger сказал: И часто это вам приходилось делать - на грани сотни другой байт балансировать с объемом ОЗУ? Вы опять читаете невнимательно. Речь не про запас в сотню-другую байт, а про запас в процентах. Скажем, если я вижу, что используется больше 80% ОЗУ, то я начинаю задумываться о смене камня. Так вот, благодаря вашим делегатам, этот порог снижается на 6%. Так понятно? И да, я менял камни, когда оказывалось, что запас ниже допустимого. 1 час назад, Forger сказал: Если начнете вызывать из прерываний С++ функции, любые, то разницы никакой не будет. А то и вовсе наоборот. Выше по теме я приводил пример, как вызов из обработчика функции-члена класса не приводит к накладным расходам. Совсем. Но вы же не читатель... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 15 февраля, 2019 Опубликовано 15 февраля, 2019 · Жалоба 1 hour ago, AHTOXA said: Вы опять читаете невнимательно. Так вот, благодаря вашим делегатам, этот порог снижается на 6%. Так понятно? Делегаты тут ни при чем. Вы просто хотите за что нибудь уцепиться, чтобы себя же убедить, что некие "делегаты" якобы зло, прекрасно понимая, что имея исходники, можно найти решение даже в таком невероятно редком случае. Quote Но вы же не читатель... Чепуху не читаю. При возникновении прерывания все равно произойдет вызов обычной С-функции, адрес которой размещается при сборке проекта в таблице векторов. Далее уже из этой С-функции произойдет вызов вашей (не static) С++ функции с размещением в стеке в регистре R0 соотв значения this. Архитектуру никакой ваш inline не обманет. Можете убедиться лично и посмотреть disasm. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 15 февраля, 2019 Опубликовано 15 февраля, 2019 · Жалоба 23 минуты назад, Forger сказал: Делегаты тут ни при чем. Вы просто хотите за что нибудь уцепиться, чтобы себя же убедить, что некие "делегаты" якобы зло, прекрасно понимая, что имея исходники, можно найти решение даже в таком невероятно редком случае. Тут я не распарсил. Празднуете пятницу? 13 минут назад, Forger сказал: При возникновении прерывания все равно произойдет вызов обычной С-функции, адрес которой размещается при сборке проекта в таблице векторов. Далее уже из этой С-функции произойдет вызов вашей (не static) С++ функции с размещением в стеке/в регистре соотв значения this. Архитектуру никакой ваш inline не обманет. Можете убедиться лично и посмотреть disasm. Да я-то как раз смотрел. Могу и вам показать, раз не верите. Вот, смотрите. Берём мой тестовый проект, смотрим файл hw.cpp: #include "hw.h" /// UART object ConsoleUart uart; /// UART interrupt handler. OS_INTERRUPT void USART1_IRQHandler() { OS::TISRW ISR; uart.UartIrqHandler(); } Видите, всё как надо, си-обработчик прерывания, вызывает не-статическую функцию класса. Смотрим в дизассемблер: 0800041c <USART1_IRQHandler>: 800041c: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr} 8000420: f3ef 8310 mrs r3, PRIMASK 8000424: b672 cpsid i 8000426: 4c7e ldr r4, [pc, #504] ; (8000620 <USART1_IRQHandler+0x204>) 8000428: 68a2 ldr r2, [r4, #8] 800042a: 3201 adds r2, #1 800042c: 60a2 str r2, [r4, #8] 800042e: f383 8810 msr PRIMASK, r3 8000432: 4b7c ldr r3, [pc, #496] ; (8000624 <USART1_IRQHandler+0x208>) 8000434: 881d ldrh r5, [r3, #0] 8000436: f8b3 8004 ldrh.w r8, [r3, #4] 800043a: b2ad uxth r5, r5 800043c: 06ae lsls r6, r5, #26 800043e: d455 bmi.n 80004ec <USART1_IRQHandler+0xd0> 8000440: 0628 lsls r0, r5, #24 8000442: d518 bpl.n 8000476 <USART1_IRQHandler+0x5a> 8000444: 4b77 ldr r3, [pc, #476] ; (8000624 <USART1_IRQHandler+0x208>) 8000446: 899a ldrh r2, [r3, #12] 8000448: 0611 lsls r1, r2, #24 800044a: d514 bpl.n 8000476 <USART1_IRQHandler+0x5a> 800044c: f3ef 8210 mrs r2, PRIMASK 8000450: b672 cpsid i 8000452: 4e75 ldr r6, [pc, #468] ; (8000628 <USART1_IRQHandler+0x20c>) 8000454: 6c31 ldr r1, [r6, #64] ; 0x40 ... Как видим, всё прекрасно заинлайнилось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 15 февраля, 2019 Опубликовано 15 февраля, 2019 · Жалоба 2 minutes ago, AHTOXA said: Смотрим в дизассемблер: Выделите нужный кусок из disasm при вызове скажем uart.UartIrqHandler() и покажите только его. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 15 февраля, 2019 Опубликовано 15 февраля, 2019 · Жалоба 4 минуты назад, Forger сказал: Выделите нужный кусок из disasm при вызове скажем uart.UartIrqHandler() и покажите только его. Я сделал проще - закомментировал создание объекта TISRW, оставил только вызов uart.UartIrqHandler(): /// UART object ConsoleUart uart; /// UART interrupt handler. OS_INTERRUPT void USART1_IRQHandler() { // OS::TISRW ISR; uart.UartIrqHandler(); } Теперь всё, что есть в USART1_IRQHandler - это заинлайненная функция uart.UartIrqHandler(). Она длинная, я попробую засунуть её в спойлер: 0800043c <USART1_IRQHandler>: 800043c: 4b72 ldr r3, [pc, #456] ; (8000608 <USART1_IRQHandler+0x1cc>) 800043e: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr} 8000442: 881c ldrh r4, [r3, #0] 8000444: f8b3 8004 ldrh.w r8, [r3, #4] 8000448: b2a4 uxth r4, r4 800044a: 06a5 lsls r5, r4, #26 800044c: d441 bmi.n 80004d2 <USART1_IRQHandler+0x96> 800044e: 0620 lsls r0, r4, #24 8000450: d517 bpl.n 8000482 <USART1_IRQHandler+0x46> 8000452: 4b6d ldr r3, [pc, #436] ; (8000608 <USART1_IRQHandler+0x1cc>) 8000454: 899a ldrh r2, [r3, #12] 8000456: 0611 lsls r1, r2, #24 8000458: d513 bpl.n 8000482 <USART1_IRQHandler+0x46> 800045a: f3ef 8210 mrs r2, PRIMASK 800045e: b672 cpsid i 8000460: 4e6a ldr r6, [pc, #424] ; (800060c <USART1_IRQHandler+0x1d0>) 8000462: 6c31 ldr r1, [r6, #64] ; 0x40 8000464: f382 8810 msr PRIMASK, r2 8000468: 2900 cmp r1, #0 800046a: d178 bne.n 800055e <USART1_IRQHandler+0x122> 800046c: 899a ldrh r2, [r3, #12] 800046e: f022 0280 bic.w r2, r2, #128 ; 0x80 8000472: 0412 lsls r2, r2, #16 8000474: 0c12 lsrs r2, r2, #16 8000476: 819a strh r2, [r3, #12] 8000478: 899a ldrh r2, [r3, #12] 800047a: b292 uxth r2, r2 800047c: f042 0240 orr.w r2, r2, #64 ; 0x40 8000480: 819a strh r2, [r3, #12] 8000482: 0662 lsls r2, r4, #25 8000484: d521 bpl.n 80004ca <USART1_IRQHandler+0x8e> 8000486: 4a60 ldr r2, [pc, #384] ; (8000608 <USART1_IRQHandler+0x1cc>) 8000488: 8993 ldrh r3, [r2, #12] 800048a: 065b lsls r3, r3, #25 800048c: d51f bpl.n 80004ce <USART1_IRQHandler+0x92> 800048e: 8813 ldrh r3, [r2, #0] 8000490: f023 0340 bic.w r3, r3, #64 ; 0x40 8000494: 041b lsls r3, r3, #16 8000496: 0c1b lsrs r3, r3, #16 8000498: 8013 strh r3, [r2, #0] 800049a: 8993 ldrh r3, [r2, #12] 800049c: f023 0340 bic.w r3, r3, #64 ; 0x40 80004a0: 041b lsls r3, r3, #16 80004a2: 0c1b lsrs r3, r3, #16 80004a4: 8193 strh r3, [r2, #12] 80004a6: f3ef 8410 mrs r4, PRIMASK 80004aa: b672 cpsid i 80004ac: 4858 ldr r0, [pc, #352] ; (8000610 <USART1_IRQHandler+0x1d4>) 80004ae: 4957 ldr r1, [pc, #348] ; (800060c <USART1_IRQHandler+0x1d0>) 80004b0: 6842 ldr r2, [r0, #4] 80004b2: f8d1 308c ldr.w r3, [r1, #140] ; 0x8c 80004b6: ea33 0502 bics.w r5, r3, r2 80004ba: d133 bne.n 8000524 <USART1_IRQHandler+0xe8> 80004bc: 2301 movs r3, #1 80004be: f881 3090 strb.w r3, [r1, #144] ; 0x90 80004c2: f384 8810 msr PRIMASK, r4 80004c6: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} 80004ca: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} 80004ce: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} 80004d2: f3ef 8310 mrs r3, PRIMASK 80004d6: b672 cpsid i 80004d8: 4e4c ldr r6, [pc, #304] ; (800060c <USART1_IRQHandler+0x1d0>) 80004da: 68f2 ldr r2, [r6, #12] 80004dc: f383 8810 msr PRIMASK, r3 80004e0: 2a20 cmp r2, #32 80004e2: d0b4 beq.n 800044e <USART1_IRQHandler+0x12> 80004e4: fa1f f888 uxth.w r8, r8 80004e8: fa5f f888 uxtb.w r8, r8 80004ec: f3ef 8710 mrs r7, PRIMASK 80004f0: b672 cpsid i 80004f2: 4d47 ldr r5, [pc, #284] ; (8000610 <USART1_IRQHandler+0x1d4>) 80004f4: f04f 0901 mov.w r9, #1 80004f8: 46aa mov sl, r5 80004fa: 682a ldr r2, [r5, #0] 80004fc: 68f3 ldr r3, [r6, #12] 80004fe: fa09 f202 lsl.w r2, r9, r2 8000502: 2b20 cmp r3, #32 8000504: ea6f 0102 mvn.w r1, r2 8000508: d116 bne.n 8000538 <USART1_IRQHandler+0xfc> 800050a: 6873 ldr r3, [r6, #4] 800050c: 4313 orrs r3, r2 800050e: 6073 str r3, [r6, #4] 8000510: 686b ldr r3, [r5, #4] 8000512: 400b ands r3, r1 8000514: 606b str r3, [r5, #4] 8000516: 68ab ldr r3, [r5, #8] 8000518: 2b00 cmp r3, #0 800051a: d1f6 bne.n 800050a <USART1_IRQHandler+0xce> 800051c: 4650 mov r0, sl 800051e: f000 fb57 bl 8000bd0 <OS::TKernel::sched()> 8000522: e7ea b.n 80004fa <USART1_IRQHandler+0xbe> 8000524: 6845 ldr r5, [r0, #4] 8000526: 401a ands r2, r3 8000528: 432b orrs r3, r5 800052a: 6043 str r3, [r0, #4] 800052c: f8c1 208c str.w r2, [r1, #140] ; 0x8c 8000530: f384 8810 msr PRIMASK, r4 8000534: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} 8000538: 6972 ldr r2, [r6, #20] 800053a: 3301 adds r3, #1 800053c: 18b1 adds r1, r6, r2 800053e: 3201 adds r2, #1 8000540: 2a20 cmp r2, #32 8000542: 60f3 str r3, [r6, #12] 8000544: bf08 it eq 8000546: 2300 moveq r3, #0 8000548: 6172 str r2, [r6, #20] 800054a: f881 8018 strb.w r8, [r1, #24] 800054e: bf08 it eq 8000550: 6173 streq r3, [r6, #20] 8000552: 4830 ldr r0, [pc, #192] ; (8000614 <USART1_IRQHandler+0x1d8>) 8000554: f000 fb20 bl 8000b98 <OS::TService::resume_all(unsigned int volatile&)> 8000558: f387 8810 msr PRIMASK, r7 800055c: e777 b.n 800044e <USART1_IRQHandler+0x12> 800055e: f3ef 8710 mrs r7, PRIMASK 8000562: b672 cpsid i 8000564: 6c32 ldr r2, [r6, #64] ; 0x40 8000566: b19a cbz r2, 8000590 <USART1_IRQHandler+0x154> 8000568: 6c73 ldr r3, [r6, #68] ; 0x44 800056a: 3a01 subs r2, #1 800056c: 18f1 adds r1, r6, r3 800056e: 3301 adds r3, #1 8000570: 2b40 cmp r3, #64 ; 0x40 8000572: bf08 it eq 8000574: 2300 moveq r3, #0 8000576: f891 504c ldrb.w r5, [r1, #76] ; 0x4c 800057a: 6473 str r3, [r6, #68] ; 0x44 800057c: 6432 str r2, [r6, #64] ; 0x40 800057e: 4826 ldr r0, [pc, #152] ; (8000618 <USART1_IRQHandler+0x1dc>) 8000580: f000 fb0a bl 8000b98 <OS::TService::resume_all(unsigned int volatile&)> 8000584: b2ab uxth r3, r5 8000586: f387 8810 msr PRIMASK, r7 800058a: 4a1f ldr r2, [pc, #124] ; (8000608 <USART1_IRQHandler+0x1cc>) 800058c: 8093 strh r3, [r2, #4] 800058e: e778 b.n 8000482 <USART1_IRQHandler+0x46> 8000590: 4d1f ldr r5, [pc, #124] ; (8000610 <USART1_IRQHandler+0x1d4>) 8000592: f04f 0801 mov.w r8, #1 8000596: 46aa mov sl, r5 8000598: 6829 ldr r1, [r5, #0] 800059a: f8df 9080 ldr.w r9, [pc, #128] ; 800061c <USART1_IRQHandler+0x1e0> 800059e: f859 3021 ldr.w r3, [r9, r1, lsl #2] 80005a2: 809a strh r2, [r3, #4] 80005a4: 6bf2 ldr r2, [r6, #60] ; 0x3c 80005a6: fa08 f301 lsl.w r3, r8, r1 80005aa: 431a orrs r2, r3 80005ac: 63f2 str r2, [r6, #60] ; 0x3c 80005ae: 686a ldr r2, [r5, #4] 80005b0: ea22 0203 bic.w r2, r2, r3 80005b4: 606a str r2, [r5, #4] 80005b6: 68aa ldr r2, [r5, #8] 80005b8: b1f2 cbz r2, 80005f8 <USART1_IRQHandler+0x1bc> 80005ba: 6bf2 ldr r2, [r6, #60] ; 0x3c 80005bc: ea13 0002 ands.w r0, r3, r2 80005c0: d004 beq.n 80005cc <USART1_IRQHandler+0x190> 80005c2: ea22 0303 bic.w r3, r2, r3 80005c6: 63f3 str r3, [r6, #60] ; 0x3c 80005c8: 2300 movs r3, #0 80005ca: e7dc b.n 8000586 <USART1_IRQHandler+0x14a> 80005cc: 6c33 ldr r3, [r6, #64] ; 0x40 80005ce: 2b00 cmp r3, #0 80005d0: d0e8 beq.n 80005a4 <USART1_IRQHandler+0x168> 80005d2: 6c75 ldr r5, [r6, #68] ; 0x44 80005d4: f859 1021 ldr.w r1, [r9, r1, lsl #2] 80005d8: 1c6a adds r2, r5, #1 80005da: 2a40 cmp r2, #64 ; 0x40 80005dc: bf08 it eq 80005de: 4602 moveq r2, r0 80005e0: 8088 strh r0, [r1, #4] 80005e2: 4435 add r5, r6 80005e4: 3b01 subs r3, #1 80005e6: f895 504c ldrb.w r5, [r5, #76] ; 0x4c 80005ea: 6433 str r3, [r6, #64] ; 0x40 80005ec: 480a ldr r0, [pc, #40] ; (8000618 <USART1_IRQHandler+0x1dc>) 80005ee: 6472 str r2, [r6, #68] ; 0x44 80005f0: f000 fad2 bl 8000b98 <OS::TService::resume_all(unsigned int volatile&)> 80005f4: b2ab uxth r3, r5 80005f6: e7c6 b.n 8000586 <USART1_IRQHandler+0x14a> 80005f8: 4650 mov r0, sl 80005fa: f000 fae9 bl 8000bd0 <OS::TKernel::sched()> 80005fe: 6829 ldr r1, [r5, #0] 8000600: fa08 f301 lsl.w r3, r8, r1 8000604: e7d9 b.n 80005ba <USART1_IRQHandler+0x17e> 8000606: bf00 nop 8000608: 40013800 .word 0x40013800 800060c: 200001d4 .word 0x200001d4 8000610: 20000c58 .word 0x20000c58 8000614: 200001dc .word 0x200001dc 8000618: 2000020c .word 0x2000020c 800061c: 20000c6c .word 0x20000c6c Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 15 февраля, 2019 Опубликовано 15 февраля, 2019 · Жалоба Сделайте (времмено) uart.UartIrqHandler() пустой, хотя бы с одним оператором __NOP(), покажите disasm Покажите объявление этой UartIrqHandler внутри класса ConsoleUart. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 15 февраля, 2019 Опубликовано 15 февраля, 2019 · Жалоба Как я понял: компилятор целиком вашу функцию засунул в C-обработчик. Поскольку они объявлены и реализованы в одном и том же файле. Сам С-обработчик безусловно нельзя заменить С++ функцией. Я именно это имел ввиду под словами "Архитектуру никакой ваш inline не обманет". Вызов функции, привязанной к делегату, требует дополнительных 4 такта: В моих проектах эти доп. 4 такта - "слезы" по сравнению с тем, какой функционал дает делегат. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 15 февраля, 2019 Опубликовано 15 февраля, 2019 · Жалоба 14 минут назад, Forger сказал: Сделайте (времмено) uart.UartIrqHandler() пустой, хотя бы с одним оператором __NOP(), покажите disasm Покажите объявление этой UartIrqHandler внутри класса ConsoleUart. Мне, конечно, лень, к тому же проект лежит на гитхабе, и вы можете сами попробовать... Но ладно. Создаю заголовочный файл dummyUart.h: #pragma once #include "stm32.h" // здесь надо подставить заголовочный файл от нужного контроллера class TestUartClass { public: TestUartClass() = default; void irqHandler() { auto status = USART1->SR; auto data = USART1->DR; if (status & USART_SR_RXNE) { if (rxCount < bufferSize - 1) rxBuffer[rxCount++] = data; } } private: static constexpr size_t bufferSize { 32 }; size_t rxCount { 0 }; uint8_t rxBuffer[bufferSize]; }; В файле hw.cpp заменяю uart на вновь созданный: #include "dummyUart.h" /// UART object TestUartClass dummyUart; /// UART interrupt handler. OS_INTERRUPT void USART1_IRQHandler() { dummyUart.irqHandler(); } Смотрю дизассемблер: 0800043c <USART1_IRQHandler>: 800043c: 4b07 ldr r3, [pc, #28] ; (800045c <USART1_IRQHandler+0x20>) 800043e: 881a ldrh r2, [r3, #0] 8000440: 889b ldrh r3, [r3, #4] 8000442: 0692 lsls r2, r2, #26 8000444: b29b uxth r3, r3 8000446: d507 bpl.n 8000458 <USART1_IRQHandler+0x1c> 8000448: 4905 ldr r1, [pc, #20] ; (8000460 <USART1_IRQHandler+0x24>) 800044a: 680a ldr r2, [r1, #0] 800044c: 2a1e cmp r2, #30 800044e: d803 bhi.n 8000458 <USART1_IRQHandler+0x1c> 8000450: 1c50 adds r0, r2, #1 8000452: 440a add r2, r1 8000454: 6008 str r0, [r1, #0] 8000456: 7113 strb r3, [r2, #4] 8000458: 4770 bx lr 800045a: bf00 nop 800045c: 40013800 .word 0x40013800 8000460: 200001d4 .word 0x200001d4 Всё. Теперь в обработчике прерывания вообще нет ни одного вызова. Всё полностью заинлайнилось. НИКАКИХ НАКЛАДНЫХ РАСХОДОВ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 15 февраля, 2019 Опубликовано 15 февраля, 2019 · Жалоба 14 minutes ago, AHTOXA said: НИКАКИХ НАКЛАДНЫХ РАСХОДОВ. Поздравляю! Вы решили очень "важную" проблему :) Я раньше тоже так делал - размещал обработчик прямо в файле, где создаются классы, методы которых мы в нем вызываем. Но, увы, проблемы возникли позже при развитии проекта - слишком тесные взаимосвязи, масса глобальных объектов (пусть даже и static), как итог - полноценно использовать ООП не получается (( А раз нет ООП, то и от С++ нет никакого проку. Все это можно и на С сделать. Делегат тут хоть и дает небольшой оверхед, но полностью снимает ограничения, очень нужные для грамотного построения проекта. Второе мне важнее этих крохотных "накладных" расходов. Но кому как ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 15 февраля, 2019 Опубликовано 15 февраля, 2019 · Жалоба 3 минуты назад, Forger сказал: Поздравляю! Вы решили очень "важную" проблему, но какой ценой! Никакой проблемы и не было, кроме сложностей с разжёвыванием вам этих элементарных вещей. Ведь всё просто: нужен обработчик на плюсах - пишем обработчик, и он работает. Без накладных расходов. Главная фишка плюсов - ты не платишь за то, что не используешь. А вот вы решаете не пойми какие проблемы путём расхода кучи ОЗУ, ухудшения читаемости и сопровождаемости вашего кода. Вы ещё исключения и RTTI прямо в прерывания добавьте:) Так-то я не против, делайте как вам нравится, это ваше личное дело. Но только пожалуйста не врите, что это бесплатно. 16 минут назад, Forger сказал: Сам С-обработчик безусловно нельзя заменить С++ функцией. Я именно это имел ввиду под словами "Архитектуру никакой ваш inline не обманет". И тем не менее, как я показал выше, всё в результате выходит именно так: прямо из таблицы векторов вызывается нужная с++ функция. 17 минут назад, Forger сказал: Вызов функции, привязанной к делегату, требует дополнительных 4 такта: Срочно учить матчасть! Растактовку, потерю на переходах, сброс конвейера и всё такое. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 15 февраля, 2019 Опубликовано 15 февраля, 2019 · Жалоба 11 minutes ago, AHTOXA said: А вот вы решаете не пойми какие проблемы Для меня ваши решения - это уже давно пройденный путь, так не делаю по причинам, которые тут уже излагал. Но полагаю, что вы не понимаете этих причин. Отсюда взаимное недопонимание. Quote ухудшения читаемости - как раз наоборот, но вы и этого не видите (( Коли так, то предлагаю на этом закончить :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 15 февраля, 2019 Опубликовано 15 февраля, 2019 · Жалоба С некоторого момента с интересом слежу за трэдом чисто ради спортивного интереса Ничего, я скоро подключусь с очередным "гениальным" велосипедом - писал суперцикл для простейшего проекта (без FreeRTOS), а в итоге увлекся и сделал свою многозадачную микроОС Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 15 февраля, 2019 Опубликовано 15 февраля, 2019 · Жалоба 1 час назад, Forger сказал: Для меня ваши решения - это уже давно пройденный путь, так не делаю по причинам, которые тут уже излагал. Но полагаю, что вы не понимаете этих причин. Отсюда взаимное недопонимание. Меня поражает ваша способность двадцать раз за время спора усесться в лужу, и при этом делать вид, что вы что-то понимаете лучше оппонента. Думаю, вас ценит начальство:) Вот, сами посчитайте свои посадки в лужи (я ещё не все процитировал), и прослезитесь: В 13.02.2019 в 12:16, Forger сказал: Я имею ввиду именно такой термин "стек", БЕЗ привязки к конкретно взятой платформе или компилятору. В 13.02.2019 в 17:08, Forger сказал: Я решил, что using имеется ввиду не только использования для namespace В 12.02.2019 в 17:06, Forger сказал: Вы по сути описали delegate, но только сделанный "на коленке в гараже" :) Оверхед такой же, но в остальном - проигрывает готовым решениям. В 14.02.2019 в 20:26, Forger сказал: Я использую третий способ, но приведенный к более кмк красивому и деликатному решению, а именно - обработчик прерываний является самым обычным методом нужного класса (НЕ static). В 15.02.2019 в 01:12, Forger сказал: Не нужен startup 1 час назад, Forger сказал: Вызов функции, привязанной к делегату, требует дополнительных 4 такта: 1 час назад, Forger сказал: Я именно это имел ввиду под словами "Архитектуру никакой ваш inline не обманет". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться