GIF3002 Examen1 A16 Solution -...

9
GIF-3002, 27 octobre 2016 Nom/Matricule : ____Solution________ 2 Examen 1 Cet examen vaut 30% de la note totale du cours. Les questions seront corrigées sur un total de 30 points. La valeur de chaque question est indiquée avec la question. Une calculatrice scientifique peut être utilisée. Cependant, aucune documentation n’est permise. Vous pouvez répondre aux questions directement sur ce questionnaire et/ou dans le cahier bleu mis à votre disposition. Q1 (2 points): Le circuit suivant apparaît dans le modèle pour un thyristor. Indiquez quelle sera la valeur de la tension de sortie (Vout) en fonction du signal sur la Gate qui peut avoir trois états : « 1 » (3.3V), « 0 » (0V) ou Z (haute impédance). État de Gate Vout « 1 » 0 « 0 » 1 « Z » Ne change pas Gate 3.3V Vout 10kOhms Q2 (1 point): Dites pourquoi la mémoire SRAM coûte plus cher que la mémoire DRAM. Un bit de SRAM est fait avec 6 transistors alors qu’un bit de DRAM n’utilise qu’un transistor et un condensateur. Q3 (2 points): Expliquez comment contrer les rebonds d’un bouton, avec du matériel et avec du logiciel. Matériel : Ajouter un circuit RC ou autre filtre passe-bas pour éliminer les transitions brusques. Logiciel : Faire une machine d’état et attendre dans un état temporaire lors de transitions (voir figure ci-dessous) OU faire une moyenne (ou autre filtre passe bas digital) avec plusieurs échantillons du signal de bouton pris sur une longue période (quelques 100ms).

Transcript of GIF3002 Examen1 A16 Solution -...

Page 1: GIF3002 Examen1 A16 Solution - wcours.gel.ulaval.cawcours.gel.ulaval.ca/2017/...Examen1_A16_Solution.pdf · 28 &dofxohu oh whpsv pr\hq g¶hqwuph gdqv o¶lqwhuuxswlrq dyhf xq rvfloorvfrsh

GIF-3002, 27 octobre 2016 Nom/Matricule : ____Solution________ 2

Examen 1

Cet examen vaut 30% de la note totale du cours. Les questions seront corrigées sur un total de 30 points. La valeur de chaque question est indiquée avec la question. Une calculatrice scientifique peut être utilisée. Cependant, aucune documentation n’est permise. Vous pouvez répondre aux questions directement sur ce questionnaire et/ou dans le cahier bleu mis à votre disposition.

Q1 (2 points): Le circuit suivant apparaît dans le modèle pour un thyristor. Indiquez quelle sera la valeur de la tension de sortie (Vout) en fonction du signal sur la Gate qui peut avoir trois états : « 1 » (3.3V), « 0 » (0V) ou Z (haute impédance). État de Gate Vout

« 1 » 0 « 0 » 1 « Z » Ne change pas

Gate

3.3V

Vout

10kOhms

Q2 (1 point): Dites pourquoi la mémoire SRAM coûte plus cher que la mémoire DRAM. Un bit de SRAM est fait avec 6 transistors alors qu’un bit de DRAM n’utilise qu’un transistor et un condensateur. Q3 (2 points): Expliquez comment contrer les rebonds d’un bouton, avec du matériel et avec du logiciel. Matériel : Ajouter un circuit RC ou autre filtre passe-bas pour éliminer les transitions brusques. Logiciel : Faire une machine d’état et attendre dans un état temporaire lors de transitions (voir figure ci-dessous) OU faire une moyenne (ou autre filtre passe bas digital) avec plusieurs échantillons du signal de bouton pris sur une longue période (quelques 100ms).

Page 2: GIF3002 Examen1 A16 Solution - wcours.gel.ulaval.cawcours.gel.ulaval.ca/2017/...Examen1_A16_Solution.pdf · 28 &dofxohu oh whpsv pr\hq g¶hqwuph gdqv o¶lqwhuuxswlrq dyhf xq rvfloorvfrsh

Q4 (3 points): Vous héritez d’un vieux SMI avec un microprocesseur 8051 (architecture CISC) que vous devez reprogrammer. On vous demande d’ajouter une interruption périodique à un programme déjà assez complexe (plein d’autres périphériques), qui fera flasher une LED à toutes les secondes, avec un timer 16 bits dont la fréquence d’horloge est 2MHz, 4MHz, 8MHz ou 16MHz, au choix (vous avez un prescaler limité). Sachant que le timer du vieux microcontrôleur n’a qu’un seul mode : rouler en continue, qu’il peut compter vers le haut seulement, qu’il génère une interruption uniquement lorsque le compte fait un débordement (overflow) et que vous pouvez écrire la valeur du timer en tout temps, répondez aux questions suivantes :

a) Comment allez-vous gérer le timer pour allumer et éteindre la LED à toutes les secondes (500ms allumée, 500ms éteinte)? Écrivez les grandes lignes de votre code.

On choisit l’horloge aléatoirement, mais la plus lente peut aider. J’ai pris 2MHz pour l’exemple. Avec une horloge de 2MHz si on met la valeur du timer à 65536 - 2000, une interruption de produira après 1ms (la période d’un coup d’horloge est 1/2MHz ou 500ns, au bout de 2000 comptes, il se sera écoulé 500ns * 2000 = 1ms). Dans l’interruption, on peut écrire de nouveau la valeur de timer à 65536-2000 pour générer la prochaine interruption. Au bout de 500 interruptions, on change l’état de la LED… unsigned int CompteurDeMs; unsigned int MsTimestamp; void TimerISR(void) { ValeurTimer = 65536 – 2000; //Horloge de timer à 2MHz CompteurDeMs++; if(CompteurDeMs – MsTimestamp >= 500) { MsTimestamp = CompteurDeMs; ToggleLED();

} }

b) Pourquoi la fréquence de l’interruption sera-t-elle imprécise (au moins trois raisons)?

L’interruption du timer peut être retardée par les autres interruptions L’interruption du timer peut être retardée par la fin de l’exécution de l’instruction en cours Le temps pris pour exécuter le code dans TimerISR peut varier en fonction des autres interruptions L’horloge interne du microprocesseur est imprécise

c) Comment pourrait-on améliorer le timer pour que la fréquence moyenne de l’interruption soit précise?

Ajouter un mode d’auto-reload au timer

Page 3: GIF3002 Examen1 A16 Solution - wcours.gel.ulaval.cawcours.gel.ulaval.ca/2017/...Examen1_A16_Solution.pdf · 28 &dofxohu oh whpsv pr\hq g¶hqwuph gdqv o¶lqwhuuxswlrq dyhf xq rvfloorvfrsh

OU Calculer le temps moyen d’entrée dans l’interruption avec un oscilloscope et des I/Os, puis diminuer le 2000 de mon exemple pour compenser la latence de traitement de l’interruption. Q5 (1 point): Quelles sont les différences entre le I2C et le SPI? I2C est half-duplex alors que SPI est full-duplex I2C est 10 fois moins rapide que SPI environ (10MHz max pour le SPI) I2C utilise 2 broches alors que le SPI en utilise 3+ nbre de slave I2C permet plusieurs Master alors que le SPI n’en permet qu’un seul I2C a des sorties open-collector avec pull-ups alors que SPI est totem-pole

Page 4: GIF3002 Examen1 A16 Solution - wcours.gel.ulaval.cawcours.gel.ulaval.ca/2017/...Examen1_A16_Solution.pdf · 28 &dofxohu oh whpsv pr\hq g¶hqwuph gdqv o¶lqwhuuxswlrq dyhf xq rvfloorvfrsh

Q6 (5 point): Sergio Marcello Inicio veut enregistrer un signal cosSMIque avec un ADC externe à une fréquence de 1MHz. Le montage est dessiné ci-dessous :

Sergio a aussi extrait les timings suivants de la fiche technique de l’ADC :

Pour enregistrer le signal, monsieur SMI, qui est un spécialiste du matériel, mais qui s’y connaît peu en logiciel, a essayé de faire un programme qui met la broche « Active » à 0, puis lit la broche « Prêt » jusqu’à ce qu’elle devienne 1. Ensuite, le programme active la broche « Lecture », il attend un peu (avec une boucle vide [for(i=0; i<CTE;i++){};] et, enfin, va lire les douze lignes de données une par une. Lorsque les douze lignes de données sont lues et chacune des valeurs est multipliées par le poids de chaque bit, le programme de SMI écrit la valeur lue en FLASH. Ça ne marche pas. De plus, des simulations montrent que le programme de Sergio n’est pas capable d’acquérir les échantillons d’ADC à 1MHz, même en mettant la vitesse du microprocesseur à 100MHz.

a) Selon vous, à quelle vitesse maximale peut échantillonner le programme de Sergio? Quel élément du design de Sergio limite le plus la vitesse d’échantillonnage?

b) Pourquoi ça ne marche pas? c) Comment Sergio pourrait-il accélérer l’exécution de son programme et libérer au mieux

le microprocesseur afin que celui-ci puisse exécuter d’autres tâches? Expliquer les grandes lignes de votre programme amélioré.

d) Si l’ADC retourne un échantillon valant 0xB0B à un moment donné, quelles sont les valeurs possibles du signal cosSMIque à ce moment donné.

e) À quoi servent les deux diodes?

a,b,c) Ce qui limite le plus la vitesse d’échantillonnage est l’écriture de la FLASH. Il faut plusieurs centaines de millisecondes pour écrire une valeur et il est impossible d’écrire des valeurs uniques individuellement. Sergio devrait utiliser un tableau de

Page 5: GIF3002 Examen1 A16 Solution - wcours.gel.ulaval.cawcours.gel.ulaval.ca/2017/...Examen1_A16_Solution.pdf · 28 &dofxohu oh whpsv pr\hq g¶hqwuph gdqv o¶lqwhuuxswlrq dyhf xq rvfloorvfrsh

RAM pour entreposer temporairement ses données pour écriture en bloc dans la FLASH ultérieurement. Ensuite, Sergio devrait lire toutes les broches d’un coup en lisant un seul port. Il devrait aussi utiliser une interface parallèle pour gérer les signaux d’accès à l’ADC et, finalement, prendre du DMA. Sans utiliser d’ADC ou de DMA, Sergio pourrait aussi utiliser des interruptions afin de réduire le temps d’attente active, d) 0xB0B/212 * 3.3V = 2.27761V. 1 bit vaut 1/212 * 3.3V = 0.00008. Toutes les entrées entre 2.7761V et 2.7761V + 0.00008V produiront 0xB0B à la sortie de l’ADC. e) Protéger l’entrée contre les ESDs. Q7 (4 points): Dites si les énoncés suivant sont vrais ou faux (1/2 pt si bon, -1/4 pt si incorrect, 0 si pas de réponse, minimum de 0 au total) Énoncé V/F Si une interruption haute priorité interrompt une interruption basse priorité, le traitement de l’interruption basse priorité recommencera du début lorsque celui de l’interruption haute priorité sera terminé.

F

Une sortie « push-pull » ou « totem-pole » peut fournir du courant (source) et tirer du courant (sink).

V

Une sortie « open-drain » ou « open-collector » peut fournir du courant (source) et tirer du courant (sink).

F

Lorsque vous passez d’un prototype à un SMI de production, il y a habituellement très peu de changements.

F

La création d’un banc de test pour un produit doit débuter idéalement juste avant de commander les PCBs pour la production de masse.

F

L’architecture Von Neumann est plus simple que l’architecture Harvard (il y a un bus de moins) et est, de ce fait, plus utilisée.

F

Pour augmenter la MTBF d’un produit, on peut lui ajouter des composantes ayant des MTBFs très élevées.

F

Le registre de lien contient les adresses de retour après un appel de fonction ou après une interruption. Cela permet d’éviter d’utiliser la pile à cet usage.

F

Q8 (2 points): Réécrivez le texte suivant pour qu’il devienne vrai : « Dans un microcontrôleur comme celui des labos de SMI, le microprocesseur exécute des instructions spéciales pour accéder aux périphériques. Ces instructions comme TRANSMET_OCTET_UART permettent de contrôler les périphériques et de lire leur état. L’exécution des instructions spéciales est implémentée par le manufacturier du microcontrôleur (ST micro par exemple), tandis que l’exécution des autres instructions est implémentée par les concepteurs du cœur/microprocesseur (Keil par exemple). » Des instructions LOAD et STORE sont utilisées pour accéder aux périphériques. Elles utilisent les adresses des registres des périphériques pour accéder à ceux-ci. Les concepteurs du cœur implémentent l’exécution des instructions LOAD/STORE alors

Page 6: GIF3002 Examen1 A16 Solution - wcours.gel.ulaval.cawcours.gel.ulaval.ca/2017/...Examen1_A16_Solution.pdf · 28 &dofxohu oh whpsv pr\hq g¶hqwuph gdqv o¶lqwhuuxswlrq dyhf xq rvfloorvfrsh

que le manufacturier du microcontrôleur implémente les registres des périphériques et les périphériques. Q9 (2 points): Un microprocesseur 32 bits est relié à une mémoire FLASH de 64K et une mémoire RAM de 16K.

a) Dessinez un décodeur d’adresse le plus simple possible qui mettra la mémoire FLASH à l’adresse 0 et la mémoire RAM à l’adresse 0x2000 0000.

b) Avec votre décodeur, que se passera-t-il si on lit l’adresse 0x4000 0000?

La FLASH sera lue à l’adresse 0.

c) Avec votre décodeur, que se passera-t-il si on lit des instructions à l’adresse 0x0001 0000?

La FLASH sera lue à l’adresse 0. Les réponses en b) et en c) varient en fonction de la réponse en a). En temps normal, si le microprocesseur accède à une adresse non-valide, il peut se produire trois évènements :

1) Si le microprocesseur « sait » quelles plages d’adresses valides (un circuit logique décode les adresses invalides), l’accès mémoire déclenche une interruption/exception (comme lors d’une division par 0; exemple : bus fault). C’est au programmeur de décider ce qui se produit lors de l’interruption…

2) Si le microprocesseur ne « sait » pas quelles plages d’adresses sont valides, mais que le décodeur d’adresse désigne une mémoire existante, le microprocesseur accèdera à la mémoire existante sans soulever d’erreur.

3) Si le microprocesseur ne « sait » pas quelles plages d’adresses sont valides et que le décodeur d’adresse ne désigne aucune mémoire existante, le microprocesseur lira des instructions aléatoires (un bus de données flottant!). Cela conduira très probablement au déclenchement d’une interruption/exception : instruction invalide… C’est au programmeur de décider ce qui se produit lors de l’interruption…

Page 7: GIF3002 Examen1 A16 Solution - wcours.gel.ulaval.cawcours.gel.ulaval.ca/2017/...Examen1_A16_Solution.pdf · 28 &dofxohu oh whpsv pr\hq g¶hqwuph gdqv o¶lqwhuuxswlrq dyhf xq rvfloorvfrsh

Q10 (2 points): Votre collègue Simon-Michel Ivanovich a besoin d'aide pour faire fonctionner son pilote de réception sur le port série supportant 2 baudrates : 115 200 bps et 4 800 bps. Sa stratégie adoptée est de programmer deux périphériques distincts dans le microcontrôleur, relié au même port série physique. Le périphérique UART0 est configuré à 115 200 bps et le périphérique UART1 est configuré à 4 800 bps. Les deux périphériques sont configurés pour lever une interruption lors de la réception du "stop bit" afin de récupérer la valeur du Byte reçu. Les périphériques sont configurés pour attendre un byte constitué d'un start bit à 0, suivi de 8 bits de données et d'un stop bit à 1.

Écrivez, en C ou en pseudo-code, le programme pour configurer les UARTs et gérer la réception des messages.

Les périphériques comme le UART décodent les octets sans donner nécessairement donner accès aux bits séries. Toutefois, certaines observations peuvent aider à résoudre le problème :

- 115200/4800 = 24. Le UART0 à 115200 est 24 fois plus rapide que celui à 4800 - Lors de réception d’un Start Bit (« 0 »), les deux UARTs commenceront à

recevoir - Si on reçoit un Start bit à 4800 bps, le UART0 à 115200 bps recevra 24 fois le

bit 0 consécutivement. Comme il y a 8 bits de données suivi d’un stop bit (toujours « 1 »), on peut présumer que le UART0 rapportera une erreur comme « trame invalide » lors de la réception du premier bit à 115200 bps

- Si on reçoit un Start bit à 115200, le UART1 à 4800 bps échantillonnera un octet aléatoire : tout le byte à 115200 aura le temps de passer avant l’échantillonnage (habituellement au milieu du bit) et le UART1 verra très probablement une descente d’horloge accompagnée du start bit valant « 1 ». Ces deux informations sont contradictoires et une erreur devrait être rapportée.

Donc, en pseudo-code :

Main UART0_ISR (115200) UART0_ISR (115200) void main(void) /*Écrit registres du UART pour baudrate, 8bits, signal d’interruption)*/ ConfigureUART1(); ConfigureUART2(); /*Prepare interruption UART*/ ConfigureNVIC() /*Décode Messages*/ while(1){ DecodeMsgDuBufferCirculaire () }

Void UART0_ISR(void) { if(REG_STATUS_U0 & REÇU) { MetByteDansBufferCirculaire( REG_OCTET_RECU_U0) } if(REG_STATUS_U0 & ERREUR) { IgnoreOctetsEtErreursU0 (); } }

Void UART1_ISR(void) { if(REG_STATUS_U1 & REÇU) { MetByteDansBufferCirculaire( REG_OCTET_RECU_U1) } if(REG_STATUS_U0 & ERREUR) { IgnoreOctetsEtErreursU1 (); } }

Page 8: GIF3002 Examen1 A16 Solution - wcours.gel.ulaval.cawcours.gel.ulaval.ca/2017/...Examen1_A16_Solution.pdf · 28 &dofxohu oh whpsv pr\hq g¶hqwuph gdqv o¶lqwhuuxswlrq dyhf xq rvfloorvfrsh

Q11 (3 points): Vous voulez qu’une routine nommée Mon_ISR soit exécutée lorsqu’un périphérique appelé Mon_Périphérique déclenche une interruption. Décrivez les opérations que devra faire votre programme pour atteindre ce but.

Le programme devra écrire les registres de Mon_Périphérique pour que celui-ci active sa ligne d’interruption lorsque désiré.

Le programme devra écrire les registres du contrôleur d’interruption (NVIC) pour que celui active l’interruption et établir sa priorité.

Le programme doit s’assurer que l’adresse de Mon_ISR soit dans la table des vecteurs d’interruptions, à l’index correspondant au numéro associé à Mon_Périphérique.

Q12 (1 points): Décrivez brièvement ce qu’est un banc de test ICT (In-Circuit Test).

Un nid de clous sur lequels est déposé l’unité à tester. Le banc de test injecte des signaux afin de vérifier toutes les composantes du circuit à tester.

Q13 (2 point): Associez chaque abréviation qui suit avec la bonne description :

Abréviation Description 1 EPEAT A Évaluation globale du système de protection de

l’environnement relié au produit 2 RoHS B Contrôleur d’interruptions imbriquées 3 WEEE C Norme pour les substances chimiques retrouvées dans

les produits 4 DMA D Norme pour le recyclage et la récupération des appareils

électroniques 5 Energy Star E Méthode de transfert de données entre la mémoire et les

périphériques sans intervention du microprocesseur 6 NVIC F Norme pour la réduction de la consommation

énergétique

1-A, 2-C, 3-D, 4-E, 5-F, 6-B

Page 9: GIF3002 Examen1 A16 Solution - wcours.gel.ulaval.cawcours.gel.ulaval.ca/2017/...Examen1_A16_Solution.pdf · 28 &dofxohu oh whpsv pr\hq g¶hqwuph gdqv o¶lqwhuuxswlrq dyhf xq rvfloorvfrsh

QBonus (3 points): Une expression mathématique contenant uniquement des opérations parmi les suivantes : * (multiplication), ÷ (division), ⌊𝑥⌋ (arrondi inférieur), ⌈𝑦⌉ (arrondi supérieur), % (modulo) a été compilée ci-dessous, pour le STM32F407. Cette expression mathématique, avec des entiers, est représentée par les instructions de la table ci-dessous (l’exécution commence à l’adresse 0xA0) : adresse Instruction/valeur Commentaire 0x88 0x2000 0000 Adresse de la variable « a » 0x8C 0x2000 0004 Adresse de la variable « b » 0x90 0x2000 0008 Adresse de la variable « c » 0x94 0x2000 000C Adresse de la variable « d » 0x98 0x2000 0010 Adresse de la variable « e » 0x9C 0x2000 0014 Adresse de la variable « f » 0xA0 LOAD R1, [PC-0x18] Lecture de la mémoire. Début 0xA4 LOAD R2, [PC-0x18] Lecture de la mémoire 0xA8 LOAD R3, [PC-0x18] Lecture de la mémoire 0xAC LOAD R1, [R1] Lecture de la mémoire 0xB0 LOAD R2, [R2] Lecture de la mémoire 0xB4 ADD R2, R2, #7 Addition 0xB8 ASR R2, R2, #3 Décalage arithm. de 3 bits vers la droite 0xBC MUL R4, R1, R2 R4 = R1 * R2 0xC0 AND R4, R4, 0x07 R4 = R4 & 0x07 0xC4 STORE R4, [R3] Écriture de la mémoire

Assumez que toutes les instructions sont encodées sur quatre octets. Les variables de « a » à « f » ont été placées aux adresses de « 0x20000000 » à « 0x20000014 » par l’éditeur de liens. Quelle est cette expression mathématique? À l’adresse 0xA0, l’adresse de la variable C est mise dans R1 (0xA0 – 0x18 = 0x88, mais il faut ajouter 8 en raison du pipeline d’instruction du cœur). À l’adresse 0xA4, l’adresse de la variable D est mise dans R2 (0xA4 – 0x18 = 0x8C, mais il faut ajouter 8 en raison du pipeline d’instruction du cœur). À l’adresse 0xA8, l’adresse de la variable E est mise dans R3 (0xA8 – 0x18 = 0x8C, mais il faut ajouter 8 en raison du pipeline d’instruction du cœur). À l’adresse 0xAC et à l’adresse 0xB0, on lit les variables C et D dans R1 et R2 respectivement. À l’adresse 0xB4 et 0xB8, l’opération D = (D+7) >> 3 équivaut à diviser D par 8, arrondi supérieur. À l’adresse 0xBC, on fait C * ((D+7) >> 3) À l’adresse 0xC0, le R4 = R4 AND 7 équivaut à faire un modulo 8.

Donc, à l’adresse 0xC4 : 𝒆 = 𝒄 ∗𝒅

𝟖%𝟖