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

[LIB][ICC][IAR][GCC] 8K ~ 4K 小flash芯片专用架构

  [复制链接]

出0入0汤圆

发表于 2011-3-19 16:53:00 | 显示全部楼层
这类系统从根本上说还是前后台系统,当后台有个新的任务就绪了,而前台上一个任务还未完成,就只好傻等了~

出0入0汤圆

发表于 2011-3-19 17:07:03 | 显示全部楼层
记号,

出0入0汤圆

发表于 2011-3-24 16:36:58 | 显示全部楼层
请教一下:
“3. xxxxx.c 里面 强烈建议不要包含 xxxxx.h 当我们具体要使用某个头文件的
       时候,应该通过 “相对路径来添加”   ”

为什么这么做,我一直是在一个头文件Conf.h中包含所有的头文件,
然后所有的xxx.c文件包含相应的xxx.h文件。xxx.h文件再包含Conf.h文件。
这样就不用考虑.c文件有没有将要用的文件全部包含进来。也少写了不少#include ..

出0入0汤圆

发表于 2011-3-28 09:17:44 | 显示全部楼层
还看不懂啊!谁能写个教程,或者简单讲一下,万分感谢!

出0入296汤圆

 楼主| 发表于 2011-3-28 11:18:53 | 显示全部楼层
to 【104楼】 ww1228
    工程较小的时候可以这么做,当工程较大的时候,这种方式就阻碍了
代码的复用和模块化的一些要求:比如封装原则。一些不必要的信息在总
的.h中被加入,那么合作编程者甚至是自己都会因为一定的原因直接使用
这些信息——而这些信息很有可能是你不希望别人再干预的。比如一个模
块所有要处理的数据都放在一个结构体中,外界与这个模块以这个结构体
作为信息交换媒介,那么.h中很可能就要包含着个结构体……有了这个结
构体的定义,外界就可以通过他来访问和干预原本只应该由那个模块才能
处理的数据。这就是一个封装问题。
    头文件的包含问题牵扯很多细节。我在我的书中有所讨论。我会放出
一个PPT专门解释这个编码规范和使用细节。

出0入296汤圆

 楼主| 发表于 2011-3-28 11:36:30 | 显示全部楼层
更新嵌入式C语言入门培训用PPT到楼主位
点击此处下载 ourdev_626094JKZJQ9.rar(文件大小:410K) (原文件名:Trainning.rar)

还请大家批评指正,多多讨论最好哈。道理越争越明。

出0入0汤圆

发表于 2011-3-28 13:54:44 | 显示全部楼层
mark

出0入9汤圆

发表于 2011-3-28 14:15:32 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-28 21:16:43 | 显示全部楼层
好长,,慢慢看.

出0入0汤圆

发表于 2011-3-28 22:32:30 | 显示全部楼层
支持O(∩_∩)O谢谢

出0入0汤圆

发表于 2011-3-28 23:22:34 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-30 10:42:34 | 显示全部楼层
最近在此专栏努力学习,测试了一下Queue,请Gorgon Meducer指导、点评一下.
主要是文件结构,先说一下我的文件,以TestForQueue为例.
TestForQueue看作一个模块,从外部看,它有一个输出相关的文件(TestForQueue.h)
和一个输入相关的文件(TestForQueue_Conf.h).TestForQueue.c只包含TestForQueue.h。
使用该模块只需要包含该模块的输出文件与输入文件(各为一个文件)。

TestForQueue.h,功能主要就两个:包含_Conf.h和外部要使用的最小信息(如果该模块有多部分组成,则采用输出
文件包含各部分的头文件,各部分头文件包含外部要使用的最小信息,Gorgon Meducer在106楼意见我没使用,
理由是那样做的话,外部使用本模块时要知道的头文件不止一个,太烦)。

/*******************************************************************************
* File Name          : TestForQueue.h
* Author             :
* Version            : V0.0.1
* Date               : 10:07 2011年3月30日
* Description        :
*******************************************************************************/
#ifndef __TESTFORQUEUE_H
#define __TESTFORQUEUE_H

/* Includes -------------------------------------------------------------------*/
#include "TestForQueue_Conf.h"
/* Private define -------------------------------------------------------------*/
/* Exported types -------------------------------------------------------------*/
/* Exported constants ---------------------------------------------------------*/
/* Exported varibales ---------------------------------------------------------*/
/* Exported macro -------------------------------------------------------------*/
/* Exported functions -------------------------------------------------------- */
extern  void TestQueue(void);

#endif /* __TESTFORQUEUE_H */



TestForQueue_Conf.h,主要功能有两:配置本模块、包含本模块要使用的外部信息

/*******************************************************************************
* File Name          : TestForQueue_Conf.h
* Author             :
* Version            : V0.0.1
* Date               : 9:54 2011年3月30日
* Description        :
*******************************************************************************/
#ifndef __TESTFORQUEUE_CONF_H
#define __TESTFORQUEUE_CONF_H

/* Includes -------------------------------------------------------------------*/
#include "Queue.h"
#include "Usart.h"
#include "Delay.h"
/* Private define -------------------------------------------------------------*/
#define Q_PUTS(pstr) //输出字符串,例:"Testing for queue ./r/n"
#define Q_PUTHEX(num)//将int类型数据以hex方式输出

#define Q_TIMESTART(nms)//计时开始
#define Q_TIMECHECK()//检查计时是否结束
#define Q_TIMESTOP() //停止计时

#define Q_QF  //退出标志,1有效

/* Exported types -------------------------------------------------------------*/
/* Exported constants ---------------------------------------------------------*/
/* Exported varibales ---------------------------------------------------------*/
/* Exported macro -------------------------------------------------------------*/
/* Exported functions -------------------------------------------------------- */

#endif /* __TESTFORQUEUE_CONF_H */


另外:相对路径还没学习,要是有空也给讲讲吧,提速一下。
   本着“不管以前的是好是坏都尽量不修改”的想法,Gorgon Meducer的许多好方法都没使用。
   楼主位的蓝色字怎么加进去的啊?会了

TestForQueue.c/h  TestForQueue_Conf.h  
ourdev_626737ZIYDHQ.rar(文件大小:2K) (原文件名:TestForQueue.rar)

出0入0汤圆

发表于 2011-3-30 12:01:09 | 显示全部楼层
mark !

出0入296汤圆

 楼主| 发表于 2011-3-30 18:54:02 | 显示全部楼层
to 【114楼】 ww1228
    总体来说,你已经掌握了头文件包含的要点。至于我106楼所说的,
只是一个指导原则,就你现在所作的来说,已经很好了,并不冲突。

出0入0汤圆

发表于 2011-4-1 19:59:18 | 显示全部楼层
mark!!!

出0入0汤圆

发表于 2012-3-27 09:46:40 | 显示全部楼层
好好学习一下

出0入0汤圆

发表于 2012-11-16 01:51:12 | 显示全部楼层
Gorgon_Meducer 发表于 2011-3-30 18:54
to 【114楼】 ww1228
    总体来说,你已经掌握了头文件包含的要点。至于我106楼所说的,
只是一个指导原 ...

“SVN的使用”部分待更新。

出0入0汤圆

发表于 2012-12-25 15:52:17 | 显示全部楼层
学习学习学习

出0入0汤圆

发表于 2013-1-11 21:19:23 来自手机 | 显示全部楼层
Mark!miniFSM

出0入0汤圆

发表于 2013-1-30 09:58:35 | 显示全部楼层
非常感谢   学习下

出0入0汤圆

发表于 2013-1-30 10:04:28 来自手机 | 显示全部楼层
强贴留名

出0入0汤圆

发表于 2013-1-30 10:13:42 | 显示全部楼层
从另外一个帖子里追过来学习的

出0入0汤圆

发表于 2013-2-1 13:43:27 | 显示全部楼层
一直使用中,楼主居然能总结出来,牛人

出0入0汤圆

发表于 2013-2-3 23:51:49 | 显示全部楼层
学习了了

出0入0汤圆

发表于 2013-2-4 05:46:19 来自手机 | 显示全部楼层
学习一下。

出0入0汤圆

发表于 2013-2-20 20:21:30 | 显示全部楼层
请问傻孩子,什么是掩码结构体,网络上解释几乎没有啊

出0入296汤圆

 楼主| 发表于 2013-2-20 21:54:48 | 显示全部楼层
cumtcmeeczm 发表于 2013-2-20 20:21
请问傻孩子,什么是掩码结构体,网络上解释几乎没有啊

PPT里面应该有的吧?如果没有,看我另外一个帖子:http://www.amobbs.com/thread-5505499-1-1.html

出0入0汤圆

发表于 2013-3-8 20:05:09 | 显示全部楼层
傻孩子大哥,我看你的程序都写得很工整,很好看。请问在你的程序中,你是用什么规则对变量,函数等进行命名的呢?有没有什么规则文档可以学习呢?谢谢!

出0入296汤圆

 楼主| 发表于 2013-3-9 17:28:03 | 显示全部楼层
qingaixww 发表于 2013-3-8 20:05
傻孩子大哥,我看你的程序都写得很工整,很好看。请问在你的程序中,你是用什么规则对变量,函数等进行命名 ...

各人风格不同,这个模仿没有意义的哦,对自身提高也基本没有帮助的。
不过可以交流下这方面的习惯和偏好
1、变量我基本上用的是匈牙利命名法,但用着用着,我就并不完全遵循最初的匈牙利
     命名法了,而是自己逐步形成了一些自己的规则。
2、函数基本上就是动词短语,单词之间用下划线分开,全体小写。
3、变量习惯上用的是名词短语,单词首字母大写,不用下划线。
4、宏一律大写。

差不多就这些吧。

出0入0汤圆

发表于 2013-3-12 09:33:59 | 显示全部楼层
Gorgon_Meducer 发表于 2013-3-9 17:28
各人风格不同,这个模仿没有意义的哦,对自身提高也基本没有帮助的。
不过可以交流下这方面的习惯和偏好
...

这几天比较忙,刚过来看到,谢谢你提供的参考,非常感谢!因为自己在写程序的时候命名比较随意,所以想在这方面下点功夫,统一好。

出0入0汤圆

发表于 2013-3-18 16:55:34 | 显示全部楼层
强烈关注

出0入0汤圆

发表于 2013-3-18 23:24:59 | 显示全部楼层
傻孩子大哥,在这个模板中,
//! \brief use this macro to add tasks at design time in top level app_cfg.h file
#if MINI_FSM_TIMER_BASED == ES_ENABLED
#define MINI_FSM_REGISTER_NEW_TASK( __TASK_FUN, __PERIOD, __READY)  \
                {true, (__READY), ((__PERIOD) & 0xFF), ((__PERIOD) & 0xFF), (__TASK_FUN)},
#else
#define MINI_FSM_REGISTER_NEW_TASK( __TASK_FUN, __PERIOD, __READY)  \
                {true, (__READY), 0,(__TASK_FUN)},
#endif
//! \brief use this macro to reserve one task solt.
#define MINI_FSM_RESERVE_TASK_SPACE()   \
                {0}
这几个宏具体应该怎么使用呢?
MINI_FSM_REGISTER_NEW_TASK 这个是用来初使化任务的?
MINI_FSM_RESERVE_TASK_SPACE() 这个具体怎么使用,实在没想明白。
((__PERIOD) & 0xFF),这样操作后不是还是自身吗?这样做有何意义呢?谢谢!

出0入296汤圆

 楼主| 发表于 2013-3-18 23:38:50 | 显示全部楼层
qingaixww 发表于 2013-3-18 23:24
傻孩子大哥,在这个模板中,
//! \brief use this macro to add tasks at design time in top level app_cf ...

提示,找一找程序中什么地方用了宏MINI_FSM_RESERVE_TASK_SPACE。
应该在调度器的代码里面

出0入0汤圆

发表于 2013-3-18 23:58:31 | 显示全部楼层
Gorgon_Meducer 发表于 2013-3-18 23:38
提示,找一找程序中什么地方用了宏MINI_FSM_RESERVE_TASK_SPACE。
应该在调度器的代码里面 ...

好的,我先找找。

出0入0汤圆

发表于 2013-3-19 00:08:52 | 显示全部楼层
本帖最后由 qingaixww 于 2013-3-19 18:55 编辑

//! \brief use this macro to reserve one task solt.
#define MINI_FSM_RESERVE_TASK_SPACE()   \
                {0}

#ifdef ES_DECLARE_MINI_FSM_TASK_LIST
ES_DECLARE_MINI_FSM_TASK_LIST
#endif
这两个都没有找到在哪里有用到,傻孩子大哥,可以帮我看一下吗?谢谢!

出0入0汤圆

发表于 2013-3-30 16:31:08 | 显示全部楼层
qingaixww 发表于 2013-3-19 00:08
//! \brief use this macro to reserve one task solt.
#define MINI_FSM_RESERVE_TASK_SPACE()   \
       ...

傻孩子,你发布的模板里一个任务都没有吗?我找了好几圈都没找到?

出0入296汤圆

 楼主| 发表于 2013-3-30 22:37:39 | 显示全部楼层
meirenai 发表于 2013-3-30 16:31
傻孩子,你发布的模板里一个任务都没有吗?我找了好几圈都没找到?

是没有任务,模板嘛。

出0入0汤圆

发表于 2013-4-24 21:45:28 | 显示全部楼层
傻孩子大哥,用查询的方式进行串口接收,为什么会很容易掉帧?应该从哪些方面进行分析呢?

出0入0汤圆

发表于 2013-7-27 16:33:19 | 显示全部楼层
楼主酷似青年发哥啊

出0入296汤圆

 楼主| 发表于 2013-7-27 17:19:58 | 显示全部楼层
qingaixww 发表于 2013-4-24 21:45
傻孩子大哥,用查询的方式进行串口接收,为什么会很容易掉帧?应该从哪些方面进行分析呢? ...

从数据的速率以及主循环的最大执行周期的角度来考虑。当主循环的最大执行周期至少是数据速率的2倍时才能保证
使用查询的方法不会丢数据。

出0入0汤圆

发表于 2014-3-26 16:48:07 | 显示全部楼层
顶一个!!!!

出0入0汤圆

发表于 2014-3-26 17:08:21 | 显示全部楼层
马克            

出0入0汤圆

发表于 2014-3-26 22:20:23 来自手机 | 显示全部楼层
谢谢分享

出0入10汤圆

发表于 2014-3-28 14:52:15 | 显示全部楼层
谢谢分享!   

出0入0汤圆

发表于 2014-8-13 16:01:00 | 显示全部楼层
mark            

出0入0汤圆

发表于 2014-9-14 11:02:57 | 显示全部楼层
看了这个帖子PPT,希望能看懂傻孩子的程序

出0入0汤圆

发表于 2014-9-19 14:11:32 | 显示全部楼层
下载学习

出0入0汤圆

发表于 2014-10-16 19:39:39 | 显示全部楼层
傻孩子的东西要支持要支持

出0入0汤圆

发表于 2014-10-16 20:34:08 | 显示全部楼层
果断收藏。。。楼主辛苦了。。。谢谢分享。。。

出0入0汤圆

发表于 2014-12-15 23:33:15 | 显示全部楼层
看了多次,正在实践。 傻孩子,还在完善这个规范吗?

出0入296汤圆

 楼主| 发表于 2014-12-16 10:11:04 | 显示全部楼层
ppdd 发表于 2014-12-15 23:33
看了多次,正在实践。 傻孩子,还在完善这个规范吗?

在完善的。只不过现在这个已经是老版本的,新版本还没发出来。

出0入0汤圆

发表于 2014-12-26 09:10:49 | 显示全部楼层
本帖最后由 slzm40 于 2014-12-26 09:12 编辑

傻孩子你好,你的这个调度器经过了一个分析,有所了解,目前有一些疑问。 先说非时间触发的,从程序来看,定义结构体MINI_FSM_TASK,元素0定义了Available,IsAlive和一个函数指针用于任务。 Available用于定义任务有效性,当任务只执行一次或删除可以将Available置为false,就是将任务放入任务回收堆。
IsAlive是任务运行的启动标志位。我在看
        疑问0:
  1. void mini_FSM_task_schedule(void)
  2. {
  3.     #ifdef MINI_FSM_IDLE_TASK
  4.     bool bIfIdle = true;
  5.     #endif
  6.    
  7.     uint8_t n = 0;
  8.    
  9.     for (n = 0; n < UBOUND(s_fsmTasks); n++)
  10.     {
  11.     #if MINI_FSM_TIMER_BASED == ES_ENABLED
  12.         if ((0x03 == (((volatile uint8_t *)&s_fsmTasks[n])[0] & 0x03))&&(NULL != s_fsmTasks[n].fnTaskRoutine))
  13.     #else
  14.         if ((0x01 == (((volatile uint8_t *)&s_fsmTasks[n])[0] & 0x01))&&(NULL != s_fsmTasks[n].fnTaskRoutine))
  15.     #endif
  16.         {
  17.         #if MINI_FSM_TIMER_BASED == ES_ENABLED
  18.             bool result = s_fsmTasks[n].fnTaskRoutine();
  19.             
  20.             ATOM_CODE
  21.             (
  22.                 s_fsmTasks[n].IsAlive = result;
  23.             )
  24.             bIfIdle = false;
  25.         #else
  26.             if (s_fsmTasks[n].fnTaskRoutine())
  27.             {
  28.                 bIfIdle = false;
  29.             }
  30.         #endif
  31.             
  32.         }
  33.     }
  34.    
  35.     #ifdef MINI_FSM_IDLE_TASK
  36.     if (bIfIdle)
  37.     {
  38.         MINI_FSM_IDLE_TASK;
  39.     }
  40.     #endif
  41. }
复制代码


        任务分派运行中,只有 if ((0x01 == (((volatile uint8_t *)&s_fsmTasks[n])[0] & 0x01))&&(NULL != s_fsmTasks[n].fnTaskRoutine))判断任务是否有效,没有看到            if (s_fsmTasks[n].fnTaskRoutine())
            {
                bIfIdle = false;
            }
有判断任务是否被激活?也就是IsAlive 没用到, 一直没搞清楚。
       
        疑问1.另外我发现一个问题,不知道是否分析的对,在需要添加任务时,mini_FSM_Register_Task是在s_fsmTasks 遍历是否有有Available = false,
如果的确有位置就插入。 也就是说,在实现添加任务时,在s_fsmTasks 任务列表就必须提前先占4个byte位置,不然有可能找不到位置而任务添加失败。
        疑问2.另外,任务删除和任务添加,以及任务回收任务堆重捡任务有点冲突,例如,我在任务中删除了这个任务,置Available = false,而有时我想重新从回收任务堆中激活这个任务,而在这之前有可能任务添加把这个任务位置优先占了,也就是说,从任务回收堆重激活可能不是原来想要的任务。  当然,代码中我没发现有实现这样功能,应该是没有这个功能。
        疑问3.我想问下非时间触发的那个架构,触发任务激活原理是如何实现的,这里我找到一个函数mini_FSM_start_task,这里有回到疑问0,在分派任务实现时,没看到有用到alive.
       

        最后说下我目前用的时间触发式架构的问题,目前我用的是时间触发式,也就是楼主傻孩子里那个时间片的类似,大部份任务都能分到时间片去实现,但是我有一些任务想一收到消息就尽快运行,或者想在大循环一运行到此任务立马开始运行,有点抢占的意思。而不想用最小时间片1ms到时才运行。
        所以目前,我用的应该是混合式协作调度法。伪代码如下
        void main(void)
        {
        各种初始化;
        while(true)
        {
        时间触发任务列表task;
        事件触发任务loop1();
        事件触发任务loop2(); //这里相当于回到大轮询方式了
        ....
        }
        }
        事件触发任务我以目前遇到ADC采样数据流,我在时间触发任务中会启动ADC,然后ADC开始采样,每500us采样一次,我必须边采边算,一起算时不够快,这里我用FIFO,以下伪代码 也就是事件触发
        if(ADC_dequeue())//如果ADC有数据
        {
        开始计算。
        if(计算数据量到达要求>=max_size)
        {
        关闭ADC。
        处理之
        送显示缓冲
        }
        }

        如何在时间片调度中实现较高实时的任务?

出0入0汤圆

发表于 2014-12-26 09:16:37 | 显示全部楼层
另外再问,在STM32这种资源丰富的芯片中,用什么软件架构好?  

出0入296汤圆

 楼主| 发表于 2014-12-26 10:33:11 | 显示全部楼层
本帖最后由 Gorgon_Meducer 于 2014-12-26 10:40 编辑
slzm40 发表于 2014-12-26 09:10
傻孩子你好,你的这个调度器经过了一个分析,有所了解,目前有一些疑问。 先说非时间触发的,从程序来看, ...


关于你的第一个问题,你要看MINI_FSM_TASK的定义

  1. typedef bool MINI_FSM_TASK_HANDLER(void);

  2. //! \name mini FSM task structure
  3. //! @{
  4. typedef struct
  5. {
  6. #if MCU_MEM_LITTLE_ENDIAN
  7.     //! little-endian
  8.     unsigned Available      : 1;            //!< avaliable flag
  9.     unsigned IsAlive        : 1;            //!< alive flag
  10.     #if MINI_FSM_TIMER_BASED == ES_ENABLED
  11.     unsigned Period         : 14;           //!< task working period
  12.     uint16_t TimeTicker;                    //!< task time ticker
  13.     #else
  14.     unsigned Reserved       : 14;   
  15.     #endif
  16.     MINI_FSM_TASK_HANDLER *fnTaskRoutine;   //!< task routine
  17. #else
  18.     //! big-endian
  19.     MINI_FSM_TASK_HANDLER *fnTaskRoutine;   //!< task routine
  20.     #if MINI_FSM_TIMER_BASED == ES_ENABLED
  21.     uint16_t TimeTicker;                    //!< task time ticker
  22.     unsigned Period         : 14;           //!< task working period
  23.     #else
  24.     unsigned Reserved       : 14;
  25.     #endif
  26.     unsigned IsAlive        : 1;            //!< alive flag
  27.     unsigned Available      : 1;            //!< avaliable flag
  28. #endif
  29. }MINI_FSM_TASK;
  30. //! @}
复制代码


这里Available和IsAlive就是MINI_FSM_TASK低字节的BIT0和BIT1所以,直接用0x03和0x01来表示就可以了。

第二个问题:删除的任务就是删除了,不允许从垃圾堆里面还翻出来这种说法,如果你后面还要用,就不要删除,暂时阻塞它好了。
                  这个代码里面应该没有实现删除任务的函数,真要这么做,就需要把 s_fsmTasks[n].fnTaskRoutine 设置为NULL,
                  并把IsAlive设置为false。

最后一个问题,其实从你的问题来看,你属于被时间触发毒害的那一类。时间触发是事件触发的一种特殊情况,而在系统里面其实
只有事件触发,时间只是一类事件。对于你说的情况,比如ADC,你可以用ADC事件去触发任务。如果你用时间去触发任务,就变成
时间触发了。实时性和即时性不同,我觉得你混淆了这两个概念。实时性并不是越快处理越好,而是只要在一个规定的时间范围内
处理掉就好。从你的描述来看,你是希望越快越好,这是即时性,即时性是个伪概念,因为怎样才算越快越好呢?多个“越快越好”
的事情同时发生究竟如何处理?还算不算越快越好呢?归根到底,是一个缺乏量化评判标准的概念。必须要引入一个时间窗口才行
这个时间窗口就是实时性时间窗口——也就是只要在规定的时间内完成就符合要求了。

最后,这个调度器我不太用了,感觉也有很多冗余,推荐你参考另外一个更简洁的调度器版本:http://www.amobbs.com/thread-5509424-1-1.html?_dsign=392c4e86

出0入296汤圆

 楼主| 发表于 2014-12-26 10:45:57 | 显示全部楼层
slzm40 发表于 2014-12-26 09:16
另外再问,在STM32这种资源丰富的芯片中,用什么软件架构好?

成熟的OS,比如FreeRTOS, ucos,RT-Thread等等

出0入0汤圆

发表于 2014-12-26 11:00:48 | 显示全部楼层
        那个更简洁的正在领悟,时间触发的确是事件确发的一种特殊情况,我也想跳出这种时间触发的模式,但很多任务与时间相关,比如,灯1s闪烁一次,固定时间片对任务中有时间处理会比较好算。
        帮我回答下第0个疑问,isAlive参数没有用到,回看157楼代码,在调度过程中,使用mini_FSM_start_task去激活任务,也就是激活isalive,而在任务查询是否激活中,只用到了Available和IsAlive就是MINI_FSM_TASK低字节的BIT0和BIT1所以,直接用0x03和0x01来表示就可以了。另一种模式,非时间触发的,只判断Available是为何,isAlive没有做任何判断是怎么回事。
        另外,有个问题没有回答,在使用添加任务时,应该需要在任务列表中提前占一些地方,供添加任务使用。
       
        你给我的那个贴子还在看,待我仔细学习一下。

出0入296汤圆

 楼主| 发表于 2014-12-26 11:15:57 | 显示全部楼层
slzm40 发表于 2014-12-26 11:00
那个更简洁的正在领悟,时间触发的确是事件确发的一种特殊情况,我也想跳出这种时间触发的模式,但很多任 ...

其实大部分任务都和时间触发没多少关系……你只看到了闪烁灯……一般一个实际应用,只需要给对应的模块提供一个
ms中断源就可以了。时间触发基本不需要集成到调度器中。
至于你说增加空槽给新任务,这个只要定义MINI_FSM_TASK_LIST就可以了。

出0入0汤圆

发表于 2014-12-26 11:21:23 | 显示全部楼层
Gorgon_Meducer 发表于 2014-12-26 11:15
其实大部分任务都和时间触发没多少关系……你只看到了闪烁灯……一般一个实际应用,只需要给对应的模块提 ...

        能否来个伪代码演示一下, 我从软件开始学习起,没受过正规的培训。对于你说的这个((对应的模块提供一个
ms中断源就可以了))
        在任务中如何实现,以闪烁灯为例即可,我去思考一下。
        谢谢

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-6-17 20:49

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

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