agileRTOS (zrtos)  Version 0.8.0 (ghostbuster)
agileRTOS (zrtos) Documentation

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>
/**
* If malloc and new is only used on boot without releasing the memory, code and
* ram usage can be further reduced by '#define ZRTOS_MALLOC__CFG_DISABLE_FREE'.
*/
//#define ZRTOS_MALLOC__CFG_DISABLE_FREE
#include <zrtos/malloc.h>
// global heap for malloc()/free()
int main(void){
// separate heap usable with zrtos_malloc__malloc()/zrtos_malloc__free()
// separate heap usable with zrtos_malloc__malloc()/zrtos_malloc__free()
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++){
ptr[l] = zrtos_malloc__malloc(heap2,16);
}
for(l=0;l<=length;l++){
}
for(l=0;l<=length;l++){
ptr[l] = zrtos_malloc__malloc(heap3,16);
}
for(l=0;l<=length;l++){
}
return 0;
}

vheap

#include <avr/io.h>
#include <zrtos/vheap.h>
int main(void){
&mem
,160
);
&mem
,chunka
);
&mem
,chunkb
);
&mem
,chunkc
);
&mem
,chunkd
);
&mem
,chunka
);
&mem
,chunkb
);
&mem
,chunkc
);
&mem
,chunkd
);
zrtos_vheap__free(&mem,chunkb);
&mem
,chunka
);
&mem
,chunkc
);
zrtos_vheap__free(&mem,chunka);
&mem
,chunkc
);
zrtos_vheap__free(&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;
#include <zrtos/debug.h>
bool handler_a(
){
"{fn:%s,ctx:%p,data:%p,type:%d(EVENT_CODE_A)} "
,"handler_a"
);
return true;
}
bool handler_b(
){
char *data = zrtos_event__get_data(args);
"{fn:%s,ctx:%p,data:'%c',type:%d(EVENT_CODE_B)} "
,"handler_b"
,*data
);
return true;
}
bool handler_bb(
){
char *data = zrtos_event__get_data(args);
"{fn:%s,ctx:%p,data:'%c',type:%d(EVENT_CODE_B)} "
,"handler_bb"
,*data
);
return true;
}
bool handler_c(
){
void *data = zrtos_event__get_data(args);
"{fn:%s,ctx:%p,data:%p,type:%d("
,"handler_c"
,data
);
switch(zrtos_event__get_type(args)){
case EVENT_CODE_A:
ZRTOS_DEBUG("%s(%p)","EVENT_CODE_A",data);
break;
case EVENT_CODE_B:
ZRTOS_DEBUG("%s(%c)","EVENT_CODE_B",((char*)data)[0]);
break;
default:
ZRTOS_DEBUG("%s(%s)","EVENT_CODE_ANY",(char*)data);
break;
}
ZRTOS_DEBUG(")} ");
return true;
}
ZRTOS_EVENT_INDEX(global_events,
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
//#define ZRTOS_DEBUG__CFG_ENABLED
//#define ZRTOS_DEBUG__CFG_MEMORY_CONSOLE 160
__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){
zrtos_arch_stack_t heap_a[160];
zrtos_arch_stack_t heap_b[160];
zrtos_arch_stack_t heap_c[160];
zrtos_task_t task_a;
zrtos_task_t task_b;
zrtos_task_t task_c;
&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
//#define ZRTOS_DEBUG__CFG_ENABLED
//#define ZRTOS_DEBUG__CFG_MEMORY_CONSOLE 160
void *callback_aa(void *args){
return (void*)0xA0A1;
}
void *callback_a(void *args){
pthread_t thread_aa;
void *retval;
&thread_aa
,0
,callback_aa
,(void*)0xAAAA
);
pthread_join(thread_aa,&retval);
return (void*)0xA0A1;
}
void *callback_bb(void *args){
while(1){
}
return (void*)0xA0A1;
}
void *callback_b(void *args){
pthread_t thread_bb;
&thread_bb
,0
,callback_bb
,(void*)0xAAAA
);
return (void*)0xB0B1;
}
void *callback_c(void *args){
return (void*)0xC0C1;
}
int main(void){
pthread_t thread_a;
pthread_t thread_b;
pthread_t thread_c;
void *retval;
if(pthread_attr_init(&attr)==0){
&thread_a
,&attr
,callback_a
,(void*)0xAAAA
);
&thread_b
,&attr
,callback_b
,(void*)0xAAAA
);
&thread_c
,&attr
,callback_c
,(void*)0xAAAA
);
pthread_join(thread_a,&retval);
pthread_join(thread_b,&retval);
pthread_join(thread_c,&retval);
}
}

### VM ###

#include <avr/io.h>
#define ZRTOS_ARCH__ATMEGA328P
#define ZRTOS_BOARD__AVR_SOFTWARE_EMULATOR
#include <zrtos/vm.h>
zrtos_error_t callback0(
struct _zrtos_vm_t *vm
){
static uint64_t a = 0;
a++;
}
zrtos_error_t callback1(
struct _zrtos_vm_t *vm
){
static uint64_t a = 0;
a++;
}
ZRTOS_VM_FUNCTION(0,callback0,0)
,ZRTOS_VM_FUNCTION(1,callback1,0)
);
int main(void){
zrtos_stack_t program;
uint8_t program_data[] = {
,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
//typedef uint8_t max_align_t;
#define ZRTOS_VFS_FILE_DESCRIPTOR__CFG_MAX 10
#include <zrtos/error.h>
#include <zrtos/types.h>
#include <zrtos/vfs_file.h>
#include <zrtos/vfs_fd.h>
#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;
uint8_t buffer[1];
zrtos_vfs_fd__read(fd,0,buffer,1,0,&outlen);
Serial.print("#ZERO:");
Serial.print(buffer[0], HEX);
Serial.print("\n");
}
void on_can_read_random(
){
size_t outlen;
uint8_t buffer[1];
zrtos_vfs_fd__read(fd,0,buffer,1,0,&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){
zrtos_vfs_dentry_t dev_random;
zrtos_vfs_dentry_t dev_gpiochip0;
&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
,ZRTOS_VFS_PLUGIN(arduino_gpio)
,0
);
&dev_adc
,ZRTOS_VFS_PLUGIN(avr_adc)
,0
);
zrtos_vfs_fd_t fd_zero;
zrtos_vfs_fd_t fd_random;
&notify
);
zrtos_vfs_fd__open((char*)"/dev/zero",&fd_zero);
zrtos_vfs_fd__open((char*)"/dev/random",&fd_random);
zrtos_vfs_fd__open((char*)"/dev/adc",&fd_adc);
zrtos_vfs_notify__add(&notify,fd_zero,on_can_read_zero,0);
zrtos_vfs_notify__add(&notify,fd_random,on_can_read_random,0);
zrtos_vfs_notify__add(&notify,fd_adc,on_can_read_adc,0);
&notify
);
}

Supported Chips and Boards

  • None