查看: 3559|回复: 4

【SAM-4S Xplained手记】陀螺停下来,BF醒来吧!

  [复制链接]
  • TA的每日心情
    郁闷
    2024-10-28 10:11
  • 签到天数: 1703 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2013-2-6 18:38:23 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 nemon 于 2013-3-8 19:44 编辑

    12840864197726945.jpg


      电影《盗梦空间》就像在玩一个入栈出栈的头脑游戏,莱昂纳多·迪卡普里奥饰演的多姆·柯布潜入别人梦中,一层层深入又突然跳出,观众要没点儿FILO的意识还真就乱了。然而影片结尾那只用来进行测试的陀螺仍旧在旋转,留给我们专业挨踢人士一个问题——影片开始的时候是栈底吗?
      电影中的柯布到底是否还在做梦我确实有点晕,不过之前实现的BF语言的解释器倒是可以肯定还在做梦——只能进行内部运算,没法与其它硬件进行互动。为了解决这个问题,看来一定要深入到SAM-4S Xplained的bf梦境中,把它带出来。过程很简单看下去就知道了。
      首先要解决如何给bf解释器增加扩展的问题。如果直接修改bf,虽然可以完成功能,但是与基于板子的功能过紧的耦合会使移植变得非常麻烦,因此要尽量将处理逻辑放在现有的bf逻辑之外。在bf处理逻辑的最后,有一个什么都不干的“default:”,用来忽略掉不能解释的字符,在这里加一个事件是符合前面的要求的。同时还要修改一些头定义和函数定义。
    头文件增加:
    1. typedef unsigned char(*FB_USER_CHAR)(char c,unsigned char m);
    2. #define FUNC_FB_USER_CHAR(funcname) char funcname(char c,unsigned char m)
    复制代码
    修改BrainFuckInterpret的定义:
    1. void BrainFuckInterpret(unsigned char *pc_CmdLine,unsigned char *pc_Memory,FB_OUT_CHAR out_char, FB_GET_CHAR get_char,FB_USER_CHAR user_char)
    复制代码
    修改bf逻辑:
    1.         default:
    2.                         (*pc_PM)=user_char(*pc_PC,*pc_PM);
    3.                         pc_PC++;
    4.                         break;
    复制代码
    然后,增加处理一个用户扩展字符的过程:
    1. //处理一个用户扩展字符
    2. FUNC_FB_USER_CHAR(console_user_char)
    3. {
    4.         unsigned char uc_m;
    5.         uc_m=m;
    6.         switch(c)
    7.         {
    8.                 case 'A':
    9.                         if(uc_m)
    10.                         {
    11.                                 gpio_set_pin_high(LED1_GPIO);
    12.                         }
    13.                         else
    14.                         {
    15.                                 gpio_set_pin_low(LED1_GPIO);
    16.                         }
    17.                         break;
    18.                 case 'B':
    19.                         if(uc_m)
    20.                         {
    21.                                 gpio_set_pin_high(LED0_GPIO);
    22.                         }
    23.                         else
    24.                         {
    25.                                 gpio_set_pin_low(LED0_GPIO);
    26.                         }
    27.                         break;
    28.                 case '=':
    29.                         if(uc_m)
    30.                         {
    31.                                 delay_ms(uc_m);
    32.                         }
    33.                         break;
    34.                 default:
    35.                         NULL;
    36.         }
    37.         return uc_m;
    38. }
    复制代码
    可以看出以上的逻辑定义了3个与板子功能相关的功能:
    1】如果bf遇到了“A”则根据当前指针指向的内存值决定是否点亮LED1_GPIO;
    2】如果bf遇到了“B”则根据当前指针指向的内存值决定是否点亮LED0_GPIO;
    3】如果bf遇到了“=”则根据当前指针指向的内存值决定delay多少毫秒;
    下面是为新的功能编写的bf程序:
    1. >+[
    2.         >[-]A
    3.                 >[-]+B
    4.                         >++++++++++[
    5.                                 >++++++++++[
    6.                                         >++++++++++[
    7.                                                 >+
    8.                                         <-
    9.                                         ]
    10.                                 <-
    11.                                 ]
    12.                         <-
    13.                         ]
    14.                 <
    15.                         >
    16.                                 >
    17.                                         >
    18.                                                 >=
    19.                                         <
    20.                                 <
    21.                         <
    22.                 <
    23.         <
    24. <
    25.         >[-]+A
    26.                 >[-]B
    27.                         >++++++++++[
    28.                                 >++++++++++[
    29.                                         >++++++++++[
    30.                                                 >+
    31.                                         <-
    32.                                         ]
    33.                                 <-
    34.                                 ]
    35.                         <-
    36.                         ]
    37.                 <
    38.                         >
    39.                                 >
    40.                                         >
    41.                                                 >=
    42.                                         <
    43.                                 <
    44.                         <
    45.                 <
    46.         <
    47. <
    48. ]
    49. .
    50. ;
    复制代码
    当然运行时最好压缩成一行,老规矩,以@结尾:
    1. >+[>[-]A>[-]+B>++++++++++[>++++++++++[>++++++++++[>+<-]<-]<-]<>>>>=<<<<<<>[-]+A>[-]B>++++++++++[>++++++++++[>++++++++++[>+<-]<-]<-]<>>>>=<<<<<<].@
    复制代码
    好了,白话了这么多,看实效啦:














    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2014-7-16 09:10
  • 签到天数: 361 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2013-2-7 11:26:06 | 显示全部楼层
    我来了,呵呵呵呵{:soso_e181:}
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2018-8-29 20:40
  • 签到天数: 1341 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2013-2-9 17:08:54 | 显示全部楼层
    强悍 呵呵
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-5-12 10:32
  • 签到天数: 295 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2013-11-30 08:14:24 | 显示全部楼层
    赞一个~~~~~~~~~~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2015-1-22 18:04
  • 签到天数: 189 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2013-12-29 17:44:04 | 显示全部楼层
    版主的徽章真心多
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /5 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-12-21 16:31 , Processed in 0.141495 second(s), 23 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.