当前位置: 首页 > news >正文

衡阳网站建设衡阳千度网络百度优化教程

衡阳网站建设衡阳千度网络,百度优化教程,扬之云公司网站建设,免费软件app下载状态机——Protothreads 宗旨#xff1a;技术的学习是有限的#xff0c;分享的精神是无限的。 一、prothreads的优缺点 优点#xff1a; 1. 以纯C语言实现#xff0c;无硬件依靠性#xff1b;因此不存在移植的困难。 2. 极少的资源需求#xff0c;每个Protothread仅需要…状态机——Protothreads 宗旨技术的学习是有限的分享的精神是无限的。 一、prothreads的优缺点 优点 1. 以纯C语言实现无硬件依靠性因此不存在移植的困难。 2. 极少的资源需求每个Protothread仅需要2个额外的字节 3. 支持阻塞操纵且没有栈的切换。 缺点 1. 函数中不具备可重入型不能使用局部变量 2. 按顺序判断各任务条件是否满足因此无优先级抢占 3. 任务中的各条件也是按顺序判断的因此要求任务中的条件必须是依次出现的 protothread的阻塞机制在每个条件判断前先将当前地址保存到某个变量中再判断条件是否成立若条件成立则往下运行若条件不成立则返回。 二、注意事项 注意 1任务中使用的变量应为静态变量 2线程内不能使用纯 while(1)--即含 PT_WAIT_UNTIL()等宏的 while(1)是可以的。 不能在 switch(){case…}中调用任务 Protothreads API 带有 case 的语句即只能单向嵌套。 3线程内可以使用: for(){…} switch(){case…}-- case 与 case 之间必须是一个完整的语句或者语句段 if(){…}else{…} 含宏的 while(1){…} 4ProtothreadS 系统可以仍然还是个大 while(1)循环。但也可设计为根据定时器产生的恒定间隔的中断来触发和管理任务 --时间触发方式的嵌入式系统此时可更改 pt 结构体为见《时间触发模式下的 ProtothreadS 设计应用》 struct pt { lc_t lc; unsigned short count; // 每次中断都减 1 unsigned short load; // 初始计数值 char ready; // 任务就绪标志 } 5在 ProtothreadS 系统中延时 1如果 ProtothreadS 系统是基于时间触发则延时可基于该触发--即基于系统时钟。 2如果 ProtothreadS 系统中无系统时钟 6Protothreads 虽然提供了在各自线程内的条件阻塞机制但对于在该线程内调用的其它函数则无法阻塞其运行。所以 如果要在线程内调用占用时间较多的函数为保证各个线程的实时性要求需要将这类函数进一步划分为更小的函数分步执 行。 7 Protothread 的精华当 Protothread 程序运行到 PT_WAIT_UNTIL 时判断其运行条件是否满足若不满足则阻塞。 Protothread 的阻塞其实质就是函数返回。 Protothread 仅能在程序员指定位置阻塞。 三、protothreads各函数简要介绍 函数 说明 PT_INIT(pt) 初始化任务变量只在初始化函数中执行一次 PT_BEGIN(pt) 启动任务处理放在函数开始处 PT_END(pt) 结束任务放在函数的最后 PT_WAIT_UNTIL(pt,condition) 条件成立执行下面的否则退出下次直接跳到此处执行 PT_WAIT_WHILE(pt, condition) 类似PT_WAIT_UNTIL只是条件取反了 PT_WAIT_THREAD(pt, thread) 等待一个子任务执行完成 PT_SPAWN(pt, child, thread) 新建一个子任务并等待其执行完退出 PT_RESTART(pt) 重新启动某个任务执行 PT_EXIT(pt) 任务后面的部分不执行直接退出重新执行 PT_YIELD(pt) 锁死任务 PT_YIELD_UNTIL(pt, condition) 锁死任务等待条件成立重新执行 四、protothreads代码 struct pt {lc_t lc; };#define PT_WAITING 0 #define PT_YIELDED 1 #define PT_EXITED 2 #define PT_ENDED 3#define PT_INIT(pt) LC_INIT((pt)-lc)#define PT_THREAD(name_args) char name_args#define PT_BEGIN(pt) { char PT_YIELD_FLAG 1;LC_RESUME((pt)-lc)#define PT_END(pt) LC_END((pt)-lc);PT_YIELD_FLAG 0; \PT_INIT(pt); return PT_ENDED; }#define PT_WAIT_UNTIL(pt, condition) \do { \LC_SET((pt)-lc); \if(!(condition)) { \returnPT_WAITING; \} \} while(0)#define PT_WAIT_WHILE(pt, cond) PT_WAIT_UNTIL((pt), !(cond))#define PT_WAIT_THREAD(pt, thread)PT_WAIT_WHILE((pt), PT_SCHEDULE(thread))#define PT_SPAWN(pt, child, thread) \do { \PT_INIT((child)); \PT_WAIT_THREAD((pt), (thread)); \} while(0)#define PT_RESTART(pt) \do { \PT_INIT(pt); \returnPT_WAITING; \} while(0)#define PT_EXIT(pt) \do { \PT_INIT(pt); \returnPT_EXITED; \} while(0)#define PT_SCHEDULE(f) ((f) PT_EXITED)#define PT_YIELD(pt) \do { \PT_YIELD_FLAG 0; \LC_SET((pt)-lc); \if(PT_YIELD_FLAG 0) { \returnPT_YIELDED; \} \} while(0)#define PT_YIELD_UNTIL(pt, cond) \do { \PT_YIELD_FLAG 0; \LC_SET((pt)-lc); \if((PT_YIELD_FLAG 0) || !(cond)) { \returnPT_YIELDED; \} \} while(0)五、举例 //解码 static char camera_rs485_rx_decode(struct pt *pt, uint8_t c) {PT_BEGIN(pt);PT_WAIT_UNTIL(pt, 0x7E c);camera_rs485.rx_count 0;while(1){PT_YIELD(pt);if (0x7E c){if(camera_rs485.rx_count){camera_rs485_dispatch(camera_rs485.rx_buf,camera_rs485.rx_count);PT_EXIT(pt);}else{continue;}}if(0x1B c){PT_YIELD(pt);if (0x00 c){c 0x1B;}else if (0x65 c){c 0x7E;}else{//c ^0x20;}}if(camera_rs485.rx_count CAMERA_RS485_RX_BUF_SIZE){camera_rs485.rx_buf[camera_rs485.rx_count] c;}else{PT_EXIT(pt);}}PT_END(pt); }// 模块类型识别——定时器 static char gps_probe(struct pt *pt, uint32_t ms) {staticuint32_t tmo 0;static inti;const char*cmd;if (tmo ms){tmo - ms;}else{tmo 0;}PT_BEGIN(pt);tmo 3000;PT_WAIT_UNTIL(pt, (0 tmo));if(GPS_MODULE_TYPE_UNKNOWN gps.module_type){for(i GPS_MODULE_TYPE_UNKNOWN 1; i GPS_MODULE_TYPE_COUNT; i){if(gps_cmds[i].query_version){debug(gps_probe type: %d cmd: %s, i,gps_cmds[i].query_version);// 发送两次确保模块接收到正确的命令cmd gps_cmds[i].query_version;UartSend(gps_uart, cmd, strlen(cmd));PT_YIELD(pt);cmd gps_cmds[i].query_version;UartSend(gps_uart, cmd, strlen(cmd));// 等待模块输出版本信息tmo 3000;PT_WAIT_UNTIL(pt, (0 tmo));}if(GPS_MODULE_TYPE_UNKNOWN ! gps.module_type){break;}}}// stopPT_WAIT_UNTIL(pt, FALSE);PT_END(pt); }
http://www.pierceye.com/news/744717/

相关文章:

  • 有没有哪个做美食的网站wordpress多用户模版
  • 网站关键词几个justnews wordpress
  • 创维爱内购网站2017网站设计尺寸
  • 网站建设的一般过程包括哪些方面手机免费制作app的软件下载
  • dw对网站建设有哪些作用深圳团购网站设计多少钱
  • 阿里巴巴网站详情页怎么做龙岩公司做网站
  • 网站后台这么做视频教程佛山百度seo排名
  • 网站建立吸引人的策划活动适合做推广的平台
  • 无锡市住房和城乡建设局网站昆明做网站的网络公司
  • 家居seo整站优化方案已经有了网站源代码怎样搭建
  • 红河州网站建设对网站做维护
  • 网站建设5000费用预算wordpress 鼠标点击特效
  • 江门企业自助建站系统做网站诱导网站
  • 知识问答网站开发南昌建站
  • 开发网站需要租服务器网易企业邮箱如何申请注册
  • 青岛市黄岛区城市建设局网站南京建设监理协会网站
  • 网站设计要点做网站的是什么职业
  • 造型设计网站推荐哪些企业网站做得好
  • 东丰网站建设网络域名怎么注册
  • 行业网站模板装饰公司东莞网站建设
  • 成都政务网站建设电脑编程与网站建设
  • 描述电子商务网站建设网站开发教程H5
  • 个人做电影网站有什么风险招聘网站制作公司
  • 安徽网站推广公司网站集群建设参数
  • 个人网站做哪种能赚钱网站维护有哪些企业
  • 专题类的网站郴州全网推广公
  • 流行用什么做网站手机响应式网站
  • 绍兴网站建设 微德福如何填写网站开发验收单
  • php 创建网站开发中山如何建设网站
  • 莱芜企业建站公司申请微信公众号