//------------------------------------------------------ // char teclado(void) // // Descripción: // Explora el teclado matr<icial y devuelve la tecla // pulsada //------------------------------------------------------ char teclado(void) { //char tecla; BYTE fila, columna, fila_mask; static char teclas[4][4] = {{"123C"}, {"456D"}, {"789E"}, {"A0BF"}}; // Bucle de exploración del teclado while (TRUE) { // Excitamos una columna for (columna = NUM_COLS - 1; columna >= 0; columna--) { salida = salida & 0xFFF0; // Realizamos un AND binario con el valor actual de salida y 0xFFF0 para no interferir salida = salida | (EXCIT << columna); set16_puertoS (salida); // Se envía la excitación de columna retardo(20000); // Esperamos respuesta de optoacopladores // Exploramos las filas en busca de respuesta for (fila = NUM_FILAS - 1; fila >= 0; fila--) { fila_mask = EXCIT << fila; // Máscara para leer el bit de la fila actual if (lee16_puertoE() & fila_mask) { // Si encuentra tecla pulsada, while (lee_puertoE() & fila_mask); // Esperamos a que se suelte retardo(20000); // Retardo antirrebotes return teclas[fila][columna]; // Devolvemos la tecla pulsada } } // Siguiente columna } // Exploración finalizada sin encontrar una tecla pulsada } // Reiniciamos exploración }
//-------------------------------------- // void LCD_reset() // // Descripción: // Función de inicialización del LCD //-------------------------------------- void LCD_reset() { int i; retardo(RET_15MS); // Retardo inicial for(i = 0; i < 3; i++){ // Se repite 3 veces, LCD_inst(FS_8BITS); // Instrucción para funcionamiento en 8 bits retardo(RET_15MS); // Hay que esperar más de 4.1ms } }
//------------------------------------------------------ // void LCD_write(UWORD dato, LCD_TIPO tipo) // // Descripción: // Función para escribir en el LCD // // Parámetros: // char dato // instrucción o carácter a escribir en el display // LCD_TIPO tipo // LCD_CHAR si dato es un carácter a escribir // LCD_INST si dato es una instrucción para el LCD //------------------------------------------------------ void LCD_write(UWORD dato, LCD_TIPO tipo) { UWORD salida; if(tipo == LCD_CHAR){ dato = dato << 8; // El dato debe estar en los 8 bits más significativos } set16_puertoS(dato | tipo | BIT_ENABLE); // Enable + dato: Activamos LCD e indicamos el tipo de dato retardo(RET_3MS); set16_puertoS(dato | tipo); // Disable: carga el dato en el LCD retardo(RET_3MS); }
char* readPage(int absolutePageNumber) { retardo(); int page_size = getSwapPagesSize(); char *file_name = getSwapFileName(); FILE *fp = fopen(file_name, "r"); char* page = malloc(sizeof(char) * page_size); int position = absolutePageNumber * page_size; fseek(fp, position, SEEK_SET); fgets(page, page_size + 1, fp); return page; }
void writePage(int absolutePageNumber, char *content) { retardo(); int page_size = getSwapPagesSize(); char *file_name = getSwapFileName(); FILE *fp = fopen(file_name, "rb+"); int position = absolutePageNumber * page_size; fseek(fp, position, SEEK_SET); fwrite(content, sizeof(char), strlen(content), fp); fclose(fp); }
void calcularPorcentaje() { int i = 0; while (1) { i++; retardo(60); //duerme cada 60 segundos void sacaPorcentaje(t_cpu* cpu) { // 60 instrucciones ejecutadas equivale al 100% //en este if es para una instruccion que empezo antes de los 60s y terminara despues de estos if (cpu->estado == NO_TERMINO_RAFAGA && cpu->terminaInstruccion == NO_TERMINO) { ////esta ejecutando aun una instruccion, pero no ha terminado, entonces la sumo, esta en memoria incrementaInstPorcentaje(cpu); calculaAcumulado(cpu); //// cpu->retardoTotal = (uint8_t) dameDiferencia( //// cpu->inicioInstruccion, cpu->finInstruccion); // printf("acumuladoSegundos %f\n", cpu->acumuladoSegundos); // cpu->porcentajeUso = (uint8_t)(cpu->acumuladoSegundos * 100) // /60; // resetValPorcentaje(cpu); //lo reseteo porque luego cuando termine la instruccion se contara } //ya termino la rafaga // cpu->porcentajeUso = (uint8_t) ((cpu->cantInstEjecutadasPorcentaje * 100) // / instEquivalenteCienPorciento(configuracion->retardo)); pthread_mutex_lock(&mutexCPUPorcentaje); // cpu->porcentajeUso = (cpu->acumuladoSegundos * 100) // /60; // printf("cant Inst ejecutadas %d \n", // cpu->cantInstEjecutadasPorcentaje); // printf("acumuladoSegundos %f\n", cpu->acumuladoSegundos); // cpu->porcentajeUso = (cpu->acumuladoSegundos * 100) / 60; // if (cpu->porcentajeUso > 100) // cpu->porcentajeUso = 93.331133; // tiempo promedio que demora una instruccion double result = cpu->acumuladoSegundos / cpu->cantInstEjecutadasPorcentaje; //cuantas instrucciones se podrian ejecutar en 60 segundos int cienPorcien = redondea(result); // printf("max instrucciones que se pueden ejecutar %d \n", // cienPorcien); double resultadoPor = ((cpu->cantInstEjecutadasPorcentaje * 100) / cienPorcien); double parte_entera; modf(resultadoPor, &parte_entera); cpu->porcentajeUso =(int) parte_entera; // cpu->porcentajeUso = ((cpu->cantInstEjecutadasPorcentaje * 100) // / instEquivalenteCienPorciento(configuracion->retardo)); resetValPorcentaje(cpu); //calculo el inicio de la otra mitad de esta instruccion calculafecha(cpu); pthread_mutex_unlock(&mutexCPUPorcentaje); //muestra y loguea resultado puts( string_from_format( KRED "++++++++++++++++++++++"RESET "++++++++"KRED "+++++++++++++++++++++++++++\n" RESET)); puts(string_from_format("%s,\n", queCPUsoy(cpu))); puts(string_from_format("Para el minuto %d, \n", i)); puts( string_from_format( "el porcentaje de uso es de %i porciento. \n", cpu->porcentajeUso)); puts( string_from_format( KBLU "++++++++++++++++++++++"RESET "+++++++++"KBLU "++++++++++++++++++++++++++\n"RESET)); pthread_mutex_lock(&mutexCPULogs); log_info(logger, identificaCPU(queHiloSoy())); log_info(logger, "se ejecuta el calculo del porcentaje de la cpu"); log_info(logger, string_from_format("para el minuto %i \n", i)); log_info(logger, string_from_format("porcentaje de %i \n", cpu->porcentajeUso)); pthread_mutex_unlock(&mutexCPULogs); } list_iterate(procCPU->listaCPU, (void*) sacaPorcentaje); } }