Vinnaren i pepparkakshustävlingen!
  • 1
  • 2
2020-08-10, 00:17
  #1
Medlem
Ska skriva realtidskod för ett inbyggt system vilket jag aldrig gjort förut och tänkte se om nån kan hjälpa. Detta är strukturen på koden:

Kod:
parameter1
parameter2
parameter3
osv...

loop{

funktion1(flera invärden och utvärden)
funktion2(flera invärden och utvärden)
funktion3(flera invärden och utvärden)
osv...

}

Jag har läst att i C kan man få flera return-värden från en funktion genom att använda pekare. Så jag tänker göra så, behöver invärdena till funktionerna också vara pekare?

Spelar det nån roll om jag deklarerar parametrarna som vanligt:
Kod:
double d 10

eller om jag använder malloc? Kan nån förklara skillnaden?

I funktionerna tänker jag använda malloc/free för alla variabler som skapas i dem för att undvika fragmentering.

Vill ha så effektiv kod som möjligt.

Tack på förhand.
__________________
Senast redigerad av chelchele 2020-08-10 kl. 00:20.
Citera
2020-08-10, 00:36
  #2
Medlem
Trollfeeders avatar
Citat:
Ursprungligen postat av chelchele
Ska skriva realtidskod för ett inbyggt system vilket jag aldrig gjort förut och tänkte se om nån kan hjälpa. Detta är strukturen på koden:

Realtid handlar inte om att vara klar så snabbt som möjligt. Det handlar om att vara klar inom specificerad tid.

Citat:
Kod:
parameter1
parameter2
parameter3
osv...

loop{

funktion1(flera invärden och utvärden)
funktion2(flera invärden och utvärden)
funktion3(flera invärden och utvärden)
osv...

}

Jag har läst att i C kan man få flera return-värden från en funktion genom att använda pekare. Så jag tänker göra så, behöver invärdena till funktionerna också vara pekare?

Det du syftar på tror jag är att returnera en pekare, som pekar på t ex en struct. Det har ingeting med dina funktionsparametrar att göra.

Citat:
Spelar det nån roll om jag deklarerar parametrarna som vanligt:
Kod:
double d 10

eller om jag använder malloc? Kan nån förklara skillnaden?

Ja. Att bara deklarera en variabel lägger den på stacken. Om du allokerar minne med malloc så hamnar det på heapen.

Citat:
I funktionerna tänker jag använda malloc/free för alla variabler som skapas i dem för att undvika fragmentering.

Hur ska det undvika fragmentering menar du?

Citat:
Vill ha så effektiv kod som möjligt.

Varför då? Om du skriver kod för ett realtidssystem, så borde målet vara att skriva tillräckligt effektiv kod. Att optimera innan man vet om det behövs är bortkastad tid och skapar onödig komplexitet.

Citat:
Tack på förhand.

Varsågod. Vad är det för typ av realtidssystem du ska koda? Jag får intrycket att du är ute på djupt vatten av vad du skriver.

Vad har du för bakgrund sedan tidigare?
__________________
Senast redigerad av Trollfeeder 2020-08-10 kl. 00:59.
Citera
2020-08-10, 01:06
  #3
Medlem
Citat:
Ursprungligen postat av Trollfeeder
Realtid handlar inte om att vara klar så snabbt som möjligt. Det handlar om att vara klar inom specificerad tid.



Det du syftar på tror jag är att returnera en pekare, som pekar på t ex en struct. Det har ingeting med dina funktionsparametrar att göra.



Ja. Att bara deklarera en variabel lägger den på stacken. Om du allokerar minne med malloc så hamnar det på heapen.



Hur ska det undvika fragmentering menar du?



Varför då? Om du skriver kod för ett realtidssystem, så borde målet vara att skriva tillräckligt effektiv kod. Att optimera innan man vet om det behövs är bortkastad tid och skapar onödig komplexitet.



Varsågod. Vad är det för typ av realtidssystem du ska koda? Jag får intrycket att du är ute på djupt vatten av vad du skriver.

ECU, bildator. Ju mer man kan få in desto bättre, så effektivitet är bra. Snabb kod är viktigt.

Jag har läst lite om minne i C nu. Finns ingen anledning att använda heapen utan låter funktionernas variabler vara i stacken. Parametrarna lägger jag i static-minnet eller kanske i stacken. Bra idéer?

Nej! Eftersom funktionerna ska returnera flera variabler (av vilka parametrarna ingår) måste parametrarna läggas i heapen så jag kan modifiera dem i funktionerna = flera return-variabler.......?

Är man aldrig ute på djupt vatten lär man sig inget
Citera
2020-08-10, 01:07
  #4
Medlem
Citat:
Ursprungligen postat av Trollfeeder
Vad har du för bakgrund sedan tidigare?

java, m, python
Citera
2020-08-10, 01:25
  #5
Medlem
Trollfeeders avatar
Citat:
Ursprungligen postat av chelchele
ECU, bildator. Ju mer man kan få in desto bättre, så effektivitet är bra. Snabb kod är viktigt.

En ECU ska väl bara följa spec och göra det den ska? Eller är det ett hempularprojekt?

Citat:
Jag har läst lite om minne i C nu. Finns ingen anledning att använda heapen utan låter funktionernas variabler vara i stacken.

Det beror på vad du ska göra. Och hur ser minnesarkitekturen ut på din hårdvara?

Citat:
Parametrarna lägger jag i static-minnet eller kanske i stacken. Bra idéer?

Funktionsparametrar läggs på stacken.

Citat:
Nej! Eftersom funktionerna ska returnera flera variabler (av vilka parametrarna ingår) måste parametrarna läggas i heapen så jag kan modifiera dem i funktionerna = flera return-variabler.......?

Jag får intrycket att du har en hög med data som du vill göra en serie med operationer på genom en serie funktionsanrop. Då vore det naturligt att lägga det på heapen och sen skicka med pekaren till structen eller arrayen eller vad du nu väljer för datatyp, och operera på den i varje funktion.

Citat:
Är man aldrig ute på djupt vatten lär man sig inget

Hehe, helt rätt!

Citat:
Ursprungligen postat av chelchele
java, m, python

Ok, då är det just minneshanteringen som blir det nya.
Citera
2020-08-10, 02:22
  #6
Medlem
Citat:
Ursprungligen postat av Trollfeeder
En ECU ska väl bara följa spec och göra det den ska? Eller är det ett hempularprojekt?

ska programmera den själv


Citat:
Det beror på vad du ska göra. Och hur ser minnesarkitekturen ut på din hårdvara?

Vad spelar det för roll? Minne som minne, eller har jag missat nåt viktigt här?


Citat:

Jag får intrycket att du har en hög med data som du vill göra en serie med operationer på genom en serie funktionsanrop. Då vore det naturligt att lägga det på heapen och sen skicka med pekaren till structen eller arrayen eller vad du nu väljer för datatyp, och operera på den i varje funktion.

jag har ett gäng parametrar,
funktion1 räknar på några parametrar och insignaler och ger en eller flera signaler ut och kan uppdatera parametrarna
funktion2 gör samma sak med andra parametrar och in/utsignaler
osv...

är det nån skillnad på att skicka in en hel structs pekare ist för separata parametrars pekare? Alltså blir det snabbare med färre pekare in i en funktion? minnesåtgång?
Citera
2020-08-10, 02:30
  #7
Medlem
vad om jag gör parametrarna static (globala), kan jag uppdatera dem i alla funktioner då?

även alla andra in/utsignaler från funktionerna kan man ju göra static? då blir funktionerna inte pekarbaserade, spelar det nån roll?
Citera
2020-08-10, 02:41
  #8
Medlem
Trollfeeders avatar
Citat:
Ursprungligen postat av chelchele
ska programmera den själv

Det jag frågade var om du gör det åt dig själv, eller om det är kommersiellt.




Citat:
Vad spelar det för roll? Minne som minne, eller har jag missat nåt viktigt här?

Man kan ha minneshierarkier där vissa delar av minnet inte är tillgängligt för stacken, t ex.

Citat:
jag har ett gäng parametrar,
funktion1 räknar på några parametrar och insignaler och ger en eller flera signaler ut och kan uppdatera parametrarna
funktion2 gör samma sak med andra parametrar och in/utsignaler
osv...

Ok, ska jag tolka det som att dom opererar på olika data? Du delar inget data mellan funktionerna?

Citat:
är det nån skillnad på att skicka in en hel structs pekare ist för separata parametrars pekare? Alltså blir det snabbare med färre pekare in i en funktion? minnesåtgång?

Det är skillnad. Vad som är snabbast beror på vad du gör i övrigt också, men när det gäller själva funktionsanropet så behöver ju bara en pekare pushas på stacken om du bara har en pekare, så just den biten blir effektivare på det sättet.


Citat:
Ursprungligen postat av chelchele
vad om jag gör parametrarna static (globala), kan jag uppdatera dem i alla funktioner då?

Ja, men globala variabler är ju inte att rekommendera.

Citat:
även alla andra in/utsignaler från funktionerna kan man ju göra static? då blir funktionerna inte pekarbaserade, spelar det nån roll?

Det kan man väl om man vill ha magsår.
Citera
2020-08-10, 02:48
  #9
Medlem
Bromsklosss avatar
Citat:
Ursprungligen postat av chelchele
Eftersom funktionerna ska returnera flera variabler (av vilka parametrarna ingår) måste parametrarna läggas i heapen så jag kan modifiera dem i funktionerna = flera return-variabler.......?

Jag är inte så säker på att någon heap bör vara inblandad alls i ett realtidssystem som det här, eller kanske i "inbyggda" system överhuvudtaget. Annars måste det ju finnas ett helt maskineri, med malloc och kanske operativsystem, för att tillhandahålla minnesallokeringsfunktionaliteten.

I stället går det väl bra att ha sakerna på stacken?:

https://onlinegdb.com/H1pfuzR-v
Kod:
#include <stdio.h>

void doubling(int*);

int main()
{
    int x = 5;
    printf("x: %d\n", x);

    doubling(&x);
    printf("x: %d\n", x);

    return 0;
}

void doubling(int *a)
{
    *a = 2*(*a);
}

Citat:
Ursprungligen postat av chelchele
är det nån skillnad på att skicka in en hel structs pekare ist för separata parametrars pekare? Alltså blir det snabbare med färre pekare in i en funktion? minnesåtgång?

Det är inte osannolikt att kompilatorn kommer generera samma kod i båda fallen så att det inte blir någon skillnad alls. Du kan testa sådant på sidan Compiler Explorer.
__________________
Senast redigerad av Bromskloss 2020-08-10 kl. 02:59.
Citera
2020-08-10, 10:50
  #10
Medlem
28k8s avatar
Skapa en/flera struct som databehållare för dina värden, passa sedan en pekare till den.
Citera
2020-08-10, 11:00
  #11
Medlem
28k8s avatar
Citat:
Ursprungligen postat av Trollfeeder
Om du skriver kod för ett realtidssystem, så borde målet vara att skriva tillräckligt effektiv kod. Att optimera innan man vet om det behövs är bortkastad tid och skapar onödig komplexitet.

Håller delvis med. Att skriva eftertänkt (och i den här kontexten "optimerad") kod är något man alltid bör sträva efter. Visst kan man labba fram en lösning utan att tänka på datatyper, loop unrolling, pekararitmetik etc och ta städningen senare. Problemet är bara att det där "senare" sällan inträffar då kodbas och scope expanderar.

TS är definitivt ute på ovan beskrivna djupt vatten, men låt oss kasta ut en livboj som flyter och peka i rätt riktning.
Citera
2020-08-10, 11:09
  #12
Medlem
Trollfeeders avatar
Citat:
Ursprungligen postat av 28k8
Håller delvis med. Att skriva eftertänkt (och i den här kontexten "optimerad") kod är något man alltid bör sträva efter. Visst kan man labba fram en lösning utan att tänka på datatyper, loop unrolling, pekararitmetik etc och ta städningen senare. Problemet är bara att det där "senare" sällan inträffar då kodbas och scope expanderar.

TS är definitivt ute på ovan beskrivna djupt vatten, men låt oss kasta ut en livboj som flyter och peka i rätt riktning.

Om man från början vet att det kommer bli tight med någon viss resurs, visst. Men om man inte vet om det kommer vara cykler eller minne som kommer vara den trängsta resursen, så vet man inte vad man ska optimera. Loop unrolling är ett typexempel på det. Det ska man absolut inte ägna sig åt innan man vet om det är minne eller cykler man optimerar för. Kanske är det både och, och att man i så fall vill göra det i kritiska loopar men inte i andra. Kanske har man hur mycket cykler som helst, men får tight med minne. Då vill man inte ha det alls. Kanske har man oceaner av minne, men tight med cykler överallt. Först då kan det vara vettigt att göra det på varenda loop.
Citera
  • 1
  • 2

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback