Op 9 augustus 2020 23:55:26 schreef henri62:
Hoe ziet de preprocessor file eruit?
Ik vind dat een lastige vraag. Enerzijds moet ik dan weer uitzoeken hoe ik die ook al weer moet maken, anderzijds verwacht ik geen spectaculaire dingen.
Mijn policy is bij dit soort dingen om ook de verzoeken te honoreren waar ik geen heil in zie: In m'n eentje heb ik die allemaal al niet gedaan en kwam ik er niet uit. 1 van de "rare, dat heeft geen zin" dingen geeft mogelijk een hint.
Mijn gevoel van "de bug" is nu dat de code voor opts->macaddress[0] = xxx; erg lijkt op iets wat intern gebruikt wordt voor "en hier stopt de executie".
PS: En ook nog of je clang oid kunt gebruiken.
Ik weet niet wat dat is. Ik gebruik geen IDE.
Ik heb alle LWIP shit uit main gehaald en een apart sourcefile voor gemaakt. Nu heb ik een my_ip_init () functie om de ip stuff te initializeren.
Ik heb in een poging een leesbare assembly te krijgen dat file gecompileerd zonder -ggdb ... Dat ziet er als volgt uit:
code:
.section .gnu.lto_.jmpfuncs.45ecf0a0896eca14,"e",%progbits
.ascii "x\234\225\223\313K\303@\020\306\347\313\246i\264V{o"
.ascii "\017={\360\320?P\323Z\037\024\321\233\342Az\250\005"
.ascii "Q\004\361Q\360\331\326\267\320\203\005O\005=\025\274"
.ascii "\010\036D\360 \306\231t\023C\212\025\027\206$\273\277"
.ascii "\371\276\331\331\215M\2407E\3010\011\300TY\221\245V"
.ascii "\024\352\356r\335\\Te\005\330\374\271\266\321r\207\212"
Niet leesbaar dus. Ik denk dat dit een soort van tussencode is die dan nog door LTO in de linker verder gecompileerd en geoptimaliseerd moet worden.
Ik heb LTO nu maar uitgezet: 1 complicatie minder.
Met de assignment naar een lwipopts->macaddress er in krijg ik nu 39k aan text-segment en zonder krijg ik 80k. Ik dacht dat ik 120k zou moeten krijken, maar daar doe ik even niet moeilijk over (Oh! ik denk dat ik het al weet: Dat was met -O0).
De my_ip_init geeft nu de volgende assembly:
code:
my_ip_init:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
push {r3, r4, r5, lr}
ldr r5, .L11
movs r2, #0
mov r1, #2048
ldr r4, .L11+4
mov r0, r5
bl _pal_lld_setgroupmode
mov r0, r5
movs r2, #0
mov r1, #8192
bl _pal_lld_setgroupmode
mov r0, r5
movs r2, #0
mov r1, #16384
bl _pal_lld_setgroupmode
mov r0, r4
movw r2, #1410
mov r1, #2048
bl _pal_lld_setgroupmode
mov r0, r4
movw r2, #1410
mov r1, #4096
bl _pal_lld_setgroupmode
mov r0, r4
movw r2, #1410
mov r1, #8192
bl _pal_lld_setgroupmode
movs r0, #0
pop {r3, r4, r5, lr}
b lwipInit
.L12:
.align 2
En dat is de gecompileerde versie van:
code:
void my_ip_init (void)
{
lwipthread_opts_t opts;
palSetPadMode (GPIOG, 11, PAL_MODE_INPUT);
palSetPadMode (GPIOG, 13, PAL_MODE_INPUT);
palSetPadMode (GPIOG, 14, PAL_MODE_INPUT);
palSetPadMode (GPIOB, 11, PAL_MODE_ALTERNATE (11));
palSetPadMode (GPIOB, 12, PAL_MODE_ALTERNATE (11));
palSetPadMode (GPIOB, 13, PAL_MODE_ALTERNATE (11));
memset (&opts, 0, sizeof (opts));
// set_mac2 (opts.macaddress);
#if 0
opts.macaddress[0] = UIDROM[0];
opts.macaddress[1] = UIDROM[1];
opts.macaddress[2] = UIDROM[2];
opts.macaddress[3] = UIDROM[3];
opts.macaddress[4] = UIDROM[4];
opts.macaddress[5] = UIDROM[5];
#endif
//opts.macaddress[1] = UIDROM[1];
//lwipInit(&opts);
lwipInit(NULL);
}
De palsetpadmode is dus wel een macro. Die maakt er kennelijk een pal_lld_setgroupmode call van.
Hey!!!! Dus nu met de assignment terug:
code:
my_ip_init:
@ Volatile: function does not return.
De compiler denkt inderdaad dat alle code achter deze call "dood" is!
Volledige assembly van de functie:
code:
.type my_ip_init, %function
my_ip_init:
@ Volatile: function does not return.
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
ldr r5, .L11
movs r2, #0
mov r1, #2048
ldr r4, .L11+4
mov r0, r5
push {r3, lr}
bl _pal_lld_setgroupmode
mov r0, r5
movs r2, #0
mov r1, #8192
bl _pal_lld_setgroupmode
mov r0, r5
movs r2, #0
mov r1, #16384
bl _pal_lld_setgroupmode
mov r0, r4
movw r2, #1410
mov r1, #2048
bl _pal_lld_setgroupmode
mov r0, r4
movw r2, #1410
mov r1, #4096
bl _pal_lld_setgroupmode
mov r0, r4
movw r2, #1410
mov r1, #8192
bl _pal_lld_setgroupmode
movs r3, #0
strb r3, [r3, #1]
.inst 0xdeff
.L12:
.align 2
.L11:
.word 1073879040
.word 1073873920
.size my_ip_init, .-my_ip_init
.section .text.udp_artnet_init,"ax",%progbits
.align 1
edit: Oh. Vergeten te zeggen: Ik roep lwipInit() nu aan met NULL zoals vroeger, dus al het gedoe met de lwip struct is nutteloos....
Hier is nog hoe de functie er uitziet na de preprocessor.
code:
void my_ip_init (void)
{
lwipthread_opts_t opts;
_pal_lld_setgroupmode(((stm32_gpio_t *)((0x40000000UL + 0x00020000UL) + 0x1800UL)), ((ioportmask_t)(1U << (11))) << 0U, (0U << 0U));
_pal_lld_setgroupmode(((stm32_gpio_t *)((0x40000000UL + 0x00020000UL) + 0x1800UL)), ((ioportmask_t)(1U << (13))) << 0U, (0U << 0U));
_pal_lld_setgroupmode(((stm32_gpio_t *)((0x40000000UL + 0x00020000UL) + 0x1800UL)), ((ioportmask_t)(1U << (14))) << 0U, (0U << 0U));
_pal_lld_setgroupmode(((stm32_gpio_t *)((0x40000000UL + 0x00020000UL) + 0x0400UL)), ((ioportmask_t)(1U << (11))) << 0U, ((2U << 0U) | ((11) << 7U)));
_pal_lld_setgroupmode(((stm32_gpio_t *)((0x40000000UL + 0x00020000UL) + 0x0400UL)), ((ioportmask_t)(1U << (12))) << 0U, ((2U << 0U) | ((11) << 7U)));
_pal_lld_setgroupmode(((stm32_gpio_t *)((0x40000000UL + 0x00020000UL) + 0x0400UL)), ((ioportmask_t)(1U << (13))) << 0U, ((2U << 0U) | ((11) << 7U)));
memset (&opts, 0, sizeof (opts));
# 61 "lwip.c"
opts.macaddress[1] = ((uint8_t *)0x1FF0F420)[1];
lwipInit(
# 64 "lwip.c" 3 4
((void *)0)
# 64 "lwip.c"
);
}
[Bericht gewijzigd door
rew
op maandag 10 augustus 2020 09:53:22
(11%)