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