{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# ProtoThreads库" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "引入$keywords.txt$\n", "\n", ">## Datatypes (KEYWORD1)\n", "\n", ">PT_WAITING \n", "PT_EXITED\t\n", "PT_ENDED\t\n", "PT_YIELDED\t\n", "\n", "\n", ">## Methods and Functions (KEYWORD2)\n", "\n", ">PT_INIT\t\n", "PT_THREAD\t\n", "PT_BEGIN\t\n", "PT_END\t\n", "PT_WAIT_UNTIL\t\n", "PT_WAIT_WHILE\t\n", "PT_WAIT_THREAD\t\n", "PT_SPAWN\t\n", "PT_EXIT\t\n", "PT_RESTART\t\n", "PT_SCHEDULE\t\n", "PT_YIELD\t\n", "PT_YIELD_UNTIL\t\n", "\n", ">## Constants (LITERAL1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 主要方法(keywords2):\n", "\n", "**pt.h**中所定义的:\n", "- PT_INIT(&name)\n", "- PT_BEGIN(pt)\n", "- PT_END(pt) :*以上三个方法属于基本结构,在使用ProtoThreads时,必须有:在setup()函数中的初始化步骤PT_INIT(pt),同时定义线程函数,包含PT_BEGIN(pt)&PT_END(pt)*\n", "- PT_WAIT_UNTIL(pt,condition):条件成立,则继续执行;条件不成立,则暂停执行,将CPU让给其他。。。等待直到条件成立\n", "- PT_WAIT_WHILE(pt,condition):条件不成立,则继续执行;条件成立,则暂停执行,将CPU让给其他。。。条件成立后,等待\n", "- PT_WAIT_THREAD(pt,another_thread):当another_thread执行时,暂停运行,直到another_thread执行完毕再继续\n", "- PT_SPAWN(pt,&pt_child, thread):pt是当前线程的pointer,&pt_child是子线程的pointer,thread是子线程的实际表达函数写作function(&pt_child)。\n", "- PT_RESTART(pt):重启本线程\n", "- PT_EXIT(pt):退出本线程\n", "- PT_YIELD(pt):将CPU让出\n", "- PT_YIELD_UNTIL(pt,condition):将CPU让出,直到条件成立再收回\n", "\n", "**pt_sem.inc**中所引入的:\n", "- PT_SEM_INIT(&name_of_semaphore, num_of_semaphore):定义一个名为name_of_samephore的信息量,其初始可用信息量为num\n", "- PT_SEM_WAIT(pt,&name_of_semaphore):可用信息量减小一\n", "- PT_SEM_SIGNAL(pt,&name_of_semaphore):可用信息量增加一\n", "\n", "**PT_timer.h**([来自](www.cnblogs.com/xiaowuyi/p/4319720.html))中所定义的:\n", "定义对象:\n", "PT_timer t;\n", "对象调用方法\n", "- t.setTimer(unsigned long duration):延时duration微秒\n", "- t.Expired():和上一方法连用,若setTimer计时结束,则返回True." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 基本结构\n", "\n", "**pt.h:**\n", "```c\n", "#include \n", "static struct pt First,Seconde;//创建两个线程任务\n", "\n", "void setup()\n", "{\n", " PT_INIT(&First);\n", " PT_INIT(&Seconde);//初始化两个任务\n", "}\n", "\n", "static int thread1(struct pt *pt)//建立任务描述的主题函数\n", "{\n", " PT_BEGIN(pt);\n", " while(1)\n", " {\n", " 循环内主体内容\n", " }\n", " 循环外内容\n", " PT_END(pt)\n", "}\n", "\n", "void loop()\n", "{\n", " thread1(&First);\n", " thread2(&Seconde);//调用线程函数\n", "}\n", "```\n", " \n", " \n", "**PT_timer.h**\n", "```c\n", "#include \n", "\n", "void setup()\n", "{\n", " 无需初始化\n", "}\n", "\n", "void loop()\n", "{\n", " 调用PT_timer方法即可\n", "}\n", "\n", "```\n", " \n", " \n", "**PT_sem.inc**\n", "```c\n", "#define PT_USE_SEM\n", "static struct pt_sem name_of_semaphore;\n", "\n", "void setup()\n", "{\n", " PT_SEM_INIT(&name_of_semaphore,num)\n", "}\n", "\n", "void loop()\n", "{\n", " 调用PT_SEM方法即可\n", "}\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 例子\n", "源自[这里](www.cnblogs.com/xiaowuyi/4355161.html)\n", "\n", "```c\n", "#include//声明protothread\n", "#include//声明pt.timer\n", "#define ANGEROFWIFE 1//老婆的愤怒\n", "#define MOTHERCALL 2//老母的呼唤\n", "#define KNEE 3//遭殃的膝盖\n", "#define HAND 4//幸福的双手\n", "\n", "static struct pt pt1,pt2;\n", "PT_timer servotimer1;\n", "PT_timer servotimer2;//定义两个计时器\n", "\n", "void setup()\n", "{\n", " pinMode(ANGEROFWIFE,INPUT);\n", " pinMode(MOTHERCALL,INPUT);\n", " pinMode(KNEE,OUTPUT);\n", " pinMode(HAND,OUTPUT);//定义端口输入输出\n", " PT_INIT(&pt1);\n", " PT_INIT(&pt2);//两个线程初始化,其实就是pt->lc归零\n", "}\n", "\n", "static int mission1(struct pt *pt)\n", "{\n", " PT_BEGIN(pt);//线程开始\n", " while(1)\n", " {\n", " digitalWrite(KNEE,LOW);//老婆不生气我不跪\n", " PT_WAIT_UNTIL(pt,digitalRead(ANGEROFWIFE));//等老婆生气\n", " digitalWrite(KNEE,HIGH);//我擦真生气了,赶紧跪\n", " servotimer1.setTimer(10000);//设定跪10秒,这里单位1为一微妙\n", " PT_WAIT_UNTIL(pt,(servotimer1.Expired()));//当时间溢出,这里是10秒就结束\n", "}\n", "PT_END(pt);//线程结束\n", "}\n", "\n", "Static int mission2(struct pt *pt)\n", "{\n", " PT_BEGIN(pt);\n", " While(1)\n", "{\n", " digitalWrite(HAND,LOW);\n", " PT_WAIT_UNTIL(pt,digitalRead(MOTHERCALL));\n", " digitalWrite(HAND,HIGH);\n", " servotiemr2.setTimer(15000);\n", " PT_WAIT_UNTIL(pt,(servotimer2.Expired()));\n", "}\n", " PT_END(pt);\n", "}\n", "\n", "void loop()\n", "{\n", " mission1(&pt1);\n", " mission2(&pt2);//循环执行,特步,永不停息\n", "}\n", "\n", "```\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "最后再给一个[链接](https://people.ece.cornell.edu/land/courses/ece4760/PIC32/ProtoThreads/Semaphore_alternating_input.c\n", "),这是一个不错的对ProtoThread的描述的地址。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.0" } }, "nbformat": 4, "nbformat_minor": 2 }