在使用类似只有4k ram 256k rom的MCU小片子时,使用freertos或者ucos基本上会把内存耗光,但是又不想使用裸机跑,这时候就可以用一种非常简洁的操作系统代码去完成小片子的编写,这是一个俄罗斯人写的,我们研发主管教会我的,实际项目中很好用
一、协程的三种状态
#define PT_STATUS_BLOCKED 0 //<阻塞态
#define PT_STATUS_FINISHED -1 //<结束态
#define PT_STATUS_YIELDED -2 //<产生态
二、定义当前代码所处的行数
#define _pt_line3(name, line) _pt_##name##line
#define _pt_line2(name, line) _pt_line3(name, line)
#define _pt_line(name) _pt_line2(name, __LINE__)
三、定义协程数据结构
struct pt {
int label;
int status;
};
#define pt_init() \
{ .label = 0, .status = 0 }
#define pt_begin(pt) \
switch ((pt)->label) { \
case 0:
#define pt_label(pt, stat) \
do { \
(pt)->label = __LINE__; \
(pt)->status = (stat); \
case __LINE__:; \
} while (0)
#define pt_end(pt) \
pt_label(pt, PT_STATUS_FINISHED); \
}
四、核心协程API
#define pt_status(pt) (pt)->status
#define pt_wait(pt, cond) \
do { \
pt_label(pt, PT_STATUS_BLOCKED); \
if (!(cond)) { \
return; \
} \
} while (0)
#define pt_yield(pt) \
do { \
pt_label(pt, PT_STATUS_YIELDED); \
if (pt_status(pt) == PT_STATUS_YIELDED) { \
(pt)->status = PT_STATUS_BLOCKED; \
return; \
} \
} while (0)
#define pt_exit(pt, stat) \
do { \
pt_label(pt, stat); \
return; \
} while (0)
五、demo演示
void task_1(struct pt *pt)
{
pt_begin(pt);
for(;;){
pt_yield(pt);
}
pt_end(pt);
}
void task_2(struct pt *pt)
{
pt_begin(pt);
for(;;){
pt_yield(pt);
}
pt_end(pt);
}
int main(void)
{
struct pt pt_task_1 = pt_init();
struct pt pt_task_2 = pt_init();
for(;;){
task_1(&pt_task_1 );
task_2(&pt_task_2 );
}
}
至此一个最简单的应用就系统就好了,可以基于小的MCU使用操作系统了