Documentation
AgileRTOS can probably be a RTOS but mostly it is just a RAM saving malloc and pthread implementation for microcontroller without memory management unit.
🔗
Documentation
🔗
Repository
Examples
malloc() / free()
Implementation details
#include <avr/io.h>
int main(void){
size_t length = 10,l;
void *ptr[10];
for(l=0;l<=length;l++){
ptr[l] = malloc(16);
}
for(l=0;l<=length;l++){
free(ptr[l]);
}
for(l=0;l<=length;l++){
ptr[l] = malloc(16);
}
for(l=0;l<=length;l++){
free(ptr[l]);
}
for(l=0;l<=length;l++){
}
for(l=0;l<=length;l++){
}
for(l=0;l<=length;l++){
}
for(l=0;l<=length;l++){
}
return 0;
}
vheap
#include <avr/io.h>
int main(void){
&mem
,160
);
&mem
,chunka
);
&mem
,chunkb
);
&mem
,chunkc
);
&mem
,chunkd
);
&mem
,chunka
);
&mem
,chunkb
);
&mem
,chunkc
);
&mem
,chunkd
);
&mem
,chunka
);
&mem
,chunkc
);
&mem
,chunkc
);
return 0;
}
events
Implementation details
#include <avr/io.h>
#define ZRTOS_DEBUG__CFG_ENABLED
#define ZRTOS_DEBUG__CFG_MEMORY_CONSOLE 400
typedef enum{
ZRTOS_EVENT_TYPE__ANY = 0
,EVENT_CODE_A
,EVENT_CODE_B
}zrtos_event_type_t;
bool handler_a(
){
"{fn:%s,ctx:%p,data:%p,type:%d(EVENT_CODE_A)} "
,"handler_a"
);
return true;
}
bool handler_b(
){
"{fn:%s,ctx:%p,data:'%c',type:%d(EVENT_CODE_B)} "
,"handler_b"
,*data
);
return true;
}
bool handler_bb(
){
"{fn:%s,ctx:%p,data:'%c',type:%d(EVENT_CODE_B)} "
,"handler_bb"
,*data
);
return true;
}
bool handler_c(
){
"{fn:%s,ctx:%p,data:%p,type:%d("
,"handler_c"
,data
);
case EVENT_CODE_A:
break;
case EVENT_CODE_B:
break;
default:
break;
}
return true;
}
handler_a
,EVENT_CODE_A
,0
)
handler_b
,EVENT_CODE_B
,0
)
handler_bb
,EVENT_CODE_B
,0
)
handler_c
,ZRTOS_EVENT_TYPE__ANY
,(void*)0xFFAA
)
);
int main(void){
void *ptr = (void*) 0xFAFA;
char val = 'Z';
global_events
,ZRTOS_EVENT_TYPE__ANY
,"test"
);
global_events
,EVENT_CODE_A
,ptr
);
global_events
,EVENT_CODE_B
,&val
);
return 0;
}
### static tasks ###
#include <avr/io.h>
#define ZRTOS_ARCH__ATMEGA328P
#define ZRTOS_BOARD__AVR_SOFTWARE_EMULATOR
__attribute__((noreturn)) void callback_a(void *args){
static size_t a = 0;
while(true){
a++;
}
__builtin_unreachable();
}
__attribute__((noreturn)) void callback_b(void *args){
static size_t b = 0;
while(true){
b++;
}
__builtin_unreachable();
}
__attribute__((noreturn)) void callback_c(void *args){
static size_t c = 0;
while(true){
c++;
}
__builtin_unreachable();
}
int main(void){
&task_a
,heap_a+159
,callback_a
,(void*)0xAAAA
);
&task_b
,heap_b+159
,callback_b
,(void*)0xAAAA
);
&task_c
,heap_c+159
,callback_c
,(void*)0xAAAA
);
while(true){
}
}
### static pthread ###
#include <avr/io.h>
#define ZRTOS_ARCH__ATMEGA328P
#define ZRTOS_BOARD__AVR_SOFTWARE_EMULATOR
void *callback_aa(void *args){
return (void*)0xA0A1;
}
void *callback_a(void *args){
void *retval;
&thread_aa
,0
,callback_aa
,(void*)0xAAAA
);
return (void*)0xA0A1;
}
void *callback_bb(void *args){
while(1){
}
return (void*)0xA0A1;
}
void *callback_b(void *args){
&thread_bb
,0
,callback_bb
,(void*)0xAAAA
);
return (void*)0xB0B1;
}
void *callback_c(void *args){
return (void*)0xC0C1;
}
int main(void){
void *retval;
&thread_a
,&attr
,callback_a
,(void*)0xAAAA
);
&thread_b
,&attr
,callback_b
,(void*)0xAAAA
);
&thread_c
,&attr
,callback_c
,(void*)0xAAAA
);
}
}
### VM ###
#include <avr/io.h>
#define ZRTOS_ARCH__ATMEGA328P
#define ZRTOS_BOARD__AVR_SOFTWARE_EMULATOR
){
static uint64_t a = 0;
a++;
}
){
static uint64_t a = 0;
a++;
}
);
int main(void){
,0x00
,0x01
};
&stack
,(void *)0x300
,100
);
&program
,program_data
);
&functions
,vm_functions
);
&vm
,stack
,program
,functions
);
return ret;
}
### VFS ###
#include <avr/io.h>
#include <stdint.h>
#include <stddef.h>
#define ZRTOS_ARCH__ATMEGA328P
#define ZRTOS_BOARD__AVR_SOFTWARE_EMULATOR
#define ZRTOS_VFS_FILE_DESCRIPTOR__CFG_MAX 10
#define ZRTOS_VFS_MODULE_AVR_ADC__CFG_PRESCALER (ZRTOS_BINARY__00000101)
#define ZRTOS_VFS_MODULE_AVR_ADC__CFG_VREF (ZRTOS_BINARY__01000000)
#define ZRTOS_VFS_MODULE_AVR_ADC__CFG_MAX_CHANNEL (6)
#define ZRTOS_VFS_MODULE_AVR_ADC__CFG_REFERENCE_VOLT (5.0)
void setup(void){
Serial.begin(19200);
}
void on_can_read_zero(
){
size_t outlen;
Serial.print("#ZERO:");
Serial.print(buffer[0], HEX);
Serial.print("\n");
}
void on_can_read_random(
){
size_t outlen;
Serial.print("#RANDOM:");
Serial.print(buffer[0], HEX);
Serial.print("\n");
}
void on_can_read_adc(
){
size_t outlen;
float val;
Serial.print("#ADC:");
Serial.print(l, DEC);
Serial.print(": ");
fd
,0
,&val
,sizeof(val)
,l*sizeof(val)
,&outlen
);
Serial.print((int)err, DEC);
Serial.print(":");
Serial.print(val, DEC);
Serial.print("\n");
delay(1000);
}
}
void loop(void){
&dev
,(char*)"dev"
,0
);
&dev_zero
,(char*)"zero"
,&dev
);
&dev_null
,(char*)"null"
,&dev
);
&dev_random
,(char*)"random"
,&dev
);
&dev_gpiochip0
,(char*)"gpiochip0"
,&dev
);
&dev_adc
,(char*)"adc"
,&dev
);
&dev_zero
,0
);
&dev_random
,0
);
&dev_gpiochip0
,0
);
&dev_adc
,0
);
¬ify
);
¬ify
);
}
Supported Chips and Boards