|
|
|
|
Bonjour,
j'ai un projet ou je dois utiliser des interruption sous linux,
je sais qu'il y a une fanction request_irq qui existe, mais le problem c'est quand je met l'include interrupt.h j'ai plein d'erreur, comme softirq.h n'existe pas ...
est ce que quelqu'un a déja travailler sur des interruption sur linux
merci
Configuration: Windows XP Internet Explorer 7.0
Elle donne cela:
|
Quand je combile avec:
|
Salut,
int sys_open(const char * filename, int flags, int mode) Comment faire cet appel système? Il faut lever l'interruption 0x80, mettre 5 dans eax, filename dans ebx, flags dans ecx et mode dans edx. Et là tu peux te faire une fonction toute prête: int sys_open(const char * filename, int flags, int mode)
{
__asm__ __volatile__("movl 5, %eax\n"
"movl 8(%ebp), %ebx\n"
"movl 0xc(%ebp), %ecx\n"
"movl 0x10(%ebp), %edx\n"
"int $0x80");
}
Je l'ai pas testé, ya peut être une erreur dedans mais l'idée y est :D Mais attention cette solution ne fonctionnera que sous x86. Pour la liste des interruptions, voir ici: http://asm.sourceforge.net/syscall.html ..et le...le...enfin, non parce c'est...ya...quand...bah tu sais là le...
|
As-tu créer un lien symbolique /usr/src/linux vers /usr/src/linux-2.4.34 : en root :
ln - s /usr/src/linux-2.4.34 /usr/src/linux Ensuite l'option c'est bien -isystem /usr/include et non -isystem usr/include. Car en fait le types clock_t est défini dans /usr/include/linux/types.h (vérifie notamment que ce fichier existe), ce qui est traité dans /usr/include/linux/times.h par le #include <linux/types.h>. Sauf que pour que ce header soit trouvé, il faut lui dire (via le -isystem) de taper dans le répertoire /usr/include/... |
Répondre à mamiemando
|
Bon alors je t'explique le cheminement et toi tu réadaptes au besoin.
gcc -W -Wall plop.c | more On s'aperçoit que les premiers headers qui te manquent sont en fait des .h contenus dans /usr/include => je rajoute ce repertoire avec l'option -isystem ou -I : gcc -isystem /usr/include -W -Wall plop.c | more La j'ai une nouvelle erreur (mando@aldur) (~) $ gcc -isystem /usr/include -W -Wall plop.c | more
In file included from /usr/include/asm/irq.h:8,
from plop.c:3:
/usr/include/asm-i486/irq.h:15:25: error: irq_vectors.h: Aucun fichier ou répertoire de ce type
...
Ok maintenant je cherche ou est planqué ce header (au besoin fais un updatedb si la commande suivante ne donne rien, sinon c'est qu'il te manque des headers) : (mando@aldur) (~) $ locate irq_vectors.h /usr/include/asm-i486/mach-default/irq_vectors.h /usr/include/asm-i486/mach-visws/irq_vectors.h /usr/include/asm-i486/mach-voyager/irq_vectors.h /usr/include/asm/mach-default/irq_vectors.h /usr/include/asm/mach-visws/irq_vectors.h /usr/include/asm/mach-voyager/irq_vectors.h Le premier a une bonne tête donc je le rajoute dans les includes. Nouvelle erreur : (mando@aldur) (~) $ gcc -isystem /usr/include -isystem /usr/include/asm-i486/mach-default/ -W -Wall plop.c | more
In file included from /usr/include/asm/bitops.h:8,
from /usr/include/linux/bitops.h:9,
from /usr/include/linux/interrupt.h:7,
from plop.c:7:
/usr/include/asm-i486/bitops.h:244: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘int’
Ce qui correspond à la ligne : static __always_inline int constant_test_bit(int nr, const volatile unsigned long *addr)
{
return ((1UL << (nr & 31)) & (addr[nr >> 5])) != 0;
}
On cherche à coup de grep ou est defini le __always_inline qui provoque l'erreur : (mando@aldur) (/usr/include/linux) $ grep -nr always_inline * compiler-gcc3.h:16:#define __always_inline inline __attribute__((always_inline)) compiler-gcc4.h:10:# define inline inline __attribute__((always_inline)) compiler-gcc4.h:11:# define __inline__ __inline__ __attribute__((always_inline)) compiler-gcc4.h:12:# define __inline __inline __attribute__((always_inline)) compiler-gcc4.h:18:#define __always_inline inline __attribute__((always_inline)) compiler-gcc.h:26:#define inline inline __attribute__((always_inline)) compiler-gcc.h:27:#define __inline__ __inline__ __attribute__((always_inline)) compiler-gcc.h:28:#define __inline __inline __attribute__((always_inline)) compiler.h:146:#ifndef __always_inline compiler.h:147:#define __always_inline inline mm.h:529:static __always_inline void *lowmem_page_address(struct page *page) seqlock.h:83:static __always_inline unsigned read_seqbegin(const seqlock_t *sl) seqlock.h:98:static __always_inline int read_seqretry(const seqlock_t *sl, unsigned iv) Donc le problème vient de l'inclusion de ce header etc... Je te laisse faire tes petites recherches, mais par tatonnement tu trouveras les includes et les options à passer à la compilation. Bonne chance |
Bonjour,
#include <asm/irq.h>
#include <linux/signal.h>
#include <linux/sched.h>
#include <linux/interrupt.h>
void interrupt_1()
{
printf("Hello World !!!\n");
}
int main()
{
int a=0;
void (*p_fonction)();
p_fonction=&interrupt_1;
int n_irq=14;
const char *devname;
void *dev_id;
printf("request_irq !!!\n");
a=request_irq(n_irq, p_fonction, SA_INTERRUPT, "ide1", 0);
return 0;
}
Et voila ce qui me retourne dans le shell à la compilation: gcc -isystem /usr/include capt_irq.c -o capt_irq
In file included from /usr/include/linux/signal.h:4,
from capt_irq.c:15:
/usr/include/asm/signal.h:107: error: syntax error before "sigset_t"
/usr/include/asm/signal.h:110: error: syntax error before '}' token
In file included from /usr/include/linux/sched.h:14,
from capt_irq.c:23:
/usr/include/linux/timex.h:148: error: field `time' has incomplete type
In file included from /usr/include/linux/interrupt.h:9,
from capt_irq.c:27:
/usr/include/asm/bitops.h:327:2: warning: #warning This includefile is not available on all architectures.
/usr/include/asm/bitops.h:328:2: warning: #warning Using kernel headers in userspace: atomicity not guaranteed
In file included from capt_irq.c:27:
/usr/include/linux/interrupt.h:12:25: asm/hardirq.h: No such file or directory
/usr/include/linux/interrupt.h:13:25: asm/softirq.h: No such file or directory
J'ai remarqué sur internet que les personnes ayant un proleme similaire etait sous Fedora Core 3, ca ne serait pas cette distribution qui pose probleme? Sinon, comme vous pouvez le voir j'ai rajouté le '-isystem /usr/include' et c'est deja mieux mais ... encore un petit probleme. 1/Je n'est pas le fichier 'softirq.h' sur mon systeme. 2/De plus, je ne comprends pas pourquoi j'ai une erreur de syntaxe sur le 'sigset_t' 3/Peut etre un probleme car nous sommes dans l'espace utilisateur et nous utilisons des librairies du noyau... Je suis un peu perdu. Merci de votre aide... |
Merci de ton aide, j'ai rajouter les includes mais j'ai toujours les erreurs de syntaxe sans qu'il me dise qu'il me manque des fichiers
# gcc -O2 -I/usr/include/ capt_irq.c -o capt_irq
In file included from /usr/include/linux/interrupt.h:9,
from capt_irq.c:32:
/usr/include/asm/bitops.h:327:2: warning: #warning This includefile is not available on all architectures.
/usr/include/asm/bitops.h:328:2: warning: #warning Using kernel headers in userspace: atomicity not guaranteed
In file included from /usr/include/asm/hw_irq.h:16,
from /usr/include/linux/irq.h:34,
from /usr/include/asm/hardirq.h:6,
from /usr/include/linux/interrupt.h:12,
from capt_irq.c:32:
/usr/include/asm/atomic.h:40:2: warning: #warning Using kernel header in userland program. BAD!
In file included from /usr/include/linux/irq.h:34,
from /usr/include/asm/hardirq.h:6,
from /usr/include/linux/interrupt.h:12,
from capt_irq.c:32:
/usr/include/asm/hw_irq.h:78: error: syntax error before '(' token
/usr/include/asm/hw_irq.h: In function `x86_do_profile':
/usr/include/asm/hw_irq.h:212: error: `prof_pid' undeclared (first use in this function)
/usr/include/asm/hw_irq.h:212: error: (Each undeclared identifier is reported only once
/usr/include/asm/hw_irq.h:212: error: for each function it appears in.)
/usr/include/asm/hw_irq.h:212: error: `current' undeclared (first use in this function)
In file included from /usr/include/linux/irq.h:34,
from /usr/include/asm/hardirq.h:6,
from /usr/include/linux/interrupt.h:12,
from capt_irq.c:32:
/usr/include/asm/hw_irq.h:236:2: warning: #warning Including kernel header in userspace!
In file included from /usr/include/linux/interrupt.h:12,
from capt_irq.c:32:
/usr/include/asm/hardirq.h: At top level:
/usr/include/asm/hardirq.h:13: error: syntax error before "irq_cpustat_t"
In file included from /usr/include/asm/hardirq.h:15,
from /usr/include/linux/interrupt.h:12,
from capt_irq.c:32:
/usr/include/linux/irq_cpustat.h:20: error: syntax error before "irq_stat"
/usr/include/linux/irq_cpustat.h:20: warning: array 'irq_stat' assumed to have one element
Je me demande si le 'Using kernel headers in userspace: automicity not guaranteed' n'est pas bloquant pour la comilation... |
En fait c'est des histoires de compilation dans l'espace utilisateur et dans l'espace kernel. Malheureusement je ne me souviens plus comment ça marche je sais juste que ça ne se compile pas pareil. Par ailleurs tu ne derais pas inclure bitops.h
|
J'ai reussi a capturer mon interruption, ca marche vraiment bien...
|
Répondre à mamiemando
|