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