https://github.com/blabu/femtox
Simple operation system for microcontrolers
https://github.com/blabu/femtox
arm avr microcontroller msp430
Last synced: 5 days ago
JSON representation
Simple operation system for microcontrolers
- Host: GitHub
- URL: https://github.com/blabu/femtox
- Owner: blabu
- Created: 2017-10-07T10:31:16.000Z (over 8 years ago)
- Default Branch: master
- Last Pushed: 2024-10-21T08:33:54.000Z (over 1 year ago)
- Last Synced: 2024-10-21T11:51:57.422Z (over 1 year ago)
- Topics: arm, avr, microcontroller, msp430
- Language: C
- Size: 604 KB
- Stars: 5
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: Readme.md
Awesome Lists containing this project
README
# Femtox
**
Мини фреймворк написаннный на ANCII C для работы с микроконтроллерами, соответсвует стандарту С99. С нулевыми зависимостями.
**
Возможности
=============
Фреймворк представляет собой прототип кооперативной операционной системы. В котором реализваны следующие возможности:
1. Очередь задач
2. Очередь таймеров
3. Подсистема сигналов и слотов
4. Подсистема управления колбек функциями
5. Система управления и выделения динамической памяти из заранее выделеной кучи
6. Структуры данных стек, очередь (FIFO, FILO) и кольцевой буфер, связанный список
7. Подсистема циклически выполняющихся задач
Введение
=============
Для использования фреймворка необходимо define-ми выбрать архитектру в файле platform.h, для которой будет осуществлятся компиляция или, если необходимой архитектуры найдено не было, реализовать платфомо-зависимые функции по примеру файла PlatformSpecific?????.h.
Поддерживаемые архитектуры:
1. AVR
2. MSP430
3. STM32
4. X86 (из под Linux) - может использоватся как мини фреймворк
5. X86 (из под Windows) - может использоватся как мини фреймворк
Для тонкой настройки фреймворка под заданные нужды существуют файлы FemtoxConf????.h.
В файлах FemtoxTypes???.h - определены типы данных используемые в библиотеки.
Пример использования: минимальный рабочий код.
-------------
```c
#include "TaskMng.h"
#include "PlatformSpecific.h"
int main() {
initFemtOS();
runFemtOS();
return 0;
}
```
initFemtOS() - инициализирует все подсистемы настроенные в файле FemtoxConf????.h.
runFemtOS() - запустит цикл обработки всех подсистем.
Указанный выше код не выполняет никаких полезных функций.
Расмотрим еще пример:
Пример использования: выполняем одну задачу.
-------------
Задачей является любая функция со следующей сигнатурой:
void taskName(BaseSize_t arg_n, BaseParam_t arg_p);
```c
#include "TaskMng.h"
#include "PlatformSpecific.h"
void someVeryImportantTask(BaseSize_t arg_n, BaseParam_t arg_p) {
// Do many important things
SetTimerTask(someVeryImportantTask,arg_n, arg_p,10);
}
int main() {
initFemtOS();
SetTask(someVeryImportantTask,arg_n, arg_p);
runFemtOS();
return 0;
}
```
В коде выше функция void someVeryImportantTask(BaseSize_t arg_n, BaseParam_t arg_p)
будет выполнена сразу после вызова runFemtOS()
По завершению выполнения этой функции будет запущен таймер для запуска ее же через 10 тиков операционной системы.
После чего, процесс повторится, и так до бесконечности.
Код выше можно упростить с приминением подсистема циклически выполняющихся задач:
```c
#include "TaskMng.h"
#include "PlatformSpecific.h"
void someVeryImportantTask() {
// Do many important things
}
int main() {
initFemtOS();
SetCycleTask(10, someVeryImportantTask,TRUE);
runFemtOS();
return 0;
}
```
Аналогично предыдущему, функция void someVeryImportantTask() будет вызыватся каждые 10 тактов операционной системы.
Пример использования: подсистема колбек-ов.
-------------
Колбэк - это отложеный вызов функции по завершению какой-либо задачи.
На одну регистрацию колбека будет вызван один раз колбэк.
```c
#include "TaskMng.h"
#include "PlatformSpecific.h"
void someVeryImportantTask(BaseSize_t count, BaseParam_t argPtr) {
switch(count) {
case 0:
// Do some prepare stuff
count++;
SetTimerTask(someVeryImportantTask,count,argPtr,20); // Back here later
return;
case 1:
// Do some another stuff
if(argPtr == NULL) count=10;
else count = 20;
SetTimerTask(someVeryImportantTask,count,argPtr,100); // Back here later
return;
case 10:
// Do some stuff
count = 2;
SetTask(someVeryImportantTask,count,argPtr);
case 20:
// Do some stuff
count = 2;
SetTask(someVeryImportantTask,count,argPtr);
case 2:
// Finish some
count = 0xFF;
SetTask(someVeryImportantTask,count,argPtr); //Call task as quickly as you can
return;
default:
execCallBack((void*)someVeryImportantTask); // Задача завершилась, сообщим об этом всем
return;
}
}
void waitSomeTask(BaseSize_t argN, BaseParam_t argPtr) {
// Do some
}
int main() {
initFemtOS();
registerCallBack(waitSomeTask,0,NULL,someVeryImportantTask);
// По завершению этой задачи будет вызван waitSomeTask с указанными выше параметрами
SetTask(someVeryImportantTask,0,NULL);
// По заверению этой задачи ничего вызвано не будет так как новый колбэк не зарегистрирован
SetTimerTask(someVeryImportantTask,0,NULL,BIG_TIME_DELAY);
runFemtOS();
return 0;
}
```
Пример использования: подсистема сигналов.
-------------
Для реализации патерна издатель-подписчик хорошо подойдет подсистема сигналов
```c
#include "TaskMng.h"
#include "PlatformSpecific.h"
void* someVeryImportantSignal = (void*)10; // Здесь может быть что угодно (это лишь метка)
void someVeryImportantTask(BaseSize_t count, BaseParam_t argPtr) {
switch(count) {
case 0:
// Do some prepare stuff
count++;
SetTimerTask(someVeryImportantTask,count,argPtr,20); // Back here later
return;
case 1:
// Do some another stuff
if(argPtr == NULL) count=10;
else count = 20;
SetTimerTask(someVeryImportantTask,count,argPtr,100); // Back here later
return;
case 10:
// Do some stuff
count = 2;
SetTask(someVeryImportantTask,count,argPtr);
case 20:
// Do some stuff
count = 2;
SetTask(someVeryImportantTask,count,argPtr);
case 2:
// Finish some
count = 0xFF;
SetTask(someVeryImportantTask,count,argPtr); //Call task as quickly as you can
return;
default:
emitSignal(someVeryImportantSignal, count, argPtr); // Генерируем сигнал с параметрами
return;
}
}
void waitSomeTask(BaseSize_t argN, BaseParam_t argPtr) {
// Do some
}
#define BIG_TIME_DELAY 0xFFFF0
int main() {
initFemtOS();
connectTaskToSignal(waitSomeTask, someVeryImportantSignal);
// По завершению задачи будет создан сигнал и вызвана функция waitSomeTask
SetTask(someVeryImportantTask,0,NULL);
// Через заданное время сново будет создан сигнал и вызвана функция waitSomeTask
SetTimerTask(someVeryImportantTask,0,NULL,BIG_TIME_DELAY);
runFemtOS();
return 0;
}
```
Лицензия
-------------
MIT License