搜索
bottom↓
回复: 117

[交流] ESnail Software Framework 3.x 11-05-2012 updated

[复制链接]

出0入296汤圆

 楼主| 发表于 2010-10-13 00:32:01 | 显示全部楼层
本帖最后由 Gorgon_Meducer 于 2013-1-29 14:05 编辑


例程1:闪烁的LED


1、首先我们要声明一个状态机

  1. //! \brief define a static statemachine
  2. STATIC_FSM(Work_LED_Flash)
  3.     NO_INIT PRIVATE uint32_t s_hwLEDDelay;

  4.     PRIVATE STATE(LED_Init);
  5.     PRIVATE STATE(LED_Toggle);
  6.     PRIVATE STATE(LED_Delay);
  7. END_FSM
复制代码
2、接下来我们要实现状态机的本体。

  1. /*----------------------------------------------------------------------------*
  2. * State machine: LED Flash                                                   *
  3. *----------------------------------------------------------------------------*/
  4. #if USE_LED_FLASH_SERVICE == ENABLED
  5. /*! \brief initialize work led
  6. */
  7. PRIVATE STATE(LED_Init) BEGIN

  8.     //! gpio initialization
  9.     ESSF_GPIO_INIT(LED_WORK_PORT);
  10.     ESSF_GPIO_ENABLE(LED_WORK_PORT);
  11.     ESSF_GPIO_PIN_CONFIG(LED_WORK_PIN, PIN_FUNC_GPIO, PIN_OUTPUT);
  12.    
  13.     //! transfer to next state
  14.     TRANSFER_TO_STATE(LED_Toggle);
  15.     EXIT_STATE;
  16. END

  17. /*! \brief toggle led and set delay down counter
  18. */
  19. PRIVATE STATE(LED_Toggle) BEGIN   
  20.     //! toggle work led
  21.     ESSF_GPIO_TOGGLE(LED_WORK_PIN);

  22.     //! initialize delay down counter
  23.     s_hwLEDDelay = 10000;

  24.     //! transfer to next state
  25.     TRANSFER_TO_STATE(LED_Delay);
  26.     EXIT_STATE;
  27. END

  28. /*! \brief delay
  29. */
  30. PRIVATE STATE(LED_Delay) BEGIN
  31.     if (s_hwLEDDelay) {
  32.         s_hwLEDDelay--;
  33.     } else {
  34.         //! transfer to state: LED_Toggle
  35.         TRANSFER_TO_STATE(LED_Toggle);      
  36.     }
  37.    
  38.     REFLEXIVE_STATE;
  39. END
  40. #endif
复制代码
3、最后我们要在初始化应用的时候启动这个状态机——也就是用上面的状态机新建一个调度器任务:
  1. /*! \note initialize application
  2. *  \param none
  3. *  \retval true hal initialization succeeded.
  4. *  \retval false hal initialization failed
  5. */  
  6. bool app_init(void)
  7. {
  8.     ....
  9.     //! start state machine
  10.     NEW_STATIC_FSM(Work_LED_Flash, REF_STATE(LED_Init));
  11.     ...
  12. }
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入296汤圆

 楼主| 发表于 2010-10-13 00:32:15 | 显示全部楼层
占位

出0入0汤圆

发表于 2010-10-13 00:37:12 | 显示全部楼层
ding

出0入0汤圆

发表于 2010-10-13 00:37:15 | 显示全部楼层
只有地板了

出0入0汤圆

发表于 2010-10-13 00:59:27 | 显示全部楼层
下水道?

出0入0汤圆

发表于 2010-10-13 01:13:11 | 显示全部楼层
回复【1楼】Gorgon Meducer 傻孩子


[状态机引擎]


<font color=brown>
作为demo,先放一个状态机调度器的头文件出来,所有用户使用的核心内容,都在里面了
#ifndef __scheduler_h__
#define __scheduler_h__
/*============================ includes ======================================*/
#include ".\app_cfg.h"
#if task_scheduler == enabled
/*============================ macros ========================================*/
/*=====================......
-----------------------------------------------------------------------

是我喜欢的大牛,顶!

出0入0汤圆

发表于 2010-10-13 01:13:27 | 显示全部楼层
连个下水道都没抢上啊

出0入0汤圆

发表于 2010-10-13 01:20:55 | 显示全部楼层
v。。。。。vvvvvvvvvvvvvvvvvB?看的好别扭哦

还有大写太多,话说见到大写我的反应速度直线下降,总是不能很快的反应出这个单词的意思

出0入0汤圆

发表于 2010-10-13 01:53:26 | 显示全部楼层
你的操作系统~~~~~~

出0入0汤圆

发表于 2010-10-13 09:12:56 | 显示全部楼层
mark

出0入296汤圆

 楼主| 发表于 2010-10-13 10:01:30 | 显示全部楼层
to 【8楼】 sznetling
    这些大写是我自己OOXX得,没有说要用这个系统就一定要用这种不习惯的方式,
毕竟背后都是大家看得到的标准C语言。

to 【9楼】 jrcsh 邪恶的小会会
    这不是一个操作系统。如果你非要这么说,我只能告诉你,这是一个安装在开发
人员脑子里面的操作系统。我这是一种和操作系统背道而驰的做法。一般的操作系统
都是想简化开发人员的开发,让他们不要考虑很多任务调度的细节,每个任务都可以
while(1)——但是这对小flash,小sram的嵌入式系统来说太昂贵了,对于某些效率
优先的项目,也有可能造成冲突。我这种全体状态机的开发模式就是要求开发人员清
楚自己要做什么,然后安排好所有运行的细节,从而获得最大的系统效率。

出0入0汤圆

发表于 2010-10-13 10:05:30 | 显示全部楼层
cool

出0入0汤圆

发表于 2010-10-13 10:12:54 | 显示全部楼层
宏~~~

出0入0汤圆

发表于 2010-10-13 10:32:01 | 显示全部楼层
看不明白啊,看来俺编程功底实在是差,要补要补啊

出0入0汤圆

发表于 2010-10-13 10:35:28 | 显示全部楼层
呵呵,可以在M0的小片子上面试试看。学习了。

出0入0汤圆

发表于 2010-10-13 10:35:50 | 显示全部楼层
听课...

出0入0汤圆

发表于 2010-10-13 10:45:06 | 显示全部楼层
学习!!

出0入0汤圆

发表于 2010-10-13 10:59:11 | 显示全部楼层
不错

出0入0汤圆

发表于 2010-10-13 11:03:09 | 显示全部楼层
不得不说,用宏把C的风格变成pascal风格....实在是....古怪.....
这个具体有啥意义么?

出0入0汤圆

发表于 2010-10-13 11:11:03 | 显示全部楼层
其实这个到底怎么用的,能不能写个简单的测试例子啊?

出0入0汤圆

发表于 2010-10-13 11:29:14 | 显示全部楼层
Gorgon Meducer,
其实我个人认为,你应该写几个实用的例子来让大家更深入的了解你的ESnail Software Framework, 就像我们有很多人用UCGUI,UCOS一样,没有多少人一开始就去深入研究他的每一个函数用法,只是在调案例时,有问题才去一点点积累. 你的ESnail Software Framework留给用户应用层的1,2个文件给应用级别的人看和用,当应用到一点成度,自然会深入...

关于状态机的内容,你可以用一些状态机工具生成代码,图一个状态图出来,有兴趣的用户也方便去研究.

因为我们自己整天都泡在自已的代码中,自己看当然是一目了然. 但是给其他人用,先要用一个简单的多任务程序实例跑起来,再深入研究的.

出0入0汤圆

发表于 2010-10-13 11:32:35 | 显示全部楼层
关注

出0入0汤圆

发表于 2010-10-13 11:52:09 | 显示全部楼层
记号,待研究

出0入296汤圆

 楼主| 发表于 2010-10-13 12:06:23 | 显示全部楼层
to 【19楼】 ilovezeno2
    类pascal脚本代码是给代码生成器用的……

to 【21楼】 SystemARM
    谢谢你的建议,我准备逐步实现这些,工作量不小,不过肯定要做。这个帖子实际上就是
探探大家的兴趣和胃口……ESSF 3.x的想法我藏了很久了……还是忍不住要拿出来……虽然我
自己评估的结果是阻力很大……

出0入0汤圆

发表于 2010-10-13 12:12:55 | 显示全部楼层
不懂   看看

出0入0汤圆

发表于 2010-10-13 12:14:38 | 显示全部楼层
来个HELLO WORLD
你这个东西干什么用的,能否介绍一下。
你要先给大家扫一下盲!

出0入0汤圆

发表于 2010-10-13 12:51:31 | 显示全部楼层
为什么是英文的,老大在学托福吗,还是要变成美国人吗

出0入296汤圆

 楼主| 发表于 2010-10-13 12:58:36 | 显示全部楼层
to 【28楼】 xyang18 狗头军师
    对我来说很危险的一个问题。不敢随便回答你。应该说是在学习英文吧……
直接看代码,其实不需要什么注释。以后例子肯定是中文的。

出0入0汤圆

发表于 2010-10-13 14:17:30 | 显示全部楼层
回复【11楼】Gorgon Meducer 傻孩子
to 【8楼】 sznetling
    这些大写是我自己ooxx得,没有说要用这个系统就一定要用这种不习惯的方式,
毕竟背后都是大家看得到的标准c语言。
to 【9楼】 jrcsh 邪恶的小会会
    这不是一个操作系统。如果你非要这么说,我只能告诉你,这是一个安装在开发
人员脑子里面的操作系统。我这是一种和操作系统背道而驰的做法。一般的操作系统
都是想简化开发人员的开发,让他们不要考虑很多任务调度的细节,每个任务都可以
while(1)——但是这对小flash,小sram的嵌入式系统来说太昂贵了,对于某些效率
优先的项目,也有可能造成冲突。我这种全体状态机的开发模式就是要求开发人员清
楚自己要做什么,然后安排好所有运行的细节,从而获得最大的系统效率。
-----------------------------------------------------------------------

遥拜大牛啊

出0入4汤圆

发表于 2010-10-13 16:44:32 | 显示全部楼层
头晕呀

出0入296汤圆

 楼主| 发表于 2010-10-13 17:41:54 | 显示全部楼层
看来文档很重要……呵呵……大家看不明白是我的错……还在整理……耐心哈……

出0入264汤圆

发表于 2010-10-13 18:11:38 | 显示全部楼层
大侠。不过我看的还不是清楚。希望有简单的说明文档。

出0入0汤圆

发表于 2010-10-13 18:16:08 | 显示全部楼层
不懂   看看 :)

出0入0汤圆

发表于 2010-10-13 19:40:17 | 显示全部楼层
UML?

出0入0汤圆

发表于 2010-10-13 20:55:53 | 显示全部楼层
也看不懂,干啥用的。程序框架吧,应该不是小的OS吧

出0入0汤圆

发表于 2010-10-13 21:32:28 | 显示全部楼层
楼主写个使用手册吧?

出0入0汤圆

发表于 2010-10-13 21:52:36 | 显示全部楼层
没看懂,纯支持,呵呵

出0入0汤圆

发表于 2010-10-13 21:57:06 | 显示全部楼层
关注!

出0入0汤圆

发表于 2010-10-14 11:11:39 | 显示全部楼层
lz很牛!
但是我没看懂,代码生成器 是什么工具?是不是还要学习一下pascal语言?

出0入296汤圆

 楼主| 发表于 2010-10-14 11:31:24 | 显示全部楼层
我会写一个代码解析……大家的关注度让我很觉得很开心……我觉得应该有必要
让更多的人加入到实在的讨论中来。

出0入0汤圆

发表于 2010-10-14 17:48:21 | 显示全部楼层
Gorgon Meducer ,
你可以写一个最简单的多任务,不同优级的闪灯例子嘛!
你可以用你最熟的IDE 写,然后我可以给你改为C51,或ARM在MDK上用波形仿真,那就直观多了.
再上一些分间的图出来,然后再慢慢上状态机.....

出0入0汤圆

发表于 2010-10-14 20:53:04 | 显示全部楼层
对,用一keil 编译几个LED闪烁的最简单的例子来演示一下怎么用

出0入296汤圆

 楼主| 发表于 2010-10-14 21:55:26 | 显示全部楼层
to 【43楼】 SystemARM
    好的!我弄好了发上来。最近有点忙,抽空做吧,

出0入0汤圆

发表于 2010-10-14 22:52:17 | 显示全部楼层
回复【1楼】Gorgon Meducer 傻孩子
-----------------------------------------------------------------------

好东西,学习一下。

出0入0汤圆

发表于 2010-10-15 09:14:23 | 显示全部楼层
等待中。。。。。。。。。。

出0入0汤圆

发表于 2010-10-15 09:59:12 | 显示全部楼层
顶了...

出0入0汤圆

发表于 2010-10-15 13:25:05 | 显示全部楼层
很感兴趣:  状态机。

出0入0汤圆

发表于 2010-10-18 09:53:44 | 显示全部楼层
有空研究下 ~~~~~~

出0入0汤圆

发表于 2010-10-18 12:33:09 | 显示全部楼层
暂时看不懂    帮顶

出0入0汤圆

发表于 2010-10-18 13:42:18 | 显示全部楼层
支持适用小rom小ram MCU的准OS

出0入0汤圆

发表于 2010-10-18 13:46:27 | 显示全部楼层
为什么把c转成其它语言用啊

出0入296汤圆

 楼主| 发表于 2010-10-18 20:01:28 | 显示全部楼层
一种尝试……主要是想做一个和具体编译语言无关的脚本语言……现在看来,可能有简化的需要……

出0入0汤圆

发表于 2010-10-20 08:56:07 | 显示全部楼层
等待应用例子

出0入0汤圆

发表于 2010-11-2 22:05:41 | 显示全部楼层
继续等待实例

   继续帮顶

出0入0汤圆

发表于 2010-11-3 01:34:38 | 显示全部楼层
刚发现你这个项目,看起来很不错.
大半年前我也想研究纯状态机自动生成代码,并且在一个项目上面应用了.但是效果不是很好,总的来说还是不习惯,觉得直接改代码更快.

我是用smart state(http://www.smartstatestudio.com/)编辑状态图.
自己写了一个解释器,直接解释他的状态图文件,生成源代码(*.h).
用户再根据自己的需求,填写细节代码(*.c).
支持多层状态机,不同层之间直接跳转.

另外我还有一个方法,已经用一两年.
通过xml编写状态图,描述ui布局,窗体流程,事件跳转
写一个解释器,将xml生成代码(*.h)
用户填细节代码(*.c)

相比xml架构不错,看xml文件就能迅速了解项目概况,现在还一直在产品上使用.不过树状的xml还是不如图形界面友好.
改天仔细研读你的成果.

出95入100汤圆

发表于 2010-11-3 09:37:20 | 显示全部楼层
mark 傻孩子的小系统

出0入296汤圆

 楼主| 发表于 2010-11-3 10:45:42 | 显示全部楼层
to 【58楼】 skyler
    看来可以一起合作?IDE部分我原本准备用xml存储状态机,使用图形化界面来进行开发
——简单来说就是画好状态图,双击状态,弹出代码框填写代码……和VB类似。
    刚才看了一下那个smart state,感觉做得还只是停留在状态机本身,没有处理好虑资源
的问题,应该可以作为很好的参考,然后走得更远,这应该也是制约他没有更大规模被应用的
原因。另外,操作习惯上,他还是很具有亲和力……貌似他用的也是Visual Studio Shell?
嘿嘿,我也准备用这个平台,可以省很多力气……和它不同,我不准备收费……做成一个完全
开源的系统。

出0入0汤圆

发表于 2010-11-3 12:22:49 | 显示全部楼层
回复【60楼】Gorgon Meducer 傻孩子
-----------------------------------------------------------------------
Gorgon Meducer,

都在说什么,我想看懂, 请问需要看哪些书呢?推荐下

出0入0汤圆

发表于 2010-11-4 22:09:08 | 显示全部楼层
可以考虑啊,不过我最近没什么时间。在做调试器,等做完了再去想这个吧。

我的出发点是内核复杂一些也没关系,但用户(程序员)接口一定要友好,
第三者只要看流程图就可以知道整个项目的脉络。
还有一点,我坚持自动生成的代码(*.h)与用户编写的代码(*.c)分离,这样开
发时修改流程图,重新生成机器代码,也不影响用户原来写的代码。如果二者
在同一个文件里,用起来就很不方便了。

你上面的例子,如果需要用户手工编写这样的脚本,我觉得不好,因为要去
重新学习一门新的语言或掌握新的规则。不赞成这样的模式。

ps:你就职于atmel公司吗?

出0入0汤圆

发表于 2010-11-5 16:48:49 | 显示全部楼层
好!

出0入296汤圆

 楼主| 发表于 2010-11-5 17:16:09 | 显示全部楼层
to 【62楼】 skyler
    手工编写脚本还不是因为缺少IDE……我是在Atmel工作。

出0入0汤圆

发表于 2010-11-25 12:34:26 | 显示全部楼层
Gorgon Meducer ,给一个免费的IDE给你,有部分可以与你的语法兼容. 不知对你有没有帮助.
还有例子代码.
主页在: http://www.plcedit.org/

(原文件名:PLCEdit.PNG)


(原文件名:page0_1.png)

点击此处下载 ourdev_600349B6Z3EV.rar(文件大小:4.01M) (原文件名:PLCEdit.rar)

出0入296汤圆

 楼主| 发表于 2010-11-25 17:11:27 | 显示全部楼层
to 【65楼】 SystemARM
    谢谢你,这是类PASCAL语言。最近这个项目正在严格测试中。到时候会有完整的Framework发布出来。

出0入264汤圆

发表于 2010-11-25 18:06:31 | 显示全部楼层
期待傻孩子大侠

出0入0汤圆

发表于 2010-12-4 00:18:54 | 显示全部楼层
这是个OS嘛?还是什么,不太明白

出0入0汤圆

发表于 2011-1-16 20:18:28 | 显示全部楼层
回复【11楼】Gorgon Meducer  傻孩子

    这不是一个操作系统。如果你非要这么说,我只能告诉你,这是一个安装在开发
人员脑子里面的操作系统。我这是一种和操作系统背道而驰的做法。一般的操作系统
都是想简化开发人员的开发,让他们不要考虑很多任务调度的细节,每个任务都可以
while(1)——但是这对小flash,小sram的嵌入式系统来说太昂贵了,对于某些效率
优先的项目,也有可能造成冲突。我这种全体状态机的开发模式就是要求开发人员清
楚自己要做什么,然后安排好所有运行的细节,从而获得最大的系统效率。
-----------------------------------------------------------------------

又懂了一些,谢谢傻孩子

出0入0汤圆

发表于 2011-1-16 22:09:04 | 显示全部楼层
谢谢傻孩子提供的开源代码,正在读代码,还不太明白,希望能够编写一个使用手册之类的文档。

出0入0汤圆

发表于 2011-1-16 22:17:14 | 显示全部楼层
压缩包里好像缺少一个stdafx.h的头文件,请问是标准的VC里的stdafx.h么?

出0入296汤圆

 楼主| 发表于 2011-1-19 13:11:11 | 显示全部楼层
to 【71楼】 admvip
    把顶层app_cfg.h下#include "utilities\stdafx.h"屏蔽掉。

出0入0汤圆

发表于 2011-1-19 13:28:49 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-4-5 22:24:50 | 显示全部楼层
收藏啦

出0入296汤圆

 楼主| 发表于 2011-4-11 11:02:20 | 显示全部楼层
- Update new vertion ESSF 3.0 beta1   
        a. 增加了FSM引擎对EVENT的支持
        b. 增加了FSM对休眠的支持
        c. 修正了一些BUG

点击此处下载ESSF3.0 源代码 beta1 ourdev_629937IIM7Z0.rar(文件大小:80K)

出0入0汤圆

发表于 2011-4-11 12:17:49 | 显示全部楼层
回复【75楼】Gorgon Meducer 傻孩子
-----------------------------------------------------------------------

傻哥 附件挂了

出0入296汤圆

 楼主| 发表于 2011-4-11 13:23:48 | 显示全部楼层
貌似是下载服务器的问题?

出0入0汤圆

发表于 2011-4-11 14:16:03 | 显示全部楼层
听课,学习中...

出50入0汤圆

发表于 2011-4-11 15:48:08 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-4-11 16:10:26 | 显示全部楼层
听课

出0入0汤圆

发表于 2011-4-13 21:49:14 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-4-26 11:09:01 | 显示全部楼层
mark, 全状态机开发。

出0入0汤圆

发表于 2011-4-26 12:03:30 | 显示全部楼层
找空瞧瞧.

出0入0汤圆

发表于 2011-5-13 13:38:24 | 显示全部楼层
能给个ESSF3的小实例吗?谢谢傻孩子

出0入296汤圆

 楼主| 发表于 2011-7-26 11:49:14 | 显示全部楼层

aes_fsm.c

#include "app_cfg.h"
#include "..\..\hal\hal.h"
#include "..\..\service\service.h"

#define AES_SUCCESS             (0x0001u)
#define AES_ON_GOING            (0x0000u)
#define AES_ILLEGAL_PARAMTER    (0xFFFFu)


DEF_ARG(AES_Encryption)
    uint32_t        wHandle;
    uint16_t        hwResult;
    uint16_t        hwKey;
    uint32_t        wOffset;
    uint32_t        wSize;
    uint8_t        *pchStream;
    AES_KEY_FRAME   chKey;
    AES_DATA_FRAME  chDataMask;
END_DEF_ARG

DECLARE
   
    PUBLIC      STATE( AES_Initialize );
    PUBLIC      STATE( Load_AES_Key );
    PUBLIC      STATE( Start_AES_Encrypt );
    PRIVATE     STATE( AES_Encrypt_Init );
    PRIVATE     STATE( AES_Encrypt );
END_DECLARE

    PUBLIC STATE( AES_Initialize ) BEGIN
   
        do {
            if (!CHECK_ARG(AES_Encryption)) {
                break;
            }
            
            //! load first aes key
            do {
                uint32_t n = AES_KEY_SIZE;
                AES_KEY_FRAME chKeyMask = {<...你自己的mask>};

                uint8_t *pchKey = REF_ARG(AES_Encryption).chKey;
                uint8_t *pchMask = chKeyMask;
                reset_random();
                set_random_seed(REF_ARG(AES_Encryption).hwKey);

                do {
                    *pchKey++ = *pchMask++ ^ get_random_u8();
                } while(--n);
            } while(false);

            //! load datamask
            do {
                uint32_t n = AES_BLOCK_SIZE;
                AES_DATA_FRAME chDataMask = {<你自己的mask>};
                uint8_t *pchData = REF_ARG(AES_Encryption).chDataMask;
                uint8_t *pchMask = chDataMask;
                do {
                    *pchData++ = *pchMask++ ^ get_random_u8();
                } while(--n);

            } while(false);
            
        } while(false);

        EXIT_STATE;
    END
   

    PUBLIC STATE( Load_AES_Key ) BEGIN
        
        do {
            if (!CHECK_ARG(AES_Encryption)) {
                break;
            }
            uint8_t *pchKey = REF_ARG(AES_Encryption).chKey;
            uint32_t n = AES_KEY_SIZE;
            do {
                *pchKey++ ^= get_random_u8();
            } while(--n);

        } while(false);

        EXIT_STATE;
    END


    PUBLIC STATE(Start_AES_Encrypt) BEGIN
        
        do {
            //! check parameter
            if (!CHECK_ARG(AES_Encryption)) {
                break;
            }else if (NULL == REF_ARG(AES_Encryption).wHandle) {
                REF_ARG(AES_Encryption).hwResult = AES_ILLEGAL_PARAMTER;
                break;
            } else if (0 == REF_ARG(AES_Encryption).wSize) {
                REF_ARG(AES_Encryption).hwResult = AES_ILLEGAL_PARAMTER;
                break;
            } else if (REF_ARG(AES_Encryption).wSize % AES_BLOCK_SIZE) {
                REF_ARG(AES_Encryption).hwResult = AES_ILLEGAL_PARAMTER;
                break;
            }else if (NULL == REF_ARG(AES_Encryption).pchStream) {
                REF_ARG(AES_Encryption).hwResult = AES_ILLEGAL_PARAMTER;
                break;
            }
            
            
            REF_ARG(AES_Encryption).wOffset = 0;
            REF_ARG(AES_Encryption).hwResult = AES_ON_GOING;

            CALL_FSM_EX( REF_STATE(AES_Initialize), pArg, REF_STATE(AES_Encrypt_Init), pArg);

        }while(false);
        

        EXIT_STATE;
    END

    PRIVATE STATE( AES_Encrypt_Init ) BEGIN
        
        CALL_FSM_EX( REF_STATE(Load_AES_Key), pArg, REF_STATE(AES_Encrypt), pArg);

        EXIT_STATE;
    END

    PRIVATE STATE( AES_Encrypt ) BEGIN
        
        uint32_t wOffset = REF_ARG(AES_Encryption).wOffset;
        uint8_t *pchStream = REF_ARG(AES_Encryption).pchStream;
        uint8_t *pchMask = REF_ARG(AES_Encryption).chDataMask;
        uint32_t n = AES_BLOCK_SIZE;

        pchStream += wOffset;

        //! encrypt
        AES_PrepareEncrypt(REF_ARG(AES_Encryption).chKey);
        do {
            AES_KEY_FRAME tKey;
            memcpy(tKey,REF_ARG(AES_Encryption).chKey,sizeof(AES_KEY_FRAME));
            AES_Encrypt(pchStream,tKey);
        } while(false);
        
        do {
            *pchStream ^= *pchMask;
            *pchMask++ = *pchStream++;
        } while(--n);
        
        wOffset += AES_BLOCK_SIZE;
        if (wOffset >= REF_ARG(AES_Encryption).wSize) {
            //! complete
            REF_ARG(AES_Encryption).hwResult = AES_SUCCESS;
        } else {
            CALL_FSM_EX( REF_STATE( Load_AES_Key ), pArg, REF_STATE( AES_Encrypt ), pArg );
        }

        REF_ARG(AES_Encryption).wOffset = wOffset;
        
        EXIT_STATE;
    END

    PUBLIC STATE( AES_Decrypt ) BEGIN
        
        uint32_t wOffset = REF_ARG(AES_Encryption).wOffset;
        uint8_t *pchStream = REF_ARG(AES_Encryption).pchStream + wOffset;
        uint8_t *pchMask = REF_ARG(AES_Encryption).chDataMask;
        uint32_t n = AES_BLOCK_SIZE;

        #if DEBUG_LEVEL >= 4 && (DEBUG_FW_DECRYPTION == ENABLED || DEBUG_FW_ENCRYPTION == ENABLED)
            DEBUG_LOG_STR("AES Decrypt.\r\n Offset:");        
            DEBUG_LOG_HEX(wOffset);
            DEBUG_LOG_STR("\r\n");
            #if DEBUG_LEVEL >= 4 && (DEBUG_FW_DECRYPTION == ENABLED || DEBUG_FW_ENCRYPTION == ENABLED)
                DEBUG_LOG_STR("From: ");
            #endif
        #endif

        //! encrypt
        do {
            uint8_t chTemp = *pchMask;
            *pchMask++ = *pchStream;
        #if DEBUG_LEVEL >= 5 && (DEBUG_FW_DECRYPTION == ENABLED || DEBUG_FW_ENCRYPTION == ENABLED)   
            DEBUG_LOG_HEX((*pchStream));
            DEBUG_LOG_STR(" ");
        #endif
            *pchStream++ ^= chTemp;
        } while(--n);
        
        #if DEBUG_LEVEL >= 5 && (DEBUG_FW_DECRYPTION == ENABLED || DEBUG_FW_ENCRYPTION == ENABLED)
            DEBUG_LOG_STR("\r\n");
        #endif
        
        pchStream = REF_ARG(AES_Encryption).pchStream + wOffset;
        
        AES_PrepareDecrypt(REF_ARG(AES_Encryption).chKey);
        AES_Decrypt(pchStream,REF_ARG(AES_Encryption).chKey);

        #if DEBUG_LEVEL >= 5 && (DEBUG_FW_DECRYPTION == ENABLED || DEBUG_FW_ENCRYPTION == ENABLED)
        n = AES_BLOCK_SIZE;
        DEBUG_LOG_STR(" To: ");
        do {
        
            DEBUG_LOG_HEX((*pchStream));
            DEBUG_LOG_STR(" ");
            pchStream++;
        } while(--n);
        DEBUG_LOG_STR("\r\n\r\n");
        #endif

        wOffset += AES_BLOCK_SIZE;
        if (wOffset >= REF_ARG(AES_Encryption).wSize) {
        #if DEBUG_LEVEL >= 4 && (DEBUG_FW_DECRYPTION == ENABLED || DEBUG_FW_ENCRYPTION == ENABLED)
            DEBUG_LOG_STR("Decrypt AES Data Block Complete.\r\n\r\n");
        #endif
            
            //! complete
            REF_ARG(AES_Encryption).hwResult = AES_SUCCESS;

        } else {
            //! on going...
            REF_ARG(AES_Encryption).hwResult = AES_ON_GOING;
        }

        REF_ARG(AES_Encryption).wOffset = wOffset;
   
        EXIT_STATE;
    END


<font color=blue>aes_fsm.h
<font color=brown>
#ifndef __USE_AES_FSM_CFG_H__
#define __USE_AES_FSM_CFG_H__

#include "app_cfg.h"

#define AES_SUCCESS             (0x0001u)
#define AES_ON_GOING            (0x0000u)
#define AES_ILLEGAL_PARAMTER    (0xFFFFu)

DEF_ARG(AES_Encryption)
    uint32_t        wHandle;
    uint16_t        hwResult;
    uint16_t        hwKey;
    uint32_t        wOffset;
    uint32_t        wSize;
    uint8_t        *pchStream;
    AES_KEY_FRAME   chKey;
    AES_DATA_FRAME  chDataMask;
END_DEF_ARG

EXTERN_STATE( Start_AES_Encrypt );
EXTERN_STATE( AES_Initialize );
EXTERN_STATE( Load_AES_Key );
EXTERN_STATE( AES_Decrypt );

#endif

出0入0汤圆

发表于 2011-11-13 00:10:31 | 显示全部楼层
MARK

出0入296汤圆

 楼主| 发表于 2011-11-14 13:42:23 | 显示全部楼层
- beta3
        a. 修正了选择单任务队列的情况下函数_register_task()缺失返回值的错误。         
        b. 删除了不必要的宏
        c. 使用新的状态返回类型vsf_fsm_rt_t
        d. 加入了License.

出75入4汤圆

发表于 2011-12-19 21:43:17 | 显示全部楼层
是不是要加点说明,注释啥的。光看代码头晕。

出0入296汤圆

 楼主| 发表于 2012-10-23 18:33:35 | 显示全部楼层
[10-23-2012]
- Beta 4
    - New Features
        a. Add support for thread synchronization.
            i. Support Event
           ii. Support Critical Section.
        b. Use optimized interface standard of Versaloon Software
           Framework for HAL.
    - Other
        a. Migerate ESSF into VSF.

出0入0汤圆

发表于 2012-10-30 15:33:03 | 显示全部楼层
标记, 傻孩子ESSF,听课.........

出0入296汤圆

 楼主| 发表于 2012-11-2 18:35:47 | 显示全部楼层
本帖最后由 Gorgon_Meducer 于 2012-11-2 18:40 编辑


[更新日至]

    - Update new version VSF(ESSF) 3.x beta4a
        a. 修正了临界区的bug
        b. 简化了系统,删除了SAFE_TASK_ARG
        c. 加入了演示状态机范例代码
         1) 普通的静态状态机——闪烁的LED
         2) 子状态机的调用——字符串打印
         3) 临界区的建立——字符串打印
         4) 互斥——温度显示和Demo字符串显示的互斥

出0入296汤圆

 楼主| 发表于 2012-11-5 14:13:03 | 显示全部楼层

[更新日至]

    - Update new version VSF(ESSF) 3.x beta4b
        a. 优化了调度函数结构,提高了调度效率。

出0入76汤圆

发表于 2012-11-10 15:36:17 | 显示全部楼层
Gorgon_Meducer  大侠:
牛人作品,不同凡响.....  膜拜....
感觉有些复杂, 有没有说明文档? 大侠能不能讲解些原理性的东西, 普及吾等小白....

出0入296汤圆

 楼主| 发表于 2012-11-10 21:28:38 | 显示全部楼层
foxpro2005 发表于 2012-11-10 15:36
Gorgon_Meducer  大侠:
牛人作品,不同凡响.....  膜拜....
感觉有些复杂, 有没有说明文档? 大侠能不能 ...

原理解析看这个链接,注意61楼
http://www.amobbs.com/forum.php? ... p;page=2&extra=

虽然最终实现有很多性能上的改进,但基本思想是可以互通的。

出0入0汤圆

发表于 2012-11-16 01:11:57 | 显示全部楼层
Gorgon_Meducer 发表于 2012-11-10 21:28
原理解析看这个链接,注意61楼
http://www.amobbs.com/forum.php? ... &page=2&ext ...


直接看这里吧。

新版论坛中帖子的楼层号是可以点击的,点击后直接获得通往该楼层的超链接:

本帖子中包含更多资源

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

x

出0入296汤圆

 楼主| 发表于 2012-11-16 10:08:27 | 显示全部楼层
eduhf_123 发表于 2012-11-16 01:11
直接看这里吧。

新版论坛中帖子的楼层号是可以点击的,点击后直接获得通往该楼层的超链接: ...

多谢指点~

出0入0汤圆

发表于 2012-11-16 11:13:49 | 显示全部楼层
Gorgon_Meducer 发表于 2012-11-16 10:08
多谢指点~

不客气哈~!

出0入0汤圆

发表于 2012-11-16 11:22:01 | 显示全部楼层
看看

出0入0汤圆

发表于 2013-1-9 11:50:35 | 显示全部楼层
LZ,帅气,学习中。。。

出0入0汤圆

发表于 2013-1-13 16:19:26 | 显示全部楼层
楼主好人啊,跟着学习中

出0入0汤圆

发表于 2013-1-20 14:58:13 | 显示全部楼层
LZ辛苦了,其实强大的注释会对版本后期的管理与升级起相当大作用,即使你今天把A代码用很熟,如果5年后再把A代码拿出来,你还会在很短时间内把它看懂并加以实用吗??

出0入0汤圆

发表于 2013-2-21 22:17:22 | 显示全部楼层
完全看的头疼啊。。。这个调度器是时间触发的么??  现在只能稍微看懂那本《时间触发嵌入式系统模式》。。。想问下傻孩子,把状态机这种思想应用到我们的程序当中??应该怎么从零开始呢?先学面对象,然后再看那本《Object-oriented programming with ANSI-C》,再到自动机原理什么的??有什么好的学习方法可以借鉴借鉴,或者书籍推荐??

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-3-29 17:52

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

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