2017-02-08 1 views
-1

Je suis d'apprendre à créer des modules du noyau sur Raspbian Jessie basé sur The Linux Kernel Module Programming Guideuint8_t est reconnu comme un type de données mais pas avec u8. Pourquoi?

Actuellement, je suis sur hello-5.c partie. J'ai essayé d'ajouter static u8 myByte = 'X'; mais u8 n'est pas reconnu. Puis j'ai changé u8 avec uint8_t qui est la même chose AFAIK et uint8_t est reconnu comme un type de données.

L'ancienne version du tutoriel here a déclaré static u8 myByte = 'X';, donc je veux le réutiliser avec le nouveau tutoriel.

Le tutoriel plus inclus ces:

#define MODULE 
#define LINUX 
#define __KERNEL__ 

#include <linux/module.h> 
#include <linux/kernel.h> 
#include <linux/init.h> 

Alors que le plus récent tutoriel inclus ces;

#include <linux/module.h> 
#include <linux/moduleparam.h> 
#include <linux/kernel.h> 
#include <linux/init.h> 
#include <linux/stat.h> 

J'ai essayé d'utiliser l'ancien, mais la partie define génère des erreurs, donc je le tutoriel plus récent.

Alors, pourquoi uint8_t peut être reconnu alors que u8 ne peut pas dans la version plus récente?

+0

Je crains que cette question soit en dehors de la portée de ce site particulier, mais peut faire mieux sur Stackoverflow ou Unix.stackexchange. –

+0

Oh, ça a vraiment répondu à ma question. Je vous remercie. :) –

+0

Les questions qui cherchent une aide au débogage ("pourquoi ce code ne fonctionne-t-il pas?") Doivent inclure le comportement souhaité, un problème ou une erreur spécifique et le code le plus court nécessaire pour le reproduire ** dans la question elle-même. Les questions sans énoncé de problème clair ne sont pas utiles aux autres lecteurs. Voir: Comment créer un exemple minimal, complet et vérifiable. – Olaf

Répondre

3

Parce que u8 n'est pas un type standard, alors que uint8_t est (typedef'd en C99 et plus tard <stdint.h>). Si vous souhaitez utiliser u8, incluez un en-tête avec un typedef approprié, ou tapez-le dans votre code.

+1

Ce n'est pas une réponse entièrement correcte. Bien que ce soit un type non-standard, il est largement utilisé dans le noyau Linux. Je suppose que le problème n'est pas dans le type en soi, mais plutôt avec son utilisation comme paramètre de module. En tout cas, il n'y a pas de code fourni pour voir ce que l'auteur a effectivement fait. – 0andriy

+0

J'utilise le code dans [chapter-5.c] (http://www.tldp.org/LDP/lkmpg/2.6/html/x323.html#AEN345). Je veux ajouter statique u8 myByte = 'X' comme dans l'ancienne version [ici] (http://www.tldp.org/LDP/lkmpg/2.4/html/x354.htm) –

+2

@ 0andriy: La réponse est correcte . "u8" n'est pas un type standard. Son utilisation dans le noyau est un héritage d'avant C99 où il n'y avait pas de types à largeur fixe dans la norme. Le noyau Linux ne définit pas ce qui est standard ou non. Cependant, pour le noyau, il faut s'en tenir à ces restes, mais pour d'autres, nouveaux projets, il faut utiliser les types standards. – Olaf