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

Gorgon_Meducer 发表于 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) (原文件名:.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可以获得全面的帮助。

menghong_4 发表于 2009-8-21 21:36:56

顶~~~~~~~~~~

ddaitt999 发表于 2009-8-21 21:46:47

紧跟傻孩子足迹~~
:大家都来支持新版本

Gorgon_Meducer 发表于 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

http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_473393.GIF
(原文件名: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

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

snoopyzz 发表于 2009-8-22 09:44:28

...
把C语言变成BASIC了
...
...
...

ddaitt999 发表于 2009-8-22 13:14:30

大家都来逛逛哦,把此结构用于你自己的工程的心得谈谈。
上面两份代码的分量是相当的足,希望能有更多的网友看到。

jxmlingyun 发表于 2009-10-7 09:49:44

请教一下这个app_cfg.h文件的作用,不胜感激

Gorgon_Meducer 发表于 2009-10-11 18:54:17

app_cfg.h使用条件编译开关 来配置 代码的某些 编译时刻可变 的部分。

w418781840 发表于 2009-10-11 20:18:47

大侠的东西值得好好学习。

junmadianzi 发表于 2010-1-11 19:06:37

高,实在是高,

myyule 发表于 2010-10-19 21:21:30

看不懂

ljt8015 发表于 2010-10-19 22:17:39

回复【11楼】myyule
看不懂
-----------------------------------------------------------------------

flor 发表于 2010-10-19 22:27:25

mark
页: [1]
查看完整版本: 谈谈傻孩子“升级版工程构架”