Avatar billede mse Nybegynder
01. september 2004 - 09:04 Der er 8 kommentarer og
1 løsning

Dybt inde i Linux. Need help.

Hey folkens

Jeg er igang med at pille med uC Linux til et embedded system. Ved opstarten af kernen møder jeg dog lidt modstand fra pingvinen.

\kernel\kthread.c (linie ca. 130) udføres nedenstående.
  work.func(work.data);

Efter noget debuging er jeg så kommet til et punkt jeg ikke lige er helt med på.
\include\linux\workqueue.h (linie ca. 20)
  #define __WORK_INITIALIZER(n, f, d) {                \
        .entry    = { &(n).entry, &(n).entry },            \
    .func = (f),                        \
    .data = (d),                        \
    .timer = TIMER_INITIALIZER(NULL, 0, 0),            \
    }

#define DECLARE_WORK(n, f, d)                    \
    struct work_struct n = __WORK_INITIALIZER(n, f, d)

Mit spørgsmål er så hvad #define DECLARE_WORK(.... osv. er??? Er det en speciel måde at oprette en funktion på(som det ligner)

Har hellere aldrig set en struct med .entry, .func osv.. Hvad betyder alt det???

Og et sidste spørgsmål. Når "work.func(work.data);" kaldes dør kernen. Hvad kan dette skyldes??? Er der noget IRQ der er sat forkert op som får den til at fryse???

Håber sq i kan hjælpe en ung junior pingvin
Mvh
GreateWhite.DK
Avatar billede arne_v Ekspert
01. september 2004 - 09:29 #1
Det der er makroer.

Grundliggende er det en tekst substitution som sker i forbindelse
med preprocessingen (samtidigt med #include og #ifdef).
Avatar billede arne_v Ekspert
01. september 2004 - 09:32 #2
Du kan se hvad det bliver til med:

gcc -E xxxx.c -o xxxx.i

så kører den kun præprocessoren og du kan se i .i filen hvad
den rigtige compiler får.
Avatar billede mse Nybegynder
01. september 2004 - 09:54 #3
Det er ikke så meget hvad den får. Det er mere hvad en sådan macro betyder. Men nu hvor jeg ved det hedder macro så kan jeg da lige surfe lidt mere rundt på nettet.
Ved du noget om hvad .entry, .func osv. bruges til?

Takker for dit svar forresten arne_v
Avatar billede arne_v Ekspert
01. september 2004 - 10:06 #4
Princippet er meget simpelt.

Hvis du laver:

#define M(typ,nam,val) typ nam = val;

så kan du skrive:

M(int,a,123)
M(char*,b,"abc")

og preprocessoren laver det til:

int a = 123;
char* b = "abc";
Avatar billede arne_v Ekspert
01. september 2004 - 10:07 #5
Ovenstående eksempel er ikke specielt anvendeligt, men ...
Avatar billede arne_v Ekspert
01. september 2004 - 10:08 #6
Den der lidt mystiske konstruktion initialiserer tilsyneladende nogle
felter i structen (jeg antager at entry, func etc. er felter i work_struct).
Avatar billede mse Nybegynder
01. september 2004 - 12:40 #7
Kan du ikke svare så jeg kan give dig point.
Du har nemlig hjulpen mig til at komme lidt videre. Og det skal du have mange tak for
Avatar billede arne_v Ekspert
01. september 2004 - 12:43 #8
ok
Avatar billede bertelbrander Novice
02. september 2004 - 23:25 #9
Macro'en er ganske rigtigt lidt speciel, og kræver at man bruger en C99 kompiler, dvs ingen C++ og en ret ny gcc eller ...

Det specielle er at man bruger ".zzz=xx" i initialiser listen. Normalt skal man liste initialiserne i rækkefølge men med C99 kan man specificere at det er feltet .zzz der skal have værdien xx. Det kan så vidt jeg ved også bruges til at initialisere arbitrære elementer i en union.
Så vidt jeg kan se må "struct work_struct" være et struct der er beregnet til at indgå i en dobbelt linket liste. Jeg kunne forestille mig macro'en brugt som:

struct work_struct
{
  struct entry_struct
  {
      struct entry_struct *next;
      struct entry_struct *prev;
  }entry;
  void (*func)();
  int data;
  int *timer;
};

void Func(void)
{

}

#define __WORK_INITIALIZER(n, f, d) {                \
    .entry    = { &(n).entry, &(n).entry },            \
.func = (f),                        \
.data = (d),                        \
.timer = TIMER_INITIALIZER(NULL, 0, 0),            \
}

#define DECLARE_WORK(n, f, d)                    \
    struct work_struct n = __WORK_INITIALIZER(n, f, d)

#define TIMER_INITIALIZER(a, b, c) a

int main(void)
{
  DECLARE_WORK(Ole, Func, 1);
  return 0;
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester