数据结构之迷宫求解

为了找工作,最近看了一段时间的数据结构,看得头昏脑涨,二叉树的递归遍历与查找,递归来递归去都给递归晕了,函数指针,指向指针的指针,指来指去,已经指向云彩里了。往往一个小问题都需要纠结好久,花费几十分钟乃至几个小时的时间,真有点感觉自己不适合搞程序设计,心中万分失落。哎,想要混一口饭吃真不容易,但是除了这些真不知道还能干些什么。

在学习数据结构的过程中发现在面对一个问题,自己的思路不清,缺少归纳,往往想出一个大致方法,就急于去用程序求解,具体实现的时候上发现犯了很多错误乃至于进入死胡同。没办法学习总归还是要去学习,习惯也要慢慢去培养。虽然学习的过程中有纠结,有痛苦,但是也会有一些有趣的东西,或者解决出某一个问题的成就感(虽然不值得一提)。不管怎样,只要每天都在进步,这样也就够了。

在学习数据结构时,遇到一个迷宫求解的例题,感觉比较有趣,写出记录一些,就当作是对痛苦的学习过程的一种纪念吧。

迷宫求解

迷宫求解

求解方法:

  1. 判断当前位置是否可通,即该位置不为墙,也不是已走过的方块
  2. 若当前位置可通,位置加入路径堆栈,留下脚印,寻找下一个相邻的方块
  3. 寻找下一个相邻方块的方法:先向东寻找,若东边相邻方块不可通,顺时针方向继续寻找,寻找到相邻可通方块后,此相邻方块设为当前位置。若东西南北方相邻方块均不可通,则设置当前位置为不可通,并从路径堆栈中删除该方块,然后获取路径中最后一个方块为当前位置(即后退一步)。
  4. 若当前位置不可通,则寻找相邻为位置是否可通(寻找方法同3)。相邻位置可通,则该相邻位置设为当前位置;相邻位置均不可通,则该位置从路径堆栈中删除,获取路径中最后一个方块为当前位置(即后退一步)。
  5. 重复以上步骤,直至找到出口或者路径堆栈为空,且起始点不可通(未找到出口)。

迷宫求解代码:

基于FPGA的SRAM设计

一、不利用FPGA内部存储单元,只利用VerilogHDL硬件描述语言来设计。

分为两个部分,SRAM内核,SRAM接口。SRAM接口利用三态门使数据口具有双向(输入\输出)功能。RTL结构如下:

RTL

altera_reports

SRAM内核代码:

 

SRAM接口代码:

SRAM顶层代码:

 

modelsim仿真程序:

用modelsim仿真如下:

modelsim

二、利用VerilogHDL,调用FPGA内部存储单元

altera 内部存储单元需要时钟来驱动,但是异步sram是没有时钟的,只需把时钟接在锁相环上,利用晶振来驱动即可。sram顶层bdf图如下所示:

sram2

altera_reports2

sram内核代码:

sram接口代码:

modelsim仿真程序:

modelsim仿真结果:

(将顶层文件生成HDL语言文件后,在工程中移除bdf文件,并添加生成的HDL文件后才可仿真)

modelsim2

利用ARM测试:

综合后,连接上LPC1788 EMC(外部存储器控制器)接口上,经过测试可以正常读写。

嵌入式格式化输出

在C语言中,一般用printf进行格式化输出。但是在ARM使用标准C库时,printf一般用于半主机模式(semihosting)的输出。可以对printf进行重定向,但是要求使用microlib。在使用microlib时,利用printf进行输出,会优先调用用户自定义的函数fputc,所以对fputc进行重写既可以完成printf的重定向。在标准C库下,如果取消半主机模式,也可以通过定义fputc实现对printf的重定向。

除此之外,还可以自己编写格式化输出函数,实现格式化的输出。

一、使用microlib,对printf重定向

只需重写fputc,并勾选microlib即可。

二、使用标准C库,对printf进行重定向

取消半主机模式

重写fputc函数

 

三、自己编写格式化输出函数

 

自己编写格式化输出,另外一种简单的办法

基于uC/OS-II与LwIP的WEB服务器搭建

拿到新唐公司送的NUC472开发板已经有一段时间了,主要学习了一下以太网。毕业课题,准备找工作。。。时间有限,对NUC472开发板就到处为止吧。

以前总是想学习一下以太网,但是一直没有付诸行动。新唐公司的NUC472开发板恰好带有以太网接口,并且外置了以太网PHY,终于下定决心学习一下以太网。

先是了解了下以太网的几种基本的协议,以及大多芯片上采用的MII和RMII接口,最后做了UDP和TCP通信实验,最后搭建了动态的http服务器。

自己在NUC472上编写了服务器端的SSI和CGI。CGI用于处理网页提交的GET方法,SSI用于服务器端对网页的处理,主页是把设置的标签替换成所要在web页面上显示的数据。

web目录结构如下:.

                                ./index.shtml

                                ./404.html

                                ./cgi_respond.shtml

                                ./image/mytown.jpg

                                ./image/favicon.ico

页面主要有以下特点:

  • 页面无刷新,动态获取服务器数据,动态显示uC/OS-II系统时钟及LED闪烁状态
  • 页面无刷新,设置并控制NUC472开发板LED闪烁周期

http1http2

nuc472

收到新唐NUC472开发板

四月份从大学同学那里得到消息,参加新唐网络研讨会,可以免费获得新唐的开发板。这也是新唐推销自己产品的一种手段吧。于是,就去参加了一下。其实就是看看在线视频,里面讲解了一下新唐最新产品的功能和特点,以及应用。五月份收到开发板确认邮件,到昨天才拿到手。真实够慢的,不过也无所谓,毕竟是免费的东西,也应该知足了。五月份又参加了新唐的一个网络研讨会,也已经收到确认邮件,不知何时才能收到板子。 NUC472是ARMv7版本的Cortex M4构建的芯片,据说比M3增加了浮点数运算单元。一直用的时M3内核的ARM,M4还没用过,有时间好好学习一下。
新唐开发板