pourquoi ne ioctl retour “mauvaise adresse”
J'utilise le code ci-dessous pour les données de sortie à partir de SPI port de incorporée conseil d'administration (olimex imx233-micro -- ce n'est pas un conseil, une question spécifique). Lorsque j'exécute le code ioctl
retour "mauvaise adresse". Je suis modifiant le code de la http://twilight.ponies.cz/spi-test.c qui fonctionne très bien. Quelqu'un pourrait-il me dire ce que je fais mal?
root@ubuntu:/home# gcc test.c -o test
test.c:20: warning: conflicting types for ‘msg_send’
test.c:16: note: previous implicit declaration of ‘msg_send’ was here
root@ubuntu:/home# ./test
errno:Bad address - cannot send SPI message
root@ubuntu:/home# uname -a
Linux ubuntu 3.7.1 #2 Sun Mar 17 03:49:39 CET 2013 armv5tejl GNU/Linux
Code:
//test.c
#include <stdint.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <getopt.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/types.h>
#include <linux/spi/spidev.h>
#include <errno.h>
static uint16_t delay;
int main(int argc,char *argv[]){
msg_send(254); //the message that I want to send decimal "254"
return 0;
}
void msg_send(int msg){
int fd;
int ret = 0;
fd = open("/dev/spidev32766.1", O_RDWR); //ls /dev outputs spidev32766.1
if(fd < 0){
fprintf(stderr, "errno:%s - FD could be not opened\n ", strerror(errno));
exit(1);
}
struct spi_ioc_transfer tr = {
.len = 1,
.delay_usecs = delay,
.speed_hz = 500000, //500 kHz
.bits_per_word = 8,
.tx_buf = msg,
.rx_buf = 0, //half duplex
};
ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
if (ret <1 ){
fprintf(stderr, "errno:%s - cannot send SPI message\n ", strerror(errno));
}
close(fd);
}
Merci!
Vous savez que le déplacement de vos
Merci Mike, j'ai été négligent. les mises en garde s'en va mais
n.m., J'ai pensé qu'il passera le message(
msg_send()
fonction au-dessus de la main()
permettra de se débarrasser de ce droit d'alerte?Merci Mike, j'ai été négligent. les mises en garde s'en va mais
bad address
erreur reste.tx_buf=msg
-- que pensez-vous devrait se produire ici?n.m., J'ai pensé qu'il passera le message(
254
) que je veux envoyer à l'émetteur de la mémoire tampon, puis il sera envoyé par ioctl
, est-il où je fais erreur?
OriginalL'auteur sven | 2013-04-02
Vous devez vous connecter pour publier un commentaire.
Le message d'erreur "adresse incorrecte" vient du code d'erreur
EFAULT
, ce qui arrive lorsque vous passez une adresse pour le noyau qui n'est pas valide adresse virtuelle dans votre processus de l'espace d'adressage virtuel. L'adresse de votretr
structure est clairement valable, donc le problème doit être avec l'un de ses membres.Selon la définition de
struct spi_ioc_transfer
, le.tx_buf
et.rx_buf
les membres doivent être des pointeurs vers l'espace utilisateur, des tampons, ou la valeur null. Vous êtes réglage.tx_buf
à l'entier 254, qui n'est pas valide userspace pointeur, alors c'est la mauvaise adresse.Je ne suis pas familier avec cet IOCTL, donc ma meilleure supposition est que vous avez besoin de la basse de données en binaire. Une façon de faire qui serait celui-ci:
Si vous avez besoin de l'envoyer en ASCII au lieu de cela, vous devez utiliser une fonction comme
snprintf(3)
pour convertir l'entier en une chaîne de caractères ASCII, et puis pointez le TX de tampon à cette chaîne et de définir la durée en conséquence.OriginalL'auteur Adam Rosenfield