Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
tinyos-rtos — RTOS ultraleve para IoT com escalonamento preemptivo, TLS/DTLS, MQTT, CoAP, compatibilidade POSIX e proteção de memória baseada em MPU. Kernel com menos de 10 KB. | Kitploit
Ferramentas/GitHubGitHub/cmc-labo/tinyos-rtos
Segurança de Sistemas EmbarcadosSegurança IoTSegurança de RedeHacking de HardwareCriptografiaSegurança de HardwareAnálise de Firmware
GitHubcmc-labo/tinyos-rtos

tinyos-rtos

RTOS ultraleve para IoT com escalonamento preemptivo, TLS/DTLS, MQTT, CoAP, compatibilidade POSIX e proteção de memória baseada em MPU. Kernel com menos de 10 KB.

Ver Repositório
2358há 3 mesesRevisado pelo Kitploit

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

TinyOS — RTOS Ultra-Leve para IoT

Um sistema operacional em tempo real ultra-leve para dispositivos IoT e embarcados com recursos limitados.
Kernel com footprint inferior a 10 KB, RAM mínima de 2 KB, escalonamento preemptivo baseado em prioridade.


Recursos

CategoriaDetalhes
KernelEscalonamento preemptivo baseado em prioridade (256 níveis), round-robin dentro da mesma prioridade, busca de prioridade O(1) via bitmap, herança de prioridade
SincronizaçãoMutex (com herança de prioridade), semáforo, variável de condição, grupos de eventos, filas de mensagens
Temporizadores de SoftwareDisparo único e recarga automática, precisão de milissegundos, alteração de período em tempo de execução
MemóriaAlocador first-fit com coalescência imediata (heap de 8 KB, alinhado a 8 bytes), detecção de estouro de pilha, marca d'água alta por tarefa
ShellShell interativo VT100 — 23 comandos integrados, histórico de comandos (↑↓), preenchimento com Tab, editor de linha completo
Compatibilidade POSIXpthreads (criar/juntar/destacar/sair, mutex, var. cond.) · API de socket BSD (socket/bind/listen/accept/connect/send/recv, inet_pton/ntop, htons/htonl)
Sistema de ArquivosFS em dispositivo de bloco com journaling (WAL, recuperação de falhas), compartilhamento de blocos COW, snapshots atômicos, API similar à POSIX
RedeEthernet, IPv4, ICMP, UDP, TCP, cliente/servidor HTTP, DNS
TLS / DTLSTLS 1.2/1.3 sobre TCP, DTLS 1.2 sobre UDP (backend mbedTLS)
MQTTMQTT 3.1.1 completo — QoS 0/1/2 com tabela de retransmissão em voo, fila offline, reconexão automática com back-off exponencial
CoAPCliente/servidor compatível com RFC 7252, padrão observe
OTAAtualizações de firmware em partições A/B, verificação CRC32, reversão
WatchdogWatchdog de hardware e software, monitoramento de tempo limite por tarefa
EnergiaModos Idle / Sleep / Deep-sleep, idle sem ticks, escalonamento de frequência da CPU
SegurançaProteção de memória baseada em MPU, suporte a boot seguro
HALCamada de Abstração de Hardware genérica — ARM Cortex-M / RISC-V / AVR; seleção de arquitetura em tempo de compilação, tabelas de operação periférica

Hardware Suportado

ArquiteturaExemplos
ARM Cortex-M (M0/M0+/M3/M4/M7)STM32, nRF52, Raspberry Pi Pico
RISC-V (RV32I)ESP32-C3
AVR (experimental)ATmega

Início Rápido

Pré-requisitos```bash

ARM cross-compiler (required)

sudo apt-get install -y gcc-arm-none-eabi binutils-arm-none-eabi

QEMU ARM emulator (optional — for running without hardware)

sudo apt-get install -y qemu-system

root@kitploit:~
Verificar instalação:```bash
arm-none-eabi-gcc --version   # 10.x or later
qemu-system-arm --version     # 6.x or later

Compilar```bash

Default example (blink_led) — ARM Cortex-M4

make

Target a different architecture (auto-selects toolchain and HAL)

make ARCH=cortex-m0 # Cortex-M0/M0+ make ARCH=cortex-m7 # Cortex-M7 make ARCH=riscv32 # RISC-V RV32I (uses riscv32-unknown-elf-gcc) make ARCH=avr5 # AVR ATmega (uses avr-gcc)

Specific example

make EXAMPLE=blink_led # LED blink + task scheduler demo make EXAMPLE=event_groups # Event group AND/OR/NOT/SYNC demo make EXAMPLE=iot_sensor # Multi-sensor IoT node make EXAMPLE=shell_demo # Interactive UART shell make EXAMPLE=mqtt_demo # MQTT publish/subscribe make EXAMPLE=condition_variable # Producer/consumer

Convenience aliases

make example-blink make example-events make example-shell make example-mqtt make example-iot

Build output

make size # Print ROM/RAM usage

root@kitploit:~
Build artifacts are placed in `build/`:

| Arquivo | Descrição |
|---|---|
| `build/tinyos.elf` | Imagem ELF com símbolos de depuração |
| `build/tinyos.bin` | Binário bruto para gravação |
| `build/tinyos.map` | Mapa do linker (tamanhos de símbolos) |

### Executar no QEMU

TinyOS executa no alvo QEMU `mps2-an385` (ARM Cortex-M3, 4 MB de flash, 4 MB de RAM):```bash
# Run indefinitely (Ctrl-A X to quit)
qemu-system-arm \
    -machine mps2-an385 \
    -cpu cortex-m3 \
    -nographic \
    -kernel build/tinyos.elf

# Run for a fixed duration (e.g. 10 seconds)
timeout 10 qemu-system-arm \
    -machine mps2-an385 \
    -cpu cortex-m3 \
    -nographic \
    -kernel build/tinyos.elf

# Debug: trace interrupts
qemu-system-arm \
    -machine mps2-an385 \
    -cpu cortex-m3 \
    -nographic \
    -d int \
    -kernel build/tinyos.elf

Saída esperada do rastreamento de interrupção: linhas repetidas successful exception return confirmam que o escalonador está em execução, o SysTick está funcionando e as mudanças de contexto PendSV estão sendo concluídas corretamente.

Flashear no Hardware```bash

OpenOCD (STM32 example)

openocd -f interface/stlink.cfg -f target/stm32f4x.cfg
-c "program build/tinyos.bin verify reset exit 0x08000000"

pyOCD (generic ARM Cortex-M)

pyocd flash --target cortex_m build/tinyos.bin

root@kitploit:~
### Compilar com TLS (mbedTLS)

O suporte a TLS é ativado automaticamente quando o mbedTLS está presente em `~/mbedtls`.
Para usar um caminho diferente:```bash
# Clone and build mbedTLS
git clone https://github.com/Mbed-TLS/mbedtls ~/mbedtls
make -C ~/mbedtls

# Build TinyOS with TLS
make MBEDTLS_DIR=~/mbedtls

Exemplo de tarefa mínima:```c #include "tinyos.h"

void my_task(void param) { while (1) { / work */ os_task_delay_ms(100); } }

int main(void) { tcb_t task; os_init(); os_task_create(&task, "my_task", my_task, NULL, PRIORITY_NORMAL); os_start(); }

root@kitploit:~
---

## Visão Geral da API

### Gerenciamento de Tarefas```c
os_task_create(tcb, name, entry, param, priority)
os_task_delete(task)
os_task_suspend(task) / os_task_resume(task)
os_task_delay(ticks) / os_task_delay_ms(ms)
os_task_set_priority(task, priority)
os_task_get_stats(task, stats)
os_task_get_stats_by_index(index, stats)   /* iterate all tasks by index */
os_task_find_by_name(name)                 /* returns tcb_t*, NULL if not found */
os_get_system_stats(stats)
os_get_memory_stats(&free, &used, &allocs, &frees)

Sincronização```c

os_mutex_init(mutex) / os_mutex_lock(mutex, timeout) / os_mutex_unlock(mutex) os_semaphore_init(sem, count) / os_semaphore_wait(sem, timeout) / os_semaphore_post(sem) os_cond_init(cond) / os_cond_wait(cond, mutex, timeout) os_cond_signal(cond) / os_cond_broadcast(cond) os_event_group_set_bits(eg, bits) / os_event_group_wait_bits(eg, bits, opts, out, timeout) os_queue_init(q, buf, item_size, max) / os_queue_send(q, item, timeout) os_queue_receive(q, item, timeout) / os_queue_peek(q, item, timeout)

root@kitploit:~
### Temporizadores```c
os_timer_create(timer, name, type, period_ms, callback, param)
os_timer_start(timer) / os_timer_stop(timer) / os_timer_reset(timer)
os_timer_change_period(timer, ms) / os_timer_get_remaining_ms(timer)

Shell```c

/* Register custom commands before calling shell_start() */ shell_register_cmd(name, handler_fn, help_text)

/* Provide UART I/O callbacks and start the shell task */ shell_io_t io = { .getc = uart_getc, .puts = uart_puts }; shell_start(&io)

/* Change the prompt at any time */ shell_set_prompt("mydevice> ")

/* Execute a single line programmatically */ shell_exec(line)

root@kitploit:~
**Exemplo de comando personalizado:**```c
static int cmd_led(int argc, char *argv[]) {
    if (argc < 2) return 1;  /* non-zero → prints usage */
    bool on = (strcmp(argv[1], "on") == 0);
    gpio_write(LED_PIN, on);
    return 0;
}

/* In main(), before shell_start(): */
shell_register_cmd("led", cmd_led, "led <on|off>  Toggle LED");

Comandos Internos do Shell

Atalhos do editor de linha:

Configuração do Shell (include/tinyos/shell.h):```c #define SHELL_MAX_COMMANDS 32 /* max registered commands / #define SHELL_LINE_MAX 128 / max input line length (bytes) / #define SHELL_ARGV_MAX 16 / max arguments per command / #define SHELL_HISTORY_DEPTH 8 / command history entries */

root@kitploit:~
### Rede```c
net_init(driver, config) / net_start()
net_socket(type) / net_bind(sock, addr) / net_connect(sock, addr, timeout_ms)
net_send(sock, data, len, timeout_ms) / net_recv(sock, buf, len, timeout_ms)
net_sendto(sock, data, len, addr) / net_recvfrom(sock, buf, len, addr)
net_close(sock)
net_ping(dest_ip, timeout_ms, rtt)
net_dns_resolve(hostname, ip, timeout_ms)
net_http_get(url, response, timeout_ms)
net_http_post(url, content_type, body, len, response, timeout_ms)

Compatibilidade POSIX

O TinyOS fornece duas camadas finas de compatibilidade que permitem que código portável padrão seja compilado e executado no TinyOS com mudanças mínimas.

pthreads (include/tinyos/posix_threads.h)

Adicione src/posix/posix_threads.c ao seu build.```c #include "tinyos/posix_threads.h"

/* ── Thread ── / pthread_t tid; pthread_attr_t attr; pthread_attr_init(&attr); tinyos_pthread_attr_setpriority(&attr, PRIORITY_NORMAL); / TinyOS extension / pthread_create(&tid, &attr, my_fn, arg); pthread_join(tid, &retval); pthread_detach(tid); / free resources automatically on exit / pthread_exit(retval); / terminate calling thread / pthread_self(); / handle of calling thread */

/* ── Mutex ── / pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock(&mtx); pthread_mutex_trylock(&mtx); / returns EBUSY if already locked */ pthread_mutex_unlock(&mtx);

/* ── Condition variable ── / pthread_cond_t cond = PTHREAD_COND_INITIALIZER; pthread_cond_wait(&cond, &mtx); pthread_cond_timedwait(&cond, &mtx, &abstime); / abstime relative to boot */ pthread_cond_signal(&cond); pthread_cond_broadcast(&cond);

root@kitploit:~
| Conceito | Mapeado para |
|---|---|
| `pthread_t` | Índice em um pool interno de slots `tcb_t` do TinyOS |
| `pthread_mutex_t` | Incorpora `mutex_t` diretamente (inicialização zero / `PTHREAD_MUTEX_INITIALIZER` válido) |
| `pthread_cond_t` | Incorpora `cond_var_t` diretamente (inicialização zero / `PTHREAD_COND_INITIALIZER` válido) |
| `pthread_join` | Aguarda por um `semaphore_t` por thread, postado por `pthread_exit` |

**Não suportado:** `pthread_cancel`, armazenamento local de thread (`pthread_key_*`),
mutexes recursivos (retorna `ENOTSUP`).

**Configuração** (`include/tinyos/posix_threads.h`):```c
#define PTHREAD_MAX_THREADS  MAX_TASKS  /* max concurrent pthreads */

BSD Sockets (include/tinyos/posix_socket.h)

Adicione src/posix/posix_socket.c ao seu build.```c #include "tinyos/posix_socket.h"

/* ── TCP server ── */ int srv = socket(AF_INET, SOCK_STREAM, 0);

int reuse = 1; setsockopt(srv, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));

struct sockaddr_in addr = { .sin_family = AF_INET, .sin_port = htons(8080), .sin_addr = { htonl(INADDR_ANY) }, }; bind(srv, (struct sockaddr *)&addr, sizeof(addr)); listen(srv, 4);

struct sockaddr_in peer; socklen_t plen = sizeof(peer); int client = accept(srv, (struct sockaddr )&peer, &plen); recv(client, buf, sizeof(buf), 0); send(client, response, response_len, 0); posix_sock_close(client); / or define TINYOS_POSIX_WRAP_CLOSE to use close() */ posix_sock_close(srv);

/* ── TCP client ── */ int fd = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in dest = { .sin_family = AF_INET, .sin_port = htons(80), .sin_addr = { inet_addr("192.168.1.1") }, }; connect(fd, (struct sockaddr *)&dest, sizeof(dest)); send(fd, request, request_len, 0); recv(fd, buf, sizeof(buf), 0); posix_sock_close(fd);

/* ── UDP ── */ int udp = socket(AF_INET, SOCK_DGRAM, 0); sendto(udp, data, len, 0, (struct sockaddr *)&dest, sizeof(dest)); recvfrom(udp, buf, sizeof(buf), 0, (struct sockaddr *)&src, &srclen); posix_sock_close(udp);

/* ── Address utilities ── / htons(port) / htonl(addr) / ntohs(n) / ntohl(n) inet_addr("192.168.1.1") / → in_addr_t, network byte order / inet_ntoa(in) / → "192.168.1.1" (static buffer) */ inet_pton(AF_INET, "192.168.1.1", &in_addr) inet_ntop(AF_INET, &in_addr, buf, sizeof(buf))

root@kitploit:~
| Chamada BSD | Mapeada para |
|---|---|
| `socket()` | `net_socket()` |
| `bind()` | `net_bind()` |
| `listen()` | `net_listen()` |
| `accept()` | `net_accept()` |
| `connect()` | `net_connect()` |
| `send()` / `recv()` | `net_send()` / `net_recv()` |
| `sendto()` / `recvfrom()` | `net_sendto()` / `net_recvfrom()` |
| `posix_sock_close()` | `net_close()` |

**Opções `setsockopt` suportadas:**

| Opção | Efeito |
|---|---|
| `SO_REUSEADDR` | Aceito; sem operação (sempre reutilizável no TinyOS) |
| `SO_RCVTIMEO` | Define tempo limite de recebimento por socket (struct timeval → ms) |
| `SO_SNDTIMEO` | Define tempo limite de envio/conexão por socket |

**Redirecionamento de `close()`:** defina `TINYOS_POSIX_WRAP_CLOSE` antes de incluir o
cabeçalho para mapear `close(fd)` → `posix_sock_close(fd)`.

**Não suportados:** `select` / `poll` / `epoll`, modo não bloqueante (`O_NONBLOCK`),
IPv6 (`AF_INET6` retorna `EAFNOSUPPORT`).

---

### TLS / DTLS

TLS 1.2/1.3 sobre TCP e DTLS 1.2 sobre UDP apoiados pelo **mbedTLS**.  
Habilite em tempo de compilação com `-DTINYOS_TLS_ENABLE` e vincule ao mbedTLS.```c
/* Client (TLS over TCP) */
tls_context_t tls;
tls_config_t  cfg = TLS_CONFIG_DEFAULT_CLIENT;
cfg.ca_cert     = ca_cert_pem;
cfg.ca_cert_len = sizeof(ca_cert_pem);
tls_init(&tls, &cfg);

net_socket_t sock = net_socket(SOCK_STREAM);
net_connect(sock, &broker_addr, 5000);
tls_connect(&tls, sock, "example.com", 5000);

tls_send(&tls, data, len);
tls_recv(&tls, buf, sizeof(buf), 5000);
tls_close(&tls);

/* Server (TLS accept) */
tls_config_t srv_cfg = TLS_CONFIG_DEFAULT_SERVER;
srv_cfg.cert     = server_cert_pem;
srv_cfg.cert_len = sizeof(server_cert_pem);
srv_cfg.key      = server_key_pem;
srv_cfg.key_len  = sizeof(server_key_pem);
tls_init(&tls, &srv_cfg);
tls_accept(&tls, client_sock, 5000);

/* DTLS over UDP */
tls_config_t dtls_cfg = TLS_CONFIG_DEFAULT_DTLS_CLIENT;
net_socket_t usock = net_socket(SOCK_DGRAM);
tls_connect_dtls(&tls, usock, "example.com", 5000);

MQTT

MQTT completo 3.1.1 com garantias de entrega QoS por mensagem.```c mqtt_config_t cfg = { .broker_host = "mqtt.example.com", .client_id = "tinyos-01", .keepalive_sec = 60, .clean_session = true, .auto_reconnect = true, .reconnect_interval_ms = 3000, /* base; doubles each attempt (max 60 s) */ }; mqtt_client_t client; mqtt_client_init(&client, &cfg); mqtt_set_connection_callback(&client, on_connect, NULL); mqtt_set_message_callback(&client, on_message, NULL); mqtt_connect(&client);

/* Publish — QoS1/2 are buffered offline if disconnected */ mqtt_publish(&client, "sensors/temp", "23.5", 4, MQTT_QOS_1, false);

/* Inspect reliability queues / uint8_t in_flight = mqtt_get_inflight_count(&client); / sent, awaiting ACK / uint8_t pending = mqtt_get_pending_count(&client); / queued while offline */

mqtt_subscribe(&client, "cmd/#", MQTT_QOS_1); mqtt_flush_pending(&client); /* discard offline queue */ mqtt_disconnect(&client);

root@kitploit:~
#### Modelo de Confiabilidade MQTT```
QoS 0  ─── fire-and-forget; dropped if disconnected
QoS 1  ─── in-flight table tracks each PUBLISH until PUBACK
              ↳ retransmits with DUP=1 every 5 s, up to 5 times
              ↳ if offline → offline queue (up to 8 messages)
QoS 2  ─── full PUBLISH → PUBREC → PUBREL → PUBCOMP handshake
              ↳ each step is retried independently on timeout

Auto-reconnect back-off: 3 s → 6 s → 12 s → … → 60 s (cap)
On reconnect: re-subscribes all topics, flushes offline queue

Configuração de confiabilidade MQTT (include/tinyos/mqtt.h):```c #define MQTT_MAX_INFLIGHT 8 /* in-flight slots / #define MQTT_MAX_PENDING 8 / offline queue slots / #define MQTT_MAX_PAYLOAD_SIZE 512 / bytes per queued msg / #define MQTT_RETRY_INTERVAL_MS 5000 / retry after (ms) / #define MQTT_MAX_RETRY_COUNT 5 / retries before drop / #define MQTT_RECONNECT_BASE_MS 3000 / first reconnect delay / #define MQTT_RECONNECT_MAX_MS 60000 / backoff ceiling */

root@kitploit:~
### CoAP```c
coap_init(ctx, config, is_server) / coap_start(ctx) / coap_stop(ctx)
coap_get(ctx, ip, port, path, response, timeout_ms)
coap_post(ctx, ip, port, path, format, payload, len, response, timeout_ms)
coap_resource_create(ctx, path, handler, user_data)
coap_process(ctx, timeout_ms)

OTA```c

ota_init(config) ota_start_update(url, callback, user_data) ota_write_chunk(data, size, offset) / ota_finalize_update() ota_confirm_boot() / ota_rollback() ota_verify_partition(type)

root@kitploit:~
### Sistema de Arquivos```c
fs_format(device) / fs_mount(device) / fs_unmount()
fs_open(path, flags) / fs_close(fd)
fs_read(fd, buf, size) / fs_write(fd, buf, size)
fs_seek(fd, offset, whence) / fs_tell(fd)
fs_mkdir(path) / fs_remove(path) / fs_rmdir(path)
fs_stat(path, stat)
fs_opendir(path) / fs_readdir(dir, entry) / fs_closedir(dir)
fs_get_stats(stats) / fs_get_free_space() / fs_is_mounted()

/* Copy-on-Write snapshots */
fs_snapshot(source_path, snapshot_name)   /* atomic COW snapshot of a file */
fs_get_block_refcount(block_nr)           /* reference count of a data block */

Journaling (Write-Ahead Log)

O sistema de arquivos utiliza journaling apenas de metadados (modo ordenado). Antes de qualquer inode, bitmap ou bloco de diretório ser modificado, um registro de journal é escrito em uma área WAL dedicada de 32 blocos no início da partição. Na próxima montagem após uma falha, o fs_mount reproduz o journal e restaura um estado consistente.``` Disk layout (FS_BLOCK_SIZE = 512 bytes) Block 0 Superblock (version 0x00020000 — v2 with journaling) Block 1 Block bitmap Block 2 Journal header Blocks 3-33 Journal data (31 slots) Blocks 34-41 Inode table (8 blocks, 128 inodes) Block 42+ Data blocks

root@kitploit:~
#### Copy-on-Write (COW)

Cada bloco de dados possui uma contagem de referência em memória reconstruída a partir da tabela de inodes na montagem. Escrever em um bloco que é compartilhado (`refcount > 1`) aloca primeiro uma cópia privada — a contagem do bloco original é decrementada e todas as alterações ocorrem no novo bloco.

`fs_snapshot()` cria um snapshot atômico pontual duplicando o inode de origem (mesmos ponteiros de bloco, contagens de referência incrementadas) dentro de uma única transação do journal. Ou o snapshot completo é confirmado ou nada muda.```c
/* Create a snapshot of /data/config → /snapshots/config-20260101 */
fs_snapshot("/data/config", "/snapshots/config-20260101");

/* Inspect sharing */
uint8_t rc = fs_get_block_refcount(42);   /* 1 = private, >1 = shared */

Gerenciamento de Energia```c

os_power_init() os_power_set_mode(mode) /* ACTIVE / IDLE / SLEEP / DEEP_SLEEP */ os_power_get_mode() os_power_enter_sleep(duration_ms) os_power_enter_deep_sleep(duration_ms) os_power_enable_tickless_idle(enable) os_power_set_cpu_frequency(freq_hz) os_power_configure_wakeup(source, enable) os_power_get_stats(stats) os_power_get_consumption_mw() os_power_estimate_battery_life_hours()

root@kitploit:~
### Watchdog```c
wdt_init(config) / wdt_start() / wdt_stop()
wdt_feed() / wdt_set_timeout(ms)
wdt_register_task(task, timeout_ms) / wdt_feed_task(task)

HAL (Camada de Abstração de Hardware)

O TinyOS fornece um HAL genérico que oculta todo o acesso a registros específicos da arquitetura por trás de uma interface C estável. A arquitetura é selecionada em tempo de compilação através da variável ARCH do Makefile; nenhuma proteção #ifdef aparece no código do kernel.

Primitivas portáveis (declaradas como static inline em cada cabeçalho de arquitetura)```c

uint32_t hal_irq_save(void) /* disable IRQs, return saved state / void hal_irq_restore(uint32_t s) / restore IRQ state / void hal_context_switch_trigger() / pend PendSV / raise MSIP / Timer0 / void hal_cpu_wait_for_interrupt() / WFI / wfi / sleep instruction / void hal_cpu_dsb(void) / data synchronization barrier / void hal_cpu_isb(void) / instruction synchronization barrier */

root@kitploit:~
#### Funções não inline (implementadas por arquitetura em `hal/<arch>/hal_<arch>.c`)```c
void     hal_init(void)
void     hal_tick_init(uint32_t core_clock_hz, uint32_t tick_rate_hz)
void     hal_tick_suppress(uint32_t max_ticks)
uint32_t hal_tick_unsuppress(void)
uint32_t hal_core_clock_hz(void)

bool     hal_cycle_counter_init(void)
void     hal_cycle_counter_reset(void)
uint32_t hal_cycle_counter_read(void)

bool     hal_mpu_init(uint8_t *region_count)
int      hal_mpu_configure_region(uint8_t region, uint32_t base,
                                   uint32_t size, uint32_t attrs)
void     hal_mpu_enable(bool allow_privileged_default)
void     hal_mpu_disable(void)

void     hal_irq_set_priority(int irq_num, uint8_t priority)
void     hal_system_reset(void)          /* does not return */
void     hal_fault_capture(const uint32_t *frame, hal_fault_info_t *info)

Board-level platform registry

Registre os periféricos da placa uma vez na inicialização; o kernel e o gerenciador de energia consultam a tabela via hal_platform_get() em vez de usar símbolos fracos.```c static const hal_uart_ops_t my_uart = { .init = ..., .putc = ... }; static const hal_power_ops_t my_power = { .enter_sleep = ..., .set_clock_hz = ... };

static const hal_platform_t board = { .uart[0] = &my_uart, .power = &my_power, };

hal_platform_register(&board); /* call before os_start() */

root@kitploit:~
`hal_platform_t` fornece slots para `uart[4]`, `flash`, `gpio`, `spi[4]`,
`i2c[4]` e `power`.  Qualquer ponteiro `NULL` significa "não presente nesta placa".

#### Matriz de suporte de arquitectura

| Arquitectura | Fonte de tick | Contador de ciclos | MPU / PMP | Gatilho de troca de contexto |
|---|---|---|---|---|
| Cortex-M0/M0+/M3/M4/M7 | SysTick | DWT CYCCNT (M3+) | MPU | PendSV via ICSR |
| RISC-V RV32I/IM | CLINT MTIMECMP | `rdcycle` CSR | PMP (4 regiões) | MSIP interrupção de software |
| AVR ATmega/ATtiny | Timer0 CTC | — (retorna 0) | — | Timer0 overflow |

---

## Configuração

**`include/tinyos.h`** — kernel e SO:```c
#define MAX_TASKS              16     /* max concurrent tasks                    */
#define STACK_SIZE             256    /* stack size per task (words)             */
#define TICK_RATE_HZ           1000   /* scheduler tick frequency (Hz)           */
#define TIME_SLICE_MS          10     /* round-robin time slice (ms)             */
#define TICKLESS_MAX_SLEEP_TICKS 100U /* tickless idle: max ticks per WFI sleep  */

include/tinyos/shell.h — shell interativo:```c #define SHELL_MAX_COMMANDS 32 /* max registered commands / #define SHELL_LINE_MAX 128 / max input line length (bytes) / #define SHELL_ARGV_MAX 16 / max arguments per command / #define SHELL_HISTORY_DEPTH 8 / command history ring buffer */

root@kitploit:~
**`include/tinyos/mqtt.h`** — Confiabilidade MQTT:```c
#define MQTT_MAX_INFLIGHT        8      /* in-flight QoS1/2 slots    */
#define MQTT_MAX_PENDING         8      /* offline queue slots       */
#define MQTT_MAX_PAYLOAD_SIZE    512    /* max queued payload bytes  */
#define MQTT_RETRY_INTERVAL_MS   5000   /* unACKed retry interval    */
#define MQTT_MAX_RETRY_COUNT     5      /* retries before discard    */
#define MQTT_RECONNECT_BASE_MS   3000   /* initial reconnect delay   */
#define MQTT_RECONNECT_MAX_MS    60000  /* back-off ceiling          */

TLS — requer mbedTLS; ative com:```makefile CFLAGS += -DTINYOS_TLS_ENABLE LDFLAGS += -lmbedtls -lmbedcrypto -lmbedx509

root@kitploit:~
---

## Estrutura do Projeto```
tinyos-rtos/
├── include/
│   ├── tinyos.h              # Core API (tasks, sync, timers, memory, FS, power)
│   └── tinyos/
│       ├── shell.h           # Interactive shell API & configuration
│       ├── net.h             # Network stack
│       ├── tls.h             # TLS 1.2/1.3 + DTLS 1.2 (mbedTLS)
│       ├── mqtt.h            # MQTT 3.1.1 client
│       ├── coap.h            # CoAP RFC 7252
│       ├── ota.h             # OTA firmware updates
│       ├── watchdog.h        # Watchdog timer
│       ├── posix_threads.h   # POSIX pthreads compatibility layer
│       └── posix_socket.h    # BSD socket compatibility layer
├── src/
│   ├── startup.s             # Vector table, Reset_Handler, SysTick/SVC/PendSV stubs
│   ├── context_switch.s      # Thumb-2: PendSV_Handler, SVC_Handler, os_pend_sv
│   ├── kernel.c              # Preemptive scheduler & task management
│   ├── sync.c                # Mutex, semaphore, queue, condition var, event groups
│   ├── timer.c               # Software timers
│   ├── memory.c              # Heap allocator
│   ├── shell.c               # Interactive shell (VT100, history, tab completion)
│   ├── filesystem.c          # Block-device file system
│   ├── security.c            # MPU memory protection
│   ├── power.c               # Power management & CPU frequency scaling
│   ├── watchdog.c            # Watchdog (HW + SW, per-task monitoring)
│   ├── bootloader.c          # Secure bootloader
│   ├── ota.c                 # OTA A/B partition updates
│   ├── mqtt.c                # MQTT client (in-flight table, offline queue)
│   ├── coap.c                # CoAP client/server
│   ├── net/
│   │   ├── network.c         # Core & buffer management
│   │   ├── ethernet.c        # Ethernet / ARP
│   │   ├── ip.c              # IPv4 / ICMP
│   │   ├── socket.c          # UDP / TCP socket API
│   │   ├── http_dns.c        # HTTP client & DNS resolver
│   │   └── tls.c             # TLS/DTLS (mbedTLS wrapper, excluded when mbedTLS absent)
│   └── posix/
│       ├── posix_threads.c   # pthreads → TinyOS task/sync wrapper
│       └── posix_socket.c    # BSD socket → net_* wrapper
├── hal/
│   ├── hal.h                 # Portable HAL interface (arch-agnostic API + peripheral op-tables)
│   ├── cortex_m/
│   │   ├── hal_cortex_m.h    # Register defines + static inline primitives (irq_save, WFI, DSB …)
│   │   └── hal_cortex_m.c    # SysTick, DWT, MPU, AIRCR reset, fault capture
│   ├── riscv/
│   │   ├── hal_riscv.h       # csrrci/csrw inline primitives, CLINT defines
│   │   └── hal_riscv.c       # CLINT tick, rdcycle counter, PMP, PLIC priority, CSR fault capture
│   └── avr/
│       ├── hal_avr.h         # SREG-based irq_save, Timer0 context-switch trigger
│       └── hal_avr.c         # Timer0 CTC tick, watchdog reset, stub MPU/cycle-counter
├── drivers/
│   ├── flash.c / flash.h     # Flash memory driver
│   ├── ramdisk.c / ramdisk.h # RAM disk (testing)
│   └── loopback_net.c        # Loopback network driver (testing)
├── linker.ld                 # Linker script (mps2-an385: Flash 0x0/4MB, RAM 0x20000000/4MB)
└── examples/
    ├── blink_led.c           # GPIO blink
    ├── iot_sensor.c          # Multi-task sensor node
    ├── shell_demo.c          # Custom shell commands over UART
    ├── network_demo.c        # TCP/UDP/HTTP/ping
    ├── tls_demo.c            # TLS client/server
    ├── mqtt_demo.c           # MQTT publish/subscribe (QoS 1/2)
    ├── coap_demo.c           # CoAP client/server
    ├── ota_demo.c            # Firmware update flow
    ├── filesystem_demo.c     # File I/O
    ├── watchdog_demo.c       # Watchdog configuration
    ├── low_power.c           # Power mode transitions
    ├── software_timers.c     # Timer creation and callbacks
    ├── event_groups.c        # Event synchronisation
    ├── event_flags_logic.c   # AND / OR / NOT(CLEAR) / SYNC(barrier) patterns
    ├── condition_variable.c  # Producer/consumer
    ├── priority_adjustment.c # Dynamic priority
    ├── task_statistics.c     # CPU and stack monitoring
    └── posix_compat_demo.c   # POSIX pthreads + socket usage examples

Desempenho

ArquiteturaTroca de contexto
Cortex-M0~2 μs
Cortex-M4~1 μs
RISC-V~1.5 μs

Requisitos de sistema: mínimo de 2 KB de RAM · < 10 KB de ROM apenas para o kernel


Histórico de versões

v2.0.0

Novas funcionalidades

  • Sistema de arquivos com journaling (src/filesystem.c) — O Write-Ahead Log (WAL) protege todas as gravações de metadados (inodes, bitmap, superbloco, diretórios).
    Formato em disco elevado para FS_VERSION 0x00020000. O journal ocupa 32 blocos começando no bloco 2; fs_mount reproduz qualquer transação confirmada mas não aplicada antes de passar o controle para a aplicação.
    O journaling apenas de metadados (ordenado) mantém a amplificação de escrita baixa enquanto garante um sistema de arquivos consistente após uma falha de energia ou reset em qualquer ponto durante uma gravação.

  • Compartilhamento de blocos Copy-on-Write (src/filesystem.c) — Cada bloco de dados carrega uma contagem de referência em memória (reconstruída a partir da tabela de inodes no momento da montagem).
    Escrever em um bloco compartilhado aloca silenciosamente uma cópia privada; a contagem do bloco compartilhado é decrementada.
    fs_snapshot(source, name) cria um snapshot atômico pontual dentro de uma única transação de journal — ou tudo ou nada é confirmado.
    Nova API pública: fs_snapshot() e fs_get_block_refcount() (veja include/tinyos.h).

  • HAL genérico (hal/) — Uma Camada de Abstração de Hardware em dois níveis desacopla o kernel do assembly específico do ARM Cortex-M.

Mudanças que quebram a compatibilidade

  • src/kernel.c não contém mais defines de registradores SYST_*, SCB_SHPR3, SCB_AIRCR ou DWT_* — estes agora são fornecidos pelo HAL. Código que referenciasva diretamente essas macros deve ser atualizado para usar a API do HAL.
  • Os símbolos fracos de src/power.c (platform_enter_sleep_mode, etc.) agora delegam para hal_platform_t->power quando uma plataforma é registrada; placas que dependiam do padrão antigo __asm__ volatile("wfi") verão comportamento idêntico a menos que um hal_power_ops_t seja registrado.
  • A versão em disco do sistema de arquivos é 0x00020000. Volumes formatados com v1.x devem ser reformatados (fs_format).

v1.2.0

Correções de bugs

  • Tabela de vetores startup.s — MemManage_Handler, BusFault_Handler e UsageFault_Handler agora apontam para os handlers corretos em fault.c.
    Anteriormente, todas as três entradas resolviam para Default_Handler, então falhas de MPU, barramento e uso eram silenciosamente engolidas em vez de acionar o despejo de diagnóstico.
  • Decremento duplo em os_cond_wait — cond_remove_task() já decrementa waiting_count; os três locais de chamada que o decrementavam novamente depois foram corrigidos.
    Anteriormente, um decremento extra espúrio poderia causar underflow do contador e corromper o estado da variável de condição.
  • Boost de PIP do mutex não liberado no timeout — o caminho de spin temporizado em os_mutex_lock agora chama mutex_pip_recalculate() antes de retornar OS_ERROR_TIMEOUT. Anteriormente, o boost de prioridade aplicado ao proprietário nunca era desfeito quando a tarefa esperando desistia, causando inflação permanente de prioridade.

Melhorias

  • Reescrita do alocador de memória (src/memory.c) — substituiu o pool de blocos fixos de 32 bytes por um alocador first-fit com:
    • heap de 8 KB (aumentado de 4 KB), blocos alinhados a 8 bytes
    • Lista livre mantida em ordem de endereço; blocos livres adjacentes são coalescidos imediatamente em cada os_free() (para frente e para trás)
    • Blocos são divididos na alocação quando o restante é grande o suficiente para ser útil (≥ BLK_HDR + ALIGN)
  • Ordem de inicialização de os_init() — os_mem_init() e os_power_init() agora são chamados antes de os_timer_init(), para que o heap e o subsistema de energia estejam prontos antes que qualquer callback de timer ou código de tarefa seja executado.
  • Idle sem ticks implementado (src/kernel.c: os_kernel_tickless_sleep) — quando habilitado via os_power_enable_tickless_idle(true), a tarefa idle suprime o SysTick antes de WFI e usa o contador de ciclos DWT CYCCNT para medir o tempo real decorrido. Após o wakeup, o SysTick é reiniciado, é avançado pelos ticks medidos (limitado a ), e é chamado para desbloquear imediatamente quaisquer tarefas atrasadas. Anteriormente a flag existia mas o caminho idle sempre caía em um simples com SysTick rodando.

v1.1.0

Novas funcionalidades

  • Flag EVENT_WAIT_CLEAR para grupos de eventos — espera até que os bits se tornem limpos (condição NOT).
    EVENT_WAIT_ALL | EVENT_WAIT_CLEAR acorda quando todos os bits mascarados são 0; EVENT_WAIT_ANY | EVENT_WAIT_CLEAR acorda quando qualquer um é 0.
  • os_event_group_sync() — primitiva de rendezvous / barreira.
    Cada tarefa participante define seu próprio bit de chegada e bloqueia até que o conjunto completo esteja presente; todas desbloqueiam simultaneamente.
  • Novo exemplo examples/event_flags_logic.c demonstrando todos os quatro modos (AND, OR, NOT, SYNC).

Correções de compilação e execução

  • Adicionado src/startup.s: tabela de vetores, Reset_Handler (cópia .data, zero .bss), stub SysTick_Handler, HardFault_Handler.
  • Adicionado linker.ld: layout de memória para mps2-an385 (Flash 0x00000000 / 4 MB, RAM 0x20000000 / 4 MB).
  • Corrigida pilha inicial da tarefa: a área de salvamento R4–R11 agora é pré-alocada para que o LDMIA {R4-R11} do PendSV funcione corretamente na primeira troca de contexto para qualquer tarefa recém-criada.
  • SVC_Handler atualizado para LDMIA {R4-R11} antes de definir PSP, mantendo os caminhos SVC e PendSV simétricos.
  • Verificação de MPU_TYPE em os_mpu_configure_default() — a configuração da MPU é ignorada silenciosamente quando nenhuma MPU está presente (QEMU ).

Licença

Licença MIT — veja LICENSE para detalhes.

Baixar ferramenta
ComandoDescrição
help [cmd]Lista todos os comandos, ou mostra ajuda detalhada para cmd
clearLimpa a tela do terminal (VT100)
echo <text>Imprime texto no terminal
historyMostra o histórico de comandos
psLista todas as tarefas (estado, prioridade, %CPU, uso da pilha)
topLista de tarefas ordenada por uso de CPU, decrescente
kill <name> [suspend|resume|delete]Controla uma tarefa pelo nome
memEstatísticas da heap (total / usado / livre, contagens de alocação/liberação)
verVersão do TinyOS e tempo de atividade formatado
netEstatísticas de rede (contadores Ethernet, IP, UDP, TCP)
ping <ip> [count]Envia requisições de eco ICMP
ifconfig [ip|netmask|gw|dns <addr>]Mostra ou altera a configuração de rede
power [active|idle|sleep|deepsleep]Estatísticas de energia ou mudança de modo
ls [path]Lista diretório (padrão: /)
cat <file>Exibe conteúdo do arquivo
mkdir <path>Cria diretório
rm <path>Remove arquivo ou diretório vazio
dfEstatísticas de uso do sistema de arquivos
touch <file>Cria arquivo vazio
cp <src> <dst>Copia arquivo
uptimeMostra o tempo de atividade do sistema (HH:MM:SS ou N day(s), HH:MM:SS)
sleep <ms>Atrasa a tarefa do shell por N milissegundos
rebootReinicia o sistema
TeclaAção
← / Ctrl-BMove o cursor para a esquerda
→ / Ctrl-FMove o cursor para a direita
Home / Ctrl-ASalta para o início da linha
End / Ctrl-ESalta para o fim da linha
↑ / ↓Navega pelo histórico de comandos
TabCompleta o nome do comando
Ctrl-KApaga até o fim da linha
Ctrl-UApaga até o início da linha
Ctrl-WApaga a palavra anterior
Ctrl-LLimpa a tela e redesenha
Ctrl-CCancela a linha atual
ComponenteROMRAM
Kernel6 KB512 B
Por tarefa—~1 KB
Mutex—12 B
Semáforo—8 B
Fila de mensagens (10 itens)—40 B + dados
Shell (com 23 comandos internos)~4 KB~2.5 KB
Cliente MQTT (com filas)~8 KB~10 KB
Camada de threads POSIX~2 KB~PTHREAD_MAX_THREADS × (tcb_t + 32 B)
Camada de sockets POSIX~1 KB~NET_MAX_SOCKETS × 12 B
  • hal/hal.h — interface independente de arquitetura: tick, contador de ciclos, MPU, salvamento/restauração de IRQ, gatilho de troca de contexto, reset do sistema, captura de falhas e tabelas de operações de periféricos (hal_platform_t com slots para UART / flash / GPIO / SPI / I²C / energia).
  • hal/cortex_m/ — implementação completa para Cortex-M0–M7 (SysTick, DWT, AIRCR, PRIMASK, gatilho PendSV).
  • hal/riscv/ — stub RISC-V RV32 (tick CLINT MTIMECMP, contador rdcycle, PMP, prioridade PLIC, captura de falhas CSR).
  • hal/avr/ — stub AVR ATmega (tick Timer0 CTC, seções críticas SREG, reset watchdog).
  • O Makefile seleciona automaticamente o HAL a partir de ARCH= (cortex-m* / riscv* / avr*) e passa -DHAL_ARCH_* para o compilador.


kernel.tick_count
TICKLESS_MAX_SLEEP_TICKS
delay_queue_tick()

WFI
  • MAX_TASKS aumentado — elevado de 8 para 16 para suportar cargas de trabalho IoT mais realistas sem alterações de configuração do lado do usuário.
  • mps2-an385
  • Renomeado timer_t → os_timer_t para evitar conflito com POSIX <sys/types.h>.
  • Makefile: -I. adicionado para includes de drivers/; fontes TLS excluídas automaticamente quando mbedTLS está ausente; -Wno-stringop-truncation para falsos positivos de avisos de strncpy.
  • Corrigidos avisos de comparação de sinal, função não utilizada, variável não inicializada e declaração implícita em coap.c, filesystem.c, mqtt.c, ota.c, security.c, net/ip.c, net/http_dns.c.