J'ai cherché avec diligence (à la fois dans le réseau S [O | F | U] et ailleurs) et je crois que c'est une question rare. Je travaille avec une carte de développement Atmel AT91SAM9263-EK (noyau ARM926EJ-S, jeu d'instructions ARMv5) sous Debian Linux 2.6.28-4. J'écris en utilisant (je crois) le tty driver pour parler à un RS-485 serial controller. Je dois m'assurer que les écritures et les lectures sont atomiques. Plusieurs lignes de code source (listées sous la fin de ce post par rapport au répertoire d'installation de la source du noyau) impliquent ou implicitement cela.Comment vérifier les écritures atomiques?
Est-il possible de vérifier que l'écriture/la lecture vers/depuis cet appareil est réellement une opération atomique? Ou, le périphérique/dev/ttyXX est-il considéré comme une FIFO et l'argument se termine-t-il? Il ne semble pas suffisant de simplement croire que le code applique cette revendication - aussi récemment que février de cette année, freebsd était demonstrated to lack atomic writes for small lines. Oui, je me rends compte que freebsd n'est pas exactement la même chose que Linux, mais ce que je veux dire, c'est que ça ne fait pas de mal d'en être bien sûr. Tout ce que je peux penser est de continuer à envoyer des données et de chercher une permutation - j'espérais quelque chose d'un peu plus scientifique et, idéalement, déterministe. Malheureusement, je ne me souviens précisément de rien de mes cours de programmation simultanée à l'époque universitaire. J'apprécierais profondément une gifle ou une poussée dans la bonne direction. Merci d'avance si vous choisissez de répondre.
Cordialement,
Jayce
drivers/char/tty_io.c: 1087
void tty_write_message(struct tty_struct *tty, char *msg)
{
lock_kernel();
if (tty) {
mutex_lock(&tty->atomic_write_lock);
if (tty->ops->write && !test_bit(TTY_CLOSING, &tty->flags))
tty->ops->write(tty, msg, strlen(msg));
tty_write_unlock(tty);
}
unlock_kernel();
return;
}
arc/bras/include/asm/bitops.h: 37
static inline void ____atomic_set_bit(unsigned int bit, volatile unsigned long *p)
{
unsigned long flags;
unsigned long mask = 1UL << (bit & 31);
p += bit >> 5;
raw_local_irq_save(flags);
*p |= mask;
raw_local_irq_restore(flags);
}
pilotes/série/serial_core.c: 2376
static int
uart_write(struct tty_struct *tty, const unsigned char *buf, int count)
{
struct uart_state *state = tty->driver_data;
struct uart_port *port;
struct circ_buf *circ;
unsigned long flags;
int c, ret = 0;
/*
* This means you called this function _after_ the port was
* closed. No cookie for you.
*/
if (!state || !state->info) {
WARN_ON(1);
return -EL3HLT;
}
port = state->port;
circ = &state->info->xmit;
if (!circ->buf)
return 0;
spin_lock_irqsave(&port->lock, flags);
while (1) {
c = CIRC_SPACE_TO_END(circ->head, circ->tail, UART_XMIT_SIZE);
if (count < c)
c = count;
if (c <= 0)
break;
memcpy(circ->buf + circ->head, buf, c);
circ->head = (circ->head + c) & (UART_XMIT_SIZE - 1);
buf += c;
count -= c;
ret += c;
}
spin_unlock_irqrestore(&port->lock, flags);
uart_start(tty);
return ret;
}
En outre, à partir de la documentation écriture de l'homme (3):
Une tentative d'écrire à un tuyau ou FIFO a plusieurs caractéristiques principales:
- Atomique/non-atomique: A écrire est atomique si la quantité totale écrite en une opération n'est pas entrelacée avec les données d'un autre processus. Ceci est utile lorsque plusieurs auteurs envoient des données à un seul lecteur. Les applications doivent connaître la taille de la requête d'écriture qui doit être exécutée de manière atomique. Ce maximum est appelé {PIPE_BUF}. Ce volume de IEEE Std 1003.1-2001 ne dit pas si les demandes d'écriture pour plus de {PIPE_BUF} octets sont atomiques, mais nécessite que les écritures de {PIPE_BUF} ou moins d'octets doivent être atomiques.
Vous pouvez avoir une meilleure réponse si vous mettez la "Question" en haut (un résumé des sortes). –
J'ai fait ce changement, merci pour le conseil. -Jayce – user239719
On dirait que ce que vous voulez vraiment est un test de stress de torture pour les conducteurs de vérifier l'exactitude. Cela semble être vraiment utile partout. – Omnifarious