|
楼主 |
发表于 2012-4-21 06:13:53
|
显示全部楼层
本帖最后由 uc_c++ 于 2012-4-21 07:52 编辑
有了状态机跳转关系,有可以移植到IAR C++。
LGT板子还没到,没有在硬件上验证过。
说明:
由于我的状态机没有子状态机,改用状态机等待另一个状态机为IDLE,
因此Hello_World_CLASS加入状态HW_WaitSendEnd,等待发送完毕。
另外,我的状态机可以直接延时,不需要再定义延时状态,因此,
将状态HW_Init_Delay,HW_Delay删除。- #include "proj_incs.h"
- class Ping_Pang_Demo_CLASS:public VSTATE_SCHED_CLASS
- {
- public:
- //状态机初始化,初始状态为Ping_Pang_Demo_Start
- void Init(void)
- {
- *this<<VSTATE_OBJECT(Ping_Pang_Demo_Start);
- }
- private:
- //状态声明
- VSTATE_DeclarationIn(Ping_Pang_Demo_CLASS,Ping_Pang_Demo_Start);
- VSTATE_DeclarationIn(Ping_Pang_Demo_CLASS,Ping_Pang_Demo_Wait_Busy_Flag);
- VSTATE_DeclarationIn(Ping_Pang_Demo_CLASS,Ping_Pang_Demo_Output);
- };
- class Hello_World_CLASS:public VSTATE_SCHED_CLASS
- {
- public:
- //状态机初始化,初始状态为HW_Start
- void Init(void)
- {
- *this<<VSTATE_OBJECT(HW_Start); //初始状态
- }
- private:
- //状态声明
- VSTATE_DeclarationIn(Hello_World_CLASS,HW_Start);
- VSTATE_DeclarationIn(Hello_World_CLASS,HW_WaitSendEnd);
- };
- class Stream_Output_CLASS:public VSTATE_SCHED_CLASS
- {
- public:
- //状态机初始化,初始状态为IDLE
- void Init(void)
- {
- }
- private:
- //状态声明
- VSTATE_DeclarationIn(Stream_Output_CLASS,Stream_Out_Start);
- VSTATE_DeclarationIn(Stream_Output_CLASS,Stream_Out_Byte_Output);
-
- friend class Hello_World_CLASS;
- };
- Ping_Pang_Demo_CLASS Ping_Pang_Demo; //状态机定义
- Hello_World_CLASS Hello_World; //状态机定义
- Stream_Output_CLASS Stream_Output; //状态机定义
- static uint8 s_chByte;
- static bool s_bBusyFlag = false;
- static uint8 *pchSrc;
- static uint8 chLength;
- //==============================================================================
- //==============================================================================
- VSTATE_ImplementationIn(Ping_Pang_Demo_CLASS,Ping_Pang_Demo_Start)
- {
- if (usart_serial_in_byte(&s_chByte)) //如果串口收到数据
- {
- *this<<VSTATE_OBJECT(Ping_Pang_Demo_Wait_Busy_Flag); //跳转到Ping_Pang_Demo_Wait_Busy_Flag
- return;
- }
- //没有跳转,状态机保持原来的状态,继续在Ping_Pang_Demo_Start运行
- }
- VSTATE_ImplementationIn(Ping_Pang_Demo_CLASS,Ping_Pang_Demo_Wait_Busy_Flag)
- {
- if (!s_bBusyFlag) //如果串口不繁忙
- {
- s_bBusyFlag = true; //置串口繁忙
- *this<<VSTATE_OBJECT(Ping_Pang_Demo_Output); //跳转到Ping_Pang_Demo_Output
- return;
- }
- }
- VSTATE_ImplementationIn(Ping_Pang_Demo_CLASS,Ping_Pang_Demo_Output)
- {
- if (usart_serial_out_byte(s_chByte))
- {
- s_bBusyFlag = false; //释放串口
- *this<<VSTATE_OBJECT(Ping_Pang_Demo_Start); //跳转到Ping_Pang_Demo_Start
- }
- }
- //==============================================================================
- //==============================================================================
- VSTATE_ImplementationIn(Stream_Output_CLASS,Stream_Out_Start)
- {
- if(!((pchSrc!=NULL)&&(chLength!=0))) //如果没有数据发送
- {
- *this<<VSTATE_OBJECT_IDLE(); //跳转到Idle,表示数据发送完毕
- return ;
- }
-
- *this<<VSTATE_OBJECT(Stream_Out_Byte_Output); //跳转到 Stream_Out_Byte_Output
- return;
- }
- VSTATE_ImplementationIn(Stream_Output_CLASS,Stream_Out_Byte_Output)
- {
- uint8 chByte = *pchSrc;
- if (usart_serial_out_byte(chByte))
- {
- pchSrc++;
- chLength--;
- *this<<VSTATE_OBJECT(Stream_Out_Start); //跳转到 Stream_Out_Start
- return;
- }
- }
- //==============================================================================
- //==============================================================================
- VSTATE_ImplementationIn(Hello_World_CLASS,HW_Start)
- {
- if (!s_bBusyFlag)
- {
- s_bBusyFlag = true; //置串口繁忙
-
- pchSrc = (uint8 *)"Hello world!\r\n";
- chLength = sizeof( "Hello world!\r\n");
-
- Stream_Output<<VSTATE_OBJECT_IN(Stream_Output_CLASS,Stream_Out_Start);//Stream_Output跳转到Stream_Out_Start
-
- *this<<VSTATE_OBJECT(HW_WaitSendEnd);//跳转到HW_WaitSendEnd
- return;
- }
- }
- VSTATE_ImplementationIn(Hello_World_CLASS,HW_WaitSendEnd)
- {
- if(Stream_Output.IsInIdle()) //如果状态机Stream_Output状态为IDLE,说明串口数据已经发送完毕
- {
- s_bBusyFlag = false; //释放串口
- *this<<(HS_TICKS_PER_SEC*2)<<VSTATE_OBJECT(HW_Start); //延时两秒,跳转到HW_Start
- return;
- }
- }
- int main()
- {
- usart_init(9600);
-
- Ping_Pang_Demo.Init();
- Hello_World.Init();
- Stream_Output.Init();
-
- while(1)
- {
- Ping_Pang_Demo.Do();
- Hello_World.Do();
- Stream_Output.Do();
- }
- }
复制代码 |
|