© AJF/FJR
Processamento Digital de Sinal em Tempo Real,
3ª aula teórica FEUP, 11 de M arço de 2005 1
Sumário
• O processador de sinal TMS320C31
– grupos de instruções assembly do C31
– grupos especiais de instruções assembly: “interlocked” e paralelas
– algumas simplificações permitidas na escrita do código assembly
• A Operação da “Pipeline” do C31
– conceito e estrutura
– conflitos de salto de registo e de memória
• Controlo do fluxo de programa no C31
– por software
• repetição de instruções
• saltos no programa
• chamadas a subrotinas (CALL, TRAP, RETURN)
– por hardware
• operações “interlocked”
• “reset” e interrupções
• Antevisão do 3º trabalho de laboratório
3ª
aula teórica
Instruções assembly do C31
• Vocacionadas para aplicações de processamento digital
de sinal e de cálculo intensivo
• Há 113 instruções que se podem estruturar em diversos
grupos funcionais:
– leitura e escrita (13),
– lógicas/aritméticas com dois operandos (35),
– lógicas/aritméticas com três operandos (17),
© AJF/FJR
Processamento Digital de Sinal em Tempo Real,
3ª
aula teórica
FEUP, 11 de M
arço de 2005
3
• Há ainda variantes de instruções base
– certas instruções admitem variantes em função da condição
especificada para o sufixo “cond” (e.g. LDIcond) e que se
relacionam com o estado de certos bits do registo de estado
(ST) que são, por sua vez, determinados pelo resultado de
operações aritméticas e lógicas anteriormente ocorridas. As
diferentes condições, seu significado e respectivas flags do
registo ST testadas indicam-se nas cinco tabelas seguintes.
Tabelas 1 e 2
NOTA: o “U” de
unconditional
pode ser omitido na instrução !
© AJF/FJR
Processamento Digital de Sinal em Tempo Real,
3ª aula teórica FEUP, 11 de M arço de 2005 4 Tabela 3 Tabelas 4 e 5
© AJF/FJR
Processamento Digital de Sinal em Tempo Real,
3ª
aula teórica
FEUP, 11 de M
arço de 2005
5
• Instruções de leitura e escrita
– permitem ler uma palavra de memória para registo
– permitem escrever uma palavra de registo para memória
– manipulam dados na “stack”
NOTA: as instruções LDFcond e LDIcond são adequadas para localizar um máximo ou mínimo num vector.
3ª
aula teórica
• Instruções lógicas/aritméticas com dois operandos
– os dois operandos traduzem um local fonte (
registo, valor imediato© AJF/FJR
Processamento Digital de Sinal em Tempo Real,
3ª
aula teórica
FEUP, 11 de M
arço de 2005
7
• Instruções lógicas/aritméticas com 3 operandos
– os três operandos são representados por dois locais fonte e um
local destino que deverá ser sempre um registo
NOTA: esta tabela representa um sub-conjunto de instruções da tabela anterior, que admitem variantes de 2 e 3 operandos. Neste sentido, o caracter “3” pode ser omitido nas respectivas mnemónicas já que se destina sobretudo a melhorar a legibilidade.
© AJF/FJR
Processamento Digital de Sinal em Tempo Real,
3ª
aula teórica
FEUP, 11 de M
arço de 2005
8
• Instruções de controlo de programa
– afectam o fluxo de programa, por exemplo através de saltos
(“branch”) ou chamadas a rotinas (CALL), e permitem a
repetição de uma única linha de código (RPTS) ou um bloco de
linhas de código (RPTB)
NOTA: os modos “delayed” e “standard” nas instruções de salto do tipo “branch” prendem-se com a execução útil ou não de instruções na “pipeline” após a execução de um salto na sequência do código assembly. (ver § 7.2 do manual do C3x)
© AJF/FJR
Processamento Digital de Sinal em Tempo Real,
3ª
aula teórica
FEUP, 11 de M
arço de 2005
9
• Instruções de operação “interlocked”
– suportam o multiprocessamento através de comunicação e
sincronização entre vários processadores, com base no uso de
linhas externas dedicadas: XFØ e XF1
• Instruções de operações paralelas
– permitem executar concorrentemente duas instruções. As
instruções do par são escritas explicitamente no código fonte
em assembly como duas instruções separadas mas a segunda
é precedida por duas barras verticais ( || ), como se detalha
nas quatro tabelas seguintes:
3ª
aula teórica
Tabela 1
NOTA 1: Ao usarem-se instruções paralelas, deverá atender-se ao facto de uma instrução de par não poder utilizar o resultado da outra instrução do par. Este facto obriga normalmente a uma inicialização e conclusão adequadas de (ciclos de) operações paralelas.
NOTA 2: Como decorre da nota anterior, a ordem da sequência de instruções no par poderá ser irrelevante !
© AJF/FJR
Processamento Digital de Sinal em Tempo Real,
3ª aula teórica FEUP, 11 de M arço de 2005 11 Tabela 2 Tabela 3 Tabela 4 NOTA 1 : Sugere-se que os alunos disponham de cópias dos resumos detalhados de todas as instruções assembly que constam dos §13.2 (Instruction Set Summary) e §13.3 (Parallel Instruction Set Summary) do manual do C3x.
NOTA 2 : A descrição exaustiva de cada instrução individual deve ser procurada na seccção
“Individual Instruction
Description” do manual do C3x.
© AJF/FJR
Processamento Digital de Sinal em Tempo Real,
3ª
aula teórica
FEUP, 11 de M
arço de 2005
12
• Algumas simplificações na escrita do código assembly
ABSI
RØ, RØ
⇔
ABSI
RØ
ADDI3
RØ, R1, R2
⇔
ADDI
RØ, R1, R2
ADDI3 *ARØ(Ø), R1, R2
⇔
ADDI3 *ARØ, R1, R2
LDI *ARØ++(1), RØ
⇔
LDI
*ARØ++, RØ
BU
etiqueta
⇔
B
etiqueta
LDP @endereco, DP
⇔
LDP
@endereco
LDP @endereco
⇔
LDP
endereco
ADDI
STI
|| STI
⇔
|| ADDI
ADDI *ARØ , R2, R2
ADDI *ARØ , R2
|| MPYI *AR1 , RØ, RØ
⇔
|| MPYI *AR1 , RØ
© AJF/FJR
Processamento Digital de Sinal em Tempo Real,
3ª aula teórica FEUP, 11 de M arço de 2005 13
A Operação da “Pipeline” do C31
• Conceito
– Designa a cascata de quatro fases de processamento conducentes à
execução de uma instrução: o carregamento (fetch), a descodificação
(decode), a leitura de operandos (read) e, finalmente, a execução
(execute). Mais detalhadamente:
• FETCH: carrega a palavra de instrução a partir de memória,
• DECODE: descodifica a palavra de instrução e gera os endereços
necessários (e.g. controlando a modificação dos registos ARn ou
do apontador da “stack”),
• READ: se necessário, lê operandos a partir da memória,
• EXECUTE: se necessário, lê operandos a partir dos registos,
executa a operação pretendida e escreve o resultado num registo
ou em memória.
• Estrutura
– Para um dado instante, estas quatro fases são executadas em
paralelo para instruções diferentes
3ª
aula teórica
• Estrutura
(cont.)
– O controlador da operação da pipeline gere conflitos de pipeline de
forma automática (que são transparentes para o programador) e permite
viabilizar, havendo cuidado na programação de código assembly, um
rendimento computacional de uma instrução por ciclo de execução.
– Se W, X, Y e Z representarem instruções consecutivas e diferentes, o
© AJF/FJR
Processamento Digital de Sinal em Tempo Real,
3ª aula teórica FEUP, 11 de M arço de 2005 15
• Conflitos
Os conflitos da pipeline consistem em quebras na continuidade e
sequencialidade das instruções na pipeline através da inserção
(automática) de instruções NOP, o que evita conflitos mas também
penaliza a eficiência computacional. Os conflitos podem podem ser
categorizados da seguinte forma:
– Conflitos de salto (branch conflicts)
• ocorrem para a maior parte dasinstruções que têm que modificar o conteúdo do registo PC como sejam: BR, Bcond, DBcond, CALL, IDLE, RPTB, RPTS, RETIcond e RETScond. De facto, uma instrução de salto, ao percorrer todas as fases da pipeline até à fase de execução, conduz a que as instruções imediatamente
seguintes no código assembly, ao serem carregadas, sejam
descartadas e substituídas por NOPs (esvaziamento da pipeline).
EXEMPLO
© AJF/FJR
Processamento Digital de Sinal em Tempo Real,
3ª
aula teórica
FEUP, 11 de M
arço de 2005
16
Note-se que as instruções de salto atrasado (e.g. BRD, BcondD,
DBcondD) são usadas precisamente para assegurar o carregamento
e execução das três instruções subsequentes a um salto, evitando o
esvaziamento da pipeline e aumentando a eficiência computacional.
Isto requer naturalmente um cuidado especial na estruturação do
código assembly de modo a beneficiar destas oportunidades de
acelerar a execução do código programado. Usando o exemplo
anterior, a implicação prática do uso da instrução BRD será:
© AJF/FJR
Processamento Digital de Sinal em Tempo Real,
3ª
aula teórica
FEUP, 11 de M
arço de 2005
17
– Conflitos de registo (register conflicts)
• ocorrem devido a atrasos na leitura ou escrita de registos usados para a geração de endereços (possivelmente porque os registos não estão
disponíveis ou prontos a serem usados quando se pretende). No exemplo do lado, a fase de
descodificação da segunda instrução é atrasada de dois ciclos porque a geração de endereços com o registo AR2 só pode efectuar-se quando este tiver sido actualizado na execução da instrução anterior.
Para evitar estes conflitos, deve-se procurar assegurar, na escrita do
código, que há uma distância mínima entre as instruções que fazem
uso dos mesmos registos (preenchendo-a, por exemplo, com outras
instruções úteis mas que não usem os registos em causa).3ª
aula teórica
– Conflitos de memória
• ocorrem quando as unidades internas do C3x competem (disputam) pelos mesmos recursos de memória.
No exemplo ao lado, os registos ARØ e AR1 apontam para o bloco RAMØ e o código de programa correspondente à instrução MPYF também se situa na RAMØ. Há aqui conflito de memória quando ADDF3 se encontra na fase READ da pipeline (há leitura de dois argumentos), que coincide com o momento em que a instrução MPYF seria carregada a partir da RAMØ. Como não pode haver mais do que dois acessos à RAMØ (ou à RAM1 ou à ROM) no mesmo ciclo, esta última instrução é atrasada e é inserido automaticamente um NOP na
pipeline.
© AJF/FJR
Processamento Digital de Sinal em Tempo Real,
3ª
aula teórica
FEUP, 11 de M
arço de 2005
19 No exemplo ao lado, o conflito ocorre
quando uma instrução paralela de duas escritas é seguida de uma instrução de leitura, o que implica o atraso desta através da inserção de um NOP (note-se que não pode haver mais do que dois acessos a uma RAM interna, por ciclo).
– Outros casos de conflito de memória ocorrem, por exemplo, quando o
CPU pretende aceder a memória externa mas esta está ainda
ocupada com uma operação de acesso anterior (eventualmente devido
à inserção deliberada de “wait states” pelo facto de se tratar de memória lenta).© AJF/FJR
Processamento Digital de Sinal em Tempo Real,
3ª
aula teórica
FEUP, 11 de M
arço de 2005
20
– Para minimizar os conflitos de memória, deve-se ter presente na
escrita do código, que os dois blocos de memória RAM interna ao
C31 são de duplo acesso (dual-access) e que, quando muito,
conseguem-se num só ciclo, dois acessos ao mesmo bloco de RAM e
um acesso ao outro bloco de RAM, acessos estes que podem ser
partilhados entre carregamento de código e acesso a dados. Para
uma caracterização de todas as situações relevantes e de outros
tipos de conflito de pipeline, para além dos aqui aflorados, deverá
consultar-se o 8º capítulo “Pipeline Operations” do manual do C3x.
– Em síntese, a inserção de instruções NOPs entre instruções devido a
conflitos de pipeline, é regida por um critério de prioridades de acesso
a código de programa e dados, consoante a fase da pipeline, que é,
por ordem decrescente:
• Execute (maior prioridade)
• Read
• Fetch
© AJF/FJR
Processamento Digital de Sinal em Tempo Real,
3ª
aula teórica
FEUP, 11 de M
arço de 2005
21
Controlo do Fluxo de Programa no C31
O C31 dispõe de oportunidades de controlo do fluxo de programa
por software (
REPEAT
,
BRANCH
,
CALL
,
TRAP
e
RETURN
) e
também por hardware (“interlocked operations”,
RESET
e
“interrupts”).
•
Operação em modo de repetição (
REPEAT
)
– Através de uma instrução (RPTB ou RPTS) que consome 4 ciclos na
inicialização do ciclo mas executa “sem overhead” na sua iteração
(“zero-overhead looping”). Há três registos implicados no modo de
repetição: RC, RS e RE.
• RC: é o contador de iteração, deve ser prévia e explicitamente inicializado (só para RPTB) para o número pretendido de iterações menos um:
– Valor máximo: RC=8000000h (8000001h iterações) – Valor mínimo: RC=0 (uma repetição)
• RS: registo de endereço inicial das instruções a repetir, é automaticamente inicializado.
• RE: registo de endereço final das instruções a repetir, é automaticamente inicializado.
3ª
aula teórica
– RPTB
• Repete um bloco de instruções por um número especificado de vezes. A sua execução pode ser interrompida no atendimento a um pedido de “interrupt”. Um ciclo RPTB pode encapsular outro ciclo RPTB (“nested RPTB”). Neste caso deve-se prevenir o armazenamento dos registos críticos: RC, RE, RS e ST, por esta ordem, assim como o seu restauro pela ordem inversa.
– NOTA 1: Pode-se confirmar que existe um ciclo em curso testando o bit RM do registo ST.
– NOTA 2: É possível a conclusão prematura dos ciclos escrevendo um zero no registo RC ou no bit RM do registo ST.
– RPTS
• Repete a instrução seguinte a RPTS por um número especificado de vezes. Não pode ser interrompida na sequência do surgimento de um pedido de “interrupt” (mas caso isto seja desejável, há só que mudar de RPTS para RPTB).
– NOTA 1: a última instrução de um bloco de instruções a repetir não poderá ser Bcond, DBcond, CALL, CALLcond, TRAPcond, RETIcond, RETScond, IDLE, RPTB nem RPTS.
© AJF/FJR
Processamento Digital de Sinal em Tempo Real,
3ª aula teórica FEUP, 11 de M arço de 2005 23
– Exemplo 1
• Ilustra a troca dos elementos (N=64) de um vector equidistantes do seus extremos.
– Exemplo 2
• Ilustra a pesquisa do valor máximo dos elementos de um vector (N=148).
LDI @orig, ARØ ; início do vector
LDI ARØ, AR1 ; aqui não há conflito ! ADDI 63, AR1 ; fim do vector
LDI 31, RC ; itera 32 vezes RPTB CICLO
LDI *ARØ, RØ || LDI *AR1, R1
CICLO STI R1, *ARØ++(1) ; efectua troca || STI R0, *AR1--(1) ; efectua troca
LDI @orig, ARØ ; início do vector LDF *ARØ++(1), RØ ; inicializa MAX LDI 146, RC ; itera 147 vezes RPTB CICLO
CMPF *ARØ++(1), RØ ; testa se há novo MAX CICLO LDFLT *-ARØ(1), RØ ; actualiza novo MAX ...
© AJF/FJR
Processamento Digital de Sinal em Tempo Real,
3ª aula teórica FEUP, 11 de M arço de 2005 24
– Exemplo 3
• Acumula o produto, termo a termo, entre dois vectores de comprimento 512
– Exemplo 4
• Endereçamento indirecto em bit-reversed: permite criar uma sequência de acesso aos dados correspondente à ordem de “bit reversed”, o que evita operações explícitas de troca de dados. Exemplifica-se a cópia de um “buffer” de dados reais, de comprimento N, incluindo já a correcção de “bit-reversed”.
Real (0) Real (1) Real (2) Real (3)
. . .
Real (0) Real ( ) Real ( ) Real ( ). . .
AR1 ARØ sequencial bit reversedLDI @orig, ARØ LDI @dest, AR1 LDI N/2, IRØ LDF *ARØ++, RØ RPTS N-2 LDF *ARØ++(1), RØ || STF RØ, *AR1++(IRØ)B STF RØ, *AR1
LDI @vecA, ARØ ; aponta vector A LDI @vecB, AR1 ; aponta vector B
LDF Ø.Ø, RØ ; inicializa acumulador MPYF3 *ARØ++(1), *AR1++(1), R1 ; primeiro produto RPTS 51Ø ; itera 511 vezes MPYF3 *ARØ++(1), *AR1++(1), R1 ; nova multiplicação
|| ADDF3 R1, RØ, RØ ; acumula produto anterior ADDF R1, RØ ; acumula último produto
© AJF/FJR
Processamento Digital de Sinal em Tempo Real,
3ª aula teórica FEUP, 11 de M arço de 2005 25 Real (0) Imag (0) Real (1) Imag (1)
. . .
Real (0) Imag (0) Real ( ) Imag ( ). . .
AR1 ARØsequencial bit revers
ed
• Exemplifica-se a cópia em “bit reversed” de um “buffer” de dados complexos, de comprimento N, em que as partes real e imaginária surgem em posições alternadas.
LDI @orig, ARØ LDI @dest, AR1 LDI N, IRØ LDI 2, IR1 LDI N-2, RC LDF *+ARØ(1), R1 RPTB CICLO LDF *ARØ++(IR1), RØ || STF R1, *+AR1(1) CICLO LDF *+ARØ(1), R1 ; || STF RØ, *AR1++(IRØ)B ; LDF *ARØ, RØ ; || STF R1, *+AR1(1) ; STF RØ, *AR1
LDI @orig, ARØ LDI @dest, AR1 LDI 2, IR1 LDI N, IRØ LDI N-1, RC RPTB CICLO LDF *+ARØ(1), R1 || LDF *ARØ++(IR1), RØ CICLO STF R1, *+AR1(1) || STF RØ, *AR1++(IRØ)B
Outra solução, mais simples mas problemática, porquê ?
RØ R1 Re Im 3ª aula teórica
•
Operação em modo de salto (
BRANCH
)
– Há três tipos de saltos: normais, atrasados e atrasados condicionados.
• Normais (standard branches): esvaziam a cascata de operações associadasà execução de uma instrução (pipelining), antes de efectuar o salto do programa, de modo a facilitar a gestão da sua sequência. Este tipo de salto consome quatro ciclos de instrução, isto é, implica assim o desperdício de três ciclos de relógio de instrução.
– NOTA: como já visto, há sempre quatro fases de operações em cascata associadas à execução de uma instrução: o seu carregamento (fetch), a sua descodificação (decode), a leitura dos operandos (read) e finalmente a sua execução.
• Atrasados (delayed branches): em vez de esvaziar a cascata de operações (pipelining), executam as três instruções seguintes à instrução de BRANCH, antes de efectuar o salto. Esta solução evita o desperdício associado ao tipo anterior de salto. As instruções de salto atrasado são: BcondD, BRD,
© AJF/FJR
Processamento Digital de Sinal em Tempo Real,
3ª aula teórica FEUP, 11 de M arço de 2005 27
– Exemplo:
• Nota 1: Nenhuma das seguintes instruções poderá figurar no grupo das 3 instruções após a instrução do “delayed branch”: Bcond DBcondD BcondD IDLE BR IDLE2 BRD RETIcond CALL RETScond RPTS RPTB
DBcond CALLcond TRAPcond
• Nota 2 : os “delayed branches” inibem o atendimento a interrupções até se completarem as 3 instruções subsequentes aos “delayed branches”,
independentemente do salto condicional se concretizar ou não.
• Nota 3 : sempre que possível, deve-se procurar tirar partido de um “delayed
branch”, mesmo que para tal haja necessidade de incluir NOPS no grupo
das três instruções subsequentes a esse “delayed branch”. aqui há gralha !
© AJF/FJR
Processamento Digital de Sinal em Tempo Real,
3ª
aula teórica
FEUP, 11 de M
arço de 2005
28
•
Chamadas a subrotinas (
CALL, TRAP e RETURN
)
– As instruções do tipo CALL e TRAP permitem a chamada a uma
subrotina, sendo o regresso ao ponto inicial do código assegurado
através de uma instrução RETS (retorno normal a partir de subrotina) ou
RETI (retorno a partir de subrotina que foi invocada na sequência de uma
interrupção, o que tem como efeito repor a permissão de interrupção [1→ST(GIE)], no final da sua execução).– As instruções CALLcond e TRAPcond permitem condicionar a
execução de uma subrotina à verificação de uma condição e devem ter
por argumento:
• no caso de CALLcond: um deslocamento (expresso em 16 bits) em relação ao conteúdo do registo PC, ou a identificação de um registo contendo o endereço do início da subrotina.
• No caso de TRAPcond: o número (0 ≤ N ≤ 27) do vector de interrupção contendo o endereço da subrotina a executar.
tabela do vector de interrupções TRAP para o C31 quando este se encontra configurado no modo “Microcomputer / Boot-Loader”.
© AJF/FJR
Processamento Digital de Sinal em Tempo Real,
3ª
aula teórica
FEUP, 11 de M
arço de 2005
29
– Funcionalmente, as instruções CALL e TRAP são idênticas, excepto no
aspecto em que esta última, ao ser executada, inibe automaticamente
qualquer interrupção (até encontrar, por exemplo, uma instrução RETI).
•
Operações “Interlocked”
– Permitem comunicação directa entre dois processadores através de
dois pinos externos do C31: XFØ (configurado como pino de saída) e
XF1 (configurado como pino de entrada), o que viabiliza a
sincronização entre processadores e a decorrente possibilidade de
multiprocessamento.
Exemplo da forma mais simples de interligação:
– Há cinco instruções “interlocked”:
3ª
aula teórica
A execução de cada uma destas instruções é conjugada com a activação
do sinal em XFØ (indicando um pedido ou interrogação) e com a leitura do
sinal em XF1 (indicando uma autorização ou reconhecimento).
– Em aplicações envolvendo multiprocessamento, é comum a partilha de
memória global. Ilustra-se a seguir um exemplo da interligação entre
dois C3x com este objectivo:
© AJF/FJR
Processamento Digital de Sinal em Tempo Real,
3ª aula teórica FEUP, 11 de M arço de 2005 31
•
A operação de RESET
– É uma forma de interrupção por hardware, não mascarável, destinada a
repôr o processador num estado conhecido, através da colocação e alta
impedância da maior parte dos seus pinos, da inicialização dos
periféricos e de alguns registos internos do C3x.
– A activação do pino RESET juntamente com o pino MCBL/MP
determina se o arranque do DSP (C31) é em modo Microprocessador,
situação em que o vector de RESET se situa em ØØh, ou em modo
Microcomputador (Boot Loader), situação em que é automaticamente
carregado código a partir de uma de três possíveis endereços (1ØØØh,
4ØØØØØh, ou FFFØØØh) ou da porta série, para posterior execução
no C31.
© AJF/FJR
Processamento Digital de Sinal em Tempo Real,
3ª aula teórica FEUP, 11 de M arço de 2005 32
•
Interrupções
– Já foi visto na 4ª aula teórica (a partir do slide 8) que o C31 suporta várias
formas de interrupção (além do RESET):
• interrupções geradas externamente através de quatro linhas mascaráveis (INTØ, INT1, INT2, INT3),
• interrupções geradas internamente por:
– timers
– porto série
– instruções do tipo TRAPn, n=0, 1, 2, …, 27
e cuja prioridade é automaticamente estipulada, no caso de ocorrerem
diversas interrupções simultaneamente, de acordo com uma tabela.
Associadas a estas formas de interrupção existe um vector de
interrupções que contém os endereços das rotinas (ou uma instrução do
tipo BR remetendo para o endereço da rotina de atendimento no caso do C31 estar configurado no modo de Microcomputador/Boot-Loader) que servem ospedidos de interrupção.
• NOTA 1: Como o registo IF pode ser lido e escrito, todas as interrupções podem ser activadas por software.
© AJF/FJR
Processamento Digital de Sinal em Tempo Real,
3ª
aula teórica
FEUP, 11 de M
arço de 2005
33 • NOTA 2: No processo de atendimento a uma interrupção, a “flag”
correspondente a essa interrupção no registo IF é apagada e todas as interrupções são inibidas porque o bit GIE do registo ST é automaticamente colocado a zero. O que significa que se se pretender que uma rotina de atendimento seja, ela própria, interruptível, então deverá colocar-se o bit GIE a “1” na entrada da rotina de atendimento. Se isto não acontecer, então no final da rotina, a instrução RETI ou RETIcond coloca automaticamente o bit ST(GIE)=1.
• NOTA 3: Dado que o C31 conclui a execução das instruções que se
encontram na fase de “decode” e “read” da pipeline quando uma interrupção é reconhecida (o que tem como corolário a colocação do bit ST(GIE)=0) e antes da a atender, poderá resultar algo inesperado como haver permissão de
interrupção mesmo após a entrada numa rotina de atendimento de interrupção (se uma das duas instruções na fase de “decode” ou “read” colocar explicitamente o bit GIE a “um”). Isto obriga a precauções especiais, por exemplo, quando se altera o estado do registo ST quando o bit GIE está activado (ver manual do C3x, secção 7.7.4, “Interrupt Considerations”). De uma maneira geral, deve-se atentar a que, por causa da operação da pipeline:
– as três instruções imediatamente seguintes a uma instrução que desactiva o bit ST(GIE) ou que apagam o registo IE, podem, ainda assim, ser interrompidas. – As três instruções imediatamente seguintes a uma instrução que activa o bit
ST(GIE) ou que activam o registo IE, podem não ser interrompidas, ainda que haja um pedido pendente.
exemplo
3ª
aula teórica