C_and_CPP 板


LINE

开发平台(Platform): (Ex: Win10, Linux, ...) Raspberry pi model B+ / Raspberry pi 3 model B 编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出) gcc 4.9 问题(Question): 之前希望能固定数据读取的周期,像这样: while(...) { ReadData(); _usleep(3600); // 用nanosleep实作,不过单位换成us。 } ReadData()是读取sensor的函式,它有可能读取1-5个sensor (共用一个I2C,所以要设lock), 因为每个sensor更新资料的周期又不一样 void ReadData() { if (out_of_data0) readSensor0(); if (out_of_data1) readSensor1(); if (out_of_data2) readSensor2(); if (out_of_data3) readSensor3(); if (out_of_data4) readSensor4(); } 其中Sensor0跟Sensor1的周期最短,到没啥问题。 问题是Sensor2/Sensor3/Sensor4周期比较长,读取也需要200-400us。 只读0/1跟5个全读的所需时间有可能会差到500-600us。 之前为了固定住ReadData()的周期,我是这样实作的: .... pthread_create(thread2, readSensor2); //细节不多写,会意就好 pthread_create(thread3, readSensor3); pthread_create(thread4, readSensor4); void ReadData() { readSensor0(); readSensor1(); if (out_of_data2) pthread_cond_signal(&cond[thread1]); // 唤醒thread2 if (out_of_data3) pthread_cond_signal(&cond[thread1]); // 唤醒thread3 if (out_of_data4) pthread_cond_signal(&cond[thread1]); // 唤醒thread4 _usleep(3600); } (这几个thread被设成读取完自动睡回去,等待下次被唤醒) 意思就是说,做完readSensor0/readSensor1就暂停然後开始计时, 计时的同时被唤醒的readSensor2/readSensor3/readSensor4可以开始工作。 这招让我的周期变化<1ms (使用Preempt RT的情况,我想用xenomai应该会更好,等我程式完成的差不多就试)。 不过我不太满足就是,想找个可以用lock-free的方法。 试过一个方法是这样: void ReadData() { uint64_t time1 = get_nsec(); //使用clock_gettime得到当前时间 if (out_of_data0) readSensor0(); if (out_of_data1) readSensor1(); if (out_of_data2) readSensor2(); if (out_of_data3) readSensor3(); if (out_of_data4) readSensor4(); uint64_t time2 = get_nsec(); _usleep(4000-(int)(time2-time1)); } 就是按两次码表,把执行的时间算出来,然後周期扣掉执行时间就是该暂停的时间。 结果发现clock_gettime太频繁会得到奇怪的结果(不稳定)。 不然还有一个办法:把整个ReadData()丢到可以被唤醒的thread去 void ReadData() { if (out_of_data0) readSensor0(); if (out_of_data1) readSensor1(); if (out_of_data2) readSensor2(); if (out_of_data3) readSensor3(); if (out_of_data4) readSensor4(); } void period() { while(....) { pthread_cond_signal(&cond[thread_of_ReadData]); _usleep(4000); } } 不过有个极小的风险是如果这个thread没有在暂停的时间内跑完就.... 请问还有别的方法可以让周期的误差更低? 补充说明(Supplement): 四轴的程式龟速改写中,不要催.... --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 90.41.211.206
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1478376452.A.BE6.html ※ 编辑: wtchen (90.41.211.206), 11/06/2016 04:25:19
1F:推 EdisonX: 我没记错的话, 就算你都不用 delay, 接示波器後会发现 11/06 04:22
2F:→ EdisonX: 单一 gpio 周期是近 100K , 而且周期变动率会很大. 11/06 04:22
3F:→ EdisonX: rpi 的时间我觉得没很准,在做这东西时建议至少接便宜的 11/06 04:23
4F:→ EdisonX: LA 看讯息会比计时的准很多。 11/06 04:25
5F:→ EdisonX: 我是买淘宝 300~500 ntd,24MHZ, 对 RPI 就够用了。 11/06 04:27
6F:→ wtchen: 单一 gpio周期?我之前看有人实测是可以到5MHz以上 11/06 04:29
7F:→ EdisonX: 也可能我记错周期吧, 我是用 bcm2835 去做控制。 11/06 04:31
8F:→ EdisonX: 补一下 , 网路上找到的资料建议验证, 有些我手边的情况 11/06 04:32
9F:→ EdisonX: 和网路找的不一样。 11/06 04:32
10F:→ wtchen: 我看到的就是用bcm2835 goo.gl/bK0Cij 11/06 04:33
11F:→ wtchen: 不过我要求的频率顶多400Hz,不算多夸张阿 11/06 04:34
12F:→ wtchen: 便宜的LA大都只吃Windows.... 11/06 04:35
13F:推 EdisonX: 是啊!所以是用 Windows SW 接 LA, Pin 脚接 RPI 没错啊 11/06 04:36
14F:→ EdisonX: 好吧,若您找到稳定的方式,请不吝分享,之前我专案有时效性 11/06 04:37
15F:→ EdisonX: 发现 PWM 不稳时,就挂一颗 MCU 上去,RPI 和 MCU 交握。 11/06 04:38
16F:→ wtchen: PWM有现成的chip可以加阿,为何非要MCU? 11/06 04:40
17F:推 EdisonX: MCU 不只做 PWM, 还有其他东西要加, 考虑成本当然挂 MCU 11/06 04:40
18F:→ wtchen: RPi只有一组PWM根本不够我用,所以我加了颗PCA9685PW 11/06 04:40
19F:→ wtchen: RPi其实本来能做的事就很少(除非你非用linux不可) 11/06 04:41
20F:→ wtchen: 不然直接用MCU就好了.... 11/06 04:41
21F:→ EdisonX: 唉.. RPI .. 地狱.. 若可以的话我想转战 undo x86 11/06 04:42
22F:→ wtchen: udoo已经可以买了? 11/06 05:55
23F:→ wtchen: 是为啥非用RPi不可阿,BBB价位稍高但也跟RPi+MCU差不多了 11/06 05:56
24F:→ wtchen: 想听你说RPi的地狱.... 11/06 05:56
25F:推 kevingwn: 试看看 11/06 06:01
26F:→ kevingwn: uint64_t timer = get_nsec(); 11/06 06:01
27F:→ kevingwn: while (...) 11/06 06:01
28F:→ kevingwn: { 11/06 06:01
29F:→ kevingwn: ReadData(); 11/06 06:01
30F:→ kevingwn: timer += 4000; 11/06 06:01
31F:→ kevingwn: int delay = (int)(timer - get_nsec()); 11/06 06:02
32F:→ kevingwn: if (delay > 0) _usleep(delay); 11/06 06:02
33F:→ kevingwn: } 11/06 06:02
不是不行,是因为我一定得用测量clock_gettime测量每个loop的时间 只要我clock_gettime的间隔太短会出问题 大概try了一下,至少间隔要在1ms以上才会稳定
34F:→ descent: https://goo.gl/WgiaeR 这个 la, 其软体有 linux 版本 11/06 11:39
35F:推 firejox: 你的按两次码表的code如果read超过4000 nsec 不就不正 11/06 12:31
36F:→ firejox: 确了? 11/06 12:31
37F:→ firejox: 更正 4000us 11/06 12:33
38F:→ EdisonX: 会用 RPI 是因为它的相机解析度高、传输快、cost 低,加上 11/06 14:27
39F:→ EdisonX: 有 raspicam library 可直接呼叫 , 说 rpi 差也不对 , 只 11/06 14:28
40F:→ EdisonX: 是我在linux上有很多的不熟悉,像是权限常让我绑手绑脚. 11/06 14:28
41F:→ EdisonX: 还有从 rpi2 转到 rpi3 时 ur 的设定也花了时间, 最後转 11/06 14:29
42F:→ EdisonX: 到 rpi3 时必须做整个系统散热机制,要不 rpi 容易烧掉. 11/06 14:30
43F:→ EdisonX: 想转战udoo纯粹是我现在必须开发 rpi/windows 二套 ap,转 11/06 14:32
44F:→ EdisonX: 过去後我可以全在vs上做开发,但的确也还有一些问题要解. 11/06 14:32
45F:→ EdisonX: 补一下,我从rpi2转到rpi3时,OS从1.4.2升到1.9.2也吃了苦. 11/06 14:45
46F:→ EdisonX: 当然现在用2.0.0,lib 和设定花了一、二天解掉 @@ 11/06 14:45
47F:→ EdisonX: 现在恼人的反而是在rpi3上写qt,这时才意识到我被vs惯坏了 11/06 14:46
48F:→ EdisonX: code::blocks 上挂 qt 我反而不会 debug 11/06 14:46
49F:→ wtchen: LA这种东西怎麽只要一support linux价钱就10倍起跳? 11/06 17:16
※ 编辑: wtchen (90.41.211.206), 11/07/2016 01:29:00
50F:→ wtchen: 我在linux写久了要我跳Windows我也不习惯 XD 11/07 01:32
※ 编辑: wtchen (90.41.211.206), 11/07/2016 01:34:15







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:e-shopping站内搜寻

TOP