搜索
bottom↓
回复: 14

程序结构如何安排求助

[复制链接]

出0入0汤圆

发表于 2019-2-13 17:28:22 | 显示全部楼层 |阅读模式
这是以前写程序碰到过的一个问题,就是我有一个任务A需要能及时响应,这个任务优先级最高。
他50Hz频率来和我通信,但是这50次里可能只有一次是问我,也可能是两次,我需要每次去判断地址是不是我的地址。通信频率是固定的,每次通信间隔20ms。
另一个任务B是计算,这个任务不是那么紧急,算慢一点也没有问题。
我开始让A实现的方法是用中断去实现,B在main函数中去一直计算,这也是我们常用的方法。
但是我发现A用中断实现有点麻烦,于是我想能不能把A放在main函数中一直去执行,只要发现对方是问我了,
我就去响应,但是一旦不是问的我,我就转头去执行任务B,因为我在下一次通信到来前还有20ms(实际不够20ms)的时间去执行B,
我用定时器定个时间,比如说19ms,如果19ms时间到了,我再切换到任务A去,准备响应A。
我在想这种程序结构怎么实现呢?原来我想的是用任务切换的方法,但是实现起来也很麻烦,不仅涉及到汇编,还有内核的状态等等。
不知道有没有高人,有没有什么其他好的方法呢?

出0入0汤圆

发表于 2019-2-13 17:39:03 | 显示全部楼层
你这样操作,定时器闹钟没有响之前的CPU资源都是被你浪费了的。状态机,一直循环查询-执行就可以了。

出250入8汤圆

发表于 2019-2-13 18:54:13 | 显示全部楼层
我还是觉得中断最合适。

出0入0汤圆

发表于 2019-2-13 19:06:09 | 显示全部楼层
把任务A和B分别片段化,然后采用状态机的方式去做,比如A分成A1-A10,B分成B1-B10;While中检测到10毫秒间隔就执行A1到A10(A实时性要求高就把A1-A10全执行,实时性要求不高可以分批执行),每个10毫秒执行完A剩余的时间都用来执行B,根据片段大小,可能是每次1个片段,也可以是每次100个片段,要是不清楚的话建议看看《时间触发嵌入式》那本书及其源码。

出0入0汤圆

发表于 2019-2-13 22:31:15 | 显示全部楼层
你通讯格式是IIC?
通讯模块一般都是中断接收 然后收到的数据先统一放到缓存(数组)中,固定一段时间来统一解析回应,这样中断压力小也不会丢帧
任务机制可以很简单的用定时器来完成
比如你这个 可以建立一个1ms的定时间器 时间到{time++; handle = 0;//任务执行标志清空}

if(time > 20  )&& (handle == 0 ){ 统一处理协议数据并回复 time =0 ,handle = 1;//任务执行标志置位}
if (handle == 0 ){计算数值 handle = 1; 这能控制1ms只运算一次 一直算占用时序}

出140入115汤圆

发表于 2019-2-13 23:31:00 来自手机 | 显示全部楼层
赞同4楼

出95入100汤圆

发表于 2019-2-14 15:40:20 | 显示全部楼层
用时间片,划分的颗粒越小,响应月迅速,去看看看看《时间触发嵌入式》这本书

出0入0汤圆

发表于 2019-2-14 15:53:45 | 显示全部楼层
A很简短就中断   很长就人工切片执行     一般就直接主循环。

出0入0汤圆

 楼主| 发表于 2019-2-14 16:26:38 | 显示全部楼层
那种通信方式既不是IIC也不是其他的,是一种特殊行业的通信方式,而且还需要判断电平长度来判断报文,具体的记不太清了,但是划分时间片的方式肯定是不行的。
1.划分的时间片太长了,响应速度不够。
2.功耗有要求,所以始终频率上不去,我记得测试的时候MCU的最大运行频率也就2M,才能保证功耗较低,如果提高时钟,功耗就起飞了。所以划分的时间片也不能太小。

出0入0汤圆

发表于 2019-2-15 12:47:25 来自手机 | 显示全部楼层
感觉还是想办法塞到中断里比较合适,大概是什么原因不方便放中断?

出0入0汤圆

发表于 2019-2-15 15:47:32 | 显示全部楼层
B任务碎片化,切成很多时间片,每个时间片开始时查询一次A任务标志,A任务的标志在通讯信号来的中断里置位。

出0入0汤圆

发表于 2019-2-15 23:25:26 来自手机 | 显示全部楼层
LZ需要的功能是"延续性运行",continuation。常规解是使用实时(嵌入式)系统RTOS。简单解LZ自己说的中断加main loop。还有个简单解是借助协程 co routine,比如protothread库。

出0入0汤圆

发表于 2019-2-15 23:29:11 来自手机 | 显示全部楼层
之前在学校里做肢体机器人控制器,用的cm内核的微处理器,使用protothread加上一点数据结构和简单的有向图算法(主要是处理任务之间由于依赖关系而带来的保障先后顺序需求),动态调度十多个任务都是可以顺利实现的

出0入0汤圆

发表于 2019-2-18 10:34:21 | 显示全部楼层
还是用中断把 ,我的想法是用rtos 设置两个优先级的任务 ,可是到头来还是要用中断来驱动两个任务

出0入0汤圆

发表于 2019-2-20 15:39:19 | 显示全部楼层
学习学习,mark一下
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 10:02

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表