Vous êtes sur la page 1sur 12

Cursus Ingénieur 1ère année – Promotion Noether

Contrôles du 1er semestre 2020/2021 (S5)


Epreuve du 23 novembre 2020 – Samuel Poiraud

UE : Systèmes Numériques Embarqués Nom :


Matière : Projet Système Embarqué
Sujet : 2020_11_B4 Prénom :

COMPOSITION D’ELECTRONIQUE NUMERIQUE

--------------------------------------- Note : /64

Durée : 2 heures

Aucun document autorisé.

Epreuve sans calculatrice. Tous objets connectés interdits.

-----------------------------------------------------------------------------------------------------------------------

QCM : une seule réponse possible ; répondez sur la grille QCM, en renseignant vos identifiants.
Une bonne réponse : 1 point ; une mauvaise réponse : 0 point ; pas de réponse : 0 point.
Erreur dans la saisie des noms/prénoms ou identifiants : -1 point.

Questions ouvertes : Répondez sur le sujet. Ne dégrafez pas les feuilles.

-----------------------------------------------------------------------------------------------------------------------

Questions à choix multiples. (/32 pts ~40mn)

0- Renseignez distinctement votre nom et votre prénom en haut de cette page.

1- L’indentation du code en C :
A- Elle joue un rôle dans la compilation mais peut ne pas être respectée
B- Elle ne joue aucun rôle à la compilation mais doit être respectée pour rendre le code lisible
C- Elle ne joue aucun rôle dans la compilation et il n’est pas utile de la respecter
D- Comme en python, elle joue un rôle dans la compilation et doit être respectée scrupuleusement

2- Quel prototype de fonction est correct ci-dessous pour une fonction permettant de connaître la
taille d’une chaine de caractère ?
void my_strlen(String s, uint16_t & size); //A

void my_strlen(char * s, uint16_t size){} //B

uint16_t my_strlen(char * string); //C

bool_e my_strlen(char s[size], uint16_t size); //D

3- Le débogueur :
A- Compile le programme et nous indique les erreurs de syntaxe
B- Corrige les erreurs du programme
C- Donne accès à la mémoire et permet l’exécution en pas à pas du programme
D- Stoppe l’exécution du programme dans la mémoire du microcontrôleur en cas de problème
Cursus Ingénieur 1ère année – Promotion Noether
Contrôles du 1er semestre 2020/2021 (S5)
Epreuve du 23 novembre 2020 – Samuel Poiraud

static int a = 6;

void function(void)
{
int b = 1;
static int c = 5;
//...
}
4- Dans cet exemple, la variable a :
A- Existe en permanence et est accessible depuis n’importe quel fichier
B- Existe en permanence et est accessible depuis le fichier courant
C- Existe lorsque l’on exécute une des fonctions du fichier courant, détruite le reste du temps
D- Est créé et initialisée à 6 à chaque exécution d’une des fonctions du fichier courant

5- Dans cette fonction, la variable b :


A- Est créée avant l’entrée dans la fonction, initialisée à 1 une seule fois, jamais détruite
B- Est créée avant l’entrée dans la fonction, mise à 1 à chaque appel, jamais détruite
C- Est créée à l’entrée dans la fonction, initialisée à 1, puis détruite en fin de fonction
D- Est créée à l’entrée dans la fonction, initialisée à 1, jamais détruite

6- Dans cette fonction, la variable c :


A- Est créée avant l’entrée dans la fonction, initialisée à 5 une seule fois, jamais détruite
B- Est créée avant l’entrée dans la fonction, mise à 5 à chaque appel, jamais détruite
C- Est créée à l’entrée dans la fonction, initialisée à 5, puis détruite en fin de fonction
D- Est créée à l’entrée dans la fonction, initialisée à 5, jamais détruite

7- Une variable est considérée :


A- Comme vraie si elle vaut 1, comme fausse sinon
B- Comme fausse si elle vaut 0, comme vraie sinon
C- Comme vraie si elle est positive, comme fausse sinon
D- Comme vraie ou fausse uniquement si elle est déclarée comme booléen

float a, b, c;
a = 0.2;
b = 0.5;
c = a+b;
if(c == 0.7)
printf("ok");
else
printf("ko");

8- A votre avis, dans la fonction ci-dessus, qu’est ce qui sera affiché par printf() ?
A- La chaine « ko », car il est évident que 0.2+0.5 ne vaut pas 0.7
B- La chaine « ok », car il est évident que 0.2+0.5 vaut 0.7
C- Je ne sais pas, et mieux vaut ne pas écrire les choses ainsi
D- La chaine « ok » suivie de la chaine « ko »
Cursus Ingénieur 1ère année – Promotion Noether
Contrôles du 1er semestre 2020/2021 (S5)
Epreuve du 23 novembre 2020 – Samuel Poiraud

int tab[125];
9- Pour accéder aux cases de ce tableau tab dont on connait l’adresse, on utilise :
A- Le symbole ‘.’
B- Le symbole ‘->’
C- Les parenthèses ( )
D- Les accolades [ ]

void set_population(country_t * country, uint32_t population){}


10- Pour accéder aux champs de cette structure country dont on connait l’adresse, on utilise :
A- Le symbole ‘->’
B- Le symbole ‘.’
C- Les accolades [ ]
D- Les parenthèses ( )

country_t europe[27];
11- Pour accéder aux champs de cette structure europe que nous avons défini, on utilise :
A- Le symbole ‘->’
B- Le symbole ‘.’
C- Les accolades [ ]
D- Les parenthèses ( )

12- Peut-on appeler une fonction dont on n’a pas défini le prototype ?
A- Oui mais seulement si son prototype admet aucun paramètre et retourne un char.
B- Oui, cela fonctionne très bien dans tous les cas, mais ce n’est pas propre.
C- Non, cela fonctionne pourtant dans certains cas, mais on se l’interdit dans tous les cas.
D- Non, et de toute façon ça ne compile pas.

13- Le mot clé static


A- Rend une variable ‘constante’
B- Rend une variable ‘privée’ et ‘immobile dans la mémoire’
C- Ne sert à rien en C, il est sous-entendu par défaut
D- Permet de rendre la variable ‘accessible depuis un autre fichier’

14- Quel est l’ordre dans lequel ces outils sont utilisés ?
A- Programmation de la cible  compilation  édition des liens
B- Programmation de la cible  édition des liens  compilation
C- Édition des liens  compilation  programmation de la cible
D- Compilation  édition des liens  programmation de la cible

15- Le fait de déclarer une variable avec le mot clé volatile…


A- …indique que la variable est partagée et accessible dans plusieurs fichiers.
B- …indique qu’elle peut changer à chaque instant. Le compilateur doit y accéder sans raccourci.
C- …rend la variable non permanente lorsque l’on coupe l’alimentation du microcontrôleur.
D- …indique que la variable n’existe que temporairement et qu’elle partage son espace mémoire.
Cursus Ingénieur 1ère année – Promotion Noether
Contrôles du 1er semestre 2020/2021 (S5)
Epreuve du 23 novembre 2020 – Samuel Poiraud

16- A quoi servent les lignes que l’on place dans un header :
#ifndef APPLI_ADC
#define APPLI_ADC
// ...
#endif /* APPLI_ADC */
A- Elles permettent de configurer le code avec ou sans le module APPLI_ADC.
B- Elles permettent au compilateur de savoir qu’il traite un fichier header.
C- Elles encadrent le contenu privé du header.
D- Elles permettent d’éviter les risques liés aux inclusions récursives.

17- A la fin du troisième appel de la fonction_f : uint8_t fonction_f(void)


A- c = 3, d = 7, la valeur de retour vaut 10 {
static uint8_t c = 0x00;
B- c = 3, d = 8, la valeur de retour vaut 0x0B uint8_t d = 0x07;
C- c = 1, d = 8, la valeur de retour vaut 9 d++;
c++;
D- c = 3, d = 10, la valeur de retour vaut 0x0D return c+d;
}

18- Quelle définition est la meilleure pour expliquer la signification de la ligne, placée dans une
fonction :
static int skippers = 33;
A- Déclaration dans la fonction d’une variable locale temporaire, initialisée à 33.
B- Définition dans la fonction d’une constante locale skippers de valeur 33.
C- Déclaration d’une structure statique contenant un entier de nom skippers et la valeur 33.
D- Définition d’une variable locale skippers, permanente et de valeur initiale 33.

19- Dans la mission sun-tracker, quels périphériques a-t-on utilisé ?


A- Un moteur DC et un encodeur
B- Un ventilateur et un MOSFET
C- Un servomoteur et un potentiomètre
D- Un phototransistor et un moteur

20- Quel est le rôle d'un périphérique RTC ?


A- Générer un signal de rapport cyclique variable et de fréquence fixe
B- Interrompre le processeur lors du changement d’état d’une broche d’entrée
C- Compter le temps pour fournir la date et l’heure
D- Accélérer l’horloge interne du microcontrôleur lorsque des calculs sont en cours

21- Quel était le principal but pédagogique de la mission Fan ?


A- Parcourir le document "le C embarqué"
B- Savoir générer un signal PWM
C- Comprendre la notion de registre de périphériques
D- Apprendre à implémenter une machine à états en C
Cursus Ingénieur 1ère année – Promotion Noether
Contrôles du 1er semestre 2020/2021 (S5)
Epreuve du 23 novembre 2020 – Samuel Poiraud

22- Dans la fonction blink_led() ci-dessous, quel est le rôle de la variable ‘b’ ?
A- Elle provoque le changement d’état de la sortie A5 à chaque appel de blink_led()
B- Elle permet d’initialiser le registre lors de chaque appel de la fonction blink_led()
C- C’est une variable qui s’initialise à 0 à chaque entrée dans la fonction blink_led()
D- Elle ne sert à rien dans ce contexte
void blink_led(void)
{
static bool_e b = FALSE;
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, b);
b = !b;
}

23- Un registre de périphérique…


A- … est une zone de mémoire qui permet au périphérique d’enregistrer un historique d’états
B- … est un cahier qui regroupe les plans des réseaux du périphérique dans une grande ville
C- … est un ensemble de bits qui permettent le dialogue entre le processeur et un périphérique
D- … est un ensemble de bascules D situées dans le processeur et qui lui permettent de stocker les
valeurs intermédiaires de ses calculs

24- L’éditeur des liens a pour but de :


A- Traduire le code C en instructions assembleur compréhensibles par le processeur visé
B- Remplacer les pointeurs par des variables fixes en mémoire
C- Vérifier les liens entre les variables et relever la liste des erreurs et des warnings à corriger.
D- Rassembler les différents fichiers objets en une image chargeable sur le microcontrôleur

25- Lequel de ces potentiomètres est correctement relié au microcontrôleur ?

26- Un périphérique ADC sur 12 bits convertit une tension analogique…


A- …en un nombre allant de 0 à 4095
B- …en un nombre allant de 0 à 12
C- …en un nombre allant de 0 à 255
D- …en un nombre allant de 0 à 2^12

27- Un MOSFET est :


A- Un transistor bipolaire piloté en courant
B- Un interrupteur mécanique qui se commande par un relai nommé grille
C- Un transistor qui se commande par la tension appliquée entre la grille et la source
D- Un composant électronique doté d’une diode intrinsèque dans le sens du drain vers la source
Cursus Ingénieur 1ère année – Promotion Noether
Contrôles du 1er semestre 2020/2021 (S5)
Epreuve du 23 novembre 2020 – Samuel Poiraud

28- Quel schéma était-il demandé de réaliser dans le cadre de la mission fan ?

29- Dans lequel des schémas précédents, le ventilateur est-il susceptible de tourner en permanence quel
que soit le signal de commande ?
A- Le schéma A
B- Le schéma B
C- Le schéma C
D- Le schéma D

30- Dans la mission « grand plongeon », a quoi sert le registre BSRR du périphérique GPIOA ?
A- Il sert à configurer la broche souhaitée en sortie. (Bus Status Redirect Register)
B- Il sert à agir indirectement sur le registre ODR du GPIOA. (Bit Set Reset Register)
C- Il contient l’état du port A en sortie. (Bits State Reduced Register)
D- Il mémorise l’état des bits du GPIOA (Bits Save Reduced Register)

GPIOA->ODR |= 1<<4;

31- Que fait l’instruction ci-dessus ?


A- Elle force à 1 le 4ème bit du registre ODR du GPIOA
B- Elle positionne 1 et 4 dans le champ ODR de la structure GPIOA
C- Elle place 4 décalé vers la gauche de 1 dans le registre ODR du GPIOA
D- Elle écrit 4 dans la première case du registre ODR du GPIOA

32- Lorsqu’un flag d’interruption est levé, (et que l’interruption correspondante est activée) :
A- Le processeur baisse le flag et va traiter l’interruption à la fin de la fonction courante
B- Le processeur interrompt la tâche en cours d’exécution et va exécuter la routine d’interruption
C- Le processeur bascule l’interrupteur du périphérique concerné
D- Le processeur va exécuter la tâche de fond dans laquelle il traite l’évènement
Cursus Ingénieur 1ère année – Promotion Noether
Contrôles du 1er semestre 2020/2021 (S5)
Epreuve du 23 novembre 2020 – Samuel Poiraud

Questions ouvertes. (/32 pts ~70mn)

33- Quel est l’intervalle de définition d’un entier non signé sur 16 bits ?

34- Jusqu’à combien (à 10% près, et en décimal) peut-on compter des nombres entiers avec 32 bits ?

Indiquez le rôle des opérateurs suivants :


35- &
!
||
36- %
^
~

37- A quoi équivaut i >>= 2 ?

i est ________________________________________.

Calculez les valeurs suivantes (les nombres sont exprimés sur 8 bits, les réponses peuvent être
indiquées en décimal, en binaire, ou en hexadécimal)
38- 0x23 | 0x5F
39- 0x0F & 0x55
40- 7 << 2
41- 19 >> 1
42- 0xF0 || 0x00
43- 4%3
44- ~(1<<4)

45- Compléter les valeurs des caractères suivants :


Décima
ASCII HEX l
'\0'
'0'
'1' 0x31 49
'A' 0x41 65
'D'
'\n' 0x0A
Cursus Ingénieur 1ère année – Promotion Noether
Contrôles du 1er semestre 2020/2021 (S5)
Epreuve du 23 novembre 2020 – Samuel Poiraud

46- Complétez l’extrait de fichier ci-dessous en ajoutant :


- Une macro préprocesseur nommée PI4096 et de valeur 12868

void function(void)
{

47- Complétez l’extrait de fichier ci-dessus en ajoutant :


- Une variable v1, de type uint8_t et de valeur initiale 0x30, dont l’accès est possible depuis
plusieurs fonctions du fichier courant et qui existe de façon permanente.
- Une variable v2, de type char, initialisée à ‘D’, qui existe de façon permanente mais n’est
accessible que dans la fonction.
- Une variable v3, de type float, de valeur initiale à 360.1, qui existe durant l’appel de la fonction

48- Ce fichier ne compile pas, car il faut inclure le header types.h. Incluez ce header ci-dessous :
//<-- Inclusion du header types.h

/** //<-- Commentaires au format doxygen


*@brief
*@param
*@return
*/
char to_lower (char c)
{

49- Complétez également le contenu de cette fonction to_lower qui doit renvoyer :
- La valeur c+'a'-'A' si le paramètre c est compris entre 'A' et 'Z' inclus
- La valeur de c sinon.
Vous devez impérativement utiliser l’opérateur ternaire.

50- Commentez cette fonction to_lower au format doxygen.


Cursus Ingénieur 1ère année – Promotion Noether
Contrôles du 1er semestre 2020/2021 (S5)
Epreuve du 23 novembre 2020 – Samuel Poiraud

51- Déclarez ci-dessous un tableau de 12 entiers sur 8 bits, en utilisant la macro TAB_SIZE.

52- A l’aide d’une boucle, initialisez chaque case du tableau avec la valeur 'p'.
Affectez ensuite la valeur ‘r’ à la deuxième case de ce tableau.
#define TAB_SIZE 12

53- Définissez un type énuméré doigt_e dont les valeurs sont les noms des 5 doigts de la
main (exemple : DOIGT_MAJEUR est un doigt) :
Créez ensuite une variable doigt1, initialisée à DOIGT_POUCE.

54- Définissez un type structure doigt_t contenant les champs suivants :


type Nom du champ
doigt_e doigt
int16_t diametre En mm
int16_t perimetre En mm
Tableau de 40 caractères nom
Cursus Ingénieur 1ère année – Promotion Noether
Contrôles du 1er semestre 2020/2021 (S5)
Epreuve du 23 novembre 2020 – Samuel Poiraud

55- Définissez ensuite ci-dessous une variable d1 de type doigt_t. Initialisez les champs de la
structure. (Le doigt d1 mesure 17mm de diamètre, est de type DOIGT_ANNULAIRE, et se
nomme « annulaire_median »). Son périmètre peut se calculer avec la formule magique : p=π.d

56- Complétez ci-dessous le switch avec les doigts définis précédemment : Pour chaque doigt, cette
fonction doit retourner l’adresse d’une chaine de caractère contenant le nom du doigt.
Par exemple : ret = "majeur"; Dans le cas default, retournez la chaine "doigt inconnu".
Pour gagner du temps, votre réponse pourra se contenter de gérer seulement 2 doigts si la solution
présentée est facilement extensible aux autres doigts.

char * digit_to_string(doigt_e doigt)


{
char * ret;
ret = "doigt inconnu";

switch( )
{

return ret;
}

57- Complétez ci-dessous l’appel de la fonction HAL_RTC_Init() selon le prototype indiqué

HAL_RTC_Init(RTC_HandleTypeDef * s); //Protype de la fonction HAL_RTC_Init


static RTC_HandleTypeDef rtc_handle;

void RTC_init(void)
{
rtc_handle.Instance = RTC;
rtc_handle.Init.AsynchPrediv = 256*128;
rtc_handle.Init.OutPut = RTC_OUTPUTSOURCE_NONE;
HAL_RTC_Init( );
}
Cursus Ingénieur 1ère année – Promotion Noether
Contrôles du 1er semestre 2020/2021 (S5)
Epreuve du 23 novembre 2020 – Samuel Poiraud

58- Complétez la fonction ci-dessous selon les instructions données en commentaires :


void compute(int a, int b, int * sum, int * sub)
{
//Si sum est différent de NULL, renseigner à l’emplacement
pointé par sum la valeur a+b

//Si sub est différent de NULL, renseigner à l’emplacement


pointé par sub la valeur a-b

59- Que met-on dans un header ou dans un fichier source ? (cocher les réponses valides)
Heade Source Nulle
r (.c) part
(.h)
Inclusion d’un header nécessaire à l’interprétation des types et
fonctions publiques
Inclusion d’un header nécessaire à l’interprétation des types et
fonctions privées
Inclusion d’un fichier source .c
Prototypes des fonctions publiques
Prototypes des fonctions privées
Variables privées permanentes
Types privés
Corps des fonctions

60- Complétez ces fonctions accesseurs de la variable nb_cars :


static uint8_t nb_cars = 0;

uint8_t get_nb_cars(void)
{

void set_nb_cars(uint8_t nb)


{

61- Qu’affichent les lignes suivantes ?


printf("%ld", 0b101);
printf("%x%%\"", '0');
printf("%.2f", 84.12345678);
char tab[20];
sprintf(tab, "%X",0xb16b);
printf("%s%X",tab, 0x00b5);
Cursus Ingénieur 1ère année – Promotion Noether
Contrôles du 1er semestre 2020/2021 (S5)
Epreuve du 23 novembre 2020 – Samuel Poiraud

62- Remplissez le contenu de cette fonction afin qu’elle renvoie la valeur en degré d’un angle exprimé
en RAD.4096 (Unité d’angle où 1 représente un 4096ème de radian).
o On dispose d’une macro PI4096 valant 12868 (pi*4096).
o Mathématiquement, cette fonction revient à calculer : rad*180/PI4096.
/**
* @brief fonction qui converti en degrés un angle fourni en radian4096
* @return cette fonction retourne la valeur convertie en degrés
* @param rad : l'angle que l'on veut convertir
* @pre rad doit être compris entre –PI4096 et +PI4096
* @post la valeur de retour sera comprise entre -180 et +180
*/
int16_t rad2deg(int16_t rad)
{

63- Remplissez le contenu de cette fonction qui transforme 2 entiers sur 8 bits en 1 entier sur 16 bits :

/**
* @brief fonction qui rassemble 2 entiers sur 8 bits en 1 entier sur 16 bits
* @return le nombre constitué de la suite des bits des 2 paramètres.
* @param octet de poids fort : high. Octet de poids faible : low.
*/
uint16_t u16fromu8(uint8_t high, uint8_t low)
{

64- Indiquez si les affirmations sont vraies (V) ou fausses (F), à partir de la machine à états finis.

action2() est une fonction exécutée tant


qu’on est dans l’ETAT2
INIT
Si on est dans l’ETAT2 et que !t est vrai init()

on se rend ensuite dans l’ETAT3 1


L’instruction t=2000 est exécutée tant
qu’on est dans l’ETAT2 ETAT1 ETAT2
a
action1() in : t=2000
action2() est une condition nécessaire
pour passer de l’ETAT3 à l’ETAT2 !t
action2() est une action qui est exécutée
b/action2()
ETAT3
si l’on est dans l’ETAT3 et que b est
vrai

Vous aimerez peut-être aussi