Kleber Kruger / Mbed 2 deprecated FaultInjector

Dependencies:   mbed

Committer:
kleberkruger
Date:
Sat Sep 14 22:58:28 2013 +0000
Revision:
0:ef0a1a6d4a40
Fault injector system.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kleberkruger 0:ef0a1a6d4a40 1 /*
kleberkruger 0:ef0a1a6d4a40 2 * File: FaultsInjector.cpp
kleberkruger 0:ef0a1a6d4a40 3 * Author: Kleber Kruger
kleberkruger 0:ef0a1a6d4a40 4 *
kleberkruger 0:ef0a1a6d4a40 5 * Created on 11 de Junho de 2013, 09:20
kleberkruger 0:ef0a1a6d4a40 6 */
kleberkruger 0:ef0a1a6d4a40 7
kleberkruger 0:ef0a1a6d4a40 8 #include "FaultInjector.h"
kleberkruger 0:ef0a1a6d4a40 9
kleberkruger 0:ef0a1a6d4a40 10 MemoryRegion FaultInjector::memoryRegions[] = {
kleberkruger 0:ef0a1a6d4a40 11 {"32 kB local SRAM", 0x10004000, 0x10008000 - 1, (0x10008000 - 0x10004000)},
kleberkruger 0:ef0a1a6d4a40 12 {"16 kB AHB SRAM1", 0x20080000, 0x20084000 - 1, (0x20084000 - 0x20080000)},
kleberkruger 0:ef0a1a6d4a40 13 {"END MEMORY", 0, 0, 0}
kleberkruger 0:ef0a1a6d4a40 14 };
kleberkruger 0:ef0a1a6d4a40 15
kleberkruger 0:ef0a1a6d4a40 16 /**
kleberkruger 0:ef0a1a6d4a40 17 * Construtor da classe.
kleberkruger 0:ef0a1a6d4a40 18 * Configura as classes que podem ser criadas dinamicamente.
kleberkruger 0:ef0a1a6d4a40 19 */
kleberkruger 0:ef0a1a6d4a40 20 FaultInjector::FaultInjector() {
kleberkruger 0:ef0a1a6d4a40 21 srand(time(NULL));
kleberkruger 0:ef0a1a6d4a40 22 memorySize = 0;
kleberkruger 0:ef0a1a6d4a40 23 for (int i = 0; memoryRegions[i].size; i++) {
kleberkruger 0:ef0a1a6d4a40 24 memorySize += memoryRegions[i].size;
kleberkruger 0:ef0a1a6d4a40 25 }
kleberkruger 0:ef0a1a6d4a40 26 }
kleberkruger 0:ef0a1a6d4a40 27
kleberkruger 0:ef0a1a6d4a40 28 /**
kleberkruger 0:ef0a1a6d4a40 29 * Destrutor da classe.
kleberkruger 0:ef0a1a6d4a40 30 */
kleberkruger 0:ef0a1a6d4a40 31 FaultInjector::~FaultInjector() {
kleberkruger 0:ef0a1a6d4a40 32 }
kleberkruger 0:ef0a1a6d4a40 33
kleberkruger 0:ef0a1a6d4a40 34 /**
kleberkruger 0:ef0a1a6d4a40 35 * Função que injeta falhas no sistema.
kleberkruger 0:ef0a1a6d4a40 36 *
kleberkruger 0:ef0a1a6d4a40 37 * @param changedBytes - quantidade de bytes alterados dentro da faixa de endereço.
kleberkruger 0:ef0a1a6d4a40 38 * @param changedBits - quantidade de bits que foram alterados (0 (auto)... 8).
kleberkruger 0:ef0a1a6d4a40 39 */
kleberkruger 0:ef0a1a6d4a40 40 void FaultInjector::injectFaults(unsigned int changedBytes, unsigned int changedBits) {
kleberkruger 0:ef0a1a6d4a40 41 unsigned int addrStart, addrEnd;
kleberkruger 0:ef0a1a6d4a40 42 DigitalOut led3(LED3);
kleberkruger 0:ef0a1a6d4a40 43 //addrStart = (unsigned) getRandomIntPositive(0x10004000, 0x10008000 - 1);
kleberkruger 0:ef0a1a6d4a40 44 //addrEnd = getRandomIntPositive(addrStart, 0x10008000 - 1);
kleberkruger 0:ef0a1a6d4a40 45 addrStart = (unsigned) getRandomIntPositive(0, memorySize - 1);
kleberkruger 0:ef0a1a6d4a40 46 addrEnd = getRandomIntPositive(addrStart, memorySize - 1);
kleberkruger 0:ef0a1a6d4a40 47 led3 = 1;
kleberkruger 0:ef0a1a6d4a40 48 wait(0.3);
kleberkruger 0:ef0a1a6d4a40 49 led3 = 0;
kleberkruger 0:ef0a1a6d4a40 50 injectFaults(addrStart, addrEnd, changedBytes, changedBits);
kleberkruger 0:ef0a1a6d4a40 51 }
kleberkruger 0:ef0a1a6d4a40 52
kleberkruger 0:ef0a1a6d4a40 53 unsigned int FaultInjector::getByteMemory(unsigned int startAddr, unsigned int endAddr) {
kleberkruger 0:ef0a1a6d4a40 54 int i;
kleberkruger 0:ef0a1a6d4a40 55 unsigned int number, limit;
kleberkruger 0:ef0a1a6d4a40 56 number = getRandomIntPositive(startAddr, endAddr);
kleberkruger 0:ef0a1a6d4a40 57 limit = memoryRegions[0].size - 1;
kleberkruger 0:ef0a1a6d4a40 58 i = 0;
kleberkruger 0:ef0a1a6d4a40 59 while (number > limit) {
kleberkruger 0:ef0a1a6d4a40 60 limit += memoryRegions[i].size;
kleberkruger 0:ef0a1a6d4a40 61 i++;
kleberkruger 0:ef0a1a6d4a40 62 }
kleberkruger 0:ef0a1a6d4a40 63 return memoryRegions[i].startAddr + (number - limit);
kleberkruger 0:ef0a1a6d4a40 64 }
kleberkruger 0:ef0a1a6d4a40 65
kleberkruger 0:ef0a1a6d4a40 66 /**
kleberkruger 0:ef0a1a6d4a40 67 * Função que injeta falhas no sistema.
kleberkruger 0:ef0a1a6d4a40 68 *
kleberkruger 0:ef0a1a6d4a40 69 * @param addrStart - faixa de endereço inicial.
kleberkruger 0:ef0a1a6d4a40 70 * @param addrEnd - faixa de endereço final.
kleberkruger 0:ef0a1a6d4a40 71 * @param changedBytes - quantidade de bytes alterados dentro da faixa de endereço.
kleberkruger 0:ef0a1a6d4a40 72 * @param changedBits - quantidade de bits que foram alterados (0 (auto)... 8).
kleberkruger 0:ef0a1a6d4a40 73 */
kleberkruger 0:ef0a1a6d4a40 74 void FaultInjector::injectFaults(unsigned int addrStart, unsigned int addrEnd,
kleberkruger 0:ef0a1a6d4a40 75 unsigned int changedBytes, unsigned int changedBits) {
kleberkruger 0:ef0a1a6d4a40 76
kleberkruger 0:ef0a1a6d4a40 77 int count, temp, position;
kleberkruger 0:ef0a1a6d4a40 78 unsigned char *addr;
kleberkruger 0:ef0a1a6d4a40 79 char buffer[32];
kleberkruger 0:ef0a1a6d4a40 80 bool drawn[8]; // bits sorteados (para não alterar o mesmo bit mais de uma vez).
kleberkruger 0:ef0a1a6d4a40 81
kleberkruger 0:ef0a1a6d4a40 82 if (changedBytes < 1 || changedBytes > (addrEnd - addrStart))
kleberkruger 0:ef0a1a6d4a40 83 changedBytes = DEFAULT_CHANGED_BYTES;
kleberkruger 0:ef0a1a6d4a40 84
kleberkruger 0:ef0a1a6d4a40 85 if (changedBits > 8) // 0 para automático, 8 para alterar todos os bits
kleberkruger 0:ef0a1a6d4a40 86 changedBits = DEFAULT_CHANGED_BITS;
kleberkruger 0:ef0a1a6d4a40 87
kleberkruger 0:ef0a1a6d4a40 88 temp = changedBits;
kleberkruger 0:ef0a1a6d4a40 89
kleberkruger 0:ef0a1a6d4a40 90 LocalFileSystem local("local");
kleberkruger 0:ef0a1a6d4a40 91 FILE *fp = fopen("/local/falhas.txt", "a");
kleberkruger 0:ef0a1a6d4a40 92
kleberkruger 0:ef0a1a6d4a40 93 if (fp != NULL) {
kleberkruger 0:ef0a1a6d4a40 94 time_t seconds = time(NULL);
kleberkruger 0:ef0a1a6d4a40 95 strftime(buffer, 32, "%d/%m/%Y %H:%M:%S", localtime(&seconds));
kleberkruger 0:ef0a1a6d4a40 96
kleberkruger 0:ef0a1a6d4a40 97 fprintf(fp, "%s\n", buffer);
kleberkruger 0:ef0a1a6d4a40 98 // fprintf(fp, "Endereco inicial: %d\n", addrStart);
kleberkruger 0:ef0a1a6d4a40 99 // fprintf(fp, "Endereco final: %d\n", addrEnd);
kleberkruger 0:ef0a1a6d4a40 100 // fprintf(fp, "Bytes alterados: %d\n", changedBytes);
kleberkruger 0:ef0a1a6d4a40 101 // fprintf(fp, "Bits alterados: %d\n\n", changedBits);
kleberkruger 0:ef0a1a6d4a40 102
kleberkruger 0:ef0a1a6d4a40 103 for (int i = 0; i < changedBytes; i++) {
kleberkruger 0:ef0a1a6d4a40 104 char value[9];
kleberkruger 0:ef0a1a6d4a40 105 addr = (unsigned char *) getByteMemory(addrStart, addrEnd);
kleberkruger 0:ef0a1a6d4a40 106 itoa(*addr, value, 2);
kleberkruger 0:ef0a1a6d4a40 107
kleberkruger 0:ef0a1a6d4a40 108 fprintf(fp, "%d\n", i + 1);
kleberkruger 0:ef0a1a6d4a40 109 fprintf(fp, "Endereco (em byte): %p\n", addr);
kleberkruger 0:ef0a1a6d4a40 110 fprintf(fp, "Valor correto: %s\n", value);
kleberkruger 0:ef0a1a6d4a40 111
kleberkruger 0:ef0a1a6d4a40 112 if (changedBits == 0)
kleberkruger 0:ef0a1a6d4a40 113 temp = getRandomIntPositive(1, 8); // Valor 0 altera n bits automaticamente.
kleberkruger 0:ef0a1a6d4a40 114
kleberkruger 0:ef0a1a6d4a40 115 for (count = 0; count < 8; count++)
kleberkruger 0:ef0a1a6d4a40 116 drawn[count] = false;
kleberkruger 0:ef0a1a6d4a40 117
kleberkruger 0:ef0a1a6d4a40 118 count = 0;
kleberkruger 0:ef0a1a6d4a40 119 while (count < temp) {
kleberkruger 0:ef0a1a6d4a40 120 position = getRandomIntPositive(0, 7);
kleberkruger 0:ef0a1a6d4a40 121 if (drawn[position] != true) {
kleberkruger 0:ef0a1a6d4a40 122 drawn[position] = true;
kleberkruger 0:ef0a1a6d4a40 123 count++;
kleberkruger 0:ef0a1a6d4a40 124 (*addr) ^= (1 << position); // Altera um bit de um endereço (byte) de memória.
kleberkruger 0:ef0a1a6d4a40 125 }
kleberkruger 0:ef0a1a6d4a40 126 }
kleberkruger 0:ef0a1a6d4a40 127 itoa(*addr, value, 2);
kleberkruger 0:ef0a1a6d4a40 128 fprintf(fp, "Valor alterado: %s\n\n", value);
kleberkruger 0:ef0a1a6d4a40 129 }
kleberkruger 0:ef0a1a6d4a40 130 fclose(fp);
kleberkruger 0:ef0a1a6d4a40 131 }
kleberkruger 0:ef0a1a6d4a40 132 }