简易协程操作系统

在使用类似只有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使用操作系统了

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值