搜索
bottom↓
12
返回列表 发新帖
楼主: xiaoziwen

单片机编程模式提高--面向任务

  [复制链接]

出0入0汤圆

发表于 2012-6-19 19:14:29 | 显示全部楼层
刚想学学这,顶一个^.^

出425入0汤圆

发表于 2012-6-20 09:35:04 | 显示全部楼层
raxb 发表于 2012-6-19 18:05
可以是一个简单的例子,假设有10个Led同时工作:
第1个一直闪烁,频率1HZ;
第2个一直闪烁,频率2HZ;

抽个时间写个,研究研究。

出0入0汤圆

发表于 2012-6-20 09:39:16 | 显示全部楼层
guolun 发表于 2012-6-20 09:35
抽个时间写个,研究研究。

呵呵....................

出0入0汤圆

发表于 2012-6-27 16:24:25 | 显示全部楼层
void (*pTask)(void);//指向任务的指针
楼主我想问下这个语句~我刚刚把那本《时间触发嵌入式系统设计》拜读完,可是我不理解的就是这个函数指针,他的形参是void,那如果我想调用有参数的函数呢?怎么办呢?如果把他改为有参数的函数形式,那么如果是很多个任务有的有参数有的没有参数怎么办呢??求解释谢谢

出0入0汤圆

发表于 2012-6-27 16:25:20 | 显示全部楼层
Gorgon_Meducer 发表于 2012-5-5 14:57
又看到一个对调度器技术感兴趣的兄弟,赞。
作为过来人,我想给楼主一个建议:在概念上别被“基于时间触发 ...

void (*pTask)(void);//指向任务的指针
我想问下这个语句~我刚刚把那本《时间触发嵌入式系统设计》拜读完,可是我不理解的就是这个函数指针,他的形参是void,那如果我想调用有参数的函数呢?怎么办呢?如果把他改为有参数的函数形式,那么如果是很多个任务有的有参数有的没有参数怎么办呢??求解释谢谢

出0入0汤圆

发表于 2012-6-27 16:38:39 | 显示全部楼层
mark先,谢谢楼主。

出20入22汤圆

发表于 2012-6-27 16:43:42 | 显示全部楼层
学习,提高

出0入0汤圆

 楼主| 发表于 2012-6-27 17:05:47 | 显示全部楼层
fengtianzhifeng 发表于 2012-6-27 16:25
void (*pTask)(void);//指向任务的指针
我想问下这个语句~我刚刚把那本《时间触发嵌入式系统设计》拜读 ...

个人认为 既然是一个任务 最好是单独完成独立的事件

即尽量减小不同任务间的耦合 这样每个任务就不会对同一变量进行处理

也就不用传参数了

其次 如果真的不行 就用全局变量吧

当然 全局变量不是一个好方法

个人编程能力一般 所得不一定对 呵呵

出0入0汤圆

发表于 2012-6-27 17:15:22 | 显示全部楼层
xiaoziwen 发表于 2012-6-27 17:05
个人认为 既然是一个任务 最好是单独完成独立的事件

即尽量减小不同任务间的耦合 这样每个任务就不会对 ...

额您的意思是说,所有的子程序都在一个大程序里面,参数的传递能在子程序里面传递的就尽量在那个里面传递,是么?
不过觉得这样还是有点怪怪的~不过还是谢谢您的解答

出0入0汤圆

 楼主| 发表于 2012-6-27 17:23:42 | 显示全部楼层
fengtianzhifeng 发表于 2012-6-27 17:15
额您的意思是说,所有的子程序都在一个大程序里面,参数的传递能在子程序里面传递的就尽量在那个里面传递 ...

任务的功能要尽量单一而且完整 这样任务间的耦合减小 意味着任务间不需要交互

也就没有参数传递的必要

当不同任务真的要处理同一个变量 可将它们合并为一个任务中的子任务

对于调度器调度的任务 依然不需要参数 根据不同的状态 执行不同的子任务 对需要改变的变量进行处理就好了

出0入4汤圆

发表于 2012-6-27 18:14:09 | 显示全部楼层
本帖最后由 sunliezhi 于 2012-6-27 18:17 编辑

if(--SCH_tasks[index].delay == 0)//任务需要执行
{
      SCH_tasks[index].run = 1;//设置执行标志
      if(SCH_tasks[index].period != 0)//任务为周期执行
           SCH_tasks[index].delay = SCH_tasks[index].period;
}
后面的else .....去掉。

出0入0汤圆

发表于 2012-6-27 23:40:12 | 显示全部楼层
学习了!

出0入0汤圆

发表于 2012-6-28 08:29:21 | 显示全部楼层
xiaoziwen 发表于 2012-6-27 17:23
任务的功能要尽量单一而且完整 这样任务间的耦合减小 意味着任务间不需要交互

也就没有参数传递的必要

额~大概了解了~我在做几个项目体会体会~谢谢啦~

出0入0汤圆

发表于 2012-6-28 16:30:08 | 显示全部楼层
raxb 发表于 2012-6-19 18:05
可以是一个简单的例子,假设有10个Led同时工作:
第1个一直闪烁,频率1HZ;
第2个一直闪烁,频率2HZ;

你这个好办


关键在于什么东东都要跑任务是不是在过于复杂化了,就像延时函数的口水一样

出0入0汤圆

发表于 2012-6-28 16:35:48 | 显示全部楼层
bailangcn 发表于 2012-6-28 16:30
你这个好办

是的,都说了是简单的了......

出0入296汤圆

发表于 2012-6-28 22:08:00 | 显示全部楼层
fengtianzhifeng 发表于 2012-6-27 16:25
void (*pTask)(void);//指向任务的指针
我想问下这个语句~我刚刚把那本《时间触发嵌入式系统设计》拜读 ...

把函数指针的形式修改为
bool (*pTask)(void *pArg); 这样就可以了。

出0入0汤圆

发表于 2012-6-28 22:39:02 | 显示全部楼层
献丑
  1. static uint32_t target_ms = 0;      // 目标时间,毫秒。
  2. uint32_t now_ms = time_getTime_ms(); // 获取现在的时间,毫秒。
  3. if(target_ms < now_ms)
  4. {
  5.     target_ms = now_ms + 300;
  6.     //
  7.     //这里就会每300ms执行一次。
  8. }
复制代码

出0入0汤圆

发表于 2012-6-28 23:06:59 | 显示全部楼层
现在还没有接触这方面,先MARK

出0入0汤圆

发表于 2012-6-29 17:28:58 | 显示全部楼层
本帖最后由 weahdeng 于 2012-6-29 17:32 编辑

帖子精彩的很

出0入0汤圆

发表于 2012-6-29 17:37:45 | 显示全部楼层
相当于 时间片OS

出0入0汤圆

发表于 2012-6-30 21:30:19 | 显示全部楼层
下过来了~~

出0入0汤圆

发表于 2012-8-25 00:08:30 | 显示全部楼层
有空去我发的帖子看看,我也在研究这类编程。找你这帖子还请傻孩子帮忙了。http://www.amobbs.com/thread-5489786-1-1.html

出75入4汤圆

发表于 2012-8-25 09:15:52 | 显示全部楼层
zyw19987 发表于 2012-8-25 00:08
有空去我发的帖子看看,我也在研究这类编程。找你这帖子还请傻孩子帮忙了。http://www.amobbs.com/thread-5 ...

我也一直在学习借鉴一些程序框架。时间触发,状态机。事件驱动,基于消息的,太多了。原来农民讲习所讲过一个程序架构,后来在**ic上看到过王绍伟 的一个程序架构,发上来供大家讨论。
论坛现在不知道为什么不能上传附件。

出75入4汤圆

发表于 2012-8-25 09:19:12 | 显示全部楼层
http://www.study-bbs.com/thread-46471-1-1.html
这个是王工的一个程序框架

出0入0汤圆

发表于 2012-8-26 18:09:57 | 显示全部楼层
Xmega本身带有事件驱动的。

出0入0汤圆

发表于 2012-8-26 22:00:47 | 显示全部楼层
MARK........

出0入0汤圆

发表于 2012-8-26 22:08:13 | 显示全部楼层
你这个可以简化 我早就用在PIC 上面了

出0入0汤圆

发表于 2012-8-26 22:20:06 | 显示全部楼层
taishandadi 发表于 2012-8-25 09:19
http://www.study-bbs.com/thread-46471-1-1.html
这个是王工的一个程序框架

那个网站现在不让注册了,下不到;
能不能发到我的邮箱里?很想提高一下; 谢谢

wjx_freebird@163.com

出75入4汤圆

发表于 2012-8-27 06:53:59 | 显示全部楼层
上传王工的程序架构。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-8-27 14:46:26 | 显示全部楼层
先mark,后面有空再看。

出0入0汤圆

发表于 2012-8-27 22:36:52 | 显示全部楼层
taishandadi 发表于 2012-8-27 06:53
上传王工的程序架构。

谢谢了,下来学习下;

出0入0汤圆

发表于 2012-8-28 08:49:31 来自手机 | 显示全部楼层
谢谢了                              

出0入0汤圆

发表于 2012-11-10 08:16:36 来自手机 | 显示全部楼层
现在正遇到编程问题,手机马克一下,回去马上研究。

出0入76汤圆

发表于 2012-11-10 13:45:32 | 显示全部楼层
不错的帖子,很有启发性...

出0入0汤圆

发表于 2012-11-11 11:04:28 | 显示全部楼层
学习了,标记一下,备用

出0入0汤圆

发表于 2012-11-13 19:28:35 | 显示全部楼层
总结的不错

出0入8汤圆

发表于 2012-11-13 19:46:29 | 显示全部楼层

不错,先记号,后面有空再看

出0入0汤圆

发表于 2012-11-26 16:29:29 | 显示全部楼层
先看看。

出0入0汤圆

发表于 2012-12-10 13:03:54 | 显示全部楼层
单片机玩C++ 发表于 2012-5-11 10:29
C++状态机Demo

你这个状态机的核心代码没有share出来吧。

出0入0汤圆

发表于 2012-12-12 20:47:14 来自手机 | 显示全部楼层
记号一下,共同学习

出0入0汤圆

发表于 2012-12-13 11:22:14 | 显示全部楼层

出0入0汤圆

发表于 2012-12-13 21:54:12 | 显示全部楼层
震惊,难道这就是面向对象的雏行!

出0入76汤圆

发表于 2013-5-15 23:49:47 | 显示全部楼层
凤老大, 他的MS3的架构。 其基本思想是:时间触发(混合式)调度器 + 简单的消息触发机制。
那个调度器,就是时间触发嵌入式编程模式中讲的那个“混合式调度器”, 而凤老大在它的基础上增加了消息的一些机制和特性。 这个架构比较轻量级,也比较好理解。
1.为什么说是简单的消息机制呢? 这里主要是实现消息的触发,没有扩展增强像UCOSII中消息邮箱那样,可以实现消息参数的传递, 这样就不需要或减少使用全局变量来传递参数, 减少耦合度,更加方便实现模块化。
2.关于消息机制及处理,可以参考学习原来农民讲所所长的那个“建立通用程序框架”的教程及范例,个人感觉讲解得比较好,特别是关于模块化的一些思想和方法还是值得学习的。

出0入0汤圆

发表于 2013-6-29 11:53:07 | 显示全部楼层
xiaoziwen 发表于 2012-4-20 23:36
意思是说 作为调度器时标的定时器只能有一个 书后面部分也讲解了使用外部中断的调度器 使用异步收发器的 ...

这本书中提到的,在使用这种调度器时为了保证运行的可靠性和程序的可预测性,可活动的中断只有一个,就是调度器内核使用的定时器中断,这里我也没明白,如果我在项目中使用了串口接收的话,而又不想用串口中断来调度(因为串口并不是主要的任务),这种情况下到底能不能使用串口中断来接收数据呢?还是使用轮询的方式来检测串口的数据,轮询的方式如果遇到任务阻塞时可能会接收失败。

出0入0汤圆

发表于 2013-6-29 11:54:21 | 显示全部楼层
foxpro2005 发表于 2013-5-15 23:49
凤老大, 他的MS3的架构。 其基本思想是:时间触发(混合式)调度器 + 简单的消息触发机制。
那个调度器, ...

你说的模板在哪里,能提供个链接吗?

出0入0汤圆

 楼主| 发表于 2013-6-29 12:08:56 | 显示全部楼层
meirenai 发表于 2013-6-29 11:53
这本书中提到的,在使用这种调度器时为了保证运行的可靠性和程序的可预测性,可活动的中断只有一个,就是 ...

可以使用串口中断啊 不过前提是 串口中断执行的代码要少 最好是仅仅接收数据 并放入缓冲区

更为具体的数据处理由任务完成

因为 首先任务调度使用的是定时器 所以即便这个过程中还有中断 时标不会变化 任务的执行可以预测

其次 只要任务的执行时间小于时标(例如时标1ms 则8mhz可执行8000条指令) 任务被中断的时间也短 此任务在被打断后还是可以在下次定时器中断前执行完毕的

最后 串口接收会是一个连续的过程 前面的分析就存在问题 ①连续中断导致任务无法在定时器中断来临前执行完毕 ②定时器中断和会串口中断冲突

基于以上 最佳的解决办法是 在第一次串口中断时关闭定时器 即关闭时标 让其他任务暂时停止下来 在串口接收结束后 再打开定时器 开启任务调度

当然这种做法 会破坏任务的可预测性 但也是权宜之计啊

你也可以说说你的想法 咱们讨论讨论

出0入0汤圆

发表于 2013-6-29 13:35:54 | 显示全部楼层
恩,还是楼主思路清晰,我现在就是用的中断加缓冲区的写法,因为看到作者写的不能用其他中断,有些疑问就上来问问。

关于楼主提出的两个问题我来说一下自己的想法。
问题1 在使用了中断加缓冲区的写法后,已经不能算是个问题了。因为中断处理时间足够短,大约十几微妙,而以9600的波特率发送
数据的话 大约1ms发送一次数据,这其中的时间应该不会有很大的影响。

问题2 还没有什么解决方案。
呵呵。

出0入0汤圆

发表于 2013-6-29 13:44:20 | 显示全部楼层
meirenai 发表于 2013-6-29 13:35
恩,还是楼主思路清晰,我现在就是用的中断加缓冲区的写法,因为看到作者写的不能用其他中断,有些疑问就上 ...

又想了一下楼主的问题①,难道是我理解错了。我一般的做法是下面这个样子。
使用了串口加中断缓冲区的数据接收处理方式后,可以在中断中加入一个完整帧计数器,类似这样:
  1. void UART_INT() interrupt 4
  2. {
  3.     if(RI)
  4.     {
  5.         RI = 0;
  6.         if(SBUF == 0X0d) //0X0d是一帧数据结束的标志位
  7.         {
  8.              data_cnt++;//完整帧计数器加1
  9.         }
  10.         /*这里添加缓冲区填充代码*/
  11.     }
  12. }
复制代码
然后在应用程序中检测完整帧计数器,如果大于0的话就从缓冲区取出一个完整帧,处理这个完整帧。。。,把完整帧技术器减1
这样就不会因为串口中断任务连续接收而拖长任务的执行时间。

出0入0汤圆

 楼主| 发表于 2013-6-29 16:34:29 | 显示全部楼层
meirenai 发表于 2013-6-29 13:44
又想了一下楼主的问题①,难道是我理解错了。我一般的做法是下面这个样子。
使用了串口加中断缓冲区的数 ...

这种方式是对的

其实只要每次串口通信的数据量不是很大 串口中断接收 就不会拖长任务的执行时间

出0入0汤圆

发表于 2013-7-9 10:51:18 | 显示全部楼层
好东西,MARK一下//

出0入0汤圆

发表于 2013-7-9 13:11:09 来自手机 | 显示全部楼层
先,顶下,有时间慢慢看。

出0入0汤圆

发表于 2013-8-27 14:06:33 | 显示全部楼层
学习 这种编程 模式  ,见有人 这么用 。当时不明白  为何 ,有何好处 。   

出0入0汤圆

发表于 2013-8-27 18:15:58 | 显示全部楼层

出85入85汤圆

发表于 2014-4-9 17:50:37 | 显示全部楼层
高手云集啊,回复只为mark

出0入0汤圆

发表于 2014-9-4 17:01:19 | 显示全部楼层
我要做记好,学习61楼的原理

出0入0汤圆

发表于 2014-9-10 16:30:16 | 显示全部楼层
单片机编程模式提高--面向任务,看看

出0入0汤圆

发表于 2014-9-10 16:39:31 | 显示全部楼层
这个思路是简单明了

出0入0汤圆

发表于 2014-9-10 16:41:08 | 显示全部楼层
这样代码看起来不乱 容易维护 一块就是一块

出0入0汤圆

发表于 2014-9-10 16:45:16 | 显示全部楼层
好段子,标记一下

出0入0汤圆

发表于 2014-9-10 16:48:33 | 显示全部楼层
Mark

出0入0汤圆

发表于 2014-11-22 17:58:46 | 显示全部楼层
学习下!近来对操作系统感兴趣

出0入0汤圆

发表于 2019-7-24 09:38:02 | 显示全部楼层
Mark 学习

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-4-17 01:30

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

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