Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
tinyos-rtos — RTOS فائق الخفة لإنترنت الأشياء مع جدولة استباقية، TLS/DTLS، MQTT، CoAP، توافق POSIX، وحماية ذاكرة قائمة على MPU. النواة أقل من 10 KB. | Kitploit
أدوات/GitHubGitHub/cmc-labo/tinyos-rtos
أمان الأنظمة المدمجةأمان إنترنت الأشياءأمن الشبكاتاختراق الأجهزةالتشفيرأمن الأجهزةتحليل البرامج الثابتة
GitHubcmc-labo/tinyos-rtos

tinyos-rtos

RTOS فائق الخفة لإنترنت الأشياء مع جدولة استباقية، TLS/DTLS، MQTT، CoAP، توافق POSIX، وحماية ذاكرة قائمة على MPU. النواة أقل من 10 KB.

عرض المستودع
23586منذ 3 أشهرتمت المراجعة من قبل Kitploit

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

TinyOS — نظام تشغيل فائق الخفة للإنترنت الأشياء

نظام تشغيل فائق الخفة يعمل في الوقت الفعلي للأجهزة محدودة الموارد في إنترنت الأشياء والأنظمة المدمجة.
بصمة النواة أقل من 10 كيلوبايت، ذاكرة وصول عشوائي لا تقل عن 2 كيلوبايت، جدولة قائمة على الأولوية مع استباقية.


الميزات

الفئةالتفاصيل
النواةجدولة قائمة على الأولوية مع استباقية (256 مستوى)، دوران دائري داخل نفس الأولوية، بحث عن الأولوية O(1) عبر bitmap، وراثة الأولوية
المزامنةمفاضلة (مع وراثة الأولوية)، إشارة، متغير شرطي، مجموعات أحداث، قوائم رسائل
المؤقتات البرمجيةطلقة واحدة وإعادة تحميل تلقائي، دقة ملي ثانية، تغيير الفترة في وقت التشغيل
الذاكرةمخصص من النوع First-fit مع دمج فوري (ذاكرة كومة 8 كيلوبايت، محاذاة 8 بايت)، كشف تجاوز المكدس، علامة الحد الأقصى لكل مهمة
الصدفةصدفة تفاعلية VT100 — 23 أمرًا مضمنًا، سجل الأوامر (↑↓)، إكمال التبويب، محرر أسطر كامل
توافق POSIXpthreads (إنشاء/انضمام/فصل/خروج، مفاضلة، متغير شرطي) · BSD socket API (socket/bind/listen/accept/connect/send/recv, inet_pton/ntop, htons/htonl)
نظام الملفاتنظام ملفات تسجيلي يعمل على أجهزة الكتل (WAL، استرداد من الأعطال)، مشاركة كتل COW، لقطات ذرية، واجهة برمجة تشبه POSIX
الشبكةإيثرنت، IPv4، ICMP، UDP، TCP، زبون/خادم HTTP، DNS
TLS / DTLSTLS 1.2/1.3 عبر TCP، DTLS 1.2 عبر UDP (خلفية mbedTLS)
MQTTMQTT 3.1.1 كامل — QoS 0/1/2 مع جدول إعادة محاولة أثناء الإرسال، طابور غير متصل، إعادة اتصال تلقائي مع تأخير أسي
CoAPزبون/خادم متوافق مع RFC 7252، نمط المراقبة
OTAتحديثات البرنامج الثابت لقسم A/B، التحقق من CRC32، التراجع
الرقابةرقابة مادية وبرمجية، مراقبة المهلة لكل مهمة
الطاقةأوضاع الخمول/النوم/النوم العميق، خمول بدون علامات، تحجيم تردد المعالج
الأمانحماية الذاكرة القائمة على MPU، دعم الإقلاع الآمن
HALطبقة تجريد العتاد العامة — ARM Cortex-M / RISC-V / AVR؛ اختيار البنية وقت التجميع، جداول عمليات الأطراف

العتاد المدعوم

البنيةأمثلة
ARM Cortex-M (M0/M0+/M3/M4/M7)STM32, nRF52, Raspberry Pi Pico
RISC-V (RV32I)ESP32-C3
AVR (تجريبي)ATmega

بداية سريعة

المتطلبات الأساسية```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:~
تحقق من التثبيت:```bash
arm-none-eabi-gcc --version   # 10.x or later
qemu-system-arm --version     # 6.x or later

بناء```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/`:

| الملف | الوصف |
|---|---|
| `build/tinyos.elf` | صورة بتنسيق ELF مع رموز التصحيح |
| `build/tinyos.bin` | ثنائي خام للكتابة على الذاكرة |
| `build/tinyos.map` | خريطة الرابط (أحجام الرموز) |

### التشغيل على QEMU

يعمل TinyOS على هدف QEMU `mps2-an385` (ARM Cortex-M3، 4 ميجابايت فلاش، 4 ميجابايت ذاكرة وصول عشوائي):```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

المخرجات المتوقعة من تتبع المقاطعة: تكرار سطور successful exception return تؤكد أن المجدول يعمل، وأن SysTick يتحرك، وأن تبديلات سياق PendSV تكتمل بنظافة.

فلاش إلى الجهاز```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:~
### البناء باستخدام TLS (mbedTLS)

يتم تمكين دعم TLS تلقائياً عندما يكون mbedTLS موجوداً في `~/mbedtls`.
لاستخدام مسار مختلف:```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

مثال مهمة بسيطة:```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:~
---

## نظرة عامة على API

### إدارة المهام```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)

المزامنة```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:~
### المؤقتات```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)

شل```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:~
**مثال الأمر المخصص:**```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");

أوامر الصدفة المضمنة

اختصارات محرر الأسطر:

تكوين الصدفة (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:~
### الشبكة```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)

توافق POSIX

يوفر TinyOS طبقتين رفيعتين للتوافق تسمحان بتجميع وتشغيل الكود المحمول القياسي على TinyOS مع تغييرات طفيفة.

pthreads (include/tinyos/posix_threads.h)

أضف src/posix/posix_threads.c إلى بناءك.```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:~
| المفهوم | يُعيّن إلى |
|---|---|
| `pthread_t` | فهرس في تجمّع داخلي من فتحات `tcb_t` الخاصة بـ TinyOS |
| `pthread_mutex_t` | يضمّن `mutex_t` مباشرةً (التهيئة الصفرية / `PTHREAD_MUTEX_INITIALIZER` صالحة) |
| `pthread_cond_t` | يضمّن `cond_var_t` مباشرةً (التهيئة الصفرية / `PTHREAD_COND_INITIALIZER` صالحة) |
| `pthread_join` | ينتظر على `semaphore_t` خاص بكل خيط يتم إرساله بواسطة `pthread_exit` |

**غير مدعوم:** `pthread_cancel`، التخزين المحلي للخيط (`pthread_key_*`)،
كواتم التكرار (يرجع `ENOTSUP`).

**التهيئة** (`include/tinyos/posix_threads.h`):```c
#define PTHREAD_MAX_THREADS  MAX_TASKS  /* max concurrent pthreads */

مقابس BSD (include/tinyos/posix_socket.h)

أضف src/posix/posix_socket.c إلى بناء مشروعك.```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:~
| استدعاء BSD | المعيّن إليه |
|---|---|
| `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()` |

**خيارات `setsockopt` المدعومة:**

| الخيار | التأثير |
|---|---|
| `SO_REUSEADDR` | مقبول؛ لا تأثير (قابل لإعادة الاستخدام دائمًا في TinyOS) |
| `SO_RCVTIMEO` | يحدد مهلة الاستقبال لكل مأخذ (struct timeval → ms) |
| `SO_SNDTIMEO` | يحدد مهلة الإرسال/الاتصال لكل مأخذ |

**توجيه `close()`:** قم بتعريف `TINYOS_POSIX_WRAP_CLOSE` قبل تضمين الرأس لتعيين `close(fd)` → `posix_sock_close(fd)`.

**غير مدعومة:** `select` / `poll` / `epoll`, وضع عدم الحظر (`O_NONBLOCK`), IPv6 (`AF_INET6` يُرجع `EAFNOSUPPORT`).

---

### TLS / DTLS

TLS 1.2/1.3 عبر TCP و DTLS 1.2 عبر UDP مدعومة بواسطة **mbedTLS**.  
قم بتمكينها في وقت البناء باستخدام `-DTINYOS_TLS_ENABLE` واربطها مع 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 3.1.1 مع ضمانات تسليم QoS لكل رسالة.```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:~
#### نموذج موثوقية 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

تهيئة موثوقية 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:~
### نظام الملفات```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 */

التدوين (سجل الكتابة المسبقة)

يستخدم نظام الملفات metadata-only journaling (ordered mode). قبل تعديل أي inode أو bitmap أو كتلة دليل، يتم كتابة سجل اليومية إلى منطقة WAL مخصصة من 32 كتلة في بداية القسم. عند التثبيت التالي بعد تعطل، يقوم fs_mount بإعادة تشغيل اليومية ويعيد الحالة المتسقة.``` 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)

يحمل كل كتلة بيانات عداد مرجعية في الذاكرة يُعاد بناؤه من جدول inode عند وقت التحميل. الكتابة إلى كتلة مشتركة (`refcount > 1`) تخصص نسخة خاصة أولاً — يتم إنقاص عداد الكتلة الأصلية وتحدث جميع التغييرات على الكتلة الجديدة.

تنشئ `fs_snapshot()` لقطة ذرية في نقطة زمنية عن طريق تكرار inode المصدر (نفس مؤشرات الكتل، رفع عدادات المرجعية) داخل معاملة دفتر يومية واحدة. يتم إما تنفيذ اللقطة الكاملة أو لا يتغير شيء.```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 */

إدارة الطاقة```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 (طبقة تجريد العتاد)

تقدم TinyOS طبقة تجريد عتاد (HAL) عامة تخفي جميع عمليات الوصول إلى السجلات الخاصة بالمعمارية خلف واجهة C ثابتة. يتم تحديد المعمارية في وقت الترجمة عبر متغير ARCH في Makefile؛ لا تظهر حراسة #ifdef في كود النواة.

الأوليات المحمولة (معلنة static inline في كل ملف رأس للمعمارية)```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:~
#### الوظائف غير المضمنة (منفذة لكل معمارية في `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)

تسجيل المنصة على مستوى اللوحة

سجل الأجهزة الطرفية للوحة مرة واحدة عند بدء التشغيل؛ يقوم النواة ومدير الطاقة بالاستعلام عن الجدول عبر hal_platform_get() بدلاً من استخدام الرموز الضعيفة.```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` provides slots for `uart[4]`, `flash`, `gpio`, `spi[4]`,
`i2c[4]`, and `power`.  Any `NULL` pointer means "غير موجود على هذه اللوحة".

#### مصفوفة دعم المعماريات

| المعمارية | مصدر التكت | عداد الدورة | MPU / PMP | مشغل تبديل السياق |
|---|---|---|---|---|
| Cortex-M0/M0+/M3/M4/M7 | SysTick | DWT CYCCNT (M3+) | MPU | PendSV via ICSR |
| RISC-V RV32I/IM | CLINT MTIMECMP | `rdcycle` CSR | PMP (4 regions) | MSIP software interrupt |
| AVR ATmega/ATtiny | Timer0 CTC | — (returns 0) | — | Timer0 overflow |

---

## الإعدادات

**`include/tinyos.h`** — النواة ونظام التشغيل:```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 — شل تفاعلية:```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`** — موثوقية 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 — يتطلب mbedTLS; قم بتمكين باستخدام:```makefile CFLAGS += -DTINYOS_TLS_ENABLE LDFLAGS += -lmbedtls -lmbedcrypto -lmbedx509

root@kitploit:~
---

## هيكل المشروع```
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

أداء

المعماريةتبديل السياق
Cortex-M0~2 μs
Cortex-M4~1 μs
RISC-V~1.5 μs

متطلبات النظام: 2 KB رام حد أدنى · < 10 KB روم للنواة وحدها


سجل التغييرات

الإصدار 2.0.0

الميزات الجديدة

  • نظام الملفات المُدوَّن (src/filesystem.c) — سجل الكتابة المسبقة (WAL) يحمي جميع كتابات البيانات الوصفية (inodes, bitmap, superblock, المجلدات).
    تم رفع تنسيق القرص إلى FS_VERSION 0x00020000. يحتل السجل 32 كتلة بدءًا من الكتلة 2؛ يقوم fs_mount بإعادة تشغيل أي معاملة ملتزمة ولكن غير مطبقة قبل تسليم التحكم إلى التطبيق. يحافظ التسجيل المُدوَّن للبيانات الوصفية فقط (مرتب) على تضخيم الكتابة منخفضًا مع ضمان نظام ملفات متسق بعد انقطاع التيار الكهربائي أو إعادة التعيين في أي نقطة أثناء الكتابة.

  • مشاركة الكتل بالنسخ عند الكتابة (src/filesystem.c) — كل كتلة بيانات تحمل عدد مرجعي في الذاكرة (يُعاد بناؤه من جدول inode عند التثبيت). الكتابة إلى كتلة مشتركة تخصص نسخة خاصة بصمت؛ يتم تقليل عدد الكتلة المشتركة. fs_snapshot(source, name) ينشئ لقطة ذرية لحظة زمنية داخل معاملة سجل واحدة — إما كل شيء أو لا شيء يُلتزم. واجهة برمجة تطبيقات عامة جديدة: fs_snapshot() و fs_get_block_refcount() (انظر include/tinyos.h).

  • طبقة تجريد الأجهزة العامة (HAL) (hal/) — طبقة تجريد الأجهزة ذات المستويين تفصل النواة عن التجميع الخاص بـ ARM Cortex-M.

    • hal/hal.h — واجهة مستقلة عن المعمارية: التكة، عداد الدورة، MPU، حفظ/استعادة IRQ، مشغل تبديل السياق، إعادة تعيين النظام، التقاط الأخطاء، وجداول العمليات الطرفية ( مع فتحات UART / flash / GPIO / SPI / I²C / الطاقة).

التغييرات الجذرية

  • src/kernel.c لم يعد يحتوي على تعريفات السجلات الخام SYST_*, SCB_SHPR3, SCB_AIRCR, أو DWT_* — هذه الآن مقدمة من HAL. يجب تحديث الكود الذي أشار مباشرة إلى هذه الماكرو لاستخدام واجهة برمجة تطبيقات HAL.
  • الرموز الضعيفة في src/power.c (platform_enter_sleep_mode, إلخ) تُفوض الآن إلى hal_platform_t->power عند تسجيل منصة؛ اللوحات التي اعتمدت على الافتراضي القديم __asm__ volatile("wfi") سترى سلوكًا متطابقًا ما لم يتم تسجيل hal_power_ops_t.
  • إصدار نظام الملفات على القرص هو 0x00020000. يجب إعادة تنسيق الأقراص المنسقة بالإصدار 1.x (fs_format).

الإصدار 1.2.0

إصلاحات الأخطاء

  • جدول المتجهات startup.s — MemManage_Handler, BusFault_Handler, و UsageFault_Handler الآن تشير إلى المعالجات الصحيحة في fault.c.
    سابقًا كانت جميع الإدخالات الثلاثة تحل إلى Default_Handler، لذلك كانت أخطاء MPU والناقل والاستخدام تُبتلع بصمت بدلاً من تشغيل تفريغ التشخيص.
  • إنقاص مزدوج في os_cond_wait — cond_remove_task() يقوم بالفعل بإنقاص waiting_count؛ تم إصلاح مواقع الاستدعاء الثلاثة التي كانت تنقصه مرة أخرى بعد ذلك.
    سابقًا، كان إنقاص إضافي زائف يمكن أن يتسبب في تجاوز العداد للصفر وإفساد حالة متغير الشرط.
  • رفع أولوية PIP في Mutex لا يتم تحريره عند انتهاء المهلة — مسار الدوران الموقوت في os_mutex_lock الآن يستدعي mutex_pip_recalculate() قبل إرجاع OS_ERROR_TIMEOUT. سابقًا، لم يتم إلغاء رفع الأولوية المطبق على المالك أبدًا عندما تتخلى المهمة المنتظرة، مما تسبب في تضخم دائم في الأولوية.

التحسينات

  • إعادة كتابة مُوزع الذاكرة (src/memory.c) — استبدل مجمع الكتل الثابتة 32 بايت بموزع من النوع الأول المناسب (first-fit) يتميز بـ:
    • كومة 8 كيلوبايت (زيادة من 4 كيلوبايت)، كتل محاذاة 8 بايت
    • القائمة الحرة محفوظة بترتيب العناوين؛ يتم دمج الكتل الحرة المتجاورة فورًا في كل os_free() (للأمام والخلف)
    • يتم تقسيم الكتل عند التخصيص عندما يكون الباقي كبيرًا بما يكفي ليكون مفيدًا (≥ BLK_HDR + ALIGN)
  • ترتيب التهيئة في os_init() — يتم الآن استدعاء os_mem_init() و os_power_init() قبل os_timer_init()، بحيث تكون الكومة ونظام الطاقة جاهزين قبل تشغيل أي استدعاءات مؤقت أو رمز مهمة.
  • تنفيذ وضع الخمول بدون تكة (src/kernel.c: os_kernel_tickless_sleep) — عند تمكينه عبر os_power_enable_tickless_idle(true)، تقوم مهمة الخمول بإيقاف SysTick قبل WFI وتستخدم عداد الدورة DWT CYCCNT لقياس الوقت الفعلي المنقضي. بعد الاستيقاظ، يتم إعادة تشغيل SysTick، ويتم تقديم بواسطة التكات المقاسة (محدودة بـ )، ويتم استدعاء لإلغاء حظر أي مهام متأخرة فورًا. سابقًا، كانت العلامة موجودة ولكن مسار الخمول كان دائمًا يصل إلى عادي مع تشغيل SysTick.

الإصدار 1.1.0

الميزات الجديدة

  • علامة EVENT_WAIT_CLEAR لمجموعات الأحداث — انتظر حتى تصبح البتات واضحة (حالة NOT).
    EVENT_WAIT_ALL | EVENT_WAIT_CLEAR يستيقظ عندما تكون جميع البتات المقنعة 0؛ EVENT_WAIT_ANY | EVENT_WAIT_CLEAR يستيقظ عندما تكون أي منها 0.
  • os_event_group_sync() — أولي للالتقاء / الحاجز.
    كل مهمة مشاركة تعين بتة وصولها الخاصة وتنتظر حتى تكون المجموعة الكاملة موجودة؛ يتم إلغاء حظر الكل في وقت واحد.
  • مثال جديد examples/event_flags_logic.c يوضح جميع الأنماط الأربعة (AND, OR, NOT, SYNC).

إصلاحات البناء ووقت التشغيل

  • تمت إضافة src/startup.s: جدول المتجهات، Reset_Handler (نسخ .data، تصفير .bss)، كعب SysTick_Handler، HardFault_Handler.
  • تمت إضافة linker.ld: تخطيط الذاكرة لـ mps2-an385 (فلاش 0x00000000 / 4 ميجابايت، رام 0x20000000 / 4 ميجابايت).
  • تم إصلاح كومة المهمة الأولية: منطقة حفظ R4–R11 مُخصصة مسبقًا الآن بحيث يعمل LDMIA {R4-R11} الخاص بـ PendSV بشكل صحيح عند أول تبديل سياق إلى أي مهمة جديدة.
  • تم تحديث SVC_Handler إلى LDMIA {R4-R11} قبل تعيين PSP، مع الحفاظ على تناظر مساري SVC و PendSV.
  • فحص MPU_TYPE في os_mpu_configure_default() — يتم تخطي إعداد MPU بصمت عندما لا يكون MPU موجودًا (QEMU ).

الترخيص

رخصة MIT — انظر LICENSE للتفاصيل.

تنزيل الأداة
الأمرالوصف
help [cmd]سرد جميع الأوامر، أو عرض المساعدة التفصيلية لـ cmd
clearمسح شاشة الطرفية (VT100)
echo <text>طباعة نص إلى الطرفية
historyعرض تاريخ الأوامر
psسرد جميع المهام (الحالة، الأولوية، نسبة استخدام المعالج، استخدام المكدس)
topقائمة المهام مرتبة حسب استخدام المعالج، تنازليًا
kill <name> [suspend|resume|delete]التحكم في مهمة حسب الاسم
memإحصائيات الكومة (الإجمالي / المستخدم / الحر، عدد التخصيصات/التحريرات)
verإصدار TinyOS ووقت التشغيل المنسق
netإحصائيات الشبكة (عدادات إيثرنت، IP، UDP، TCP)
ping <ip> [count]إرسال طلبات صدى ICMP
ifconfig [ip|netmask|gw|dns <addr>]عرض أو تغيير تكوين الشبكة
power [active|idle|sleep|deepsleep]إحصائيات الطاقة أو تغيير الوضع
ls [path]سرد الدليل (الافتراضي: /)
cat <file>عرض محتويات الملف
mkdir <path>إنشاء دليل
rm <path>إزالة ملف أو دليل فارغ
dfإحصائيات استخدام نظام الملفات
touch <file>إنشاء ملف فارغ
cp <src> <dst>نسخ ملف
uptimeعرض وقت تشغيل النظام (HH:MM:SS أو N يوم، HH:MM:SS)
sleep <ms>تأخير مهمة الصدفة لمدة N ميلي ثانية
rebootإعادة تشغيل النظام
المفتاحالإجراء
← / Ctrl-Bتحريك المؤشر لليسار
→ / Ctrl-Fتحريك المؤشر لليمين
Home / Ctrl-Aالانتقال إلى بداية السطر
End / Ctrl-Eالانتقال إلى نهاية السطر
↑ / ↓التنقل في تاريخ الأوامر
Tabإكمال اسم الأمر
Ctrl-Kحذف حتى نهاية السطر
Ctrl-Uحذف حتى بداية السطر
Ctrl-Wحذف الكلمة السابقة
Ctrl-Lمسح الشاشة وإعادة الرسم
Ctrl-Cإلغاء السطر الحالي
المكونROMRAM
النواة6 KB512 B
لكل مهمة—~1 KB
Mutex—12 B
Semaphore—8 B
قائمة الرسائل (10 عناصر)—40 B + بيانات
الصدفة (مع 23 أمرًا مضمّنًا)~4 KB~2.5 KB
عميل MQTT (مع قوائم)~8 KB~10 KB
طبقة خيوط POSIX~2 KB~PTHREAD_MAX_THREADS × (tcb_t + 32 B)
طبقة مآخذ POSIX~1 KB~NET_MAX_SOCKETS × 12 B
hal_platform_t
  • hal/cortex_m/ — تنفيذ كامل لـ Cortex-M0–M7 (SysTick, DWT, AIRCR, PRIMASK, PendSV trigger).
  • hal/riscv/ — كعب RISC-V RV32 (CLINT MTIMECMP tick, rdcycle counter, PMP, PLIC priority, CSR fault capture).
  • hal/avr/ — كعب AVR ATmega (Timer0 CTC tick, SREG critical sections, watchdog reset).
  • يقوم ملف Makefile بتحديد HAL تلقائيًا من ARCH= (cortex-m* / riscv* / avr*) ويمرر -DHAL_ARCH_* إلى المترجم.


  • kernel.tick_count
    TICKLESS_MAX_SLEEP_TICKS
    delay_queue_tick()

    WFI
  • زيادة MAX_TASKS — رفع من 8 إلى 16 لدعم أعباء عمل إنترنت الأشياء الأكثر واقعية دون تغييرات في التهيئة من جانب المستخدم.
  • mps2-an385
  • تمت إعادة تسمية timer_t → os_timer_t لتجنب التعارض مع POSIX <sys/types.h>.
  • ملف Makefile: تمت إضافة -I. لتضمينات drivers/؛ يتم استبعاد مصادر TLS تلقائيًا عند عدم وجود mbedTLS؛ -Wno-stringop-truncation لتحذيرات strncpy الإيجابية الخاطئة.
  • تم إصلاح تحذيرات مقارنة الإشارة، الوظائف غير المستخدمة، المتغيرات غير المهيأة، والتصريحات الضمنية عبر coap.c, filesystem.c, mqtt.c, ota.c, security.c, net/ip.c, net/http_dns.c.