无需任务栈,不需要适配的单文件类操作系统
在小型单片机系统中,笔者经常用到改进版protothreads,使用简单方便,占用空间小。在此做个简单介绍,推荐给大家。
Protothreads原始版本
Protothreads 是瑞典计算机科学研究所大神Adam Dunkels发明的类操作系统,具有多线程无堆栈超轻量级的优点,适用于小微型内存的单片机系统,比如小型嵌入式系统,无线网络传感器,IOT模块等。 它采用事件驱动实现顺序控制,来处理阻塞等待事件。
源代码结构见下图,主要只有pt.h, pt-sem.h, lc.h, lc-switch.h, lc-addrlabels.h 5个文件。
特点:
- 非常小的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行。
使用时很简单,比原始版本更接近带操作系统的结构:
本系统有以下优点:
- 总代码不足100行,非常精简;
- 提供了PT_SLEEP, PT_WAITUNTIL, PT_SEM_WAIT, PT_SEM_SIGNAL等基本函数,方便使用;
- 单h文件,无需适配,使用时直接包含即可;
- 任务栈占用少,保存关键寄存器。
该版本在ST芯片上使用,直接包含pt.h即可。在其他芯片上芯片上使用,实现HA_GetTick函数即可。返回值单位是毫秒。
使用时注意:
- task内的局部变量,要定义为static形式,防止跳出任务又返回后,出现变量被修改的情况;
- 在非ARM平台上使用,建议使用原版。bmsdb也做了支持MSP430的版本,后面可以发出来。
本文来自博客园,作者:V大阳,转载请注明原文链接:https://www.cnblogs.com/bmsdb/archive/2010/03/09/pt-small-os-stack-free.html