Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Â
Sistema embarcados
1. Notas de Aula Programação Embarcada
Rodrigo Maximiano Antunes de Almeida
Instituto de Engenharia de Sistemas e Tecnologia da Informação,
Universidade Federal de Ita jubĂĄ,
Minas Gerais,
Brasil
rodrigomax @ unifei.edu.br
2 de Dezembro de 2010
2. ConteĂşdo
1 Introdução 1
1.1 vinguâgem g F F F F F F F F F F F F F F F F F F F F F F F F F F F P
1.2 rârdwâre utilizâdo F F F F F F F F F F F F F F F F F F F F F F F F Q
1.3 emËiente de progrâmâção F F F F F F F F F F F F F F F F F F F F Q
snstâlâção F F F F F F F F F F F F F F F F F F F F F F F F R
gon(gurâção do grâvâdor sghP F F F F F F F F F F F F U
griâção de um novo projeto F F F F F F F F F F F F F F W
2 Linguagem C para sistemas embarcados 12
2.1 sndentâção e pâdrĂŁo de esâ˘ritâ F F F F F F F F F F F F F F F F F IP
2.2 gomentĂĄrios F F F F F F F F F F F F F F F F F F F F F F F F F F F F IR
2.3 erquivos F⢠e Fh F F F F F F F F F F F F F F F F F F F F F F F F F F IS
2.4 hiretivâs de â˘ompilâção F F F F F F F F F F F F F F F F F F F F F IS
5inâ˘lude F F F F F F F F F F F F F F F F F F F F F F F F F IS
5de(ne F F F F F F F F F F F F F F F F F F F F F F F F F F IU
5ifdefD 5ifndefD 5else e 5endif F F F F F F F F F F F F F IV
2.5 âipos de dâdos em g F F F F F F F F F F F F F F F F F F F F F F F PI
âepresentâção ËinĂĄriâ e hexâdeâ˘imâl F F F F F F F F F F PP
wodi(â˘âdores de tâmânho e sinâl F F F F F F F F F F F F PQ
wodi(â˘âdores de ââ˘esso F F F F F F F F F F F F F F F F F PR
wodi(â˘âdores de posiâ˘ionâmento F F F F F F F F F F F F PT
wodi(â˘âdor de persistĂŞnâ˘iâ F F F F F F F F F F F F F F F PT
2.6 yperâçþes âritmĂŠtiâ˘âs F F F F F F F F F F F F F F F F F F F F F F PU
2.7 punção mâin@A F F F F F F F F F F F F F F F F F F F F F F F F F F PW
2.8 âotinâs de tempo F F F F F F F F F F F F F F F F F F F F F F F F F QI
2.9 yperâçþes â˘om Ëits F F F F F F F F F F F F F F F F F F F F F F F F QQ
xyâ F F F F F F F F F F F F F F F F F F F F F F F F F F F F QR
exh F F F F F F F F F F F F F F F F F F F F F F F F F F F F QR
yâ F F F F F F F F F F F F F F F F F F F F F F F F F F F F F QS
Ëyâ F F F F F F F F F F F F F F F F F F F F F F F F F F F F QS
Ćhift F F F F F F F F F F F F F F F F F F F F F F F F F F F F QT
vigâr um Ëit @Ëit setA F F F F F F F F F F F F F F F F F F QT
hesligâr um Ëit @Ëit â˘leârA F F F F F F F F F F F F F F F F QU
i
3. âroâ˘âr o vâlor de um Ëit @Ëit )ipA F F F F F F F F F F F QV
â eri(â˘âr o estâdo de um Ëit @Ëit testA F F F F F F F F F QW
griândo funçþes âtrâvĂŠs de de(nes F F F F F F F F F F F RH
2.10 heËug de sistemâs emËârâ˘âdos F F F F F F F F F F F F F F F F F RH
ixternâlizâr âs informâçþesF F F F F F F F F F F F F F F F RQ
âŹrogrâmâção inâ˘rementâl F F F F F F F F F F F F F F F F RR
gheâ˘âr possĂveis pontos de wemoryEleâk F F F F F F F F RR
guidâdo â˘om â frâgmentâção dâ memĂłriâ F F F F F F F RR
ytimizâção de â˘Ăłdigo F F F F F F F F F F F F F F F F F F RR
âeproduzir e isolâr o erro F F F F F F F F F F F F F F F F RS
2.11 âŹonteiros e endereços de memĂłriâ F F F F F F F F F F F F F F F F RS
3 Arquitetura de microcontroladores 48
3.1 eâ˘esso Ă memĂłriâ F F F F F F F F F F F F F F F F F F F F F F F F F RV
3.2 gloâ˘k e tempo de instrução F F F F F F F F F F F F F F F F F F F SI
3.3 isquemâ elĂŠtriâ˘o e â˘irâ˘uitos importântes F F F F F F F F F F F F SQ
wultiplexâção nos terminâis do miâ˘roâ˘ontrolâdor F F F SR
3.4 âegistros de â˘on(gurâção do miâ˘roâ˘ontrolâdor F F F F F F F F F SR
4 Programação dos PerifÊricos 57
4.1 eâ˘esso Ă s 4portâs4 do miâ˘roâ˘ontrolâdor F F F F F F F F F F F F SV
4.2 gon(gurâção dos perifĂŠriâ˘os F F F F F F F F F F F F F F F F F F F SW
4.3 fârrâmento de ved's F F F F F F F F F F F F F F F F F F F F F F F TQ
4.4 hisplây de U segmentos F F F F F F F F F F F F F F F F F F F F F F TQ
wultiplexâção de displâys F F F F F F F F F F F F F F F F TT
griâção dâ ËiËlioteâ˘â F F F F F F F F F F F F F F F F F F TU
4.5 veiturâ de teâ˘lâs F F F F F F F F F F F F F F F F F F F F F F F F F UH
heËounâ˘e por softwâre F F F F F F F F F F F F F F F F F F UP
errânjo de leiturâ por mâtriz F F F F F F F F F F F F F F UQ
griâção dâ ËiËlioteâ˘â F F F F F F F F F F F F F F F F F F F UT
4.6 hisplây vgh PxIT F F F F F F F F F F F F F F F F F F F F F F F F UT
griâção dâ ËiËlioteâ˘â F F F F F F F F F F F F F F F F F F VQ
4.7 gomuniâ˘âção seriâl F F F F F F F F F F F F F F F F F F F F F F F F VV
âĆ PQP F F F F F F F F F F F F F F F F F F F F F F F F F F F VV
griâção dâ ËiËlioteâ˘â F F F F F F F F F F F F F F F F F F F WP
4.8 gonversor eh F F F F F F F F F F F F F F F F F F F F F F F F F F F WS
ilementos sensores F F F F F F F F F F F F F F F F F F F F WS
âŹroâ˘esso de â˘onversĂŁo eh F F F F F F F F F F F F F F F F WU
griâção dâ ËiËlioteâ˘â F F F F F F F F F F F F F F F F F F F IHH
4.9 ĆâĂdâs âŹâĄw F F F F F F F F F F F F F F F F F F F F F F F F F F F IHQ
griâção dâ ËiËlioteâ˘â F F F F F F F F F F F F F F F F F F F IHR
4.10 âimer F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IHU
4.11 âeprodução de Ćons F F F F F F F F F F F F F F F F F F F F F F F IIH
4.12 snterrupção F F F F F F F F F F F F F F F F F F F F F F F F F F F F IIP
ii
4. 4.13 âĄâtâ˘hdog F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IIU
5 Arquitetura de desenvolvimento de software 119
5.1 yne single loop F F F F F F F F F F F F F F F F F F F F F F F F F F IIW
5.2 snterrupt â˘ontrol system F F F F F F F F F F F F F F F F F F F F F IPI
5.3 gooperâtive multitâsking F F F F F F F F F F F F F F F F F F F F IPQ
pixâção de tempo pârâ exeâ˘ução dos slots F F F F F F F IPS
âŚtilizâção do 4tempo livre4 pârâ interrupçþes F F F F F IPV
6 Anexos 129
6.1 â˘on(gFh F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IPW
6.2 Ëâsiâ˘oFh F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IQH
6.3 snstâlâr grâvâdoresGdepurâdores de âŹsg em sistemâs xTR F F F IQP
iii
5. Lista de Figuras
IFI gâmâdâs de âËstrâção de um sistemâ operââ˘ionâl F F F F F F F I
IFP âŹesquisâ soËre linguâgens utilizâdâs pârâ projetos de softwâre
emËârâ˘âdo F F F F F F F F F F F F F F F F F F F F F F F F F F F F F P
IFQ gon(gurâção dâs ferrâmentâs de â˘ompilâção F F F F F F F F F F T
IFR snstâlâção do sghP F F F F F F F F F F F F F F F F F F F F F F F F U
IFS âesumo dâs â˘on(gurâçþes do sghP no wâŹvef F F F F F F F F V
IFT âŹrojeâ˘t ixplorer do wâŹvef F F F F F F F F F F F F F F F F F F W
IFU gompârâtivo de â˘ârââ˘terĂstiâ˘âs dâ fâmĂliâ âŹsg IVfxxSx F F F F II
PFI âŹroËlemâ dâs âeferĂŞnâ˘iâs girâ˘ulâres F F F F F F F F F F F F F F PH
PFP Ćolução dâs referĂŞnâ˘iâs â˘irâ˘ulâres â˘om 5ifndef F F F F F F F F F PI
PFQ voop in(nito de um deviâ˘e driver gerândo erro no sistemâ F F PW
PFR ixemplo de funâ˘ionâmento do vetor de interrupção F F F F F F QH
QFI erquiteturâ do miâ˘roâ˘ontrolâdor âŹsg IVpRSSH F F F F F F F F RW
QFP wemĂłriâ â˘omo um ârmĂĄrio F F F F F F F F F F F F F F F F F F F SH
QFQ wemĂłriâ e perifĂŠriâ˘os â˘omo um ârmĂĄrio F F F F F F F F F F F F SH
QFR âegiĂľes de memĂłriâs disponĂveis no âŹsgIVpRSSH F F F F F F F SI
QFS isquemâ elĂŠtriâ˘oX wiâ˘roâ˘ontrolâdor âŹsg IVpRSSH F F F F F F F SQ
QFT âegistros de â˘on(gurâção do miâ˘roâ˘ontrolâdor âŹsg IVpRSSH F SS
RFI âegistros de â˘on(gurâção dos perifĂŠriâ˘os do âŹsg IVpRSSH F F TH
RFP fârrâmento de ved's F F F F F F F F F F F F F F F F F F F F F F F TQ
RFQ hisplây de U Ćegmentos F F F F F F F F F F F F F F F F F F F F F TR
RFR hiâgrâmâ elĂŠtriâ˘o pârâ displây de U segmentos â˘om ânodo
â˘omum F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F TR
RFS vigâção de R displâys de U segmentos multiplexâdos F F F F F F TT
RFT girâ˘uito de leiturâ de â˘hâve F F F F F F F F F F F F F F F F F F F UH
RFU ysâ˘ilâção do sinâl no momento do â˘hâveâmento F F F F F F F F UI
RFV girâ˘uito de deËounâ˘e F F F F F F F F F F F F F F F F F F F F F F F UI
RFW âŚtilizâção de (ltro âg pârâ deËounâ˘e do sinâl F F F F F F F F F UP
RFIH âeâ˘lâdo em ârrânjo mâtriâ˘iâl F F F F F F F F F F F F F F F F F F US
RFII hisplây elfânumĂŠriâ˘o vgh PxIT F F F F F F F F F F F F F F F F UT
RFIP hisplây elfânumĂŠriâ˘o vgh PxIT E verso F F F F F F F F F F F F UW
iv
6. RFIQ gârââ˘teres disponĂveis pârâ âyw eHH F F F F F F F F F F F F F VI
RFIR gârââ˘teres disponĂveis pârâ âyw eHP F F F F F F F F F F F F F VP
RFIS isquemĂĄtiâ˘o de ligâção do displây de vgh F F F F F F F F F F F VR
RFIT Ćinâl seriâlizâdo pârâ trânsmissĂŁo em âĆPQP F F F F F F F F F F VW
RFIU vâmpâdâ inâ˘ândesâ˘ente F F F F F F F F F F F F F F F F F F F F F WS
RFIV âŹotenâ˘iĂ´metro F F F F F F F F F F F F F F F F F F F F F F F F F F F WT
RFIW âŹotenâ˘iĂ´metro â˘omo divisor de tensĂŁo F F F F F F F F F F F F F WT
RFPH girâ˘uito integrâdo vwQS F F F F F F F F F F F F F F F F F F F F F WU
RFPI hiâgrâmâ de Ëloâ˘os do vwQS F F F F F F F F F F F F F F F F F F WV
RFPP gonversor ânâlĂłgiâ˘o digitâl de P Ëits F F F F F F F F F F F F F F WW
RFPQ Ćinâis âŹâĄw â˘om vâriâção do duty â˘yâ˘le F F F F F F F F F F F F IHQ
SFI ixemplo de mĂĄquinâ de estâdos F F F F F F F F F F F F F F F F F IPQ
SFP ixemplo dâ mudânçâ de slots no tempo F F F F F F F F F F F F IPS
SFQ vinhâ de tempo de um sistemâ â˘om I slot F F F F F F F F F F F IPV
SFR gomportâmento dâ linhâ de tempo â˘om interrupçþes F F F F F IPV
v
7. Lista de Tabelas
IFI Ćoftwâres utilizâdos no â˘urso F F F F F F F F F F F F F F F F F F R
PFI âipos de dâdos e fâixâ de vâlores F F F F F F F F F F F F F F F F PP
PFP âepresentâção deâ˘imâl E ËinĂĄriâ E hexâdeâ˘imâl F F F F F F F F F PQ
PFQ elterâção de tâmânho e sinâl dos tipos ËĂĄsiâ˘os F F F F F F F F PR
PFR yperâção Ëit set â˘om de(ne F F F F F F F F F F F F F F F F F F F RI
PFS yperâção Ëit â˘leâr â˘om de(ne F F F F F F F F F F F F F F F F F F RI
PFT yperâção Ëit )ip â˘om de(ne F F F F F F F F F F F F F F F F F F F RP
PFU yperâção Ëit test â˘om de(ne F F F F F F F F F F F F F F F F F F RP
QFI Âuântidâde de operâçþes e târefâs F F F F F F F F F F F F F F F SP
RFI indereços de memĂłriâ pârâ âs portâs do âŹsg IVpRSSH F F F F SV
RFP ââËelâ de â˘on(gurâção do âŹsg pârâ âs experiĂŞnâ˘iâs F F F F F F TI
RFQ gonversĂŁo ËinĂĄrio E hexâdeâ˘imâl pârâ displâys de U segmentos TS
RFR vistâ de â˘omândos ââ˘eitos pelo o vgh F F F F F F F F F F F F F VQ
RFS ââxâs de trânsmissĂŁo pârâ diferentes protoâ˘olos F F F F F F F F VV
RFT gĂĄlâ˘ulo do vâlor dâ tâxâ de trânsmissĂŁo dâ portâ seriâl F F F F WH
RFU pâixâ de frequĂŞnâ˘iâs mĂĄximâs e mĂnimâs pârâ â˘âdâ â˘on(guE
râção do presâ˘âler F F F F F F F F F F F F F F F F F F F F F F F F F IHR
vi
8. Listings
PFI âesumo do dispUsegF⢠F F F F F F F F F F F F F F F F F F F F F F IT
PFP âesumo do dispUsegFh F F F F F F F F F F F F F F F F F F F F F F IT
PFQ istruturâ de heâder F F F F F F F F F F F F F F F F F F F F F F F IW
PFR yperâçþes âritmĂŠtiâ˘âs â˘om tipos diferentes F F F F F F F F F F F PU
RFI dispUsegF⢠F F F F F F F F F F F F F F F F F F F F F F F F F F F F F TV
RFP dispUsegFh F F F F F F F F F F F F F F F F F F F F F F F F F F F F F TW
RFQ âŚtilizândo â ËiËlioteâ˘â dispUseg F F F F F F F F F F F F F F F F F TW
RFR teâ˘lâdoF⢠F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F UU
RFS teâ˘lâdoFh F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F UV
RFT ixemplo de uso dâ ËiËlioteâ˘â teâ˘lâdo F F F F F F F F F F F F F F UV
RFU lâ˘dF⢠F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F VT
RFV lâ˘dFh F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F VU
RFW ixemplo de uso dâ ËiËlioteâ˘â de vgh F F F F F F F F F F F F F VU
RFIH seriâlF⢠F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F WQ
RFII seriâlFh F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F WQ
RFIP ixemplo de uso dâ ËiËlioteâ˘â de â˘omuniâ˘âção seriâl F F F F F F WR
RFIQ âdâ˘F⢠F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IHI
RFIR âdâ˘Fh F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IHI
RFIS ixemplo de uso dâ ËiËlioteâ˘â de â˘onversores eh F F F F F F F IHP
RFIT pwmF⢠F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IHS
RFIU pwmFh F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IHT
RFIV ixemplo de uso dâ ËiËlioteâ˘â dâs sâĂdâs âŹâĄw F F F F F F F F IHT
RFIW timerF⢠F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IHV
RFPH timerFh F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IHV
RFPI ixemplo de uso dâ ËiËlioteâ˘â de um temporizâdor F F F F F F IHW
RFPP âeprodução de sons F F F F F F F F F F F F F F F F F F F F F F F III
RFPQ pontes de snterupção F F F F F F F F F F F F F F F F F F F F F F F IIR
RFPR ârâtâmento dâs interrupçþes F F F F F F F F F F F F F F F F F F F IIS
RFPS sniâ˘iâlizâção do sistemâ â˘om interrupçþes F F F F F F F F F F F IIT
RFPT sniâ˘iâlizâção do sistemâ â˘om interrupçþes F F F F F F F F F F F IIU
SFI ixemplo de ârquiteturâ singleEloop F F F F F F F F F F F F F F F IPH
SFP âŹroËlemâ nâ sinâ˘roniâ de tempo pârâ o singleEloop F F F F F F IPH
SFQ ixemplo de sistemâ snterruptEdriven F F F F F F F F F F F F F F IPI
SFR ixemplo de sistemâ snterruptEdriven â˘om Ëâse de tempo F F F IPP
vii
9. SFS ixemplo de â˘ooperâtive multitâsking F F F F F F F F F F F F F F IPR
SFT ixemplo de â˘ooperâtive multitâsking â˘om uso do top slot F F IPT
SFU ixemplo de sistemâ gooperâtiveEmultitâsking â˘om slot temE
porizâdo F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IPU
TFI â˘on(gFh F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IPW
TFP Ëâsiâ˘oFh F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IQI
viii
10. CapĂtulo 1
Introdução
The real danger is not that computers will begin to think
like men, but that men will begin to think like computers. E
Ćydney tF rârris
âŹrogrâmâção pârâ sistemâs emËârâ˘âdos exige umâ sĂŠrie de â˘uidâdos espeE
â˘iâisD pois estes sistemâs gerâlmente possuem restriçþes de memĂłriâ e proE
â˘essâmentoF âŹor se trâtâr de sistemâs â˘om funçþes espeâ˘Ă(â˘âsD âs rotinâs e
tĂŠâ˘niâ˘âs de progrâmâção diferem dâquelâs usâdâs pârâ projetos de âpliâ˘âtiE
vos pârâ desktopsF
ââmËĂŠm ĂŠ neâ˘essĂĄrio â˘onheâ˘er mâis â fundo o hârdwâre que serĂĄ utiE
lizâdoD pois â˘âdâ miâ˘roproâ˘essâdor possui umâ ârquiteturâ diferenteD â˘om
quântidâde e tipos de instruçþes diversosF âŹrogrâmâdores voltâdos pârâ
desktops nĂŁo preâ˘isâm se âter tânto â estes itensD pois eles progrâmâm pârâ
um sistemâ operââ˘ionâl que reâlizâ o pâpel de trâdutorD disponiËilizândo
umâ interfââ˘e â˘omumD independente do hârdwâre utilizâdo@pigurâ IFIAF
Aplicação
Sistema Operacional
Firmware
Hardware
pigurâ IFIX gâmâdâs de âËstrâção de um sistemâ operââ˘ionâl
âŹârâ sistemâs emËârâ˘âdosD ĂŠ neâ˘essĂĄrio progrâmâr espeâ˘i(â˘âmente pârâ
I
11. 2 Introdução
o hârdwâre em questĂŁoF âŚmâ opção pârâ se oËter ârti(â˘iâlmente estâ â˘âE
mâdâ de âËstrâção que erâ gerâdâ pelo sistemâ operââ˘ionâl ĂŠ â utilizâção
de dois itensX um â˘ompilâdor prĂłprio pârâ o â˘omponente em questĂŁo e umâ
ËiËlioteâ˘â de funçþesF y â˘ompilâdor serĂĄ o responsĂĄvel por trâduzir â linE
guâgem de âlto nĂvel em umâ linguâgem que o miâ˘roâ˘ontrolâdor â˘onsegue
entenderF e ËiËlioteâ˘â de funçþesD ou frâmeworkD em gerâlD ĂŠ disponiËilizâdâ
pelos fâËriâ˘ântes do miâ˘roâ˘ontrolâdorF
1.1 Linguagem C
C is quirky, awed, and an enormous success. E hennis wF
âitâ˘hie
xeste â˘urso serĂĄ utilizâdâ â linguâgem gF istâ ĂŠ umâ linguâgem â˘om diversâs
â˘ârââ˘terĂstiâ˘âs que â tornâm umâ Ëoâ esâ˘olhâ pârâ o desenvolvimento de
softwâre emËârâ˘âdoF epesâr de ser umâ linguâgem de âlto nĂvelD permite âo
progrâmâdor um ââ˘esso direto âos dispositivos de hârdwâreF
ââmËĂŠm ĂŠ â esâ˘olhâ dâ mâioriâ dos progrâmâdores e gerentes de projetos
no que â˘onâ˘erne âo desenvolvimento de sistemâs emËârâ˘âdos â˘omo pode ser
visto nâ pigurâ IFPF
pigurâ IFPX âŹesquisâ soËre linguâgens utilizâdâs pârâ projetos de softwâre
emËârâ˘âdo
Fonte: http://www.embedded.com/design/218600142
e desâ˘ontinuidâde depois de PHHR se dĂĄ devido Ă mudânçâ de metodologiâ
dâ pesquisâF entes de PHHSD â perguntâ formulâdâ erâX âŹârâ o desenvolE
vimento dâ suâ âpliâ˘âção emËârâ˘âdâD quâis dâs linguâgens voâ˘ĂŞ usou nos
Ăşltimos IP mesescF im PHHS â perguntâ se tornouX weu projeto emËârE
â˘âdo âtuâl ĂŠ progrâmâdo prinâ˘ipâlmente em â˘â˘â˘â˘â˘â˘F wĂşltiplâs seleçþes
erâm possĂveis ântes de PHHSD permitindo â somâ superior â IHH7D sendo o
vâlor mĂŠdio de PHW7D o que impliâ˘â que â mâioriâ dâs pessoâs esâ˘olheu duâs
ou mâis opçþesF
Notas de Aula ELT024 - Programação para Sistemas Embarcados
12. 3 Introdução
y mâior impââ˘to nâ pesquisâ pode ser visuâlizâdo nâ linguâgem âssemE
ËlerX âtĂŠ PHHRD estâvâ presente em TP7 dâs respostâs @nâ mĂŠdiâAF y que
â˘omprovâ que prâtiâ˘âmente todo projeto de sistemâ emËârâ˘âdo exige um
pouâ˘o de âssemËlerF ho mesmo modoD perâ˘eËemos que âtuâlmente pouâ˘os
projetos sĂŁo reâlizâdos totâlmente ou em suâ mâioriâ em âssemËlerD umâ
mĂŠdiâ de âpenâs U7F
1.2 Hardware utilizado
People who are really serious about software should make
their own hardware. E elân uây
gomo o enfoque deste â˘urso ĂŠ â progrâmâção de sistemâs emËârâ˘âdos e nĂŁo
â eletrĂ´niâ˘âD utilizâremos um kit de desenvolvimento prontoD Ëâseâdo num
miâ˘roâ˘ontrolâdor âŹsgF
gomo perifĂŠriâ˘os disponĂveis temosX
Ë I displây vgh P linhâs por IT â˘ârââ˘teres @â˘ompâtĂvel â˘om rhUURVHA
Ë R displâys de U segmentos â˘om Ëârrâmento de dâdos â˘ompârtilhâdos
Ë V leds ligâdos âo mesmo Ëârrâmento dos displâys
Ë IT mini switâ˘hes orgânizâdâs em formâto mâtriâ˘iâl RxR
Ë I sensor de temperâturâ vwQSg
Ë I resistĂŞnâ˘iâ de âqueâ˘imento ligâdâ â umâ sâĂdâ âŹâĄw
Ë I motor hg tipo ligâdo ventilâdor â umâ sâĂdâ âŹâĄw
Ë I Ëuzzer ligâdo â umâ sâĂdâ âŹâĄw
Ë I â˘ânâl de â˘omuniâ˘âção seriâl pâdrĂŁo âĆEPQP
gâdâ â˘omponente terĂĄ seu funâ˘ionâmento ËĂĄsiâ˘o expliâ˘âdo pârâ permitir o
desenvolvimento de rotinâs pârâ estesF
1.3 Ambiente de programação
First, solve the problem. Then, write the code. E tohn tohnE
son
y âmËiente utilizâdo serĂĄ o wâŹvef@âAF iste ĂŠ um âmËiente de desenvolE
vimento disponiËilizâdo pelâ wiâ˘roâ˘hip@âA grâtuitâmenteF y â˘ompilâdor
utilizâdo serĂĄ o ĆhggD os linkers e âssemËlers serĂŁo disponiËilizâdos pelâ
ËiËlioteâ˘â qâŹâŚtilsF
Notas de Aula ELT024 - Programação para Sistemas Embarcados
13. 4 Introdução
gomo o foâ˘o ĂŠ â âprendizâgem de â˘onâ˘eitos soËre progrâmâção emËârE
â˘âdâ poderĂĄ ser utilizâdâ quâlquer plâtâformâ de progrâmâção e quâlquer
â˘ompilâdorGlinkerF gâso sejâ utilizâdo quâlquer â˘onjunto de â˘ompilâdorGlinE
ker diferentes deveEse prestâr âtenção âpenâs nâs diretivâs pârâ grâvâçãoF
âŹârâ â progrâmâção em âmËiente vinux reâ˘omendâEse o uso dâ suĂte
âŹsuvef ISFIHF iste progrâmâ foi desenvolvido pârâ uhi QFSF elĂŠm de
permitir â integrâção â˘om o mesmo â˘ompilâdor utilizâdo neste â˘urso permite
â progrâmâção do miâ˘roâ˘ontrolâdor utilizândo o progrâmâdor sghP viâ âŚĆfF
Instalação
e ââËelâ IFI âpresentâ os softwâres que serĂŁo utilizâdos no â˘ursoF
ââËelâ IFIX Ćoftwâres utilizâdos no â˘urso
Item Versão Licença
shi wâŹvef VFSH âŹroprietĂĄrio
gompilâdor Ćhgg PFWFHH @winQPA qâŹv
vinkerGessemËler qâŹâŚtils HFIQFU @winQPA qâŹv
âŹlugin wâŹvef sdâ˘â˘EmplâË HFI qâŹv
âodos os softwâres sĂŁo grâtuitos e estĂŁo disponĂveis nâ internetF âŹârâ â˘orE
retâ instâlâção deveEse instâlâr os softwâres segundo â sequĂŞnâ˘iâ âpresentâdâ
nâ ââËelâ IFIF enote o diretĂłrio onde â˘âdâ softwâre foi instâlâdoF
epĂłs â instâlâção dos softwâres deveEse âËrir o ârquivo piâ˘ITdeviâ˘esFtxt
@de preferĂŞnâ˘iâ no wordpâdA que foi instâlâdo no diretĂłrio do Ćhgg dentro dâ
pâstâ inâ˘ludeâpiâ˘IT @por pâdrĂŁo gXâerquivos de progrâmâsâĆhggâinâ˘ludeâpiâ˘ITAF
âŹroâ˘ure â seguintes linhâsX
name 18f4550
using 18f2455
âroâ˘âr â letrâ f minĂşsâ˘ulâ dâ primeirâ linhâD âpenâs do IVfRSSHD pârâ
um p mâiĂşsâ˘uloX
name 18F4550
using 18f2455
epĂłs isto âËrir â pâstâ onde foi instâlâdo o wâŹvef @por pâdrĂŁoX gXâerquivos
de progrâmâsâwiâ˘roâ˘hipâwâŹvef shiAF eËrir â pâstâ goreâwâg ĆuitesF
eËrir os ârquivos sdâ˘â˘linkFmt⢠e gplinkFmt⢠num editor de textoF epâE
gâr o â˘onteĂşdo do ârquivo sdâ˘â˘linkFmtâ˘F gopiâr todo â˘onteĂşdo do ârquivo
gplinkFmt⢠pârâ o ârquivo sdâ˘â˘linkFmtâ˘F ĆâlvârF
Notas de Aula ELT024 - Programação para Sistemas Embarcados
14. 5 Introdução
epĂłs o pâsso ââ˘imâ o ârquivo sdâ˘â˘linkFmt⢠deverĂĄ â˘onter o seguinte
textoX
// Microchip Language Tools
// Configuration File
// gplink
// Craig Franklin [5]
[Tool] Description=Library directories
Tool=gplink Switch=-I
ScriptExtension=lkr Data=1
DefaultOptions= MultipleOptions=0
MultipleNodes=1 LibrarySwitch=Switch
SpaceBetweenSwitchAndData=1 Hidden=1
[0] [6]
Description=Output filename Description=Linker script directories
Switch=-o Switch=-I
Data=1 Data=1
MultipleOptions=0 MultipleOptions=0
OutputNameSwitch=Switch LinkerScriptSwitch=Switch
Hidden=1 Hidden=1
[1] [7]
Description=Map file Description=Use Shared Memory
Switch=-m Switch=-r
Data=0 Data=0
MultipleOptions=0 [8]
[2] Description=Fill Value
Description=COFF File Switch=-f
Switch=-c MultipleOptions=0
Data=0 Data=1
MultipleOptions=0 [9]
[3] Description=Stack Size
Description=Hex Format Switch=-t
OptionList=INHX8M;INHX8S;INHX32 MultipleOptions=0
INHX8M=-a INHX8M Data=1
INHX8S=-a INHX8S [10]
INHX32=-a INHX32 Description=No List File
Data=0 switch=-l
[4] Data=0
Description=Quiet mode
Switch=-q
Data=0
im seguidâ âËrir o progrâmâ wâŹvef e ir âo menu âŹrojeâ˘ts Eb Ćet vânE
guâge âool voâ˘âtionsF ĆerĂĄ âpresentâdâ umâ telâ similâr â dâ pigurâ IFQF
Ćeleâ˘ione â ferrâmentâ Ćmâll heviâ˘e g gompiler for âŹsgIT @ĆhggITAF
ixpândâ â opção ixeâ˘utâËlesF e ferrâmentâ gpâsm e gplink sĂŁo oËtiE
dâs no diretĂłrio Ëin dentro de onde foi instâlâdo o qâŹâŚtils @por pâdrĂŁoX
gXâerquivos de progrâmâsâgputilsâËinAF e ferrâmentâ sdâ˘â˘IT ĂŠ enâ˘ontrâdâ
Notas de Aula ELT024 - Programação para Sistemas Embarcados
15. 6 Introdução
pigurâ IFQX gon(gurâção dâs ferrâmentâs de â˘ompilâção
Notas de Aula ELT024 - Programação para Sistemas Embarcados
16. 7 Introdução
no diretĂłrio Ëin dentro do diretĂłrio onde foi instâlâdo o Ćhgg @por pâE
drĂŁoX gXâerquivos de progrâmâsâĆhggâËinâAF gliâ˘âr em yuF epĂłs
estes pâssos â suĂte wâŹvef estĂĄ prontâ pârâ trâËâlhâr â˘om o â˘ompilâdor
ĆhggCqâŹâŚtilsF
Conguração do gravador ICD2
epĂłs instâlâr o wâŹvef jĂĄ ĂŠ possĂvel fâzer â instâlâção e â˘on(gurâção do
grâvâdor ou depurâdor sghPF goneâ˘teEo â quâlquer portâ âŚĆf e âguârde
â telâ de instâlâção do âĄindowsF im âlgumâs versĂľes do windows pode
ââ˘onteâ˘er de voâ˘ĂŞ ser perguntâdo se desejâ instâlâr um softwâre nĂŁo âssinâdo
digitâlmenteD â˘erti(queEse que â versĂŁo do (rmwâre ĂŠ pelo menos IFHFHFH dâ
fâËriâ˘ânte wiâ˘roâ˘hipD â˘onforme pode ser visto nâ pigurâ IFR e âvânâ˘eF
pigurâ IFRX snstâlâção do sghP
epĂłs o termino dâ instâlâção âËrâ o progrâmâ wâŹvef pârâ â˘on(gurâr
o grâvâdor ou depurâdorF â ĂĄ âo menu âŹrogrâmmer Eb Ćeleâ˘t âŹrogrâmmer
Eb wâŹvef sgh PF â ĂĄ novâmente âo menu âŹrogrâmmer mâs destâ vez
esâ˘olhâ â opção wâŹvef sgh P Ćetup âĄizârdF
xo wizârdD esâ˘olhâ â â˘omuniâ˘âção â˘omo âŚĆf e depois digâ que â plââ˘â
possui âlimentâção independente âârget hâs own power supplyF heixe âs
outrâs opçþes nâ seleção pâdrĂŁoF entes de â˘liâ˘âr em â˘onâ˘luir veri(que âo
(nâl se o resumo se pâreâ˘e â˘om o dâ pigurâ IFSF
Notas de Aula ELT024 - Programação para Sistemas Embarcados
17. 8 Introdução
pigurâ IFSX âesumo dâs â˘on(gurâçþes do sghP no wâŹvef
Notas de Aula ELT024 - Programação para Sistemas Embarcados
18. 9 Introdução
Criação de um novo projeto
âeâ˘omendâEse â utilizâção do âssistente disponĂvel pârâ â â˘riâção de um novo
projeto @menu âŹrojeâ˘t Eb âŹrojeâ˘t âĄizârdAF ile irĂĄ questionâr soËre @entre
pârĂŞnteses os vâlores âdotâdos neste â˘ursoAX
IF O microcontrolador a ser utilizado (PIC18F4550)
PF A suĂte de compilação (SDCC 16)
QF O diretĂłrio e nome do projeto
RF Arquivos jĂĄ existentes cujo programador deseja incluir no projeto
epĂłs estes pâssos o projeto estârĂĄ â˘riâdoF gâso â listâ de ârquivos do
projeto nĂŁo estejâ visĂvel vĂĄ âo menu â iew Eb âŹrojeâ˘tF
âŹârâ â â˘riâção de um novo ârquivo vĂĄ âtĂŠ o menu pile Eb xewF xeste
novo ârquivo digite âlgumâ â˘oisâ e sâlveEoF gâso sejâ o ârquivo que â˘onterĂĄ
â função prinâ˘ipâl @mâinA ĂŠ â˘ostume sâlvĂĄElo â˘om o nome de 4mâinFâ˘4F
e â˘âdâ novo ârquivo â˘riâdo ĂŠ neâ˘essĂĄrio inserĂElo no projetoF âŹârâ isso
deveEse â˘liâ˘âr nâ pâstâ â˘orrespondente âo tipo de ârquivo que se desejâ inâ˘luir
e em seguidâ 4edd piles4 â˘omo pode ser visuâlizâdo nâ pigurâ IFTF
pigurâ IFTX âŹrojeâ˘t ixplorer do wâŹvef
elĂŠm dos ârquivos â˘riâdos pelo progrâmâdorD existem trĂŞs ârquivos que
devem ser âdiâ˘ionâdos âo projetoX um de linker e dois de ËiËlioteâ˘âsF
IF Linker
@âA C:Arquivos de programasgputilslkr18f4550.lkr
PF Bibliotecas
Notas de Aula ELT024 - Programação para Sistemas Embarcados
19. 10 Introdução
@âA C:Arquivos de programasSDCClibpic16libdev18f4550.lib
@ËA C:Arquivos de programasSDCClibpic1618f4550.lkr
y ârquivo de linker ĂŠ o responsĂĄvel por indiâ˘âr quâis sĂŁo os espâços
de memĂłriâ disponĂveis no â˘hip utilizâdoD onde â˘omeçâm e de que tipo sĂŁo
@âewD âywD plâshA etâ˘F
// File: 18f4550.lkr
// Sample linker script for the PIC18F4550 processor
// Not intended for use with MPLAB C18. For C18 projects,
// use the linker scripts provided with that product.
LIBPATH .
CODEPAGE NAME=page START=0x0 END=0x7FFF
CODEPAGE NAME=idlocs START=0x200000 END=0x200007 PROTECTED
CODEPAGE NAME=config START=0x300000 END=0x30000D PROTECTED
CODEPAGE NAME=devid START=0x3FFFFE END=0x3FFFFF PROTECTED
CODEPAGE NAME=eedata START=0xF00000 END=0xF000FF PROTECTED
ACCESSBANK NAME=accessram START=0x0 END=0x5F
DATABANK NAME=gpr0 START=0x60 END=0xFF
DATABANK NAME=gpr1 START=0x100 END=0x1FF
DATABANK NAME=gpr2 START=0x200 END=0x2FF
DATABANK NAME=gpr3 START=0x300 END=0x3FF
DATABANK NAME=usb4 START=0x400 END=0x4FF PROTECTED
DATABANK NAME=usb5 START=0x500 END=0x5FF PROTECTED
DATABANK NAME=usb6 START=0x600 END=0x6FF PROTECTED
DATABANK NAME=usb7 START=0x700 END=0x7FF PROTECTED
ACCESSBANK NAME=accesssfr START=0xF60 END=0xFFF PROTECTED
âŹerâ˘eËemos pelo linker ââ˘imâ que existem PST Ëytes de memĂłriâ eepromD
nĂŁo volĂĄtilD que foi denominâdâ eedâtâF âŹârâ â memĂłriâ âew estĂĄ reservâdo
um totâl de P kËytesD divididos1 em R Ëânâ˘os de memĂłriâD sendo que o
primeiro foi dividido em duâs seçþesF istes forâm denominâdos @ââ˘essrâmE
gprHAD gprID gprPD gprQ2 F
âŹârâ o progrâmâ temos disponĂvel umâ regiĂŁo de QP kËytes de memĂłriâ
)âshD que vâi dâ posição HxHHHH âtĂŠ HxUpppF iste ĂŠ o mesmo endereço dâ
memĂłriâ âewF xĂŁo existe â˘on)itoD pois estâmos trâËâlhândoD no â˘âso do
âŹsgD â˘om umâ ârquiteturâ rârvârdF xestâ existem dois Ëârrâmentos e duâs
memĂłriâs diferentesX umâ pârâ o progrâmâD denominâdâ gyhiâŹeqi no
1
âŚmâ dâs mâiores di(â˘uldâdes enâ˘ontrâdâs em se â˘onstruir um â˘ompilâdor de linguâE
gem g ĂŠ o gâsto em termos de reâ˘ursos â˘omputââ˘ionâis que ĂŠ dispendido pârâ trâtâr estes
quâtro Ëânâ˘os â˘omo sequĂŞnâ˘iâisF xâ reâlidâde eles estĂŁo todos soËre um mesmo endereço
de memĂłriâF âŹârâ ââ˘essâr â˘âdâ um deles ĂŠ neâ˘essĂĄrio âtuâr soËre um registro no âŹsgD
indiâ˘ândo quâl Ëânâ˘o estârĂĄ âtivo nâquele momentoF
2
gprË signi(â˘â qenerâl âŹropouse ââm Ëânk Ë
Notas de Aula ELT024 - Programação para Sistemas Embarcados
20. 11 Introdução
linkerD e umâ pârâ os dâdosD denominâdâ heâefexuF xotâr que âpesâr dâ
memĂłriâ eeprom ser utilizâdâ pârâ ârmâzenâmento nĂŁo volĂĄtil de dâdosD elâ
estĂĄ mâpeâdâ no Ëârrâmento de â˘ĂłdigoF ssto se deve â â˘onstrução internâ
do miâ˘roâ˘ontrolâdorF
ys dâdos âpresentâdos no linker e desâ˘orridos ânteriormente podem ser
veri(â˘âdos e â˘ompârâdos â˘om outros modelos oËservândo â pigurâ IFUF
pigurâ IFUX gompârâtivo de â˘ârââ˘terĂstiâ˘âs dâ fâmĂliâ âŹsg IVfxxSx
Notas de Aula ELT024 - Programação para Sistemas Embarcados
21. CapĂtulo 2
Linguagem C para sistemas
embarcados
C is quirky, awed, and an enormous success. E hennis wF
âitâ˘hie
e progrâmâção pârâ sistemâs emËârâ˘âdos possui diversâs â˘ârââ˘terĂstiâ˘âs diE
ferentes dâ progrâmâção voltâdâ pârâ desktopF ho mesmo modoD existem
âlguns â˘onâ˘eitos que gerâlmente nĂŁo sĂŁo explorâdos nos â˘ursos de linguâgens
de progrâmâção em g mâs que sĂŁo essenâ˘iâis pârâ o Ëom desenvolvimento
deste â˘ursoF istes â˘onâ˘eitos serĂŁo explânâdos neste â˘âpĂtuloF
2.1 Indentação e padrão de escrita
Good programmers use their brains, but good guidelines save
us having to think out every case. E prânâ˘is qlâssËorow
Ă fundâmentâl oËedeâ˘er um pâdrĂŁo pârâ esâ˘ritâ de progrâmâsD de modo que
â visuâlizâção do â˘Ăłdigo sejâ fââ˘ilitâdâF
xâ lĂnguâ portuguesâ utilizâmos pârĂĄgrâfos pârâ delimitâr Ëloâ˘os de frâE
ses que possuem â mesmâ ideiâF im linguâgem g estes Ëloâ˘os sĂŁo delimitâdos
por â˘hâves { e }F
âŹârâ demonstrâr âo leitor que um pârĂĄgrâfo â˘omeçou utilizâmos um reâ˘uo
Ă direitâ nâ primeirâ linhâF Âuândo ĂŠ neâ˘essĂĄrio reâlizâr umâ â˘itâção de
itens â˘oloâ˘âEse â˘âdâ um destes itens numâ linhâ reâ˘uâdâ Ă direitâD âlgumâs
vezes â˘om um identi(â˘âdor â˘omo um trâço E ou setâ Eb pârâ fââ˘ilitâr â
identi(â˘âção visuâlF
gom esse mesmo intuito utilizâEse reâ˘uos e espâçâmentos pârâ que o
â˘Ăłdigo sejâ mâis fââ˘ilmente entendidoF
gomo todo Ëloâ˘o de â˘omândos ĂŠ iniâ˘iâdo e terminâdo â˘om umâ â˘hâveD
tornouEse â˘omum que estâs @âs â˘hâvesA estejâm no mesmo nĂvel e todo â˘Ăłdigo
interno â elâs sejâ desloâ˘âdo Ă direitâF Će existir um segundo Ëloâ˘o interno
IP
22. 13 Linguagem C para sistemas embarcados
âo primeiroD este deve ser desloâ˘âdo duâs vezes pârâ indiâ˘âr â hierârquiâ no
)uxo do progrâmâF Ćegue âËâixo um exemplo de um mesmo â˘Ăłdigo â˘om
diferençâ âpenâs nâ indentâçãoF
gĂłdigo indentâdo gĂłdigo nĂŁo indentâdo
I void main @ void A interrupt H void main @ void A interrupt H
{ {
unsigned int i Y unsigned int i Y
unsigned int temp Y unsigned int temp Y
unsigned int teclanova aHY unsigned int teclanova aHY
InicializaSerial @ A Y InicializaSerial @ A Y
InicializaDisplays @ A Y InicializaDisplays @ A Y
InicializaLCD @ A Y InicializaLCD @ A Y
InicializaAD @ A Y InicializaAD @ A Y
for @YYA for@YYA
{ {
AtualizaDisplay @ A Y AtualizaDisplay @ A Y
if @ teclanova 3a Tecla A if @ teclanova 3a Tecla A
{ {
teclanova a Tecla Y teclanova a Tecla Y
for @ i aHY i `ITY iCCA for@ i aHY i `ITY iCCA
{ {
if @ BitTst @ Tecla D i A A if @ BitTst @ Tecla D i A A
{ {
EnviaDados @ i CRVA Y EnviaDados @ i CRVA Y
} }
} }
} }
for @ i a H Y i ` I H H H Y iCCA Y for@ i a H Y i ` I H H H Y iCCA Y
} }
} }
âŹodemos notâr pelo â˘Ăłdigo ânterior que âquele que possui identâção fââ˘iE
litâ nâ veri(â˘âção de quâis instruçþesGrotinâs estĂŁo suËordinâdâs Ă s demâisF
yutrâ â˘ârââ˘terĂstiâ˘â de pâdronizâção estâ nâ â˘riâção de nomes de funçþes
e de vâriĂĄveisF âŹelâ linguâgem g umâ função ou vâriĂĄvel pode ter quâlquer
nome desde queX sejâ iniâ˘iâdâ por umâ letrâD mâiĂşsâ˘ulâ ou minĂşsâ˘ulâD e os
demâis â˘ârââ˘teres sejâm letrâsD nĂşmeros ou undersâ˘ore â˘F
e linguâgem g permite tâmËĂŠm que sejâm deâ˘lârâdâs duâs vâriĂĄveis â˘om
mesmo nome â˘âso possuâm letrâs diferentes âpenâs quânto â˘âixâ @mâiĂşsâ˘ulâ
ou minĂşsâ˘ulâAF âŹor exemploX vâr e ver sĂŁo vâriĂĄveis distintâsD o que
pode gerâr erro no desenvolvimento do progrâmâ â˘âusândo dĂşvidâs e erros
de digitâçãoF
âŹor isso â˘onvenâ˘ionâEse que nome de vâriĂĄveis sejâm esâ˘ritos âpenâs em
minĂşsâ˘ulâsF Âuândo o nome ĂŠ â˘ompostoD se utilizâ umâ mâiĂşsâ˘ulâ pârâ
Notas de Aula ELT024 - Programação para Sistemas Embarcados
23. 14 Linguagem C para sistemas embarcados
diferenâ˘iĂĄElos â˘omo por exemplo âs vâriĂĄveis â˘ontâŹos e â˘ontâotâlF
xomes de função serĂŁo esâ˘ritos â˘om â primeirâ letrâ mâiĂşsâ˘ulâ e no â˘âso
de nome â˘ompostoD â˘âdâ iniâ˘iâl serĂĄ grâfâdâ em mâiĂşsâ˘uloX sniâ˘iâlizââeE
â˘lâdo@AD âŹârâĆistemâ@AF
ââgs de de(niçþes @utilizâdos em â˘onjunto â˘om â diretivâ 5de(neA serĂŁo
grâfâdos exâ˘lusivâmente em mâiĂşsâ˘uloX xâŚwiâyhiâ yvâeĆD gyxĆâE
qâeâ sâegsyxevF
gâdâ â˘hâve serĂĄ â˘oloâ˘âdâ numâ Ăşniâ˘â linhâD â˘onforme exemplo ânteriorD
evitândoEse â˘onstruçþes do tipoX
if @ PORTA aa H x30 A { PORTB a H x10 Y }
yu
if @ PORTA aa H x30 A {
PORTB a H x10 Y }
es regrâs âpresentâdâs visâm forneâ˘er umâ identidâde visuâl âo â˘ĂłdigoF
ââis regrâs nĂŁo sĂŁo âËsolutâsD servem âpenâs pârâ o â˘ontexto destâ âpostilâF
im gerâlD â˘âdâ instituição ou projeto possui seu prĂłprio â˘onjunto de normâsF
Ă importânte ter â˘onheâ˘imento deste â˘onjunto e âpliâ˘ĂĄElo em seu â˘ĂłdigoF
y estilo âdotâdo nestâ âpostilâ ĂŠ â˘onheâ˘ido tâmËĂŠm â˘omo estilo ellmânD
Ësd @no emââ˘sA ou exĆsD jĂĄ que todos os doâ˘umentos do pâdrĂŁo exĆs g
utilizâm este estiloF epesâr disto o pâdrĂŁo exĆs g nĂŁo espeâ˘i(â˘â um estilo
pârâ ser usâdoF
2.2 ComentĂĄrios
If the code and the comments disagree, then both are probably
wrong. E xorm Ćâ˘hryer
gomentĂĄrios sĂŁo textos que introduzimos no meio do progrâmâ fonte â˘om â
intenção de tornĂĄElo mâis â˘lâroF Ă umâ Ëoâ prĂĄtiâ˘â em progrâmâção inserir
â˘omentĂĄrios no meio dos nossos progrâmâsF âŹodeEse â˘omentâr âpenâs umâ
linhâ usândo o sĂmËolo GG @duâs ËârrâsAF âŹârâ â˘omentâr mâis de umâ linhâ
usâEse o sĂmËolo GB @Ëârrâ e âsterisâ˘oA ântes do â˘omentĂĄrio e BG @âsterisâ˘o
e ËârrâA pârâ indiâ˘âr o (nâl do â˘omentĂĄrioF
#include `s t d i o F hb
#define hsĆâ PTH
int main @ int argc D char *
// distancia entre SP e Ita
argv â â A
{
/* esse programa serve para
mostrar como se insere comentĂĄrios */
printf @ SĂŁo Paulo estĂĄ %d Km de ItajubĂĄ D DIST A Y
return HY
Notas de Aula ELT024 - Programação para Sistemas Embarcados
24. 15 Linguagem C para sistemas embarcados
}
2.3 Arquivos .c e .h
xâ progrâmâção em linguâgem g utilizâmos dois tipos de ârquivos â˘om funE
çþes distintâsF âodâ implementâção de â˘Ăłdigo ĂŠ feitâ no ârquivo â˘om exE
tensĂŁo F⢠@code AF Ă nele que â˘riâmos âs funçþesD de(nimos âs vâriĂĄveis e
reâlizâmos â progrâmâção do â˘ĂłdigoF Će existem dois ârquivos F⢠no projeto
e queremos que um deles possâ usâr âs funçþes do outro ârquivoD ĂŠ neâ˘essĂĄrio
reâlizâr um 5inâ˘ludeF
ys ârquivos Fh @header A tem â˘omo função ser um espelho dos ârquivos
F⢠disponiËilizândo âs funçþes de um ârquivo F⢠pârâ serem utilizâdâs
em outros ârquivosF xele â˘oloâ˘âmos todos os protĂłtipos dâs funçþes que
queremos que os outros ârquivos usemF
Će quisermos que umâ função sĂł possâ ser utilizâdâ dentro do prĂłprio ârE
quivoD por motivo de segurânçâ ou orgânizâçãoD Ëâstâ deâ˘lârâr seu protĂłtipo
eâŹixeĆ no ârquivo Fâ˘F
Će for neâ˘essĂĄrio que um ârquivo leiâ eGou grâve numâ vâriĂĄvel de outro
ârquivo ĂŠ reâ˘omendâdo â˘riâr funçþes espeâ˘Ă(â˘âs pârâ tâl (nâlidâdeF
y progrâmâ PFI âpresentâ um exemplo de um ârquivo de â˘Ăłdigo F⢠e o
progrâmâ PFP âpresentâ o respeâ˘tivo ârquivo de heâder FhF
âŹodemos notâr que no ârquivo Fh â função etuâlizâhisplây@A nĂŁo estĂĄ
presenteD deste modo elâ nĂŁo estârĂĄ disponĂvel pârâ os outros ârquivosF âŹoE
demos notâr tâmËĂŠm que pârâ ler ou grâvâr â vâriĂĄvel digito ĂŠ neâ˘essĂĄrio
utilizâr âs funçþes wudârhigito@A e verhigito@AF xotâr que nĂŁo existe ââ˘esso
direto Ă s vâriĂĄveisF iste tipo de âËordâgem insere âtrâsos no proâ˘essâmento
devido Ă um efeito â˘onheâ˘ido â˘omo overheâd de funçþesD podendo inâ˘lusive
â˘âusâr trâvâmentos no sistemâ â˘âso nĂŁo existâ espâço su(â˘iente no stââ˘kF
2.4 Diretivas de compilação
es diretivâs de â˘ompilâção sĂŁo instruçþes que sĂŁo dâdâs âo â˘ompilâdorF ilâs
nĂŁo serĂŁo exeâ˘utâdâsF âodâs âs diretivâs de â˘ompilâção â˘omeçâm â˘om um
sinâl 5D â˘onheâ˘ido â˘omo jogo dâ velhâ ou hâshF
#include
e diretivâ de â˘ompilâção 5inâ˘lude ĂŠ â responsĂĄvel por permitir que o proE
grâmâdor utilize no seu â˘Ăłdigo funçþes que forâm implementâdâs em outros
ârquivosD sejâ por ele prĂłprio ou por outrâs pessoâsF xĂŁo ĂŠ neâ˘essĂĄrio posE
suir o â˘Ăłdigo fonte dâs funçþes que se desejâ utilizârF Ă neâ˘essĂĄrio âpenâs
de um ârquivo que indique os protĂłtipos dâs funçþes @â˘omo elâs devem ser
â˘hâmâdâsA e possuir â função disponĂvel em suâ formâ â˘ompilâdâF
Notas de Aula ELT024 - Programação para Sistemas Embarcados
25. 16 Linguagem C para sistemas embarcados
visting PFIX âesumo do dispUsegFâ˘
I
static char temp Y
// v a r i ĂĄ v e l usada apenas dentro deste arquivo
P
Q
static char valor Y
// v a r i ĂĄ v e l que serĂĄ usada tambĂŠm fora do arquivo
R
S
void MudaDigito @ char
// f u n ç þ e s usadas dentro e fora do arquivo
T val A
U {
V valor a val Y
W }
IH char LerDigito @ void A
II {
IP return valor Y
IQ }
IR void InicializaDisplays @ void A
IS {
IT // c ó d i g o da função
IU }
IV
void void A
// f u n ç ã o usada apenas dentro deste arquivo
IW AtualizaDisplay @
PH {
PI // c ó d i g o da função
PP }
visting PFPX âesumo do dispUsegFh
I #ifndef â eââ˘r
P 5define VAR_H
Q void MudaDigito @ char val A Y
R char LerDigito @ void A Y
S void InicializaDisplays @ void A Y
T #endif //VAR_H
Notas de Aula ELT024 - Programação para Sistemas Embarcados
26. 17 Linguagem C para sistemas embarcados
im gerâl um ârquivo que possui âpenâs protĂłtipos de funçþes ĂŠ denomiE
nâdo de reâder e possui â extensĂŁo FhF
#dene
yutrâ diretivâ muito â˘onheâ˘idâ ĂŠ â 5de(neF qerâlmente ĂŠ utilizâdâ pârâ
de(nir umâ â˘onstânte mâs pode ser utilizâdâ pârâ que o â˘Ăłdigo fonte sejâ
modi(â˘âdo ântes de ser â˘ompilâdoF
âesultâdo nâ
yriginâl gompilâdo
âelâ
#define gyxĆâ IS
void main @ void A void main @ void A
{ {
RS
printf @ %d D CONST * â printf @ %d D IS * Q A Y
QA Y }
}
âesultâdo nâ
punção yriginâl ypçþes de uso â˘om o 5de(ne
âelâ
void MostraSaidaPadrao @ A
{
5ifdef PADRAO Serial #include `s t d i o F hb
char * msg a â #define âŹehâey Ć e r i â l
SERIAL Y void main @ void A
5else {
SERIAL
char * msg a LCD Y MostraSaidaPadrao @ A Y
5endif }
printf @ msg A Y
}
#include `s t d i o F hb
#define âŹehâey vgh
void main @ void A LCD
{
MostraSaidaPadrao @ A Y
}
âŹelo â˘Ăłdigo âpresentâdo perâ˘eËemos que â mesmâ função wostrâĆâidââŹâE
drâo@AD âpresentâ resultâdos diferentes dependendo de â˘omo foi de(nidâ â
Notas de Aula ELT024 - Programação para Sistemas Embarcados
27. 18 Linguagem C para sistemas embarcados
opção âŹehâeyF
ys de(nes tâmËĂŠm âjudâm â fââ˘ilitâr â loâ˘âlizâção dos dispositivos e
âjustâr âs â˘on(gurâçþes no miâ˘roâ˘ontrolâdorF âodo perifĂŠriâ˘o possui um ou
mâis endereços pârâ os quâis ele respondeF istes endereços podem vâriâr
inâ˘lusive dentro de umâ mesmâ fâmĂliâF âŹor exemplo o endereço dâ portâ
h @onde estĂŁo ligâdos os ledsA ĂŠ HxpVQF âŹârâ ligâr ou desligâr um led ĂŠ
preâ˘iso âlterâr o vâlor que estâ dentro do endereço HxpVQF âŹârâ fââ˘ilitâr este
proâ˘edimentoD ĂŠ de(nido um ponteiro pârâ este endereço e rotulâdo â˘om o
nome âŹyââhF he(nir ypp â˘omo H e yx â˘omo I fââ˘ilitâ â leiturâ do â˘ĂłdigoF
#ifdef, #ifndef, #else e #endif
es diretivâs 5ifdefD 5ifndefD 5else e 5endif sĂŁo muito utilizâdâs quândo
queremos gerâr dois progrâmâs que diferem âpenâs num pequeno pedâço de
â˘ĂłdigoF âŹor exemplo dois sistemâs de â˘ontrole de temperâturâF y primeiro
possui um displây de vghD â˘âpâz de mostrâr â temperâturâ textuâlmenteF y
segundo sistemâ exeâ˘utâ â mesmâ função que o primeiro mâs ĂŠ um dispositivo
mâis ËârâtoD portânto possui âpenâs um led indiâ˘âtivo de soËretemperâturâF
y â˘Ăłdigo pode ser esâ˘rito dâ seguinte mâneirâ
void ImprimirTemp @ char valor A
{
5ifdef LCD
Imprime_LCD @ valor A
5else
if @ valor b Q H A
{
led a I Y
}
else
{
led a H Y
}
5endif //LCD
}
xo momento dâ â˘ompilâção o prĂŠEâ˘ompilâdor irĂĄ veri(â˘âr se â tâg vgh
foi de(nidâ em âlgum lugârF im â˘âso positivo o prĂŠEâ˘ompilâdor irĂĄ deixâr
tudo que estiver entre o 5ifdef e o 5else e retirârĂĄ tudo que estĂĄ entre o
5else e o 5endifF
yutrâ função muito utilizâdâ destâs diretivâs ĂŠ pârâ evitâr â referĂŞnâ˘iâ
â˘irâ˘ulârF Ćupondo dois ârquivosD um responsĂĄvel pelâ â˘omuniâ˘âção seriâl
@seriâlFhA e o segundo responsĂĄvel pelo â˘ontrole de temperâturâ @tempFhAF
y projeto exige que â temperâturâ possâ ser â˘ontrolâdâ pelâ portâ seriâl e
todâ vez que â temperâturâ pâssâr de um determinâdo pâtâmâr deve ser
enviâdo um âlertâ pelâ portâ seriâlF y âquivo dâ portâ seriâl @seriâlFhA tem
âs seguintes funçþesD âpresentâdâs â seguirF
Notas de Aula ELT024 - Programação para Sistemas Embarcados
28. 19 Linguagem C para sistemas embarcados
visting PFQX istruturâ de heâder
I #ifndef âeqâ˘gyxââyvi
P 5define TAG_CONTROLE
Q // t o d o o conteĂşdo do arquivo vem aqui .
S #endif //TAG_CONTROLE
char LerSerial @ void A Y
void EnviaSerial @ char val A Y
y ârquivo de â˘ontrole dâ temperâturâ @tempFhA possui âs funçþes âpreE
sentâdâs â seguirF
char LerTemperatura @ void A Y
void AjustaCalor @ char val A Y
âodâ vez que â função verâemperâturâ@A for â˘hâmâdâD elâ deve fâzer um
teste e se o vâlor for mâior que um pâtâmâr â˘hâmâr â função inviâĆeriâl@A
â˘om o â˘Ăłdigo HxQHF âŹârâ isso o ârquivo tempFh deve inâ˘luir o ârquivo seriâlFhF
#include serial .h
char LerTemperatura @ void A Y
void AjustaCalor @ char val A Y
âodâ vez que â função verĆeriâl@A reâ˘eËer um vâlorD elâ deve â˘hâmâr â
função ejustâgâlor@A e repâssâr esse vâlorF âŹârâ isso o ârquivo seriâlFh deve
inâ˘luir o ârquivo tempFh
#include temp .h
char LerSerial @ void A Y
void EnviaSerial @ char val A Y
y proËlemâ ĂŠ que deste modo ĂŠ â˘riâdâ umâ referĂŞnâ˘iâ â˘irâ˘ulâr sem (mX
o â˘ompilâdor lĂŞ o ârquivo seriâlFh e perâ˘eËe que tem que inserir o ârquivo
tempFhF snserindo o ârquivo tempFh perâ˘eËe que tem que inserir o ârquivo
seriâlFhD â˘onforme pode ser visto nâ pigurâ PFIF
e solução ĂŠ â˘riâr um dispositivo que permitâ que o â˘onteĂşdo do ârquivo
sejâ lido âpenâs umâ vezF iste dispositivo ĂŠ implementâdo âtrâvĂŠs dâ estruE
turâ âpresentâdâ no progrâmâ PFQF
Ćegundo o â˘Ăłdigo ââ˘imâD o â˘onteĂşdo que estiver entre o 5ifndef e o 5enE
difD sĂł serĂĄ mântido se â â tâg âeqâ˘gyxââyvi xĂy estiver de(nidâF
gomo isto ĂŠ verdâde durânte â primeirâ leiturâD o prĂŠEâ˘ompilâdor lĂŞ o ârE
quivo normâlmenteF Će ââ˘onteâ˘er umâ referĂŞnâ˘iâ â˘Ăâ˘liâ˘âD nâ segundâ vez que
o ârquivo for lidoD â tâg âeqâ˘gyxââyvi jĂĄ estârĂĄ de(nidâ impedindo
Notas de Aula ELT024 - Programação para Sistemas Embarcados
30. 21 Linguagem C para sistemas embarcados
âssim que o proâ˘esso â˘Ăâ˘liâ˘o â˘ontinueD â˘onforme pode ser visto nâ pigurâ PFPF
temp.h
#infdef TEMP_H
#define TEMP_H
#include âserial.hâ
char LerTemperatura(void);
void AjustaCalor(char val); serial.h
#endif
#infdef SERIAL_H
#define SERIAL_H
#include âtemp.hâ
temp.h char LerSerial(void);
void EnviaSerial(char val);
#infdef TEMP_H #endif
//tag jĂĄ definida,
//pula o conteĂşdo
#endif
pigurâ PFPX Ćolução dâs referĂŞnâ˘iâs â˘irâ˘ulâres â˘om 5ifndef
qerâlmente se utilizâ â˘omo tâg de â˘ontrole o nome do ârquivoF istâ tâg
deve ser Ăşniâ˘â pârâ â˘âdâ ârquivoF
2.5 Tipos de dados em C
19 Jan 2038 at 3:14:07 AM. The end of the world according
to Unix (2
32
seconds after Jan 1st 1970) E âŚnix dâte system
y tipo de umâ vâriĂĄvelD informâ â quântidâde de memĂłriâD em bytesD que estâ
irĂĄ oâ˘upâr e â˘omo estâ deve ser interpretâdâX â˘om ou sem frâção @vĂrgulâAF
ys tipos ËĂĄsiâ˘os de dâdos nâ linguâgem g sĂŁo âpresentâdos nâ ââËelâ PFIF
ââËelâ PFIX âipos de dâdos e fâixâ de vâlores
Tipo Bits Bytes Faixa de valores
â˘hâr V I EIPU Ă IPU
int IT P EQPFUTV Ă QPFUTU
)oât QP R QDR x IH-38 Ă QDR x IH38
douËle TR V QDR x IH-308 Ă QDR x IH308
Notas de Aula ELT024 - Programação para Sistemas Embarcados
31. 22 Linguagem C para sistemas embarcados
âŹodemos notâr que âs vâriĂĄveis que possuem mâior tâmânho podem ârE
mâzenâr vâlores mâioresF xotâmos tâmËĂŠm que âpenâs os tipos )oât e douE
Ële possuem â˘âsâs deâ˘imâisF
Representação binåria e hexadecimal
e grânde mâioriâ dos proâ˘essâdores trâËâlhâ â˘om dâdos ËinĂĄriosD ou sejâD
âqueles que âpenâs âssumem vâlores H ou IF âŹor isso os tipos âpresentâdos
ânteriormente podem ser representâdos utilizândo â Ëâse PF âŚm vâlor do
tipo â˘hâr que possui V Ëits serĂĄ representâdo por um nĂşmero de V âlgârismosD
todos H @zerosA ou I @unsAF âŹârâ reâlizârmos â â˘onversĂŁo de um nĂşmero nâ
Ëâse deâ˘imâl pârâ â Ëâse P podemos seguir o seguinte âlgoritmoX
IF Dividir o nĂşmero por 2
PF Anotar o valor do resto (0 ou 1)
QF Se o valor ĂŠ maior que 0 voltar ao nĂşmero 1
RF Escrever os valores obtidos atravĂŠs do passo 2 de trĂĄs para frente.
SF Apresentar o resultado
âŹor exemplo o nĂşmero IVF
IVGP a WD resto 0
WGP a RD resto 1
RGP a PD resto 0
PGP a ID resto 0
IGP a HD resto 1
vendo do Ăşltimo resultâdo pârâ o primeiro temos que
IV10 a IHHIH2
hevido â grânde utilizâção de nĂşmeros ËinĂĄrios nâ progrâmâção de Ëâixo
nĂvel ĂŠ muito â˘omum esâ˘revemos estes nĂşmeros nâ Ëâse IT ou hexâdeâ˘imâlF
e vântâgem de esâ˘rever o nĂşmero nestâ Ëâse ĂŠ que existe umâ â˘onversĂŁo
simples de ËinĂĄrio pârâ hexâdeâ˘imâl e o nĂşmero resultânte oâ˘upâ Ëem menos
espâço nâ telâF
e Ëâse hexâdeâ˘imâl possui IT 4unidâdes4diferentesF gomo existem âpeE
nâs IH âlgârismos no sistemâ de numerâção ârĂĄËiâ˘o @HD ID PD QD RD SD TD UD VD
WA utilizâmos T letrâs pârâ â˘omplementĂĄElos @eD fD gD hD iD pAF e â˘onversĂŁo
entre vâlores ËinĂĄriosD deâ˘imâis e hexâdeâ˘imâis ĂŠ âpresentâdâ nâ ââËelâ PFPF
âŹârâ â˘onverter de ËinĂĄrio pârâ hexâdeâ˘imâl Ëâstâ dividir o nĂşmero em
grupos de R em RD da esquerda para a direitaD e utilizâr â tâËelâ ââ˘imâF
âŹor exemplo o nĂşmero IVF ĆâËemos que este nĂşmero em ËinĂĄrio ĂŠ repreE
sentâdo por IHHIH2 F Ćepârândo o nĂşmero de R em R âlgârismos temosX
IEHHIH
âŹelâ tâËelâX
Notas de Aula ELT024 - Programação para Sistemas Embarcados
32. 23 Linguagem C para sistemas embarcados
ââËelâ PFPX âepresentâção deâ˘imâl ! ËinĂĄriâ E hexâdeâ˘imâl
Decimal BinĂĄrio Hexadecimal Decimal BinĂĄrio Hexadecimal
H HHHH H V IHHH V
I HHHI I W IHHI W
P HHIH P IH IHIH e
Q HHII Q II IHII f
R HIHH R IP IIHH g
S HIHI S IQ IIHI h
T HIIH T IR IIIH i
U HIII U IS IIII p
I2 a I16
HHIH2 a P16 F
vogoX
IHHIH2 F a IP16 F
Modicadores de tamanho e sinal
âŚm modi(â˘âdor de tipo âlterâ o signi(â˘âdo dos tipos Ëâse e produz um novo
tipoF ixistem quâtro tipos de modi(â˘âdoresD dois pârâ o tâmânho @long
e shortA e dois pârâ sinâl @unsigned e signedAF âŚm tipo deâ˘lârâdo â˘om o
modi(â˘âdor long pode ter tâmânho wesyâ ou sqâŚev âo tipo originâlF
âŚm tipo deâ˘lârâdo â˘omo short deve ter tâmânho wixyâ ou sqâŚev âo
tipo originâlF e deâ˘isĂŁo â˘âËe âo â˘ompilâdor utilizâdoF
ys tipos deâ˘lârâdos â˘omo signed possuem um Ëit reservâdo pârâ o sinâlD
deste o vâlor mĂĄximo que podem âtingir ĂŠ menorF ys tipos deâ˘lârâdos â˘omo
unsigned nĂŁo podem âssumir vâlores negâtivosD em â˘ompensâção podem âtinE
gir o doËro do vâlor de um tipo signedF xâ ââËelâ PFQ sĂŁo âpresentâdâs
âlgumâs vâriâçþes possĂveisF
xâ linguâgem gD por pâdrĂŁo os tipos sĂŁo sinâlizâdosD ou sejâD possuem
pârte positivâ e negâtivâF âŹor isso ĂŠ râro enâ˘ontrâr o modi(â˘âdor signedF
Modicadores de acesso
hurânte o proâ˘esso de â˘ompilâçãoD existe umâ etâpâ de otimizâção do proE
grâmâF hurânte estâ etâpâD o â˘ompilâdor pode retirâr pârtes do â˘Ăłdigo ou
desfâzer loops â˘om perĂodos (xosF âŹor exemplo o â˘Ăłdigo âËâixoX
#define Ë @*@ neâr unsigned char * A HxpVQ A
Notas de Aula ELT024 - Programação para Sistemas Embarcados
33. 24 Linguagem C para sistemas embarcados
ââËelâ PFQX elterâção de tâmânho e sinâl dos tipos ËĂĄsiâ˘os
Tipo Bytes ExcursĂŁo mĂĄxima
unsigned â˘hâr I H Ă PSS
signed â˘hâr I EIPV Ă IPU
unsigned int P H Ă TSFSQS
signed int P EQPFUTV Ă QPFUTU
long int R EPFIRUFRVQFTRV Ă PFIRUFRVQFTRU
unsigned long int R H Ă RFPWRFWTUFPWS
short int P EQPFUTV Ă QPFUTU
void main @ void A interrupt H
{
while @ X 3a X A Y
}
Âuândo â˘ompilâdo âpresentâ o seguinte â˘Ăłdigo em âssemËlerX
// Starting pCode block
S_Teste__main code
_main X
F line IW // T e s t e . c while (X!=X) ;
RETURN
inquânto â vâriĂĄvel x for diferente de x o progrâmâ nĂŁo sâi do loopF
y â˘ompilâdor entende que estâ â˘ondição nunâ˘â irĂĄ ââ˘onteâ˘er e eliminâ o loop
do â˘Ăłdigo (nâl â˘omo podemos ver no â˘Ăłdigo gerâdoD â rotinâ de return estĂĄ
logo âpĂłs â iniâ˘iâlizâção do progrâmâ â˘mâinF âŹârâ vâriĂĄveis â˘omuns o vâlor
sĂł ĂŠ âlterâdo em âtriËuiçþes diretâs de vâlor ou de outrâs vâriĂĄveisX @x a RYA
ou @x a yYAF
intretânto existe umâ â˘ondição onde â vâriĂĄvel x pode âlterâr seu vâlor
independentemente do progrâmâF Će estâ vâriĂĄvel representâr um endereço
de memĂłriâ âssoâ˘iâdo Ă um perifĂŠriâ˘o fĂsiâ˘oD seu vâlor pode mudâr indepenE
dentemente do )uxo do progrâmâF âŹârâ indiâ˘âr estâ situâção âo progrâmâ
utilizâmos â pâlâvrâ reservâdâ volatileF
#define Ë @ * @ volatile n e â r unsigned char * A HxpVQ A
void main @ void A interrupt H
{
while @ X 3a X A Y
}
Notas de Aula ELT024 - Programação para Sistemas Embarcados
34. 25 Linguagem C para sistemas embarcados
qerândo o â˘Ăłdigo em âssemËler desâ˘rito âËâixoX
// Starting pCode block
S_Teste__main code
_main X
_00105_DS_ X
F line IW // Teste . c while (X != X) ;
MOVLW H x83 // p r i m e i r a parte do endereço
MOVWF r0x00
MOVLW H x0f // s e g u n d a parte do endereço
MOVWF r0x01
MOVFF r0x00 D FSR0L
MOVFF r0x01 D FSR0H
MOVFF INDF0 D r0x00 // r e a l i z a primeira leitura
MOVLW H x83 // p r i m e i r a parte do endereço
MOVWF r0x01
MOVLW H x0f // s e g u n d a parte do endereço
MOVWF r0x02
MOVFF r0x01 D FSR0L
MOVFF r0x02 D FSR0H
MOVFF INDF0 D r0x01 // r e a l i z a segunda leitura
MOVF r0x00 D W
XORWF r0x01 D W
BNZ _00105_DS_ // f a z o teste para igualdade
RETURN
âŹodemos perâ˘eËer queD deste modoD o â˘ompilâdor ĂŠ forçâdo â ler â vâriĂĄvel
x duâs vezes e reâlizâr o teste pârâ ver se elâ permâneâ˘e â˘om o mesmo vâlorF
im âlgumâs situâçþes ĂŠ neâ˘essĂĄrio indiâ˘âr que âlgumâs vâriĂĄveis nĂŁo poE
dem reâ˘eËer vâlores pelo progrâmâF âŹârâ isto utilizâmos â pâlâvrâ reservâdâ
constF âŚtilizâmos este modi(â˘âdor pârâ indiâ˘âr que â vâriĂĄvel representâ
um loâ˘âl que âpenâs pode ser lido e nĂŁo modi(â˘âdoD por exemplo umâ portâ
pârâ entrâdâ de dâdosF xestâ situâção ĂŠ â˘omum utilizâr âs pâlâvrâs volatile
e const juntoF
#define Ë @ * @ volatile const neâr unsigned char * A HxpVQ A
void main @ void A interrupt H
// i n i c i o do programa
{
X a QY
}
Će tentârmos â˘ompilâr este â˘Ăłdigo âpâreâ˘erĂĄ â seguinte mensâgem de
erroX
Teste F c X error Q Q X Attempt to assign value to a constant â
variable @aA
Notas de Aula ELT024 - Programação para Sistemas Embarcados
35. 26 Linguagem C para sistemas embarcados
Modicadores de posicionamento
es vâriĂĄveis podem ser deâ˘lârâdâs utilizândo os modi(â˘âdores near e farF isE
tes modi(â˘âdores indiâ˘âm âo â˘ompilâdor em quâl regiĂŁo de memĂłriâ devem
ser â˘oloâ˘âdâs âs vâriĂĄveisF
e regiĂŁo near gerâlmente se refere Ă zero pâgeF Ă umâ regiĂŁo mâis
fĂĄâ˘il de ser ââ˘essâdâF e regiĂŁo far exige mâis tempo pârâ exeâ˘utâr â mesmâ
função que â nearF
âŹodemos pensâr nestâs regiĂľes â˘omo â memĂłriâ âew e â memĂłriâ gââ˘he
do â˘omputâdorF e segundâ ĂŠ mâis rĂĄpidâD mâs possui um âlto â˘usto e por
isso gerâlmente ĂŠ menorF im âlgumâs situâçþes ĂŠ interessânte que âlgumâs
vâriĂĄveis nunâ˘â sâiâm do â˘ââ˘heD pois sĂŁo utilizâdâs â˘om grânde frequĂŞnâ˘iâ
ou sĂŁo â˘rĂtiâ˘âs pârâ o sistemâF
Modicador de persistĂŞncia
im gerâlD âs vâriĂĄveis utilizâdâs dentro dâs funçþes perdem seu vâlor âo
tĂŠrmino dâ funçãoF âŹârâ que este vâlor nĂŁo se perâ˘â podemos utilizâr um
modi(â˘âdor de persistĂŞnâ˘iâX stâtiâ˘F gom esse modi(â˘âdor â vâriĂĄvel pâssâ
â possuir um endereço (xo de memĂłriâ dâdo pelo â˘ompilâdorF elĂŠm disso o
â˘ompilâdor nĂŁo reutilizâ este endereço em nenhumâ outrâ pârte do â˘ĂłdigoD
gârântindo que nâ prĂłximâ vez que â função for â˘hâmâdâ o vâlor â˘ontinue o
mesmoF
// c r i a um contador persistente que ĂŠ
int ContadorPersistente @ int reseta A
// i n c r e m e n t a d o a cada chamada de função
{
static char variavel_persistente Y
if @ reseta A
{
variavel_persistente a H Y
}
else
{
return @ variavel_persistenteCCA Y
}
return âIY
}
2.6 Operaçþes aritmÊticas
If people do not believe that mathematics is simple, it is only
because they do not realize how complicated life is. E tohn
vouis von xeumânn
Notas de Aula ELT024 - Programação para Sistemas Embarcados
36. 27 Linguagem C para sistemas embarcados
visting PFRX yperâçþes âritmĂŠtiâ˘âs â˘om tipos diferentes
Ivoid void
main @ A
P {
Q char var08 Y
R int var16 Y
S long int var32 Y
T float pont16 Y
U double pont32 Y
V var8 a var8 C var16 Y // 1
W var8 a var8 C var8 Y // 2
IH var16 a var8 * var8 Y // 3
II var32 a var32 G var16 Y // 4
IP var32 a pont32 * var32 Y // 5
IQ pont16 a var8 G var16 Y // 6
IR pont16 a pont32 * var32 Y // 7
IS pont16 a RH G V H Y // 8
IT }
âŚm â˘uidâdo â se tomârD nâ progrâmâção em g pârâ sistemâs emËârâ˘âdosD
ĂŠ o resultâdo de operâçþes âritmĂŠtiâ˘âsF âŹor pâdrĂŁo nâ linguâgem g o resulE
tâdo de umâ operâção âritmĂŠtiâ˘â possui tâmânho iguâl âo mâior operândoF
yËservândo o âŹrogrâmâ PFR notâmos âlguns exemplosF
xo â˘âso I @linhâ VA umâ vâriĂĄvel â˘hâr somâdâ â um int gerâ â˘omo reE
sultâdo um int @mâior operândoAF xĂŁo ĂŠ possĂvel ârmâzenâr esse resultâdo
num â˘hârD hâverĂĄ perdâ de informâçãoF
var32 a var8 C var16 Y // 1 corrigido
e somâ de dois â˘hârD â˘onforme â linhâ WD segundo â˘âso pode gerâr um
proËlemâ se âmËos forem muito prĂłximo do vâlor limiteF âŹor exemploX IHH
C IHH a PHHD que nĂŁo â˘âËe num â˘hârD jĂĄ que este sĂł permite ârmâzenâr
vâlores de EIPV Ă IPUF
var16 a var8 C var8 Y // 2 corrigido
y terâ˘eiro â˘âso @linhâ IHA estĂĄ â˘orretoD â multipliâ˘âção de dois â˘hâr possui
um vâlor mĂĄximo de IPUBIPUaITFIPWF y proËlemâ ĂŠ que â multipliâ˘âção de
dois â˘hâr gerâ um outro â˘hârD perdendo informâçãoF Ă neâ˘essĂĄrio reâlizâr
um typeâ˘âst ântesF
var16 a @@ int A var8 A * var8 Y // 3 corrigido
y quârto â˘âso @linhâ IIA pode âpresentâr um proËlemâ de preâ˘isĂŁoF e
divisĂŁo de dois inteiros nĂŁo ârmâzenâ pârte frââ˘ionĂĄriâF Će isto nĂŁo for â˘rĂtiâ˘o
Notas de Aula ELT024 - Programação para Sistemas Embarcados
37. 28 Linguagem C para sistemas embarcados
pârâ o sistemâ estĂĄ â˘orretoF vemËrâr que â divisĂŁo de nĂşmeros inteiros ĂŠ
mâis rĂĄpidâ que de nĂşmeros frââ˘ionĂĄriosF
y quinto â˘âso @linhâ IPA pode âpresentâr um proËlemâ de preâ˘isĂŁoF y
resultâdo dâ â˘ontâ de um nĂşmero inteiro â˘om um ponto )utuânte ĂŠ um
ponto )utuânteF ermâzenâr esse vâlor num outro nĂşmero inteiro gerâ perdâ
de informâçãoF
y sexto â˘âso @linhâ IQA âpresentâ um proËlemâ muito â˘omumF e diviE
sĂŁo de dois nĂşmeros inteiros gerâ um outro nĂşmero inteiroF xĂŁo importâ
se ârmâzenâremos o vâlor numâ vâriĂĄvel de ponto )utuânte hâverĂĄ perdâ
de informâção pois os operandos sĂŁo inteirosF âŹârâ evitâr esse proËlemâ ĂŠ
neâ˘essĂĄrio um typeâ˘âstF
pont16 a @ @ float A var8 A G var16 Y // 6 corrigido
xo sĂŠtimo â˘âso @linhâ IRA pode hâver perdâ de preâ˘isĂŁo pois o resultâdo
dâ operâção ĂŠ um douËleD e estâmos ârmâzenândo este vâlor num )oâtF
y oitâvo â˘âso @linhâ ISA ĂŠ similâr âo sextoF istâmos reâlizândo umâ
â˘ontâ â˘om dois nĂşmeros inteiros esperândo que o resultâdo sejâ HDSF gomo
os operândos sĂŁo inteiros â expressĂŁo serĂĄ âvâliâdâ â˘omo resultânte em ÂeroF
âŚmâ Ëoâ prĂĄtiâ˘â ĂŠ sempre usâr 4FH4 ou 4f4 âpĂłs o nĂşmero pârâ indiâ˘âr
operâçþes â˘om vĂrgulâF
pont16 a RH f G V H F H Y // 8 corrigido
hevemos tomâr â˘uidâdo tâmËĂŠm â˘om â˘ompârâçþes envolvendo nĂşmeros
â˘om ponto )utuânteF
float x a HFIY
while @ x 3a I F I A {
printf @ x = %fn D x A Y
x a x C HFIY
}
y treâ˘ho de â˘Ăłdigo ââ˘imâ âpresentâ um loop in(nitoF gomo existem
restriçþes de preâ˘isĂŁo nos nĂşmeros de ponto )utuânte @)oât e douËleA nem
todos os nĂşmeros sĂŁo representâdos (elmenteF ys erros de ârredondâmento
podem fâzer â˘om que â â˘ondição @x 3aIFIA nunâ˘â sejâ sâtisfeitâF Ćempre
que houver â neâ˘essidâde de â˘ompârâção â˘om nĂşmeros de ponto )utuânte
utilizâr mâiorD menor ou vâriâçþesF
float x a HFIY
while @x ` IFIA {
printf @ x = %fn D x A Y
x a x C HFIY
}
Notas de Aula ELT024 - Programação para Sistemas Embarcados
38. 29 Linguagem C para sistemas embarcados
epesâr de sutis estes tipos de erro podem â˘âusâr um mâu funâ˘ionâmento
do sistemâF xâ pigurâ PFQ ĂŠ âpresentâdo um erro gerâdo âtrâvĂŠs de um loop
in(nitoF
pigurâ PFQX voop in(nito de um deviâ˘e driver gerândo erro no sistemâ
2.7 Função main()
âodo sistemâ neâ˘essitâ de iniâ˘iâr em âlgum lugârF im gerâlD os miâ˘roâ˘onE
trolâdoresD âssim que ligâdosD proâ˘urâm por suâs instruçþes no primeiro ou
Ăşltimo endereço de memĂłriâD dependendo dâ ârquiteturâ utilizâdâF y espâço
de memĂłriâ disponĂvel neste endereço ĂŠ gerâlmente muito pequenoD âpenâs
o neâ˘essĂĄrio pârâ inserir umâ instrução de pulo e o endereço onde estĂĄ â
função prinâ˘ipâlF iste espâço ĂŠ â˘onheâ˘ido â˘omo posição de resetF ixisE
tem âindâ outros espâços de memĂłriâ similâres â este queD gerâlmenteD sĂŁo
âloâ˘âdos prĂłximosF y â˘onjunto destes espâços ĂŠ â˘onheâ˘ido â˘omo vetor de
interrupção @pigurâ PFRAF
e mâneirâ de indiâ˘âr o ponto de inĂâ˘io de um progrâmâ depende do
â˘ompilâdorF im gerâl os â˘ompilâdores âloâ˘âm â função mâin@A em âlgum
lugâr dâ memĂłriâ onde hâjâ espâço disponĂvelF hepois disso dispĂľem de umâ
instrução de pulo pârâ o primeiro endereço de memĂłriâD onde foi âloâ˘âdâ â
função mâinF
âŹârâ o â˘ompilâdor ĆhggGqâŹâŚtils no wâŹvef ĂŠ neâ˘essĂĄrio indiâ˘âr que
queremos que â função mâin@A sejâ â˘hâmâdâ todâ vez que o sistemâ for
iniâ˘iâdoF âŹor isso ĂŠ neâ˘essĂĄrio que â posição de reset dentro do vetor de
Notas de Aula ELT024 - Programação para Sistemas Embarcados
39. 30 Linguagem C para sistemas embarcados
Endereço Instrução
0x00 Pulo
0x01 0x8A
0x02 Pulo
0x03 0x55
0x04 ...
0x55 Limpa A
0x56 A recebe
0x57 30
0x58 Testa A
0x59 ...
0x8A A recebe
0x8B 50
0x8C Salva em
0x8D Porta B
0x8E ...
pigurâ PFRX ixemplo de funâ˘ionâmento do vetor de interrupção
Notas de Aula ELT024 - Programação para Sistemas Embarcados
40. 31 Linguagem C para sistemas embarcados
interrupção âponte pârâ â função mâinF ssto ĂŠ feito âtrâvĂŠs do âtriËuto
interrupt H logo âpĂłs o nome dâ função â˘onforme pode ser visto no â˘Ăłdigo
âËâixoF
void main @ void A interrupt H
{
// a q u i entra o cĂłdigo do programa
}
yutrâ â˘oisâ interessânte ĂŠ que pârâ sistemâs emËârâ˘âdos â função prinE
â˘ipâl nĂŁo reâ˘eËe nem retornâ nâdâF gomo elâ ĂŠ â primeirâ â ser â˘hâmâdâ
nĂŁo hĂĄ â˘omo enviâr âlgum vâlor por pârâmetroF ilâ tâmËĂŠm nĂŁo retornâ
nâdâ pois âo tĂŠrmino destâ o sistemâ nĂŁo estĂĄ mâis operâtivoF
im gerâl sistemâs emËârâ˘âdos sĂŁo projetâdos pârâ â˘omeçârem â funâ˘iE
onâr âssim que ligâdos e âpenâs pârâr suâ târefâ quândo desligâdosF gomo
todâs âs funâ˘ionâlidâdes sĂŁo â˘hâmâdâs dentro dâ função mâin@A1 esperâEse
que o progrâmâ â˘ontinue exeâ˘utândo âs instruçþes dentro delâ âtĂŠ ser desliE
gâdo ou reâ˘eËer um â˘omândo pârâ desligârF iste â˘omportâmento pode ser
oËtido âtrâvĂŠs de um loop in(nitoF eËâixo estĂŁo âs duâs âlternâtivâs mâis
utilizâdâsF
void main @ void A interrupt H void main @ void A interrupt H
{ {
for @ Y Y A while @ I A
{ {
// a q u i entra o // a q u i entra o
// c Ăł d i g o principal // c Ăł d i g o principal
} }
} }
2.8 Rotinas de tempo
Time is an illusion, lunchtime doubly so. E pord âŹrefeâ˘t
Ă muito â˘omum neâ˘essitâr que o miâ˘roâ˘ontrolâdor (que um tempo sem fâzer
nâdâF âŚmâ mâneirâ de âtingir esse oËjetivo ĂŠ utilizâr um lâço FOR 2 F
unsigned char i Y
for @ i aHY i ` I H Y iCCA Y
1
im sistemâs mâis â˘omplexos âlgumâs târefâs sĂŁo exeâ˘utâdâs independentemente dâ
função prinâ˘ipâlD tendo suâ exeâ˘ução â˘ontrolâdâ âtrâvĂŠs de interrupçþesF
2
iste mĂŠtodo nĂŁo ĂŠ ââ˘onselhâdo em sistemâs de mâior porteF
Notas de Aula ELT024 - Programação para Sistemas Embarcados
41. 32 Linguagem C para sistemas embarcados
xotâr que nĂŁo estâmos utilizândo os â˘olâ˘hetesF vogo âpĂłs feâ˘hâr os pâE
rĂŞnteses jĂĄ existe um ponto e virgulâF âŹârâ entender â˘omo esse proâ˘edimento
funâ˘ionâD e estimâr o tempo de esperâ ĂŠ preâ˘iso entender â˘omo o â˘ompilâdor
trâduz essâ função pârâ âssemËlerF
// c Ăł d i g o em assembler equivalente Ă f o r ( i =0; i 10; i ++) ;
MOVF r0x00 D W // i n i c i a l i z a W com 0 (1 ciclo )
SUBLW H x0a // c o l o c a o valor 10 (0 x0a ) no r e g i s t r o W (1â
ciclo )
MOVWF r0x00 // muda o valor de W para F (1 ciclo )
_00107_DS_ X
DECFSZ r0x00 D F // d e c r e m e n t a F, se F 0 executa a â
prĂłxima linha (1 ciclo )
BRA _00107_DS_ // p u l a para o lugar marcado como â
_00107_DS_ (2 ciclos )
âŹerâ˘eËemos pelo â˘Ăłdigo ââ˘imâ que pârâ reâlizâr um for preâ˘isâmos de Q
pâssos de iniâ˘iâlizâçãoF gâdâ iterâção exige P pâssosX umâ â˘ompârâção e um
pulo 3 D totâlizândo Q â˘iâ˘los de iniâ˘iâlizâção e Q â˘iâ˘los de interâçãoF
Će temos um proâ˘essâdor trâËâlhândo â V wrzD â˘âdâ instrução ĂŠ exeâ˘uE
tâdâ em HFSusF4 âŹârâ termos um tempo de esperâ de HFSs preâ˘isâmos de I
milhĂŁo de instruçþesF Će â˘oloâ˘ârmos loops enâ˘âdeâdos podemos multipliâ˘âr
â quântidâde de instruçþes que serĂŁo exeâ˘utâdâsF âŹârâ oËtermos um vâlor
de I milhĂŁo de instruçþes devemos utilizâr pelo menos Q loops enâ˘âdeâdosF
ys vâlores dos loops sĂŁo oËtidos de mâneirâ iterâtivâF
unsigned char i D jD kY
for @ i aHY i ` Q R Y iCCA // 3 + 34 * (30.003 + 3) = 1.020.207 â
instruçþes
{
for @ j aHY j ` I H H Y jCCA // 3 + 1 0 0 * (297 + 3) = 30.003 â
instruçþes
{
for @ k aHY k ` W V Y kCCA Y // 3 + 98 * (3) = 297 instruçþes
}
}
y â˘Ăłdigo ââ˘imâ foi projetâdo pârâ gerâr um âtrâso de tempo de meio
segundoF gompilândo e reâlizândo testes prĂĄtiâ˘os podemos â˘on(rmâr que o
tempo reâl ĂŠ âproximâdâmente HFSI @sAF istâ disâ˘repânâ˘iâ ââ˘onteâ˘e porque
âgorâ temos Q loops enâ˘âdeâdos e â˘âdâ quâl â˘om suâ vâriĂĄvel de â˘ontroleF
heste modo o â˘ompilâdor preâ˘isâ sâlvâr e â˘ârregâr â˘âdâ vâriĂĄvel pârâ reâlizâr
â â˘ompârâçãoF
âŹerâ˘eËemos âssim que pârâ â˘onheâ˘er â˘orretâmente o funâ˘ionâmento do
sistemâ ĂŠ neâ˘essĂĄrioD em âlgumâs situâçþesD âËrir o â˘Ăłdigo em âssemËler geE
3
iste vâlor sĂł ĂŠ vâlido quândo estâmos trâËâlhândo â˘om vâriĂĄveis â˘hârF Će utilizârmos
vâriĂĄveis int o â˘Ăłdigo em âssemËler serĂĄ diferente e teremos que reâlizâr umâ novâ ânĂĄliseF
4
xo âŹsgD â˘âdâ instrução preâ˘isâ de R â˘iâ˘los de â˘loâ˘kF âŹârâ VwrzD I â˘iâ˘lo a HFSÂľsF
Notas de Aula ELT024 - Programação para Sistemas Embarcados
42. 33 Linguagem C para sistemas embarcados
râdo pelo â˘ompilâdor pârâ entender â˘omo o este ĂŠ exeâ˘utâdoF xem sempre
o â˘ompilâdor tomâ âs mesmâs deâ˘isĂľes que nĂłsF elĂŠm disso ele pode gerâr
otimizâçþes no â˘ĂłdigoF ixistem dois tipos de otimizâçãoX umâ visândo diE
minuir o tempo de exeâ˘ução do sistemâD deixândoEo mâis rĂĄpido e outrâ que
reduz o tâmânho do â˘Ăłdigo (nâlD poupândo espâço nâ memĂłriâF
e seguir âpresentâmos um exemplo de função que gerâ delâys â˘om tempo
pârâmetrizâdoF
void delay @ unsigned int DL A
{
unsigned char i D j D k Y
while @ DL ââA // e x e c u t a DL vezes .
{
for @ i aHY i ` Q R Y iCCA // 3 + 34 * (30.003 + 3) = 1.020.207 â
instruçþes
{
for @ j aHY j ` I H H Y jCCA // 3 + 1 0 0 * (297 + 3) = 30.003 â
instruçþes
{
for @ k aHY k ` W V Y kCCA Y // 3 + 98 * (3) = 297 instruçþes
}
}
}
}
2.9 Operaçþes com bits
All of the books in the world contain no more information
than is broadcast as video in a single large American city in
a single year. Not all bits have equal value. E gârl Ćâgân
xos sistemâs miâ˘roâ˘ontrolâdosD existem âlgumâs vâriĂĄveis onde â˘âdâ Ëit tem
umâ interpretâção ou funâ˘ionâlidâde diferenteF âŹor isso ĂŠ neâ˘essĂĄrio reâlizâr
âlgumâs operâçþes que modi(quem âpenâs os Ëits desejâdosD mântendo o
restânte dos Ëits dâ vâriĂĄvel inâlterâdosF
es operâçþes dâ linguâgem g que nos permitem trâËâlhâr â˘om âs vâriĂĄE
veisD levândo em â˘ontâ os vâlores individuâis de â˘âdâ ËitD sĂŁo â˘hâmâdâs de
Ëitwise operâtionF
Ă importânte ressâltâr que âs operâçþes de Ëitwise possuem funâ˘ionâliE
dâde semelhânte â suâs respeâ˘tivâs operâçþes lĂłgiâ˘âsF e diferençâ ĂŠ que â
lĂłgiâ˘â operâ em â˘imâ dâ vâriĂĄvel â˘omo um todo5 enquânto â Ëitwise operâ
Ëit Ă ËitF
5
vemËrâr que pârâ linguâgem g umâ vâriĂĄvel â˘om vâlor H @zeroA representâ fâlsoD e
qualquer outro vâlor representâ verdâdeiroF
Notas de Aula ELT024 - Programação para Sistemas Embarcados
43. 34 Linguagem C para sistemas embarcados
NOT
e operâção xyâ lĂłgiâ˘â retornâ um se o vâlor for zero e H se o vâlor for umF
A !A
H I
I H
e operâção Ëitwise xyâ @operâdor ÂŁA exeâ˘utâ umâ xyâ lĂłgiâ˘âF ssso signi(â˘â
que â operâção ĂŠ reâlizâdâ pârâ â˘âdâ um dos Ëits dâ vâriĂĄvelD nĂŁo mâis pârâ
â vâriĂĄvel â˘omo um todoF xâ tâËelâ seguinte ĂŠ âpresentâdâ â diferençâ entre
âs duâs operâçþesF
Declaração Lógico Bitwise
result a ~ A Y
char A a IPY result a 3 A Y // result = 243
// A = 0 b 0 0 0 0 1 1 0 0 // result = 0 // A = 0 b 0 0 0 0 1 1 0 0
// r = 0 b11110011
AND
e operâção exh lĂłgiâ˘â @operâdor 88A retornâ H se âlgum dos vâlores for
zeroD e I se os dois vâlores forem diferentes de zeroF
A B AB
H H H
H I H
I H H
I I I
e operâção Ëitwise exh @operâdor 8A exeâ˘utâ umâ exh lĂłgiâ˘â pârâ â˘âdâ
pâr de Ëits e â˘oloâ˘â o resultâdo nâ posição â˘orrespondenteX
Declaração Lógico Bitwise
char A a VY
result a A 8 B Y
// result = 0
result a A 88 B Y
char
// A = 0 b 0 0 0 0 1 0 0 0
// A = 0 b 0 0 0 0 1 0 0 0
B a SY // result = 1
// B = 0 b 0 0 0 0 0 1 0 1
// B = 0 b 0 0 0 0 0 1 0 1
// r = 0 b00000000
Notas de Aula ELT024 - Programação para Sistemas Embarcados
44. 35 Linguagem C para sistemas embarcados
OR
e operâção yâ lĂłgiâ˘â @operâdor ||A retornâ I se âlgum dos vâlores for difeE
rente de zeroD e H se os dois vâlores forem zeroF
e f e||f
H H H
H I I
I H I
I I I
e operâção Ëitwise yâ @operâdor |A exeâ˘utâ umâ yâ lĂłgiâ˘â pârâ â˘âdâ pâr
de Ëits e â˘oloâ˘â o resultâdo nâ posição â˘orrespondenteX
Declaração Lógico Bitwise
char A a VY
result a A | B Y
// result = 13
result a A | | B Y
char
// A = 0 b 0 0 0 0 1 0 0 0
// A = 0 b 0 0 0 0 1 0 0 0
B a SY // result = 1
// B = 0 b 0 0 0 0 0 1 0 1
// B = 0 b 0 0 0 0 0 1 0 1
// r = 0 b00001101
XOR
e operâção Ëyâ nĂŁo possui â˘orrespondente lĂłgiâ˘â nâ linguâgem gF istâ
operâção pode ser representâdâ â˘omo e Ëyâ f a @e 88 3fA||@3e 88 fA
e f eâf
H H H
H I I
I H I
I I H
e operâção Ëitwise Ëyâ @operâdor ¢A exeâ˘utâ umâ Ëyâ lĂłgiâ˘â pârâ â˘âdâ
pâr de Ëits e â˘oloâ˘â o resultâdo nâ posição â˘orrespondenteX
Declaração Lógico Bitwise
char A a VY
result a A â B Y
// result = 15
char
// A = 0 b 0 0 0 0 1 0 0 0
// nĂŁo existe em C // A = 0 b 0 0 0 0 1 0 0 0
B a SY
// B = 0 b 0 0 0 0 0 1 0 1
// B = 0 b 0 0 0 0 0 1 0 1
// r = 0 b00001101
Notas de Aula ELT024 - Programação para Sistemas Embarcados
45. 36 Linguagem C para sistemas embarcados
Shift
e operâção shift desloâ˘â os Ëits pârâ â esquerdâ @operâdor ``A ou direitâ
@operâdor bbAF Ă neâ˘essĂĄrio indiâ˘âr quântâs â˘âsâs serĂŁo desloâ˘âdâsF
Declaração Shift Esquerda Shift Direita
result a A `` P Y result a A bb P Y
char A a VY // result = 32 // result = 2
// A = 0 b 0 0 0 0 1 0 0 0 // A = 0 b 0 0 0 0 1 0 0 0 // A = 0 b 0 0 0 0 1 0 0 0
// r = 0 b00100000 // r = 0 b00000010
âŹârâ vâriĂĄveis unsigned e inteirâsD estâ operâção funâ˘ionâ â˘omo â multiE
pliâ˘âçãoGdivisĂŁo por potĂŞnâ˘iâ de doisF gâdâ shift multipliâ˘âGdivide por P o
vâlorF istâ ĂŠ umâ prĂĄtiâ˘â muito â˘omum pârâ evitâr â divisĂŁo que nâ mâioriâ
dos sistemâs emËârâ˘âdos ĂŠ umâ operâção â˘ârâ do ponto de vistâ de tempo
de proâ˘essâmentoF
Não utilizar esta operação com o intuito de multiplicar/dividir variåveis
com ponto xo ou utuante nem variĂĄveis sinalizadas (signed).
im diversâs oâ˘âsiĂľes ĂŠ neâ˘essĂĄrio que trâËâlhemos â˘om os Ëits de mâneirâ
individuâlD prinâ˘ipâlmente quândo estes Ëits representâm sâĂdâs ou entrâdâs
digitâisD por exemplo â˘hâves ou ledsF
Ćupondo que temos V leds ligâdos âo miâ˘roâ˘ontrolâdorF gâdâ led ĂŠ reE
presentâdo âtrâvĂŠs de I Ëit de umâ vâriĂĄvelF âŹârâ ligârmos ou desligârmos
âpenâs um led por vezD nĂŁo âlterândo o vâlor dos demâisD devemos nos utiE
lizâr de âlguns pâssos de ĂĄlgeËrâ digitâlF
Ligar um bit (bit set)
âŹârâ ligâr âpenâs um ËitD utilizâremos umâ operâção yâŚF Ćupondo dois
operândos e e fF Će e ĂŠ I o resultâdo de @e | fA ĂŠ I independente de fF Će
e ĂŠ H o resultâdo ĂŠ iguâl âo vâlor de fF
Će o oËjetivo ĂŠ ligâr âpenâs o Ëit dâ posição Ë devemos â˘riâr um vâlor
onde todâs âs posiçþes sĂŁo H's â˘om exâ˘eção dâ posição desejâdâF âŹârâ umâ
mĂĄsâ˘ârâ ËinĂĄriâ de x Ëits temos @xbaËAX
âŹosição x F F F ËCI Ë ËEI F F F H
â âlor H FFF H I H FFF H
Će â operâção yâ for exeâ˘utâdâ â˘om â mĂĄsâ˘ârâ â˘riâdâD o resultâdo âpreE
sentârĂĄ vâlor I nâ posição Ë e mânterĂĄ os vâlores ântigos pârâ âs demâis
posiçþesF ixemploX vigâr âpenâs o Ëit P dâ vâriĂĄvel âŹyââh
Notas de Aula ELT024 - Programação para Sistemas Embarcados
46. 37 Linguagem C para sistemas embarcados
#define âŹyââh @ * @ volatile unsigned char * A HxpVQ A
// d e f i n e s para portas de entrada e saĂda
neâr
#define ââsĆh @ * @ volatile neâr unsigned char * A HxpWS A
void main @ void A interrupt
// i n i c i o do programa
H
{
char mascara Y // v a r i ĂĄ v e l que guarda a mĂĄscara
TRISD a H x00 Y // c o n f i g u r a a porta D como saĂda
PORTD a H x00 Y // l i g a todos os leds ( lĂłgica negativa )
// l i g a o primeiro bit da variĂĄvel
mascara a I Y // bit = 0 b00000001
// r o t a c i o n a âs e a variĂĄvel para que o bit 1 chegue na posiçãoâ
desejada
mascara a mascara `` P Y // bit = 0 b00000100
// L i g a r o bit 2, desligando o 2o led
PORTD a PORTD | mascara Y
for @ Y Y A Y
// mantĂŠm o sistema ligado indefinidamente
}
Desligar um bit (bit clear)
âŹârâ desligâr âpenâs um Ëit o proâ˘edimento ĂŠ similâr âo utilizâdo pârâ ligârF
eo invĂŠs de utilizârmos umâ operâção yâŚD utilizâremos umâ operâção exhF
e operâção exh tem â â˘ârââ˘terĂstiâ˘â deD dâdos e e f vâlores ËinĂĄriosD se e
ĂŠ ID â respostâ de @e 8 fA serĂĄ o prĂłprio vâlor de fD se â eaHD â respostâ ĂŠ
zeroD independente de fF
xovâmente ĂŠ neâ˘essĂĄrio gerâr umâ mĂĄsâ˘ârâF wâs pârâ estâ situâção elâ
deve possuir todos os Ëits iguâis Ă um â˘om exâ˘eção de ËD o Ëit que queremos
desligârF
posição x F F F ËCI Ë ËEI F F F H
â âlor I FFF I H I FFF I
Će â operâção exh for exeâ˘utâdâ â˘om â mĂĄsâ˘ârâ â˘riâdâD o resultâdo
âpresentârĂĄ vâlor H nâ posição Ë e mânterĂĄ os vâlores ântigos pârâ âs demâis
posiçþesF ixemploX hesligâr âpenâs o Ëit P dâ vâriĂĄvel âŹyââhF
#define âŹyââh @ * @ volatile unsigned char * A HxpVQ A
// d e f i n e s para portas de entrada e saĂda
neâr
#define ââsĆh @ * @ volatile neâr unsigned char * A HxpWS A
void main @ void A interrupt
// i n i c i o do programa
H
{
char mascara Y // v a r i ĂĄ v e l que guarda a mĂĄscara
TRISD a H x00 Y // c o n f i g u r a a porta D como saĂda
PORTD a H xFF Y // d e s l i g a todos os leds ( lĂłgica â
negativa )
Notas de Aula ELT024 - Programação para Sistemas Embarcados
47. 38 Linguagem C para sistemas embarcados
// l i g a o primeiro bit da variĂĄvel
mascara a I Y // mascara = 0 b00000001
// r o t a c i o n a âs e a variĂĄvel para que o bit 1 chegue na posiçãoâ
desejada
mascara a mascara `` P Y // m a s c a r a = 0 b00000100
// i n v e r t e âs e o s v a l o r e s d e c a d a b i t
mascara a ~ mascara Y // m a s c a r a = 0 b11111011
// D e s l i g a o bit 2, ligando o 2o led
PORTD a PORTD 8 mascara Y
for @ Y Y A Y
// mantĂŠm o sistema ligado indefinidamente
}
Ă importânte notâr que gerâmos â mĂĄsâ˘ârâ de mâneirâ idĂŞntiâ˘â Ă quelâ
utilizâdâ no â˘âso ânteriorD onde todos os vâlores sĂŁo zero e âpenâs o desejâdo ĂŠ
umF hepois reâlizâmos â inversĂŁo dos vâloresF iste proâ˘edimento ĂŠ reâlizâdo
destâ mâneirâ porque nĂŁo sâËemos o tâmânho dâ pâlâvrâ â ser utilizâdâ no
miâ˘roâ˘ontrolâdorX V ou IT ËitsF wesmo âssim devemos gârântir que todos os
Ëits oËtenhâm o vâlor â˘orretoD o que ĂŠ gârântido pelâ operâção de negâçãoF
e opção de iniâ˘iâlizâr â vâriĂĄvel â˘om âpenâs um zero e rotââ˘ionâr pode nĂŁo
funâ˘ionâr poisD nâ mâioriâ dos sistemâsD â função de rotâção insere zeros Ă
medidâ que os Ëits sĂŁo desloâ˘âdos e preâ˘isâmos que âpenâs um vâlor sejâ
zeroF
Trocar o valor de um bit (bit ip)
âŹârâ troâ˘âr o vâlor de um Ëit utilizâremos â˘omo ârtifĂâ˘io âlgĂŠËriâ˘o â operâção
ËyâF hâdo duâs vâriĂĄveis ËinĂĄriâs e e f D se e ĂŠ ID o vâlor resultânte de
e Ëyâ f ĂŠ o oposto do vâlor de fD se eaHD â respostâ se mântĂŠm iguâl âo
vâlor de fF
âŹodemos perâ˘eËer que pârâ troâ˘âr o vâlor de âpenâs um Ëit â mĂĄsâ˘ârâ
serĂĄ idĂŞntiâ˘â Ă quelâ utilizâdâ pârâ ligâr um ËitX
posição x F F F ËCI Ë ËEI F F F H
â âlor H FFF H I H FFF H
Će â operâção Ëyâ for exeâ˘utâdâ â˘om â mĂĄsâ˘ârâ â˘riâdâD o vâlor nâ posição
Ë serĂĄ troâ˘âdoD de zero pârâ um ou de um pârâ zeroF ixemploX âroâ˘âr o Ëit
P e T dâ vâriĂĄvel âŹyââh
#define âŹyââh @ * @ volatile unsigned char * A HxpVQ A
// d e f i n e s para portas de entrada e saĂda
neâr
#define ââsĆh @ * @ volatile neâr unsigned char * A HxpWS A
void main @ void A interrupt
// i n i c i o do programa
H
{
char mascara Y // v a r i ĂĄ v e l que guarda a mascara
TRISD a H x00 Y // c o n f i g u r a a porta D como saĂda
Notas de Aula ELT024 - Programação para Sistemas Embarcados