无需任务栈,不需要适配的单文件类操作系统

在小型单片机系统中,笔者经常用到改进版protothreads,使用简单方便,占用空间小。在此做个简单介绍,推荐给大家。

Protothreads原始版本

Protothreads 是瑞典计算机科学研究所大神Adam Dunkels发明的类操作系统,具有多线程无堆栈超轻量级的优点,适用于小微型内存的单片机系统,比如小型嵌入式系统,无线网络传感器,IOT模块等。 它采用事件驱动实现顺序控制,来处理阻塞等待事件。

源代码结构见下图,主要只有pt.h, pt-sem.h, lc.h, lc-switch.h, lc-addrlabels.h 5个文件。

Protothreads233

特点:

  • 非常小的RAM使用量,一个线程只需要消耗2个字节;
  • 可移植性强,纯C写的,不需要任何汇编代码;
  • 提供多线程阻塞处理和线程切换;
  • 在BSD开源协议下免费提供;
#include "pt.h" 

struct pt pt;
struct timer timer; 

PT_THREAD(example(struct pt *pt))
{
  PT_BEGIN(pt); 

  while(1) {

    if(initiate_io()) {
      timer_start(&timer);

      PT_WAIT_UNTIL(pt,
         io_completed() ||
         timer_expired(&timer));

      read_data();
    }
  }

  PT_END(pt);
}

PT单文件优化版

Adam Dunkels大神已经将PT写的够精简,功能够强大了。但是在我使用的过程中,针对小型MCU系统,我比较关心下面两点:

1 免移植,使用尽量简单;

2 实现sleep功能。

延时上,原系统需要配合Timer实现,使用稍微有点麻烦。所以优化开发了个单文件版本,加上了pt_sleep功能,总共代码不足100行。

使用时很简单,比原始版本更接近带操作系统的结构:

Protothreads850

本系统有以下优点:

  1. 总代码不足100行,非常精简;
  2. 提供了PT_SLEEP, PT_WAITUNTIL, PT_SEM_WAIT, PT_SEM_SIGNAL等基本函数,方便使用;
  3. 单h文件,无需适配,使用时直接包含即可;
  4. 任务栈占用少,保存关键寄存器。

该版本在ST芯片上使用,直接包含pt.h即可。在其他芯片上芯片上使用,实现HA_GetTick函数即可。返回值单位是毫秒。

Protothreads1059

使用时注意:

  1. task内的局部变量,要定义为static形式,防止跳出任务又返回后,出现变量被修改的情况;
  2. 在非ARM平台上使用,建议使用原版。bmsdb也做了支持MSP430的版本,后面可以发出来。
posted @ 2010-03-09 08:45  V大阳  阅读(161)  评论(0编辑  收藏  举报