搜索
bottom↓
回复: 13

谈谈傻孩子“升级版工程构架”

[复制链接]

出0入0汤圆

发表于 2009-8-21 17:42:48 | 显示全部楼层 |阅读模式
各位网友:
    你们好!
    大家有福喽!傻孩子已经发布“升级版工程构架”的部分内容,相信不久傻孩子还会继续给大家发布更精彩的内容,让我们共同期待。
    新版程序已经发布一段时间了,因为没见到网友们谈论使用此工程代码的经验和体会,所以我就先谈谈升级版本的使用体会啦。新版程序可以支持
   不同的编译软件,这点的确是方便啊,不用在换编译器后再修改中断服务程序的写法,也不用再去添加  BIT 的用法。新版本中对源程序文件的管理很有条理

  还是有几点点不是很清楚比如:
一、
  (1) 我使用了IAR,在使用了compiler.h,工程主动调用了 #include <ioavr.h>  我们对I/O口的每一位宏定义操作时可以写成:
  【SFR_B_N(0x08, PORTC, Dummy7, PORTC6, PORTC5, PORTC4, PORTC3, PORTC2, PORTC1, PORTC0)】
  # define  LED1 PORTC_PORTC0
  (2)如果使用ICCAVR在原版本中提供了库文件:RD_UseAVRPortBit.h,也可用轻松使用:#define led1 _PC0,升级后的版本没有包含此头文件,直接定义I/O的任意一位如何定义
二、
新版本构架还没有公布核心的进程调度器,期待傻孩子能在近期公布在工程中如何调度功能函数和进程,并却能给大家讲讲调度器函数是如何实现的!!
我目前还是使用时间片分时调度机制作为系统的调度机制,把系统时间分为:例如:5ms,10ms,100ms,我学习老版本的工程构架时就对“合作调度器基本函数库 ”和“系统进程置配函数库”没弄明白。所以在新版本公布“进程调度”这部分时很期待傻孩子能详细的讲一讲,或者推荐一些相关这方面的书籍或资料学习学习。
三、相关的“name debug setting”调试信息是新增加的一部分内容吧,是不是要实现与上位机通信的方式来调试程序,那么上位机的调试软件相关资料不是很了解。谁能给讲讲。
   啰嗦了一通,提了不少问题,欢迎网友们拍砖!!
   期待大家能谈谈使用傻孩子工程的体会和经验。
   期待傻孩子大作--升级版程序构架开源大吉

出0入296汤圆

发表于 2009-8-21 20:47:45 | 显示全部楼层
to ddaitt999 东东
    我虽然删除了RD_UseAVRPortBit.h但是保留了Snail_UseBit.h这是构建IO位定义的基础。
而且这次的Snail_UseBit.h自动处理了大小端问题。
    我之所以删除了RD_UseAVRPortBit.h是因为直接使用IO位操作是一种不被推荐的方式。
之前担心的C代码效率问题也是一个方面,不过从近期的测试来看,ICC、IAR和GCC都能很好
的处理位段了。
    调度器我会很快发布,这次的调度器支持动态进程申请和动态释放。其实,之前我完成
了一个专用的状态机调度器,这一状态机调度器可以让你的代码天然支持多线程(伪),而
这次AVR Software Framework的调度器是从中简化而来的。随后我将给给大家看一个用之前
那个状态机调度器实现的代码。
    这次新的Framework里面带了一个完整的控制台,有兴趣的可以通过下载下面的模板来
感受一下新Framework——高度可移植性,高度对象化,高度模块化,层次化……

点击此处下载 ourdev_473321.rar(文件大小:443K) (原文件名:[Scheduler][USART][Terminal].rar)

该模板是一个串口模板,所有的配置都应该在app_cfg.h里面进行。这算是一个完整的实例。
不同器件可能因为寄存器的不同,要修改hal.c和bsp.c里面的寄存器名称和中断向量名称,
hal.c和bsp.c只是一个DEMO,并不是AVR Software Framework的一个组成部分,应该由客户
自己编写。如果你手上拥有SEK,直接下载进去就可以哈。^_^ 不同编译器的工程都在build
文件夹里面。

该代码演示了一个串口控制台,你需要连接windows的控制台,按照bsp.c里面BSP_PC_RS232_Initialize
默认设置的内容设置控制台,这个控制台很类似windows……上下左右键都有对应的效果……
自己探索咯……/help能获得帮助,help/all可以获得全面的帮助。

出0入0汤圆

发表于 2009-8-21 21:36:56 | 显示全部楼层
顶~~~~~~~~~~

出0入0汤圆

 楼主| 发表于 2009-8-21 21:46:47 | 显示全部楼层
紧跟傻孩子足迹~~
[Scheduler][USART][Terminal]:大家都来支持新版本

出0入296汤圆

发表于 2009-8-21 23:39:26 | 显示全部楼层
呵呵……被楼上跨的晕乎乎的……飘起来了要……展示一下正在研发的一个状态机系统:
首先,粘贴一个应用程序的例子,表明这是一个真正的C语言程序



/*-----------------------------*
*  include head files         *
*----------------------------*/
#include "utils\compiler.h"
#include "app_cfg.h"
#include "hal\hal.h"
#include "service\service.h"



/*-----------------------------*
*  Macros for constants       *
*----------------------------*/


/*-----------------------------*
*  Macros for others          *
*----------------------------*/


/*-----------------------------*
*  type definitions           *
*----------------------------*/


/*-----------------------------*
*  structure,union and enum   *
*----------------------------*/


/*-----------------------------*
*  public functions prototypes*
*----------------------------*/
#if ES_DEBUG_FSM_SCHEDULER == ES_ENABLED
FSM_STATE(FSM_Demo_A);
#endif
/*-----------------------------*
*  static functions prototypes*
*----------------------------*/
static ES_BOOL System_INIT(void);
static void System_Idle(void);
static ES_BOOL FSM_Task_Register(void);

#if ES_DEBUG_FSM_SCHEDULER == ES_ENABLED
static FSM_STATE(FSM_Demo_B);
static FSM_STATE(FSM_Demo_C);
static FSM_STATE(FSM_Demo_D);
static FSM_STATE(FSM_Demo_E);
#endif

/*-----------------------------*
*  public variable declaration*
*----------------------------*/


/*-----------------------------*
*  static variable declaration*
*----------------------------*/
#if ES_DEBUG_FSM_SCHEDULER == ES_ENABLED
FSM_STATE(FSM_Demo_A)
    BEGIN
   
        DDRD |= BIT(PD3);
        PORTD &= ~BIT(PD3);
        
        g_hwDelayCounter = 200;
   
        FSM_STATE_TRANSIT_TO(FSM_Demo_C)
    END

static FSM_STATE(FSM_Demo_C)
    BEGIN
        FSM_CALL_SUB_FSM  
                FSM_Demo_B
        RETURN_TO
                FSM_Demo_D
        END_CALL

        FSM_REFLEXIVE
    END

static FSM_STATE(FSM_Demo_D)
    BEGIN
        DDRD |= BIT(PD3);
        PORTD |= BIT(PD3);
        g_hwDelayCounter = 200;
   
        FSM_STATE_TRANSIT_TO(FSM_Demo_E)
    END

static FSM_STATE(FSM_Demo_E)
    BEGIN
        FSM_CALL_SUB_FSM  
                FSM_Demo_B
        RETURN_TO
                NULL
        END_CALL

        FSM_REFLEXIVE
    END

static FSM_STATE(FSM_Demo_B)
    BEGIN
        IF g_hwDelayCounter == 0 THEN
            FSM_FINAL
        END_IF
   
        FSM_REFLEXIVE
    END


#endif

/*-----------------------------------------------------------------------------*
*  Function Description:                                                      *
*      Registe all FSM tasks                                                  *
*  Parameters:                                                                *
*      None                                                                   *
*  Return                                                                     *
*      the result of this proccessing                                         *
*----------------------------------------------------------------------------*/
static ES_BOOL FSM_Task_Register(void)
{
    #if ES_DEBUG_FSM_SCHEDULER == ES_ENABLED
    if (NULL == Register_FSM_Item(NULL,FSM_Demo_A))
    {
        return ES_FALSE;
    }
    #endif
   
    if (ES_FALSE == BSP_FSM_Register())
    {
        return ES_FALSE;
    }
   
    return ES_TRUE;   
}


/*-----------------------------------------------------------------------------*
*  Function Description:                                                      *
*      Initialize the whole system                                            *
*  Parameters:                                                                *
*      None                                                                   *
*  Return                                                                     *
*      the result of this proccessing                                         *
*----------------------------------------------------------------------------*/
static ES_BOOL System_INIT(void)
{
    //! Initialize the peripherals and the devices.
    DISABLE_GLOBAL_INTERRUPT;
   
    if (ES_FALSE == Device_INIT())
    {
        return ES_FALSE;
    }
   
    if (ES_FALSE == Service_INIT())
    {
        return ES_FALSE;
    }
   
    if (ES_FALSE == FSM_Task_Register())
    {
        return ES_FALSE;
    }
   
    ENABLE_GLOBAL_INTERRUPT;
   
    return ES_TRUE;
}

/*-----------------------------------------------------------------------------*
*  Function Description:                                                      *
*      the main function                                                      *
*  Parameters:                                                                *
*      None                                                                   *
*  Return:                                                                    *
*      None                                                                   *
*  Note:                                                                      *
*      You should not modify any code of this funtion.                        *
*----------------------------------------------------------------------------*/
void main(void)
{
    System_INIT();              //!< Initialize the whole system

    while(ES_TRUE)              //!< the super loop
    {
        FSM_SCHEDULER           //!< FSM Scheduer
    }
}



可以发现,这个结构和我们现在的AVR Software Framework有几分类似,感觉就像Win98和WinNT
的差别。开个玩笑,着重来看看状态机部分:
程序一开始定义了一个状态机的n个状态
#if ES_DEBUG_FSM_SCHEDULER == ES_ENABLED
static FSM_STATE(FSM_Demo_B);
static FSM_STATE(FSM_Demo_C);
static FSM_STATE(FSM_Demo_D);
static FSM_STATE(FSM_Demo_E);
#endif


(原文件名:1.GIF)

接下来描述了这个状态机:
FSM_STATE(FSM_Demo_A)
    BEGIN
   
        DDRD |= BIT(PD3);
        PORTD &= ~BIT(PD3);
        
        g_hwDelayCounter = 200;
   
        FSM_STATE_TRANSIT_TO(FSM_Demo_C)
    END

static FSM_STATE(FSM_Demo_C)
    BEGIN
        FSM_CALL_SUB_FSM  
                FSM_Demo_B
        RETURN_TO
                FSM_Demo_D
        END_CALL

        FSM_REFLEXIVE
    END

static FSM_STATE(FSM_Demo_D)
    BEGIN
        DDRD |= BIT(PD3);
        PORTD |= BIT(PD3);
        g_hwDelayCounter = 200;
   
        FSM_STATE_TRANSIT_TO(FSM_Demo_E)
    END

static FSM_STATE(FSM_Demo_E)
    BEGIN
        FSM_CALL_SUB_FSM  
                FSM_Demo_B
        RETURN_TO
                NULL
        END_CALL

        FSM_REFLEXIVE
    END

static FSM_STATE(FSM_Demo_B)
    BEGIN
        IF g_hwDelayCounter == 0 THEN
            FSM_FINAL
        END_IF
   
        FSM_REFLEXIVE
    END

明眼人很容易看出这个状态机就是一个实现LED闪烁的DEMO。
不过你要注意,他使用了类似子程序调用的功能。也就是说
这个状态机系统支持子状态机调用,类似汇编的icall和rete,
或者说C语言的函数调用和return。在这个系统的设计中里面,
多个状态机可以并行执行,这是代码结构决定的;大家都知道,
要实现函数调用,必然要支持栈,否则无法处理返回地址问题;
在这个系统中,我允许多个状态机都拥有自己独立的栈,这个栈
可以用来压入如何内容当然默认包含了返回地址,这很类似
C语言的函数调用过程;同时为了有效利用资源,状态机的栈
是可以生长的,也就是所谓你用多少就给你多少,你不用的
就归还会来,大家共享资源。

也许说了这么多,对于上面状态机的原形,你已经很好奇了,
这里我把宏的定义给出,你一看就恍然大悟:
#if ES_USE_MINI_FSM == ES_ENABLED
    # define FSM_STATE(__FUNCTION)      ES_FSM_STATUS __FUNCTION(ES_FSM_ITEM *pFSM)
#else
    # define FSM_STATE(__FUNCTION)      ES_FSM_STATUS __FUNCTION(ES_FCB *pFCB,ES_FSM_ITEM *pFSM)
#endif

# define FSM_REFLEXIVE      return ES_FSM_ACTIVE;
# define FSM_SLEEP          return ES_FSM_SLEEP;
# define FSM_FINAL          return ES_FSM_TERMINATE;
# define FSM_STATE_TRANSIT_TO(__FSM_STATE)    \
                        {\
                            ES_FSM_State_Transition(pFSM,(__FSM_STATE));\
                            FSM_REFLEXIVE\
                        }
# define FSM_CALL_SUB_FSM   ES_FSM_Call_Sub_FSM(pFSM,
# define WHEN_READY
# define RETURN_TO   ,
# define END_CALL   );

#define BEGIN           {
#define END             }

#define IF              if (
#define THEN            ) {
#define ELSE            } else {
#define ELSE_IF         } else if (
#define END_IF          }

#define SELECT_CASE(__VALUE)    switch (__VALUE) {
#define CASE            case
#define EXIT_CASE       break;
#define END_SELECT      }

#define WHILE(__BOOL)   while((__BOOL)) {
#define EXIT_WHILE      break;
#define WEND            }
#define END_WHILE       }

#define DO                  do {
#define EXIT_DO             break;
#define LOOP                } while (1);
#define LOOP_WHILE(__BOOL)  } while ((__BOOL));
#define LOOP_UNTIL(__BOOL)  } while (!(__BOOL));

#define FOR(__INIT,__BOOL,__CODE)   for ((__INIT);(__BOOL);(__CODE)) {
#define EXIT_FOR            break;
#define NEXT                        }

#define TYPE(__NAME)        typedef struct __##__NAME __NAME {
#define END_TYPE            }

#define USER_TYPE           typedef


很遗憾,做一个测试中的项目,我暂时还不能公开所有的内容。希望大家谅解。

出0入0汤圆

发表于 2009-8-22 09:44:28 | 显示全部楼层
...
把C语言变成BASIC了
...
...
...

出0入0汤圆

 楼主| 发表于 2009-8-22 13:14:30 | 显示全部楼层
大家都来逛逛哦,把此结构用于你自己的工程的心得谈谈。
上面两份代码的分量是相当的足,希望能有更多的网友看到。

出0入0汤圆

发表于 2009-10-7 09:49:44 | 显示全部楼层
请教一下这个app_cfg.h文件的作用,不胜感激

出0入296汤圆

发表于 2009-10-11 18:54:17 | 显示全部楼层
app_cfg.h使用条件编译开关 来配置 代码的某些 编译时刻可变 的部分。

出0入0汤圆

发表于 2009-10-11 20:18:47 | 显示全部楼层
大侠的东西值得好好学习。

出0入0汤圆

发表于 2010-1-11 19:06:37 | 显示全部楼层
高,实在是高,

出0入0汤圆

发表于 2010-10-19 21:21:30 | 显示全部楼层
看不懂

出0入0汤圆

发表于 2010-10-19 22:17:39 | 显示全部楼层
回复【11楼】myyule
看不懂
-----------------------------------------------------------------------

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-4 20:57

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

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