设为首页收藏本站

Discuz! Board

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 10611|回复: 38

【青风电子社区版主原创】思想决定你的程序

[复制链接]

4

主题

56

帖子

301

积分

版主

分享的世界

Rank: 7Rank: 7Rank: 7

积分
301
QQ
发表于 2014-1-6 22:38:48 | 显示全部楼层 |阅读模式
            在写这个文章前,首先我需要表明的是,里面的时间片思想来至于我的前工程师,虽然他只教了我部分,并且最后把源代码也给了我。但是我从他的程序里面学会了很多东西.......在这里非常感谢他.....
         由于语文老师教的东西早在高中毕业后,全部还给了她,请不要吐槽我的语句错误,和语句的不流畅性......如果觉得我的程序架构对于你有帮助,那么我也希望你以后也把自己的东西拿出来分享给别人,只有分享,才会诞生linux系统......如果觉得我的架构太简单,请嘴下留情,并且希望你也可以把你自己的东西写出来。供大家学习和参考.....
           到这里,大家还不知道我要写什么吧...哈哈!!我要写的就是一个系统的架构,当然我不可能把整个系统的全部写出来,我写的只是一个思路,整个程序的运行框架,并且我可以向你保证(仅对未毕业大学生),如果你学会了这个架构,8位单片机领域的几乎所有任务都可以非常nice的完成.....不管你的项目有多复杂,并且以后一旦给定一个项目,你的脑海就已经完成的差不多了.....
         这篇文章我打算分四章讲:首先是数据结构,其次是消息处理,然后就是系统时间片化,最后将前者整合起来;
回复

使用道具 举报

0

主题

1

帖子

4

积分

新手上路

Rank: 1

积分
4
发表于 2014-10-14 19:04:25 | 显示全部楼层
思想是不错, 但是分割任务也不是那么省心, 归根到底还是RTOS来的更直接.
回复 支持 1 反对 0

使用道具 举报

4

主题

56

帖子

301

积分

版主

分享的世界

Rank: 7Rank: 7Rank: 7

积分
301
QQ
 楼主| 发表于 2014-1-6 22:38:49 | 显示全部楼层
本帖最后由 MrYan 于 2014-1-6 22:43 编辑

                   首先是数据结构,学过计算机的肯定都学过数据结构....当然数据结构在我看来其实就是告诉我们一中思想,一种将现实的现象与C语言结合起来。如果你大学期间的数据结构没有学好,没关系,我这篇文章也只是利用到了里面最简单的一个思想----队列,当然也可以用其他的形式完成,不过数据结构里面关于这里的介绍,在我看来其实都差不多。
              队列,日常生活中大家回家买火车票,需要排队;去食堂打饭,需要排队.........不管是买票还是打饭,大家都会遵守一个规则,就是先来的先处理,后来的后被处理。当然,如果不考虑某些人的素质,他会去插队.....那么这里就会涉及到一个队员的优先级,某个人认为自己的的级别高..那么很不幸,他必须被先处理.......如果排队的位置有限,那么当排队的位置被排满后,后面继续来排队的人只能去其他地方,在程序里面这叫溢出,如果某个人非常牛逼,他必须要买到票....但是位置有限怎么办,那只能把一个人赶走..留一个位置给这个人....如果这个人的素质非常非常非常差,那很不幸,他还会插队......还有很多情况,但是总结起来就是一个队员的优先级而已...这个可以根据自己的需要来写。
               现在就是如何用C语言来完成这个过程....首先就是排队容量的问题,由于单片机的性能决定了,我们可以用简单的数组来搞定,不过要是以后学到STM32(不知道可不可以),可以用数据链来实现...这个会涉及到指针,以及结构体,有点小复杂,不过如果你的数据结构学的非常nice,这都是小kiss。这里就不在详细阐述了。。。。排队容量用数组来表示,但是如何来表示对了的头和尾呢,虽然也可以和现实中一样,可以每处理一个队员,就使队员自动向前运行,但是考虑到单片机的性能有限,这样会花太多时间来处理这个...我们可以用两个变量来表示,一个记录头位置,一个记录尾的位置......那么,入队就是尾加一,处理一个队员,头也是加一...当头和尾的值相等就表示队员被处理完。在这里大家要记住这两变量的移动方向是一致...至于为什么,大家可以在草稿画一下这个过程....我也会用给大家留一张这个图,给大家具体化。
              在这里,队思想算是讲完了,不知道讲清楚了没,这个过程的代码会留在第2章的消息处理,因为这就是为消息处理服务的..... 由于木有权限,等有权限后在发图片。   

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

4

主题

56

帖子

301

积分

版主

分享的世界

Rank: 7Rank: 7Rank: 7

积分
301
QQ
 楼主| 发表于 2014-1-6 22:38:50 | 显示全部楼层
本帖最后由 MrYan 于 2014-1-7 08:16 编辑

           讲了一通理论的东西,是不是有点烦躁。请静下心来,好好体会这个思想,你会获得很多东西。我个人喜欢把一条语句看好几遍,慢慢体会,特别是在芯片资料的时候,我有时候会把一段话看好几遍,慢慢体会写这段话人作者的思想,想他到底想表达什么。因为看别人的文章,不像听人讲解,讲解会把自己的经验和理解方式告诉你。
         这篇设计到消息处理,我的这个思路是来自于windows编程,以前在大学的时候,我本来是想学软件设计的,但是专业偏硬件,所有自学了好多软件的东西。所以我的软件能力会比较好一点,特别是C和C++都非常的熟悉,当然硬件基础也没有很差...什么模电,数电都是小kiss了,不过现在也忘的差不多了,不过,所谓知识用到哪,学到哪,所有以后用在在复习复习,应该没啥问题。
          消息,其实就是触发式,有消息就处理,没有消息就不处理。消息的其中有一个目的就是要把任务分成小块来处理,你不能让一个消息处理非常的长时间,也就是说不能让这个消息长时间来占用CPU的运行....如果对于时间的要求不是非常高的话,可以将这个消息先处理一段,然后将剩下的任务在放入消息里面,等处理完其他消息,再来处理这个。这里请自己好好在写程序的过程中体会....因为将消息分成多个消息来出来,是要占资源的。这里我就开始用代码来讲解了。我只会写出大概的代码,完整的代码我会把源文件留出来,不过我希望大家一定要自己去写,只有自己写,才会属于自己的东西。


uint Message[MESSAGE_CAPACITY+1];     //这里的uint是无符号整形,至于为啥用整形,不用字符,整形是16位,可以表示更多消息
uchar MessageFront,MessageBehind;     //这里就是消息的头和尾
void InitMessage(void);                         //这里消息初始化函数,也就是将Message的值变为零,其实也不用,不过以防万一,函数的实现会以附件
                                                                 //形式给出
uchar WriteMessage(uchar Priority_WM,uint Message_WM);  //这个是插入消息....其中Priority_WM就是优先级,Message_WM消息的值
uint ReadMessage(void);               //这里的返回值就是读取的消息了.....

  上面的都是为消息服务的函数,消息处理的框架非常简单,就是在主函数里面,当然由于处理消息的时候函数非常大,你也可以用一个函数来表示,不过我在这里直接在主函数开始写了.....

void main()                                            //主函数
{
        while (1)
        {
                switch(ReadMessage())       //这个就是处理消息的模块了,
                {
                        case NO_MSG:         //处理对应的消息,这里的这个值是0,我自己设置默认,其实你可以自己来改,这里表示消息没有了
                        {
                                break;
                        }
                        case TIME_MSG:       //这个与我第三章要将的相关联,这个是时间消息
                        {
                                break;
                        }
                        case MESSAGE_MSG:   //这就是其他消息了,这里你可以定义自己的消息,反正有16位可以供你你自己来分配
                        {
                                break;
                        }
                        default:
                        {
                                break;
                        }
                }
        }
}


          这里讲的差不多了,首先是为啥我要写default:语句,即使他可能一次都不会被执行,当是你要有这个严谨的思维。我用的会是无符号整形来表示消息的值,有16位,里面什么消息表示什么意思,完全由自己来定义。。。。请用心体会......或许你还没有什么具体的东西来表示,我举个例子,按键,我将一个按键,长按和短按都是不同的消息,对于一个按键,只要一按,那么我就把这个消息存储起来,随后,这个按键是什么,就可以根据你所响应的函数来处理这个消息.....你会说那个地方产生消息呢.....这就涉及的另外的问题.....如果不结合时间片,这个很难做的非常好...下面我就讲一下时间片.....关于附件,function就不要下了,都是一样的,只是不知道为啥我这边没法删除....代码附件里面,有吴坚鸿的一个按键扫描的程序,你需要学习的是里面的思想,体会如何将时间片化....至于其他的你自己决定.....











本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

4

主题

56

帖子

301

积分

版主

分享的世界

Rank: 7Rank: 7Rank: 7

积分
301
QQ
 楼主| 发表于 2014-1-6 22:38:51 | 显示全部楼层
本帖最后由 MrYan 于 2014-1-6 22:45 编辑

          时间片,其实我也是刚听到这个词不久,我也只是在这里大致的讲一下,具体的可以百度,上面有人讲的非常详细。在我看来,何为时间片,就是将CPU处理的时间合理化,使每个任务得到及时得到处理。但是又不会使CPU处在空闲模式,举个例子,以前大家做按键处理的时候,大家都会用软延时20ms,但是你要知道这20msCPU其实什么都没有做,这是非常浪费的。如何处理好时间呢,这里就要用到定时器。在我的这个框架里面,除非特殊的要求,一般只要一个定时器就足够了。

中断函数()               //这里就是不同单片机的中断函数,请根据自己的需要来改
{
       ++TimeDatum;                               //这里是一个全局变量,为了获得所要的时间
        if(TimeDatum>TIME_DATUM)      //假如中断是1ms一次(注意中断是否频繁,根据自己的需要来),TIME_DATUM是10
        {
                TimeDatum=0;
                WriteMessage(GENERAL_MSG,TIME_MSG);
        }
}

     那么这个中断的意思就是每10ms我就会写一个消息进来,表示整个函数的运行时间......

void main()                                            //主函数
{
         while (1)
         {
                 switch(ReadMessage())       //这个就是处理消息的模块了,
                {
                         case NO_MSG:         //处理对应的消息,这里的这个值是0,我自己设置默认,其实你可以自己来改,这里表示消息没有了
                        {
                                 break;
                         }
                         case TIME_MSG:       //这个与我第三章要将的相关联,这个是时间消息
                        {
                                  if(DisplayBlink>=1)
                                  {
                                      ++ DisplayBlink;
                                  }
                                 break;
                         }
                         case MESSAGE_MSG:   //这就是其他消息了,这里你可以定义自己的消息,反正有16位可以供你你自己来分配
                        {
                                 break;
                         }
                         default:
                         {
                                 break;
                         }
                 }
         }
         Display();             //这里就是处理现实屏的,里面有个条件语句, DisplayBlink大于10时处理
}
           这里不就有一个时间处理消息么......比如我举个例子,如果你的显示屏需要闪烁,每1秒闪10次,也就是100ms要给显示屏发一次数据,如果我在这个时间处理加一个变量 DisplayBlink,来记录这个时间,大家或许看到我在 DisplayBlink自加的时候是大于等于1,而不是直接,我这样的设计相当于一个自我的开关,只有我需要闪屏的时候,我只需要将 DisplayBlink=1,那么,程序就会自动的开使根据自己的需要来处理闪屏的,有的人或许会问,既然是把 DisplayBlink自加,干嘛不放在定时器里面,也可以的啊,随你,这样也就不需要时间消息,不过我为了增强消息性,才这样做的,或许会占用一些资源,不过无所谓了。。。。。
          大家或许发现Display()是一个时时被扫描的程序,你也可以放在时间消息处理里面,都是可以,根据自己的定义来,至于Display()里面是什么,就是一个判断条件,如果达到这个,我就会将要显示的消息放在队列里面等待被处理,当然如果这个消息必须马上要被处理,我就让他的优先级变高.......
          那么,按键也是可以用这个思路来搞定,不过我一般把按键的时间记录放在中断里面,也就用单独的变量来表示按键的时间记录。这里具体的讲解,大家可以参考网络上另外一个人写的,就是吴坚鸿,百度一下这个人就可以知道他写的程序,他里面也有关于按键的扫描,不过我不喜欢把按键的扫描放在中断里面,按照我的思路,我的中断里面只有一个变量来计数,中断里面执行的时间几乎就是几us而已.......


回复 支持 反对

使用道具 举报

4

主题

56

帖子

301

积分

版主

分享的世界

Rank: 7Rank: 7Rank: 7

积分
301
QQ
 楼主| 发表于 2014-1-6 22:38:52 | 显示全部楼层
本帖最后由 MrYan 于 2014-1-6 22:43 编辑

          上面其实都已经把整个过程将的差不多了,唯一感到缺陷的就是时间片,因为时间片与消息的结合可以有非常多,随你怎么用都可以...无所谓。但是上面所有的处理,都要注意任何消息都不要处理过长的时间,一般10ms一内都是可以的,最好是时间短一点......而时间片,只是记录整个程序运行所需要的时间计数而已。。。。。特别是一些需要有时间规律处理的,比如闪烁,按键的20ms延时等等,只有这个地方我采用到时间片。我的主函数主要处理的就是消息处理和需要时时扫描的函数,至于消息的产生,可以在任何地方......
回复 支持 反对

使用道具 举报

49

主题

336

帖子

1454

积分

超级版主

Rank: 8Rank: 8

积分
1454
发表于 2014-1-6 22:47:21 | 显示全部楼层
讲的真不错。顶起
回复 支持 反对

使用道具 举报

246

主题

1521

帖子

5424

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5424
发表于 2014-1-6 22:56:33 | 显示全部楼层
这个真不错,留着认真看了
回复 支持 反对

使用道具 举报

0

主题

4

帖子

19

积分

新手上路

Rank: 1

积分
19
发表于 2014-1-6 23:08:16 | 显示全部楼层
系统时间片化,这个叫法第一次听说
回复 支持 反对

使用道具 举报

4

主题

56

帖子

301

积分

版主

分享的世界

Rank: 7Rank: 7Rank: 7

积分
301
QQ
 楼主| 发表于 2014-1-6 23:17:21 | 显示全部楼层
520stm 发表于 2014-1-6 23:08
系统时间片化,这个叫法第一次听说

你可以百度一下.....上面介绍的更加详细......
回复 支持 反对

使用道具 举报

4

主题

56

帖子

301

积分

版主

分享的世界

Rank: 7Rank: 7Rank: 7

积分
301
QQ
 楼主| 发表于 2014-1-6 23:18:23 | 显示全部楼层
admin 发表于 2014-1-6 22:56
这个真不错,留着认真看了

说好的版主呢
回复 支持 反对

使用道具 举报

246

主题

1521

帖子

5424

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5424
发表于 2014-1-6 23:37:35 | 显示全部楼层

没问题,明天给你设置一个
回复 支持 反对

使用道具 举报

1

主题

4

帖子

42

积分

新手上路

Rank: 1

积分
42
发表于 2014-1-7 07:56:16 | 显示全部楼层
学习一下、
回复 支持 反对

使用道具 举报

5

主题

23

帖子

128

积分

注册会员

Rank: 2

积分
128
发表于 2014-2-11 08:20:00 | 显示全部楼层
这样做过,但是不知道是叫这名字,写得很好呀!
回复 支持 反对

使用道具 举报

49

主题

336

帖子

1454

积分

超级版主

Rank: 8Rank: 8

积分
1454
发表于 2014-4-9 15:56:42 | 显示全部楼层
刚刚 又看了一下,感觉有点操作系统的味道,但是又没有。这样做其实就是和任务调度很像,假如很多任务一起工作,你这个思想估计够呛。这个思想用在单片机任务少还是可以的,任务多而且间隔时间很短的时候,我估计要出问题。

    个人理解,仅仅是技术方面的讨论   
回复 支持 反对

使用道具 举报

4

主题

56

帖子

301

积分

版主

分享的世界

Rank: 7Rank: 7Rank: 7

积分
301
QQ
 楼主| 发表于 2014-4-15 09:04:26 | 显示全部楼层
量子CPU 发表于 2014-4-9 15:56
刚刚 又看了一下,感觉有点操作系统的味道,但是又没有。这样做其实就是和任务调度很像,假如很多任务一起 ...

其实任务的多少,主要是时间分配的问题,也就是说,多任务运行的系统,他只是时间分配的更加合理而已....但是我这个系统框架也加入了时间片,只是这部分讲解的不是很仔细.....当然对于32位的单片机来说,我这个架构或许有点不能很好的利用32位单片机的性能,但是对于8位单片机来说,绝对是木有任何问题的......
分享才可以产生世界.....
回复 支持 反对

使用道具 举报

0

主题

17

帖子

53

积分

注册会员

Rank: 2

积分
53
发表于 2014-6-6 22:11:08 | 显示全部楼层
谢谢楼主!!谢谢楼主!!谢谢楼主!!
回复 支持 反对

使用道具 举报

1

主题

10

帖子

33

积分

新手上路

Rank: 1

积分
33
发表于 2014-7-30 10:36:58 | 显示全部楼层
讲的非常好 学习以下
回复 支持 反对

使用道具 举报

0

主题

1

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2014-8-15 12:21:36 | 显示全部楼层
其实钻研一下ucos这种轻量级的实时操作系统,这些东西就会理解得很深刻了。。。
回复 支持 反对

使用道具 举报

4

主题

56

帖子

301

积分

版主

分享的世界

Rank: 7Rank: 7Rank: 7

积分
301
QQ
 楼主| 发表于 2014-8-15 22:59:10 | 显示全部楼层
黑.白 发表于 2014-8-15 12:21
其实钻研一下ucos这种轻量级的实时操作系统,这些东西就会理解得很深刻了。。。

已经搞懂ucos这些系统了.....
分享才可以产生世界.....
回复 支持 反对

使用道具 举报

0

主题

2

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2014-9-2 15:12:44 | 显示全部楼层
不错的东西,学习下
回复 支持 反对

使用道具 举报

0

主题

8

帖子

39

积分

新手上路

Rank: 1

积分
39
发表于 2014-9-3 23:55:00 | 显示全部楼层
谢谢分享,这种消息队列的机制很好
回复 支持 反对

使用道具 举报

4

主题

56

帖子

301

积分

版主

分享的世界

Rank: 7Rank: 7Rank: 7

积分
301
QQ
 楼主| 发表于 2014-11-2 23:35:39 | 显示全部楼层
svchao 发表于 2014-10-14 19:04
思想是不错, 但是分割任务也不是那么省心, 归根到底还是RTOS来的更直接.

RTOS需要的资源太多,8位单片机很难搞的..........
分享才可以产生世界.....
回复 支持 反对

使用道具 举报

2

主题

26

帖子

105

积分

注册会员

Rank: 2

积分
105
发表于 2015-4-3 21:29:13 | 显示全部楼层
nice!                    
回复 支持 反对

使用道具 举报

1

主题

3

帖子

20

积分

新手上路

Rank: 1

积分
20
发表于 2015-4-14 10:03:06 | 显示全部楼层
楼主写的真好啊,能给个程序框架程序吗?tydz163@163.com
回复 支持 反对

使用道具 举报

0

主题

3

帖子

41

积分

新手上路

Rank: 1

积分
41
发表于 2015-5-17 11:53:33 | 显示全部楼层
讲得太好了啊!
回复 支持 反对

使用道具 举报

4

主题

56

帖子

301

积分

版主

分享的世界

Rank: 7Rank: 7Rank: 7

积分
301
QQ
 楼主| 发表于 2015-5-18 09:53:57 | 显示全部楼层


一般般啦.....现在我的好多代码都更新了.....当然都是基于这个思路来的......
分享才可以产生世界.....
回复 支持 反对

使用道具 举报

0

主题

7

帖子

31

积分

新手上路

Rank: 1

积分
31
发表于 2016-4-16 22:54:56 | 显示全部楼层
svchao 发表于 2014-10-14 19:04
思想是不错, 但是分割任务也不是那么省心, 归根到底还是RTOS来的更直接.

很赞成你的说法, 分割任务还得知道函数运行需要的时间,任务一多很麻烦.简单的程序可以不需要调度器,复杂的程序直接上RTOS了.
回复 支持 反对

使用道具 举报

1

主题

2

帖子

30

积分

新手上路

Rank: 1

积分
30
发表于 2016-11-29 22:49:54 | 显示全部楼层
MrYan 发表于 2014-1-6 22:38
讲了一通理论的东西,是不是有点烦躁。请静下心来,好好体会这个思想,你会获得很多东西。我个 ...

通俗化,大概能看的懂
回复 支持 反对

使用道具 举报

0

主题

15

帖子

74

积分

注册会员

Rank: 2

积分
74
QQ
发表于 2017-2-7 17:59:09 | 显示全部楼层
学习了  感谢分享
回复 支持 反对

使用道具 举报

0

主题

2

帖子

31

积分

新手上路

Rank: 1

积分
31
发表于 2017-9-19 17:49:53 | 显示全部楼层
楼主有完整程序吗?发我一份1158002319@qq.com,多谢。
回复 支持 反对

使用道具 举报

0

主题

6

帖子

35

积分

新手上路

Rank: 1

积分
35
发表于 2018-9-29 11:24:59 | 显示全部楼层
我觉得可以把Z-STACK的基于事件驱动的那个小操作系统(可能不能称之为操作系统)提取出来,这个还是比较经典的,我一直喜欢用这个,特别是对8位的MCU来说,
回复 支持 反对

使用道具 举报

0

主题

1

帖子

23

积分

新手上路

Rank: 1

积分
23
发表于 2018-10-9 08:50:45 | 显示全部楼层
楼主这种教程不能随便出的, 理解不够透彻,误人子弟的; 还是应该找一份RTOS的代码看起来,这些都是基础知识来的
回复 支持 反对

使用道具 举报

0

主题

1

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2019-7-21 17:12:59 | 显示全部楼层
关于容易留在清迈
清迈容易入住 提供在清迈出售的房屋,公寓,公寓,房地产和商业。
http://www.chiangmaieasystay.cn
您可以根据自己的预算和需求选择最合适的住宿。如果您需要在清迈获得隐私,灵活性和物有所值,请立即与我们联系,我们的代表将完成剩下的工作。
回复 支持 反对

使用道具 举报

0

主题

3

帖子

26

积分

新手上路

Rank: 1

积分
26
发表于 2019-7-28 13:40:32 | 显示全部楼层
写的挺好。学习了
回复 支持 反对

使用道具 举报

Archiver|手机版|小黑屋|Comsenz Inc.   

GMT+8, 2019-11-19 06:21 , Processed in 0.213362 second(s), 29 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

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