Besoin d'Explication sur fonctions en C.Merci
Driveloc
-
alex\saphir -
alex\saphir -
Bonjour,
Je suis vraiment bloqué, es que quelqu'un pourrai me donner un coup de main s'il vous plait. Il y a pas mal de chose que je ne connais pas car je n'es pa un bon niveau en C. Es que quelqu'un pourrai m'expliquer s'il vous plaît le type des fonctions qu'il y a, et ce qu'elle font.(le nom des variables n'est pas important, dans un premier temps j'essaye simplement de comprendre le fonctionnement des fonctions)
Merci, j'essaye de comprendre ces fonctions car je dois les modifier. En les comprenant je pourrai le faire.
Merci pour votre aide.
#define USE_DMA 1
#define SSP_SFRM 24
#define SSP_IRQ 22
#define GSPI_DIRECT_MAJOR 240
#define SFRM_DOWN 0
#define SFRM_UP 1
static void
dma_irqr(int dma, void *devid, struct pt_regs *regs)
{
gspihost_info_t *gspiinfo = (gspihost_info_t *) devid;
u32 dcsr;
u32 ddadr;
int chan = gspiinfo->chan;
ddadr = DDADR(chan);
dcsr = DCSR(chan);
DCSR(chan) = dcsr & ~DCSR_STOPIRQEN;
/* bus error */
if (dcsr & DCSR_BUSERR) {
dcsr |= DCSR_BUSERR;
goto complete;
}
/* data transfer completed */
if (dcsr & DCSR_ENDINTR) {
goto complete;
}
return;
complete:
gspiinfo->dma_txack = 1;
wake_up_interruptible(&(gspiinfo->queue_tx));
return;
}
static void
dma_irqw(int dma, void *devid, struct pt_regs *regs)
{
gspihost_info_t *gspiinfo = (gspihost_info_t *) devid;
u32 dcsr;
u32 ddadr;
int chanrw = gspiinfo->chanrw;
ddadr = DDADR(chanrw);
dcsr = DCSR(chanrw);
DCSR(chanrw) = dcsr & ~DCSR_STOPIRQEN;
/* bus error */
if (dcsr & DCSR_BUSERR) {
dcsr |= DCSR_BUSERR;
goto complete;
}
/* data transfer completed */
if (dcsr & DCSR_ENDINTR) {
goto complete;
}
return;
complete:
gspiinfo->dma_txack = 1;
wake_up_interruptible(&(gspiinfo->queue_tx));
return;
}
static inline int
gspi_acquire_io(gspihost_info_t * gspiinfop)
{
int ret;
if (!gspiinfop) {
ret = -EINVAL;
goto error;
}
down(&gspiinfop->host_sem);
_PRINTK("Acquired Semaphore@ %lu\n", jiffies);
ret = 0;
error:
return ret;
}
static inline void
gspi_release_io(gspihost_info_t * gspiinfop)
{
if (!gspiinfop) {
goto error;
}
up(&gspiinfop->host_sem);
_PRINTK("Released Semaphore@ %lu\n", jiffies);
error:
return;
}
Je suis vraiment bloqué, es que quelqu'un pourrai me donner un coup de main s'il vous plait. Il y a pas mal de chose que je ne connais pas car je n'es pa un bon niveau en C. Es que quelqu'un pourrai m'expliquer s'il vous plaît le type des fonctions qu'il y a, et ce qu'elle font.(le nom des variables n'est pas important, dans un premier temps j'essaye simplement de comprendre le fonctionnement des fonctions)
Merci, j'essaye de comprendre ces fonctions car je dois les modifier. En les comprenant je pourrai le faire.
Merci pour votre aide.
#define USE_DMA 1
#define SSP_SFRM 24
#define SSP_IRQ 22
#define GSPI_DIRECT_MAJOR 240
#define SFRM_DOWN 0
#define SFRM_UP 1
static void
dma_irqr(int dma, void *devid, struct pt_regs *regs)
{
gspihost_info_t *gspiinfo = (gspihost_info_t *) devid;
u32 dcsr;
u32 ddadr;
int chan = gspiinfo->chan;
ddadr = DDADR(chan);
dcsr = DCSR(chan);
DCSR(chan) = dcsr & ~DCSR_STOPIRQEN;
/* bus error */
if (dcsr & DCSR_BUSERR) {
dcsr |= DCSR_BUSERR;
goto complete;
}
/* data transfer completed */
if (dcsr & DCSR_ENDINTR) {
goto complete;
}
return;
complete:
gspiinfo->dma_txack = 1;
wake_up_interruptible(&(gspiinfo->queue_tx));
return;
}
static void
dma_irqw(int dma, void *devid, struct pt_regs *regs)
{
gspihost_info_t *gspiinfo = (gspihost_info_t *) devid;
u32 dcsr;
u32 ddadr;
int chanrw = gspiinfo->chanrw;
ddadr = DDADR(chanrw);
dcsr = DCSR(chanrw);
DCSR(chanrw) = dcsr & ~DCSR_STOPIRQEN;
/* bus error */
if (dcsr & DCSR_BUSERR) {
dcsr |= DCSR_BUSERR;
goto complete;
}
/* data transfer completed */
if (dcsr & DCSR_ENDINTR) {
goto complete;
}
return;
complete:
gspiinfo->dma_txack = 1;
wake_up_interruptible(&(gspiinfo->queue_tx));
return;
}
static inline int
gspi_acquire_io(gspihost_info_t * gspiinfop)
{
int ret;
if (!gspiinfop) {
ret = -EINVAL;
goto error;
}
down(&gspiinfop->host_sem);
_PRINTK("Acquired Semaphore@ %lu\n", jiffies);
ret = 0;
error:
return ret;
}
static inline void
gspi_release_io(gspihost_info_t * gspiinfop)
{
if (!gspiinfop) {
goto error;
}
up(&gspiinfop->host_sem);
_PRINTK("Released Semaphore@ %lu\n", jiffies);
error:
return;
}
A voir également:
- Besoin d'Explication sur fonctions en C.Merci
- Paris multiple 2/6 explication - Forum Excel
- Chambre 1408 explication fin ✓ - Forum Mozilla Firefox
- Black butler saison 2 explication ✓ - Forum Cinéma / Télé
- Foyer netflix explication - Accueil - Guide streaming
- Codes secrets Android : accéder aux fonctions cachées - Guide
2 réponses
Salut,
Il y a deux types de fonctions en gros, celles qui renvoient quelque chose (avec un return) du genre int fonction(param), et celles qui ne renvoient rien du genre void fonction(param). Il y a plusieurs appellations possibles pour les différencier ne te focalise pas dessus. Pour les void fonctions() qui ne renvoient rien, on peut quand même mémoriser les changements en utilisant par exemple des pointeurs, c'est à dire qu'on travaille directement sur la zone mémoire et non sur des variables.
Voilou
Il y a deux types de fonctions en gros, celles qui renvoient quelque chose (avec un return) du genre int fonction(param), et celles qui ne renvoient rien du genre void fonction(param). Il y a plusieurs appellations possibles pour les différencier ne te focalise pas dessus. Pour les void fonctions() qui ne renvoient rien, on peut quand même mémoriser les changements en utilisant par exemple des pointeurs, c'est à dire qu'on travaille directement sur la zone mémoire et non sur des variables.
Voilou
Merci pour ta réponse,
mais en faite le problème c le type: "static inline void" "static void" "static inline void" et les autres petites fonctions qu'il ya à l'intérieur, je ne comprend pas les écritures. Es que tu pourrai me dire en quelques lignes chaque fonctions ce qu'elle fait en gros STP. Merci d'avance pour ton aide, c sympa!
mais en faite le problème c le type: "static inline void" "static void" "static inline void" et les autres petites fonctions qu'il ya à l'intérieur, je ne comprend pas les écritures. Es que tu pourrai me dire en quelques lignes chaque fonctions ce qu'elle fait en gros STP. Merci d'avance pour ton aide, c sympa!
J'ai pris le soin de mettre de mettre un peu d'odre pour que tu puisse voir en faite les fonctions que je veux comprendre. Je veux comprendre ce qui dans ces fonctions en bref.
Merci!
#define USE_DMA 1
#define SSP_SFRM 24
#define SSP_IRQ 22
#define GSPI_DIRECT_MAJOR 240
#define SFRM_DOWN 0
#define SFRM_UP 1
static void
dma_irqr(int dma, void *devid, struct pt_regs *regs)
{
gspihost_info_t *gspiinfo = (gspihost_info_t *) devid;
u32 dcsr;
u32 ddadr;
int chan = gspiinfo->chan;
ddadr = DDADR(chan);
dcsr = DCSR(chan);
DCSR(chan) = dcsr & ~DCSR_STOPIRQEN;
/* bus error */
if (dcsr & DCSR_BUSERR) {
dcsr |= DCSR_BUSERR;
goto complete;
}
/* data transfer completed */
if (dcsr & DCSR_ENDINTR) {
goto complete;
}
return;
complete:
gspiinfo->dma_txack = 1;
wake_up_interruptible(&(gspiinfo->queue_tx));
return;
}
static void
dma_irqw(int dma, void *devid, struct pt_regs *regs)
{
gspihost_info_t *gspiinfo = (gspihost_info_t *) devid;
u32 dcsr;
u32 ddadr;
int chanrw = gspiinfo->chanrw;
ddadr = DDADR(chanrw);
dcsr = DCSR(chanrw);
DCSR(chanrw) = dcsr & ~DCSR_STOPIRQEN;
/* bus error */
if (dcsr & DCSR_BUSERR) {
dcsr |= DCSR_BUSERR;
goto complete;
}
/* data transfer completed */
if (dcsr & DCSR_ENDINTR) {
goto complete;
}
return;
complete:
gspiinfo->dma_txack = 1;
wake_up_interruptible(&(gspiinfo->queue_tx));
return;
}
static inline int
gspi_acquire_io(gspihost_info_t * gspiinfop)
{
int ret;
if (!gspiinfop) {
ret = -EINVAL;
goto error;
}
down(&gspiinfop->host_sem);
_PRINTK("Acquired Semaphore@ %lu\n", jiffies);
ret = 0;
error:
return ret;
}
static inline void
gspi_release_io(gspihost_info_t * gspiinfop)
{
if (!gspiinfop) {
goto error;
}
up(&gspiinfop->host_sem);
_PRINTK("Released Semaphore@ %lu\n", jiffies);
error:
return;
}
Merci!
#define USE_DMA 1
#define SSP_SFRM 24
#define SSP_IRQ 22
#define GSPI_DIRECT_MAJOR 240
#define SFRM_DOWN 0
#define SFRM_UP 1
static void
dma_irqr(int dma, void *devid, struct pt_regs *regs)
{
gspihost_info_t *gspiinfo = (gspihost_info_t *) devid;
u32 dcsr;
u32 ddadr;
int chan = gspiinfo->chan;
ddadr = DDADR(chan);
dcsr = DCSR(chan);
DCSR(chan) = dcsr & ~DCSR_STOPIRQEN;
/* bus error */
if (dcsr & DCSR_BUSERR) {
dcsr |= DCSR_BUSERR;
goto complete;
}
/* data transfer completed */
if (dcsr & DCSR_ENDINTR) {
goto complete;
}
return;
complete:
gspiinfo->dma_txack = 1;
wake_up_interruptible(&(gspiinfo->queue_tx));
return;
}
static void
dma_irqw(int dma, void *devid, struct pt_regs *regs)
{
gspihost_info_t *gspiinfo = (gspihost_info_t *) devid;
u32 dcsr;
u32 ddadr;
int chanrw = gspiinfo->chanrw;
ddadr = DDADR(chanrw);
dcsr = DCSR(chanrw);
DCSR(chanrw) = dcsr & ~DCSR_STOPIRQEN;
/* bus error */
if (dcsr & DCSR_BUSERR) {
dcsr |= DCSR_BUSERR;
goto complete;
}
/* data transfer completed */
if (dcsr & DCSR_ENDINTR) {
goto complete;
}
return;
complete:
gspiinfo->dma_txack = 1;
wake_up_interruptible(&(gspiinfo->queue_tx));
return;
}
static inline int
gspi_acquire_io(gspihost_info_t * gspiinfop)
{
int ret;
if (!gspiinfop) {
ret = -EINVAL;
goto error;
}
down(&gspiinfop->host_sem);
_PRINTK("Acquired Semaphore@ %lu\n", jiffies);
ret = 0;
error:
return ret;
}
static inline void
gspi_release_io(gspihost_info_t * gspiinfop)
{
if (!gspiinfop) {
goto error;
}
up(&gspiinfop->host_sem);
_PRINTK("Released Semaphore@ %lu\n", jiffies);
error:
return;
}
Inline si je ne dis pas de bêtises, ça veut dire que la fonction sera recopiée dans son intégralité à chaque appel de celle-ci. En gros ton programme sera plus rapide mais le fichier de sortie sera plus gros.
Static, c'est juste que c'est un peu comme une constante une fois définie, tu ne peux plus changer.
Voilou
Static, c'est juste que c'est un peu comme une constante une fois définie, tu ne peux plus changer.
Voilou
Merci. J'ai ciblé maintenant ce que je n'es pa compri pour faire plus simple. ce n'est pas les noms qui me poses problème, c'est l'écriture. Peux-tu m'éclairer s'il te plait. Merci bien pour ton aide!
//Je ne comprend pas cet opération//
gspihost_info_t *gspiinfo = (gspihost_info_t *) devid;
//celle-ci non plus//
dcsr |= DCSR_BUSERR;
//cette fonction//
wake_up_interruptible(&(gspiinfo->queue_tx));
//Celle-ci non plus, mais bon c'est la même chose que la précédente//
down(&gspiinfop->host_sem);
//Je ne comprend pas cet opération//
gspihost_info_t *gspiinfo = (gspihost_info_t *) devid;
//celle-ci non plus//
dcsr |= DCSR_BUSERR;
//cette fonction//
wake_up_interruptible(&(gspiinfo->queue_tx));
//Celle-ci non plus, mais bon c'est la même chose que la précédente//
down(&gspiinfop->host_sem);
gspihost_info_t *gspiinfo = (gspihost_info_t *) devid;C'est juste une affectation (opérateur '=') entre une structure déclarée gspiinfo de type gspihost_info en tant que pointeur, initialisée à devid casté en tant que gspihost_info_t *.
Une exemple plus simple de ce que ça fait :
int a=2;
float b=(float)a;
dcsr |= DCSR_BUSERR;On travaille en hexa/binaire avec des masques, |= veut dire "ou égal" (si je dis pas de bêtises).
wake_up_interruptible(&(gspiinfo->queue_tx));Si tu ne comprends pas le paramètre, ça veut dire une structure pointée, c'est-à-dire que tu dois utiliser '->' au lieu de '.' pour utiliser les valeurs de la structures, et le & indique que tu parles de la valeur et non de l'adresse.
Voilou j'espère n'avoir pas dit de bêtises ;)