Examen Introduction aux systèmes embarqués

Embedded Systems · exam

Voir tous les documents en électronique et automatique

Université de la Manouba Ecole Nationale des Sciences de l’Informatique

Examen Introduction aux systèmes embarqués

Enseignants : I. Ben Abdessalem, Ch. Jerad, L. Kriaa, L. Latrach

M. Masmoudi, D. Mezghanni, M. K. Bouaffoura, N. Sghaier

Documents : Non autorisés

Durée : 2 H

Date : 09 - 05 – 2015

Nbr pages : 11

Nom et prénom :……………………………………………

Classe :………………..

CIN : ……………………………….……………………….

CE : …………………..

Exercice 1 (5 points) :

L'ouvre portail FAAC est un système mécanique permettant d'automatiser l'ouverture d'un portail

ordinaire à l'entrée d'une propriété. Pour commander l'ouverture du portail le propriétaire doit

taper un code de 4 chiffres sur un clavier. Si le code est correct le moteur du système se met en

marche et le portail s'ouvre. Si le code n'est pas correct alors le portail reste fermer.

Nous considérons que l'utilisateur dispose d'un clavier à 5

touches :

 une touche pour taper le chiffre 1 (e1)

 une touche pour taper le chiffre 2 (e2)

 une touche pour taper le chiffre 3 (e3)

 une touche pour taper le chiffre 4 (e4)

 une touche pour annuler entièrement le code tapé

(remise à zéro du dispositif) : (e0)

La sortie logique (C) du montage devra passer à 1

seulement si le code correct (1234) est tapé. Une solution

proposée consiste à utiliser des bascules RS à portes NOR

et une porte AND à 4 entrées

1. Compléter la description VHDL par folt de données de la porte AND à 4 entrées

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

Entity AND is

Port ( a,b,c,d : in STD_LOGIC;

s : out STD_LOGIC);

end AND;

ARCHITECTURE comportment1 OF AND IS

Begin

s <= (a and b and c and d) ;

End comportment1;

1

1

Université de la Manouba Ecole Nationale des Sciences de l’Informatique

Examen Introduction aux systèmes embarqués

Enseignants : I. Ben Abdessalem, Ch. Jerad, L. Kriaa, L. Latrach

M. Masmoudi, D. Mezghanni, M. K. Bouaffoura, N. Sghaier

Documents : Non autorisés

Durée : 2 H

Date : 09 - 05 – 2015

Nbr pages : 11

Nom et prénom :……………………………………………

Classe :………………..

CIN : ……………………………….……………………….

CE : …………………..

2. Compléter la description VHDL par flot de données de la porte NOR à deux entrées

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

entity NOR is

Port ( a,b : in STD_LOGIC;

s : out STD_LOGIC);

end NOR;

ARCHITECTURE comportement2 OF NOR IS

Begin

s <= (a nor b) ;

End comportment2;

3. Compléter la description VHDL structurelle du système étudié.

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity Ouvre_Portail is

Port ( e0,e1,e2,e3,e4 : in STD_LOGIC;

C : out STD_LOGIC);

end ouvre_portail;

ARCHITECTURE structure OF Ouvre_Portail IS

COMPONENT AND

PORT (a,b,c,d : IN std_logic;s:

s: std_logic);

END COMPONENT;

COMPONENT NOR

PORT (a,b : IN std_logic;

S : OUT std_logic);

END COMPONENT;

-- déclarations de signaux internes (fils)

SIGNAL s1,s2,s3,s4,s5,s6,7s8 : std_logic;

BEGIN

1

3

2

Université de la Manouba Ecole Nationale des Sciences de l’Informatique

Examen Introduction aux systèmes embarqués

Enseignants : I. Ben Abdessalem, Ch. Jerad, L. Kriaa, L. Latrach

M. Masmoudi, D. Mezghanni, M. K. Bouaffoura, N. Sghaier

Documents : Non autorisés

Durée : 2 H

Date : 09 - 05 – 2015

Nbr pages : 11

Nom et prénom :……………………………………………

Classe :………………..

CIN : ……………………………….……………………….

CE : …………………..

Nor1 : NOR PORT MAP(e0, s1, s2);

Nor2 : NOR PORT MAP(e1, s2, s1);

Nor3 : NOR PORT MAP(e0, s3, s4);

Nor4 : NOR PORT MAP(e2, s4, s3);

Nor5 : NOR PORT MAP(e0, s5, s6);

Nor6 : NOR PORT MAP(e3, s6, s5);

Nor7 : NOR PORT MAP(e0, s7, s8);

Nor8 : NOR PORT MAP(e4, s8, s7);

Publicité

AND1 : AND PORT MAP(s2, s4, s6, s8, C);

End comportment;

Exercice 2 (1.5 points) :

Un de ces jours, le boss de Taha arrive à son bureau et lui présente une idée splendide : « J’ai lu

beaucoup d’articles sur les Systems-on-Chip (SoC). Maintenant, il est possible de mettre un grand

nombre de processeurs et de mémoire sur une seule puce, ce qui donne des performances

extrêmes ! Si on pense maintenant au marché des programmes de PC, pourquoi ne pas utiliser un

SoC { l’intérieur du PC, écrire un compilateur intelligent, et gagner beaucoup beaucoup d’argent !

Je pense que c’est une bonne idée ! Et puisque tu es notre ingénieur expert, tu nous fourniras dans

quelques jours des réponses aux requêtes suivantes :

  • Une stratégie pour le compilateur qui implémente efficacement un programme C séquentiel

sur un SoC,

  • Et une idée sur les plateformes hardware possibles, il y a plusieurs clients dans le monde, et

tu sais, le client est le Roi !

Alors, commençons à travailler, nous serons bientôt riches ! »

Lorsque le boss de Taha est sorti, Amine a commencé { réfléchir { l’implémentation de cette

grande idée… Au bout d’une année, vous pouvez être { la place de Taha. Pourriez vous l’aider {

répondre aux questions suivantes :

Rmq : les réponses ne sont pas exactes, mais doivent refléter la compréhension de la

problématique. Il est important de motiver les réponses.

1. Quels sont les problèmes et les challenges qui doivent être résolus ?

Stratégie pour la compilation (répartition et ordonnancement)

/plateforme/application

……………………………………………………………………………………………………………………………………………………………………………………

……………………………………………………………………………………………………………………………………………………………………………………

1

3

Université de la Manouba Ecole Nationale des Sciences de l’Informatique

Examen Introduction aux systèmes embarqués

Enseignants : I. Ben Abdessalem, Ch. Jerad, L. Kriaa, L. Latrach

M. Masmoudi, D. Mezghanni, M. K. Bouaffoura, N. Sghaier

Documents : Non autorisés

Durée : 2 H

Date : 09 - 05 – 2015

Nbr pages : 11

Nom et prénom :……………………………………………

Classe :………………..

CIN : ……………………………….……………………….

CE : …………………..

2. Est-ce que les attentes du boss de Taha peuvent être atteintes ? Sinon, qu’est ce qui devrait

changer et pourquoi ?

1

Non

Pas de généricité

……………………………………………………………………………………………………………………………………………………………………………………

……………………………………………………………………………………………………………………………………………………………………………………

3. Sachant les étapes du processus de compilation, comment sera adapté ce processus afin

d’exploiter une architecture d’un SoC { partir d’un code séquentiel écrit en C.

1

Etude du code pour extraire les blocs soft à affecter aux blocs hard

……………………………………………………………………………………………………………………………………………………………………………………

……………………………………………………………………………………………………………………………………………………………………………………

Problème (12 points) :

Le jeu de Simon consiste à reproduire une suite d’appuis sur un clavier constitué de n boutons

lumineux. Le jeu se déroule sur deux phases :

 La première phase : le joueur écoute une suite de notes accompagnées de signaux lumineux

correspondants aux appuis qu’il doit réaliser.

 La deuxième phase : Le joueur doit reproduire la même séquence précédente.

Nous supposons dans un premier temps que le système ne contient qu’un seul bouton lumineux.

La figure suivante présente le branchement effectué pour connecter le bouton LED avec le pin

PB10 et le speaker à la sortie PA1.

4

Université de la Manouba Ecole Nationale des Sciences de l’Informatique

Examen Introduction aux systèmes embarqués

Enseignants : I. Ben Abdessalem, Ch. Jerad, L. Kriaa, L. Latrach

M. Masmoudi, D. Mezghanni, M. K. Bouaffoura, N. Sghaier

Documents : Non autorisés

Durée : 2 H

Date : 09 - 05 – 2015

Nbr pages : 11

Nom et prénom :……………………………………………

Classe :………………..

CIN : ……………………………….……………………….

CE : …………………..

+VCC

PB10

PA1

STM32

MCU

1. Ecrire la fonction Button_init_out (GPIO_Typedef * GPIOx, uint16_t pin) permettant de

configurer un bouton LED en tant que sortie pour pouvoir gérer l’allumage et l’extinction

de la LED sans que l’utilisateur appui sur le bouton.

void Button_init_out (GPIO_Typedef * GPIOx, uint16_t pin) {

GPIO_InitTypeDef GPIO_InitStructure;

//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

2

GPIO_DeInit(GPIOx);

GPIO_InitStructure.GPIO_Pin = pin;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;

GPIO_Init(GPIOx, &GPIO_InitStructure);

}

2. Ecrire la fonction Button_init_in (GPIO_Typedef * GPIOx, uint16_t pin) permettant de

configurer le bouton en tant que entrée permettant la réception des interruptions

provenant des appuis de bouton.

void Button_init_in (GPIO_Typedef * GPIOx, uint16_t pin) {

GPIO_InitTypeDef GPIO_InitStructure;

EXTI_InitTypeDef EXTI_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

GPIO_DeInit(GPIOx);

GPIO_InitStructure.GPIO_Pin = pin;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;

2

5

Université de la Manouba Ecole Nationale des Sciences de l’Informatique

Examen Introduction aux systèmes embarqués

Enseignants : I. Ben Abdessalem, Ch. Jerad, L. Kriaa, L. Latrach

Publicité

M. Masmoudi, D. Mezghanni, M. K. Bouaffoura, N. Sghaier

Documents : Non autorisés

Durée : 2 H

Date : 09 - 05 – 2015

Nbr pages : 11

Nom et prénom :……………………………………………

Classe :………………..

CIN : ……………………………….……………………….

CE : …………………..

GPIO_Init(GPIOx, &GPIO_InitStructure);

/ Connect Button EXTI Line to Button GPIO Pin /

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource10);

/ Configure Button EXTI line /

EXTI_InitStructure.EXTI_Line = EXTI_Line1510 ;

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;

EXTI_InitStructure.EXTI_LineCmd = ENABLE ;

EXTI_Init(&EXTI_InitStructure);

/ Enable and set Button EXTI Interrupt to the lowest priority /

NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn ;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

}

3. Ecrire la fonction Speaker_Init() permettant la configuration de la sortie pour le

hautparleur.

void Speaker_Init() {

GPIO_InitTypeDef GPIO_InitStructure;

//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

1

GPIO_DeInit(GPIOA);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;

GPIO_Init(GPIOA, &GPIO_InitStructure);

}

4. Compléter

la

interruption

Speaker_generate(uint8_t son) avec son=1 pour le premier bouton.

fonction EXTI15_10_IrqHandler() permettant

le bouton poussoir ce qui

depuis

la réception d’une

fonction

la

fait appel à

void EXTI15_10_IrqHandler(void) {

if(EXTI_GetITStatus(EXTI_Line10)!= RESET)

{

if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_10)==(uint8_t)Bit_SET)

Speaker_generate(1) ;

1

/ Clear the User Button EXTI line pending bit /

EXTI_ClearITPendingBit(EXTI_Line10);

}

6

Université de la Manouba Ecole Nationale des Sciences de l’Informatique

Examen Introduction aux systèmes embarqués

Enseignants : I. Ben Abdessalem, Ch. Jerad, L. Kriaa, L. Latrach

M. Masmoudi, D. Mezghanni, M. K. Bouaffoura, N. Sghaier

Documents : Non autorisés

Durée : 2 H

Date : 09 - 05 – 2015

Nbr pages : 11

Nom et prénom :……………………………………………

Classe :………………..

CIN : ……………………………….……………………….

CE : …………………..

On suppose que notre jeu contient 4 boutons lumineux connectés sur les pins PB10, PB11, PB12 et

PB13.

5. Ecrire la fonction SIMON_init_player() permettant l’initialisation du jeu en mode player

(phase 1).

SIMON_init_player() {

Button_init_out (GPIOB, GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12

| GPIO_Pin_13);

Speaker_Init() ;

}

1

6. Ecrire la fonction SIMON_init_recorder() permettant l’initialisation du jeu en mode

recorder (phase 2).

1

SIMON_init_player() {

Button_init_in (GPIOB, GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12

| GPIO_Pin_13);

Speaker_Init() ; //facultatif

}

En utilisant la fonction Speaker_generate et la fonction delay_ms(uint32_t n) permettant de

faire un delay de n millisecondes :

7. écrire la fonction Speaker_play(uint8_t * tab) permettant de lire le contenu du tableau tab

et s’arrêter sur la première case différente de 1, 2, 3 ou 4. Les lectures sont séparées de

200ms.

Speaker_play(uint8_t * tab) {

1

while(tab == 1 || tab == 2 || tab == 3 || tab == 4) {

Speaker_generate(*tab);

delay(200);

tab++;

}

}

Sachant que le signal nécessaire pour activer le speaker est un signal PWM. Un signal PWM est

caractérisé par sa période et son rapport cyclique.

7

Université de la Manouba Ecole Nationale des Sciences de l’Informatique

Examen Introduction aux systèmes embarqués

Enseignants : I. Ben Abdessalem, Ch. Jerad, L. Kriaa, L. Latrach

M. Masmoudi, D. Mezghanni, M. K. Bouaffoura, N. Sghaier

Documents : Non autorisés

Publicité

Durée : 2 H

Date : 09 - 05 – 2015

Nbr pages : 11

Nom et prénom :……………………………………………

Classe :………………..

CIN : ……………………………….……………………….

CE : …………………..

On suppose que les signaux relatifs aux quatre boutons sont :

Bouton Période

1

2

3

4

12ms

12ms

12ms

12ms

Rapport

cyclique

75%

50%

33%

25%

Et que la génération du son pour chaque bouton consiste à répéter le signal PWM pendant 240 ms.

8. Ecrire la fonction Speaker_generate.

Speaker_generate(uint_t son) {

1

switch(son) {

case (1) : GPIO_SetBits(GPIOA, GPIO_Pin_1);

delay(9);

GPIO_ResetBits(GPIOA, GPIO_Pin_1);

delay(3);

break;

case (2) : GPIO_SetBits(GPIOA, GPIO_Pin_1);

delay(6);

GPIO_ResetBits(GPIOA, GPIO_Pin_1);

delay(6);

break;

case (3) : GPIO_SetBits(GPIOA, GPIO_Pin_1);

delay(4);

GPIO_ResetBits(GPIOA, GPIO_Pin_1);

delay(8);

break;

case (4) : GPIO_SetBits(GPIOA, GPIO_Pin_1);

delay(3);

GPIO_ResetBits(GPIOA, GPIO_Pin_1);

delay(9);

}

//ou bien le faire sans switch case mais à l’aide d’une relation et

//appel direct

8

Université de la Manouba Ecole Nationale des Sciences de l’Informatique

Examen Introduction aux systèmes embarqués

Enseignants : I. Ben Abdessalem, Ch. Jerad, L. Kriaa, L. Latrach

M. Masmoudi, D. Mezghanni, M. K. Bouaffoura, N. Sghaier

Documents : Non autorisés

Durée : 2 H

Date : 09 - 05 – 2015

Nbr pages : 11

Nom et prénom :……………………………………………

Classe :………………..

CIN : ……………………………….……………………….

CE : …………………..

9. Ecrire la fonction main permettant de gérer le jeu.

//tab existe déjà et est initialisée.

void main() {

while (1) {

SIMON_init_player() ;

Speaker_Play(tab) ;

SIMON_init_recorder();

// attente active et peut être replacée par autre chose

// (comptage du nombre d’appuis, mais là il faut inclure

// le comptage dans le handler

for(i=0 ;i<=99999 ;i++) ;

}

}

//Ensuite c’est le handler gère les interruptions pour la sortie du son

// normalement Irq_handler_15_10 doit changer pour supporter les

//différents cas et générer les sons appropriés (1, 2, 3 ou 4)

10. Proposer une amélioration du jeu pour créer trois niveaux de difficulté.

int niveau1[10] ={….};

int niveau2[20] ={….};

int niveau3[30] ={….};

void main() {

while (1) {

int niv;

// selection du niveau

SIMON_init_player() ;

Switch(niv) {

case 1 : Speaker_Play(Niveau1) ;

break;

case 2 : Speaker_Play(Niveau2) ;

break;

case 3 : Speaker_Play(Niveau3) ;

}

SIMON_init_recorder();

for(i=0 ;i<=99999 ;i++) ;

}

}

1

1

9

Annexe

typedef enum

{

GPIO_Speed_10MHz = 1,

GPIO_Speed_2MHz,

GPIO_Speed_50MHz

}GPIOSpeed_TypeDef;

Publicité

typedef enum

{ GPIO_Mode_AIN = 0x0,

//mode analog input

GPIO_Mode_IN_FLOATING = 0x04,

//mode input floating

GPIO_Mode_IPD = 0x28,

GPIO_Mode_IPU = 0x48,

GPIO_Mode_Out_OD = 0x14,

GPIO_Mode_Out_PP = 0x10,

GPIO_Mode_AF_OD = 0x1C,

GPIO_Mode_AF_PP = 0x18

}GPIOMode_TypeDef;

typedef struct

{

uint16_t GPIO_Pin;

GPIOSpeed_TypeDef GPIO_Speed;

GPIOMode_TypeDef GPIO_Mode;

}GPIO_InitTypeDef;

typedef enum

{ Bit_RESET = 0,

Bit_SET

}BitAction;

#define GPIO_Pin_0 ((uint16_t)0x0001)

#define GPIO_Pin_1 ((uint16_t)0x0002)

#define GPIO_Pin_2 ((uint16_t)0x0004)

#define GPIO_Pin_3 ((uint16_t)0x0008)

#define GPIO_Pin_4 ((uint16_t)0x0010)

#define GPIO_Pin_5 ((uint16_t)0x0020)

#define GPIO_Pin_6 ((uint16_t)0x0040)

#define GPIO_Pin_7 ((uint16_t)0x0080)

#define GPIO_Pin_8 ((uint16_t)0x0100)

#define GPIO_Pin_9 ((uint16_t)0x0200)

#define GPIO_Pin_10 ((uint16_t)0x0400)

#define GPIO_Pin_11 ((uint16_t)0x0800)

#define GPIO_Pin_12 ((uint16_t)0x1000)

#define GPIO_Pin_13 ((uint16_t)0x2000)

#define GPIO_Pin_14 ((uint16_t)0x4000)

#define GPIO_Pin_15 ((uint16_t)0x8000)

#define GPIO_Pin_All ((uint16_t)0xFFFF)

/** Deinitializes the GPIOx peripheral

registers to their default reset values.

  • @param GPIOx: where x can be (A..G)

to select the GPIO peripheral.

**/

void GPIO_DeInit(GPIO_TypeDef* GPIOx)

/** Initializes the GPIOx peripheral

according to the specified

  • parameters in the GPIO_InitStruct.
  • @param GPIOx: where x can be (A..G)

to select the GPIO peripheral.

  • @param GPIO_InitStruct: pointer to

a GPIO_InitTypeDef structure that

  • contains the configuration

information for the specified GPIO

peripheral.

**/

void GPIO_Init(GPIO_TypeDef* GPIOx,

GPIO_InitTypeDef* GPIO_InitStruct)

void GPIO_SetBits(GPIO_TypeDef* GPIOx,

uint16_t GPIO_Pin)

/** @brief Clears the selected data

port bits.

  • @param GPIOx: where x can be (A..G)

to select the GPIO peripheral.

  • @param GPIO_Pin: specifies the port

bits to be written.

  • This parameter can be any

combination of GPIO_Pin_x where x can be

(0..15).

**/

void GPIO_ResetBits(GPIO_TypeDef* GPIOx,

uint16_t GPIO_Pin)

/** @brief Reads the specified input

port pin.

  • @param GPIOx: where x can be (A..G)

to select the GPIO peripheral.

  • @param GPIO_Pin: specifies the

port bit to read.

  • This parameter can be GPIO_Pin_x

where x can be (0..15).

**/

uint8_t

GPIO_ReadInputDataBit(GPIO_TypeDef*

GPIOx, uint16_t GPIO_Pin)

EXTI15_10_IRQn = 40,

/!< External Line[15:10] Interrupts /

/** @brief Sets the selected data port

bits.

  • @param GPIOx: where x can be (A..G)

to select the GPIO peripheral.

  • @param GPIO_Pin: specifies the port

bits to be written.

  • This parameter can be any

combination of GPIO_Pin_x where x can be

(0..15).

**/

/**@brief Checks whether the specified

EXTI line is asserted or not.

  • @param EXTI_Line: specifies the

EXTI line to check.

  • This parameter can be:
  • @arg EXTI_Linex: External

interrupt line x where x(0..19)

  • @retval The new state of EXTI_Line

(SET or RESET)*/

ITStatus EXTI_GetITStatus(uint32_t

EXTI_Line)

10