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

Как делить программу на объекты?

1 час назад, Forger сказал:

МК от этого не будет медленнее работать, не будет тупить или дольше "загружаться". От этого НИЧЕГО не изменится.

Никто не говорил, что МК от большего расхода ОЗУ будет медленнее работать (хотя, как мы уже видели, латентность прерываний ухудшится). Речь шла о том, что в ряде случаев придётся взять МК с бОльшим количеством ОЗУ. Так что КОЕ-ЧТО очень даже изменится.

1 час назад, Forger сказал:

Переходим на плюсы с виртуальным методами, RTTI, исключениями и т. п. - накладных расходов не избежать. 

С другой стороны можно по-прежнему как аборигены сидеть на голом С, бить себя "пяткой в грудь"

Я не против применения C++ в МК. Я очень даже за. Но я против того, чтобы бездумно тащить ВСЁ из плюсов в МК. Я считаю, что исключения, RTTI и ещё некоторые подобные вещи в МК неуместны.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

22 minutes ago, AHTOXA said:

 в ряде случаев придётся взять МК с бОльшим количеством ОЗУ.

И часто это вам приходилось делать - на грани сотни другой байт балансировать с объемом ОЗУ?

Просто ради интереса соберите статистику по своим проектам и посмотрите RAM usage. Уверен, что редко где будет более 50%.

 

Quote

(хотя, как мы уже видели, латентность прерываний ухудшится).

Если начнете вызывать из прерываний С++ функции, любые, то разницы никакой не будет. А то и вовсе наоборот.

 

Quote

Я не против применения C++ в МК. Я очень даже за. Но я против того, чтобы бездумно тащить ВСЁ из плюсов в МК. Я считаю, что исключения, RTTI и ещё некоторые подобные вещи в МК неуместны.

Ваше мнение понятно. Раньше и я разделял это мнение, но времена меняются, проекты становятся сложнее, камни - толще... 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Forger сказал:

И часто это вам приходилось делать - на грани сотни другой байт балансировать с объемом ОЗУ?

Вы опять читаете невнимательно. Речь не про запас в сотню-другую байт, а про запас в процентах. Скажем, если я вижу, что используется больше 80% ОЗУ, то я начинаю задумываться о смене камня. Так вот, благодаря вашим делегатам, этот порог снижается на 6%. Так понятно?

И да, я менял камни, когда оказывалось, что запас ниже допустимого.

1 час назад, Forger сказал:

Если начнете вызывать из прерываний С++ функции, любые, то разницы никакой не будет. А то и вовсе наоборот.

Выше по теме я приводил пример, как вызов из обработчика функции-члена класса не приводит к накладным расходам. Совсем. Но вы же не читатель...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, AHTOXA said:

Вы опять читаете невнимательно.  Так вот, благодаря вашим делегатам, этот порог снижается на 6%. Так понятно?

Делегаты тут ни при чем. Вы просто хотите за что нибудь уцепиться, чтобы себя же убедить, что некие "делегаты" якобы зло,

прекрасно понимая, что имея исходники, можно найти решение даже в таком невероятно редком случае.

 

Quote

Но вы же не читатель...

Чепуху не читаю. При возникновении прерывания все равно произойдет вызов обычной С-функции, адрес которой размещается при сборке проекта в таблице векторов. 

Далее уже из этой С-функции произойдет вызов вашей (не static) С++ функции с размещением в стеке в регистре R0 соотв значения this.

Архитектуру никакой ваш inline не обманет. Можете убедиться лично и посмотреть disasm.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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
...

Как видим, всё прекрасно заинлайнилось.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, AHTOXA said:

Смотрим в дизассемблер:

Выделите нужный кусок из disasm при вызове скажем uart.UartIrqHandler() и покажите только его.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сделайте (времмено) uart.UartIrqHandler() пустой, хотя бы с одним оператором __NOP(), покажите disasm

Покажите объявление этой UartIrqHandler внутри класса ConsoleUart.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как я понял: компилятор целиком вашу функцию засунул в C-обработчик. Поскольку они объявлены и реализованы в одном и том же файле.

Сам С-обработчик безусловно нельзя заменить С++ функцией. Я именно это имел ввиду под словами "Архитектуру никакой ваш inline не обманет".

Вызов функции, привязанной к делегату, требует дополнительных 4 такта:

 

Вызов делегата.jpg

 

В моих проектах эти доп. 4 такта -  "слезы" по сравнению с тем, какой функционал дает делегат.

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Всё. Теперь в обработчике прерывания вообще нет ни одного вызова. Всё полностью заинлайнилось. НИКАКИХ НАКЛАДНЫХ РАСХОДОВ.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 minutes ago, AHTOXA said:

НИКАКИХ НАКЛАДНЫХ РАСХОДОВ.

Поздравляю! Вы решили очень "важную" проблему :)

 

Я раньше тоже так делал - размещал обработчик прямо в файле, где создаются классы, методы которых мы в нем вызываем.

Но, увы, проблемы возникли позже при развитии проекта - слишком тесные взаимосвязи, масса глобальных объектов (пусть даже и static), как итог -  полноценно использовать ООП не получается ((

А раз нет ООП, то и от С++ нет никакого проку. Все это можно и на С сделать. 

 

Делегат тут хоть и дает небольшой оверхед, но полностью снимает ограничения, очень нужные для грамотного построения проекта. Второе мне важнее этих крохотных "накладных" расходов.

Но кому как ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 минуты назад, Forger сказал:

Поздравляю! Вы решили очень "важную" проблему, но какой ценой! 

Никакой проблемы и не было, кроме сложностей с разжёвыванием вам этих элементарных вещей.

Ведь всё просто: нужен обработчик на плюсах - пишем обработчик, и он работает. Без накладных расходов. Главная фишка плюсов - ты не платишь за то, что не используешь.

А вот вы решаете не пойми какие проблемы путём расхода кучи ОЗУ, ухудшения читаемости и сопровождаемости вашего кода. Вы ещё исключения и RTTI прямо в прерывания добавьте:)

Так-то я не против, делайте как вам нравится, это ваше личное дело. Но только пожалуйста не врите, что это бесплатно.

16 минут назад, Forger сказал:

Сам С-обработчик безусловно нельзя заменить С++ функцией. Я именно это имел ввиду под словами "Архитектуру никакой ваш inline не обманет".

И тем не менее, как я показал выше, всё в результате выходит именно так: прямо из таблицы векторов вызывается нужная с++ функция.

17 минут назад, Forger сказал:

Вызов функции, привязанной к делегату, требует дополнительных 4 такта: 

Срочно учить матчасть! Растактовку, потерю на переходах, сброс конвейера и всё такое.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 minutes ago, AHTOXA said:

А вот вы решаете не пойми какие проблемы

Для меня ваши решения - это уже давно пройденный путь, так не делаю по причинам, которые тут уже излагал. Но полагаю, что вы не понимаете этих причин. Отсюда взаимное недопонимание.

 

Quote

ухудшения читаемости -

как раз наоборот, но вы и этого не видите ((

 

 

Коли так, то предлагаю на этом закончить :)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С некоторого момента с интересом слежу за трэдом чисто ради спортивного интереса:hi:

Ничего, я скоро подключусь с очередным "гениальным" велосипедом - писал суперцикл для простейшего проекта (без FreeRTOS), а в итоге увлекся и сделал свою многозадачную микроОС:biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 не обманет".

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

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