Sei sulla pagina 1di 8

1. Traer programas residentes tipeados de los textos especializados en algn lenguaje pequeo portable.

(asembler,basic,c std, pascal, etc)

Programa Residente en Memoria un programa residente o TSR( Terminate and Stay R e s i d e n t ) e s u n programa normal y corriente que, tras ser cargado, permanece parcial ototalmente en memoria al finalizar su ejecucin. Ello es posible utilizandouna funcin especfica del sistema operativo. Los programas r esidentespueden ser activados mediante una combinacin de teclas o bien actuar concierta periodicidad, asociados a la interrupcin del temporizador. Tambin pueden interceptar funciones del DOS o de la BIOS para cambiar om o d i f i c a r s u f u n c i o n a m i e n t o . A l f i n a l , c a s i s i e m p r e r e s u l t a t o t almentei n e v i t a b l e d e s v i a r a l g u n a i n t e r r u p c i n h a c i a u n a n u e v a r u t i n a q u e l a gestione, con objeto de activar el programa residente PROGRAMAS 1 Primer Programa. Este primer programa en C colocar de manera perpetua mi nombre Jorge Llanos haciendo un pseudoscroll horizontal en la esquina superior derecha. #include <dos.h> #include <conio.h> extern unsigned _heaplen=1024; extern unsigned _stklen=512; void interrupt (*OldTic)(void); void KillTic(void); void interrupt Tic() { unsigned int (far *pantalla)[80]; static int prueba=0;int i; static char cad[24] = "Jorge Llanos "; pantalla= MK_FP(0xb800,0); for(i=55;i<=79;i++){ pantalla[0][i]=cad[prueba%=24] + 0x7900; prueba++; } prueba++; if ((peekb(0x40,0x17) & 12) == 12)KillTic(); OldTic(); } void AliveTic(void) { OldTic = getvect (0x1c); setvect (0x1c,Tic); keep(0, (_SS+(_SP/16) - _psp)); } void KillTic(void) { setvect (0x1c,OldTic); freemem(peek(_psp,44));

freemem(_psp); } void main(void) { clrscr(); cprintf(" Pulsa <CTRL> + <ALT> para desistalar"); AliveTic(); } 2 ACCESO A LOS PUERTOS DE E/S. int inp (int puerto); /* leer del puerto E/S una palabra (16 bits) */ int inport (int puerto); /* leer del puerto E/S una palabra (16 bits) */ unsigned char inportb (int puerto); /* leer del puerto E/S un byte (8 bits) */ int outp (int puerto, int valor); /* enviar al puerto E/S una palabra (16 bits) */ void outport (int puerto, int valor); /* enviar al puerto E/S una palabra (16 bits) */ void outportb (int puerto, unsigned char valor); /* enviar al puerto E/S un byte
(8 bits) */

3 ACCESO A LA MEMORIA.
int peek (unsigned seg, unsigned off); /* leer la palabra (16 bits) en seg:off */ char peekb (unsigned seg, unsigned off); /* leer el byte (8 bits) en seg:off */ void poke (unsigned seg, unsigned off, int valor); /* poner palabra valor (16 bits) en seg:off */ void pokeb (unsigned seg, unsigned off, char valor); /* poner byte valor (8 bits) en seg:off */ unsigned FP_OFF (void far *puntero); /* obtener offset de variable tipo far */ unsigned FP_SEG (void far *puntero); /* obtener segmento de variable tipo far */ void far *MK_FP (unsigned seg, unsigned off); /* convertir seg:off en puntero tipo far */

4 LLAMADA A INTERRUPCIONES. Para llamar a las interrupciones es conveniente conocer antes ciertas estructuras y uniones. struct WORDREGS { unsigned int ax, bx, cx, dx, si, di, cflag, flags; }; struct BYTEREGS { unsigned char al, ah, bl, bh, cl, ch, dl, dh; }; union REGS { struct WORDREGS x; struct BYTEREGS h; };

struct SREGS { unsigned int es; unsigned int cs; unsigned int ss; unsigned int ds; }; struct REGPACK { unsigned r_ax, r_bx, r_cx, r_dx; unsigned r_bp, r_si, r_di, r_ds, r_es, r_flags; }; 2 .-Describa la direccin base del reloj de tiempo real de la PC y realizar un programa para poder tener acceso a dicho reloj en lectura y escritura. Un reloj en tiempo real (en ingls, real-time clock, RTC), es un reloj de un ordenador, incluido en un circuito integrado, que mantiene la hora actual. Aunque el trmino normalmente se refiere a dispositivos en ordenadores personales, servidores y sistemas embebidos, los RTCs estn presentes en la mayora de los aparatos electrnicos que necesitan guardar el tiempo exacto. 2. 1 Proposito Aunque controlar el tiempo puede hacerse sin un RTC, usar uno tiene beneficios:

Bajo consumo de energa (importante cuando est funcionando con una pila) Libera de trabajo al sistema principal para que pueda dedicarse a tareas ms crticas Algunas veces ms preciso que otros mtodos 2.2 Fuente de Alimentacin Los RTCs a menudo tienen una fuente de alimentacin alternativa, por lo que pueden seguir midiendo el tiempo mientras la fuente de alimentacin principal est apagada o no est disponible. Esta fuente de alimentacin alternativa es normalmente una batera de litio en los sistemas antiguos, pero algunos sistemas nuevos usan un supercapacitor,2 porque son recargables y pueden ser soldados. La fuente de alimentacin alternativa tambin puede suministrar energa a una Memoria RAM dentro del mismo RTC, que generalmente almacena la configuracin de la BIOS de laplaca base. #include &lt;time.h> #include &lt;dos.h> #include &lt;mem.h> #include &lt;stdlib.h> #include &lt;stdio.h> #include &lt;fcntl.h> #include &lt;sys\stat.h> #define tam_pila 3000 /*tamao pila auxiliar*/ #define retardo_por_defecto 60 #define tick 18 /*parte entera de 18.2 que es el tick del reloj. Le quito el 0.2 para no hacer operaciones con decimales dentro del TSR */ #define CLOCK_INTERRUPT 0x08

/* reduce heaplength and stacklength to make a smaller program in memory */ extern unsigned _heaplen = 1024; extern unsigned _stklen = 512; void interrupt nueva_isr_reloj (void); void descargar_tsr(void); /****** Variables globales **************/ void interrupt (*oldint_clk)(void); /*direcciones de las ISR originales.*/ int retardo; /*retardo en segundos que le aplicamos*/ int tiempo; /*contador del tiempo que falta para la activacion*/ int fh; unsigned byteswritten; volatile char activo; /*boolean. Indica si salvapantallas activado.*/ unsigned char pila[tam_pila]; /*pila auxiliar*/ volatile unsigned int sp,ss; void main(int argc, char *argv[]) { activo=0; tiempo=0; if (argc==2) retardo=(atoi(argv[1])); /*retardo en segundos*/ else retardo=retardo_por_defecto; oldint_clk = getvect(CLOCK_INTERRUPT); _AX=0x1357; oldint_clk(); if (_AX==0x7531) { printf ("\nPrograma ya activado\n"); exit(0); } setvect(CLOCK_INTERRUPT, nueva_isr_reloj); keep(0, (_SS + (_SP/16) - _psp) + 100 ); } void interrupt nueva_isr_reloj(void) { if (tiempo&lt;=tick*retardo) /*No ha llegado al lmite de temporizacin.*/ { tiempo++; if (tiempo % 18 == 0) { asm cli; activo = !activo; if ((fh = open( "c:\\temp\\finwd.txt", O_RDWR , S_IREAD | S_IWRITE )) != -1 ) { write( fh, "Fin de xxxxxxxx", 16); close(fh); descargar_tsr();

} asm sti; } } else descargar_tsr(); oldint_clk(); } void descargar_tsr() { setvect (CLOCK_INTERRUPT, oldint_clk); freemem (_psp); } 3. Como podemos programar alarmas de acuerdo al uso del reloj de tiempo real de la PC. Traer programa de alarmas. Casi todas las computadoras modernas tienen el potencial de usar miles de programas diferentes y cada programa puede realizar cualquier nmero de tareas diferentes. Ciertamente puedes encontrar un programa que funcione como una alarma o una radio o programa de msica con horario. Si quieres usar tu computadora porttil como radio despertador, algunos te preguntarn por qu simplemente no compras un despertador barato. Los beneficios de usar tu porttil incluyen permitirte conseguir estaciones de radio de todo el mundo o usar programas que puedan tener otras opciones como estimulo visual o usar msica grabada digitalmente. Instrucciones Busca y descarga un programa de alarma que puedes encontrar en sitios como download.cnet.com o descarga un programa como Alarm by Blue Five Software. Tambin puedes usar el planificador de Microsoft para agendar un programa para que comience a una hora determinada. Encuentra y descarga un reproductor de msica. Si eliges programar un programa, puedes usar un programa como iTunes para comenzar a cierta hora y poner msica. Tambin puedes programar el Explorer para comenzar y abrir una pgina web que tenga una estacin de radio en lnea. Puedes usar radiotime.com para encontrar estaciones de radio en lnea. Establece el temporizador para la hora en la que quieras despertar. Asegrate de que tu porttil est encendida para que el programa comience a tiempo. Sube el volumen lo ms alto posible para que puedas escucharlo y despertar.
#include <stdio.h> #include <Windows.h> #include <ctime> #include <cstdlib> #include <iostream> using namespace std; int main() {

//Estructura para controlar la parte de fecha y hora SYSTEMTIME st; //Diferencia horaria int zonahoraria = 3; int hora = 0; //Iniciamos el temporizador while (true) { //Para el while cada 1 segundo sino funcionara // a la velocidad que le permita el microprocesador Sleep(1000); //Tomamos fecha y hora del sistema GetSystemTime(&st); //Es necesario para establecer nuestra hora de acuerdo //a la zona horaria hora = st.wHour - zonahoraria; //Solo para tener una referencia de control visual printf("Fecha:%d-%d-%d Hora:%d:%d:%d\n", st.wYear,st.wMonth,st.wDay, hora,st.wMinute,st.wSecond); //Condicional if ((st.wYear == 2012)&& (st.wMonth == 11) && (st.wDay == 11) && //Aqu debes poner la hora que tienes en el reloj de tu sistema (hora == 10) && //Aqui pone un minuto despues del reloj de tu sistema //Y ejecuta el programa y espera (st.wMinute == 06) && (st.wSecond == 30)) { //Mostramos el alerta MessageBox(NULL, "Alerta programada por Elinv!", "Elinv temporizador!", MB_OK); //Salimos del ciclo y del programa // tambin podramos haber usado break; //o una condicional que desactive esta alerta solamente //Permitiendo que el bucle continue return 0; } } return 0; } /* //Para el caso de Buenos Aires que es -3

typedef struct _SYSTEMTIME { WORD wYear; WORD wMonth; WORD wDayOfWeek; WORD wDay; WORD wHour; WORD wMinute; WORD wSecond; WORD wMilliseconds; } */

4. Describir las interrupciones por hardware usadas en la PC cuales estn ocupadas y cuales disponibles. En el contexto de la informtica, una interrupcin (del ingls Interrupt Request, tambin conocida como peticin de interrupcin) es una seal recibida por el procesador de un ordenador, indicando que debe "interrumpir" el curso de ejecucin actual y pasar a ejecutar cdigo especfico para tratar esta situacin. Una interrupcin es una suspensin temporal de la ejecucin de un proceso, para pasar a ejecutar una subrutina de servicio de interrupcin, la cual, por lo general, no forma parte del programa, sino que pertenece al sistema operativo o al BIOS). Una vez finalizada dicha subrutina, se reanuda la ejecucin del programa. Las interrupciones surgen de la necesidad que tienen los dispositivos perifricos de enviar informacin al procesador principal de un sistema informtico. La primera tcnica que se emple para esto fue el polling, que consista en que el propio procesador se encargara de sondear los dispositivos perifricos cada cierto tiempo para averiguar si tena pendiente alguna comunicacin para l. Este mtodo presentaba el inconveniente de ser muy ineficiente, ya que el procesador consuma constantemente tiempo y recursos en realizar estas instrucciones de sondeo. El mecanismo de interrupciones fue la solucin que permiti al procesador desentenderse de esta problemtica, y delegar en el dispositivo perifrico la responsabilidad de comunicarse con l cuando lo necesitara. El procesador, en este caso, no sondea a ningn dispositivo, sino que queda a la espera de que estos le avisen (le "interrumpan") cuando tengan algo que comunicarle (ya sea un evento, una transferencia de informacin, una condicin de error, etc.). 4.1 Interrupciones de hardware Las interrupciones de hardware son aquellas interrupciones que se producen como resultado de, por lo general, una operacin de E/S. No son producidas por ninguna instruccin de un programa sino por las seales que emiten

los dispositivos perifricos para indicarle al procesador que necesitan ser atendidos. Cuando el microprocesador accede a un perifrico (disco duro, puerto de comunicacin...), puede transcurrir algn tiempo antes de que los datos sean obtenidos o transmitidos. La solucin ms simple es esperar hasta recibir los datos o hasta que se haya efectuado la transmisin (polling), pero esta solucin bloquea todos los programas en ejecucin, y eso no puede admitirse en un sistema multitarea. Por ello, en los sistemas modernos se prefiere un funcionamiento mediante interrupciones, ya que stas permiten mejorar la productividad del procesador, de forma que este ltimo puede ordenar una operacin de E/S y, en lugar de tener que realizar una espera activa, se puede dedicar a atender a otro proceso o aplicacin hasta que el dispositivo est de nuevo disponible, siendo dicho dispositivo el encargado de notificar al procesador mediante la lnea de interrupcin que ya est preparado para continuar/terminar la operacin de E/S. 4.2 funcionamiento del mecanismo de interrupciones Todos los dispositivos que deseen comunicarse con el procesador por medio de interrupciones deben tener asignada una lnea nica capaz de avisar al CPU cuando le requiere para realizar una operacin. Esta lnea se denomina IRQ ("Interrupt ReQuest" o peticin de interrupcin). Las IRQ son lneas que llegan al controlador de interrupciones, un componente de hardware dedicado a la gestin de las interrupciones, y que puede estar integrado en el procesador principal o ser un circuito separado conectado al mismo. El controlador de interrupciones debe ser capaz de habilitar o inhibir las lneas de interrupcin y establecer prioridades entre las mismas. Cuando varias lneas de peticin de interrupcin se activan a la vez, el controlador de interrupciones utilizar estas prioridades para escoger la interrupcin sobre la que informar al procesador principal. Tambin puede darse el caso de que una rutina de tratamiento de interrupcin sea interrumpida para realizar otra rutina de tratamiento de una interrupcin de mayor prioridad a la que se estaba ejecutando; aunque hay interrupciones que no se pueden deshabilitar (conocidas como interrupciones no enmascarables o NMI). Un procesador principal que no tenga un controlador de interrupciones integrado, suele tener una nica lnea de interrupcin llamada habitualmente INT. Esta lnea es activada por el controlador de interrupciones cuando tiene una interrupcin que servir. Al activarse esta lnea, el procesador consulta los registros del controlador de interrupciones para averiguar cual IRQ hay que atender. A partir del nmero del IRQ busca en la tabla de vectores de interrupcin la direccin de la rutina a la que debe llamar para atender la peticin del dispositivo asociado a dicha IRQ.

Potrebbero piacerti anche