ProtoThreads 入门

本文介绍如何在Ubuntu环境下编译Protothreads源码并运行示例程序,包括protothread基本运行、带缓冲区的生产和消费以及密码锁示例,展示了Protothreads在嵌入式系统中的应用。
1 源码下载地址

http://dunkels.com/adam/pt/download.html
在这里插入图片描述

1 源码 例子编译

将下载下来的源码:
放到 ubuntu 等 linux 环境下,
解压:
tar xvf pt-1.4.tar.gz
进入目录:
cd pt-1.4
编译:
make
cc -O -Wuninitialized -Werror example-codelock.c pt.h lc.h -o example-codelock
cc -O -Wuninitialized -Werror example-buffer.c pt.h lc.h -o example-buffer
cc -O -Wuninitialized -Werror example-small.c pt.h lc.h -o example-small

分别执行:

执行1

./example-small
Protothread 1 running
Protothread 2 running
Protothread 1 running
Protothread 2 running
Protothread 1 running
Protothread 2 running
Protothread 1 running
Protothread 2 running
Protothread 1 running

执行2

./example-buffer
./example-buffer
Item 0 produced
Item 0 added to buffer at place 0
Item 1 produced
Item 1 added to buffer at place 1
Item 2 produced
Item 2 added to buffer at place 2
Item 3 produced
Item 3 added to buffer at place 3
Item 4 produced
Item 4 added to buffer at place 4
Item 5 produced
Item 5 added to buffer at place 5
Item 6 produced
Item 6 added to buffer at place 6
Item 7 produced
Item 7 added to buffer at place 7
Item 0 retrieved from buffer at place 0
Item 0 consumed
Item 1 retrieved from buffer at place 1
Item 1 consumed
Item 2 retrieved from buffer at place 2
Item 2 consumed
Item 3 retrieved from buffer at place 3
Item 3 consumed
Item 4 retrieved from buffer at place 4
Item 4 consumed
Item 5 retrieved from buffer at place 5
Item 5 consumed
Item 6 retrieved from buffer at place 6
Item 6 consumed
Item 7 retrieved from buffer at place 7
Item 7 consumed
Item 8 produced
Item 8 added to buffer at place 0
Item 9 produced
Item 9 added to buffer at place 1
Item 10 produced
Item 10 added to buffer at place 2
Item 11 produced
Item 11 added to buffer at place 3
Item 12 produced
Item 12 added to buffer at place 4
Item 13 produced
Item 13 added to buffer at place 5
Item 14 produced
Item 14 added to buffer at place 6
Item 15 produced
Item 15 added to buffer at place 7
Item 8 retrieved from buffer at place 0
Item 8 consumed
Item 9 retrieved from buffer at place 1
Item 9 consumed
Item 10 retrieved from buffer at place 2
Item 10 consumed
Item 11 retrieved from buffer at place 3
Item 11 consumed
Item 12 retrieved from buffer at place 4
Item 12 consumed
Item 13 retrieved from buffer at place 5
Item 13 consumed
Item 14 retrieved from buffer at place 6
Item 14 consumed
Item 15 retrieved from buffer at place 7
Item 15 consumed
Item 16 produced
Item 16 added to buffer at place 0
Item 17 produced
Item 17 added to buffer at place 1
Item 18 produced
Item 18 added to buffer at place 2
Item 19 produced
Item 19 added to buffer at place 3
Item 20 produced
Item 20 added to buffer at place 4
Item 21 produced
Item 21 added to buffer at place 5
Item 22 produced
Item 22 added to buffer at place 6
Item 23 produced
Item 23 added to buffer at place 7
Item 16 retrieved from buffer at place 0
Item 16 consumed
Item 17 retrieved from buffer at place 1
Item 17 consumed
Item 18 retrieved from buffer at place 2
Item 18 consumed
Item 19 retrieved from buffer at place 3
Item 19 consumed
Item 20 retrieved from buffer at place 4
Item 20 consumed
Item 21 retrieved from buffer at place 5
Item 21 consumed
Item 22 retrieved from buffer at place 6
Item 22 consumed
Item 23 retrieved from buffer at place 7
Item 23 consumed
Item 24 produced
Item 24 added to buffer at place 0
Item 25 produced
Item 25 added to buffer at place 1
Item 26 produced
Item 26 added to buffer at place 2
Item 27 produced
Item 27 added to buffer at place 3
Item 28 produced
Item 28 added to buffer at place 4
Item 29 produced
Item 29 added to buffer at place 5
Item 30 produced
Item 30 added to buffer at place 6
Item 31 produced
Item 31 added to buffer at place 7
Item 24 retrieved from buffer at place 0
Item 24 consumed
Item 25 retrieved from buffer at place 1
Item 25 consumed
Item 26 retrieved from buffer at place 2
Item 26 consumed
Item 27 retrieved from buffer at place 3
Item 27 consumed
Item 28 retrieved from buffer at place 4
Item 28 consumed
Item 29 retrieved from buffer at place 5
Item 29 consumed
Item 30 retrieved from buffer at place 6
Item 30 consumed
Item 31 retrieved from buffer at place 7
Item 31 consumed

执行3

./example-codelock
Waiting 1 second before entering first key.
— Key ‘1’ pressed
Correct key ‘1’ found
— Key ‘2’ pressed
Incorrect key ‘2’ found
— Key ‘3’ pressed
Incorrect key ‘3’ found
— Key ‘1’ pressed
Correct key ‘1’ found
— Key ‘4’ pressed
Correct key ‘4’ found
1— Key ‘2’ pressed
Correct key ‘2’ found
Code lock timer expired.
2— Key ‘3’ pressed
Incorrect key ‘3’ found
— Key ‘1’ pressed
Correct key ‘1’ found
— Key ‘4’ pressed
Correct key ‘4’ found
— Key ‘2’ pressed
Correct key ‘2’ found
— Key ‘3’ pressed
Correct key ‘3’ found
Correct code entered, waiting for 500 ms before unlocking.
— Key ‘4’ pressed
Key pressed during final wait, code lock locked again.
— Key ‘1’ pressed
Correct key ‘1’ found
— Key ‘4’ pressed
Correct key ‘4’ found
3— Key ‘2’ pressed
Correct key ‘2’ found
— Key ‘3’ pressed
Correct key ‘3’ found
Correct code entered, waiting for 500 ms before unlocking.
Code lock unlocked.

源码在 nu-nuc140 板子上面运行的代码:

https://download.youkuaiyun.com/download/wowocpp/10966691

ProtoThreads 是一个轻量级的 C 语言协程库,专为资源受限的嵌入式系统设计。它允许开发者在没有操作系统支持的情况下实现异步编程,从而避免阻塞式操作对性能的影响。通过使用 ProtoThreads,可以有效地管理多个并发任务,而无需依赖复杂的线程调度机制。 在实际应用中,ProtoThreads 被广泛用于处理需要与外部设备(如芯片)通信的任务。例如,在执行某些操作时,程序需要等待设备完成特定任务后才能继续,这种情况下通常会看到类似 `WAIT_AND_CHECK_STATUS(return_status, optiga_lib_status);` 的代码片段。这类操作可能非常耗时,但在有或没有操作系统的环境中都能通过 ProtoThreads 实现非阻塞的异步功能[^1]。 为了使用 ProtoThreads,开发者需要将 `include/pt.h` 头文件包含到自己的项目中,并根据具体需求编写相应的代码。值得注意的是,ProtoThreads-CPP 项目并没有提供明确的“启动文件”,这意味着用户需要自行创建这些文件以开始使用该库[^2]。 下面是一个简单的 ProtoThreads 使用示例,展示了如何定义一个协程以及如何在其内部进行状态检查和延时操作: ```c #include "pt.h" // 定义协程所需的结构体 struct pt my_thread; // 协程函数 static int my_thread_func(struct pt *pt) { PT_BEGIN(pt); // 模拟等待某个条件满足的过程 while (!some_condition()) { PT_WAIT_UNTIL(pt, some_condition()); } // 执行一些操作 do_something(); // 模拟延时操作 PT_SLEEP(pt, 1000); // 延迟1000个时钟周期 // 再次执行一些操作 do_another_thing(); PT_END(pt); } int main(void) { PT_INIT(&my_thread); while (1) { my_thread_func(&my_thread); } return 0; } ``` 在这个例子中,`PT_BEGIN` 和 `PT_END` 宏用于标记协程的开始和结束。`PT_WAIT_UNTIL` 宏使协程暂停执行,直到指定条件成立。此外,`PT_SLEEP` 宏可以让协程暂停一段指定的时间。这些宏共同作用,使得协程能够在不阻塞整个程序的前提下处理各种任务[^3]。 对于希望深入了解 ProtoThreads 或者寻找更多高级特性的开发者来说,可以参考由 Craig Graham 扩展的 `graham-pt.h` 文件,其中增加了对 sleep/wake/kill 等操作的支持,进一步增强了 ProtoThreads 的灵活性和实用性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值