Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
FaultInjector.cpp@0:ef0a1a6d4a40, 2013-09-14 (annotated)
- Committer:
- kleberkruger
- Date:
- Sat Sep 14 22:58:28 2013 +0000
- Revision:
- 0:ef0a1a6d4a40
Fault injector system.
Who changed what in which revision?
| User | Revision | Line number | New 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 | } |