多单位寻路算法,寻找最优解

摘要: 对于单个单位的寻路可以使用A*算法。但是在实际应用中往往出现多个单位同时移动的场面,而且它们会互相影响,阻碍对方的移动。所以一旦冲突,之前为每个单位计算出的路径就会失效。一种流行的解决方法是发现冲突的时候重新计算路径。还有定期重新计算的等等。这些都是动态调整的方案,最后形成的路径并非是最优的。虽然这... 阅读全文
posted @ 2015-05-27 17:45 silmerusse 阅读(1004) 评论(0) 推荐(0) 编辑

寻路算法A*, JPS(跳点搜索)的一些杂谈

摘要: A*是一个比较经典的启发式寻路算法。是基于dijkstra算法,但是加入了启发函数,使路径搜索效率更高。实现起来很简单。不过要做到通用性高,比如支持各种不同类型的地图,甚至不仅仅是地图,而是个图结构如解决拼图游戏N-puzzle会用到的,就需要多花点心思。用C++实现的话,可以使用模板来适应不同的需... 阅读全文
posted @ 2014-09-15 18:05 silmerusse 阅读(3698) 评论(0) 推荐(0) 编辑

编写和运行简单的"Hello World"操作系统内核

摘要: 通常编写一个操作系统内核是一项浩大的工程。但我今天的目标是制作一个简单的内核,用比较方便的方法在虚拟机上验证它能够被grub装载和运行,并且可通过gdb进行调试,为接下去的工作创造一个基础环境。首先,为了方便运行和调试我们需要一个虚拟机。虚拟机有很多选择,这里用最简单的qemu。先用dd创建一个文件作为虚拟盘,100MB就可以了:$ dd if=/dev/zero of=disk.img count=204800 bs=512然后对这个虚拟磁盘进行分区:$ fdisk -c=dos disk.img用命令n创建一个分区就可以了。通常情况下分区的起始扇区是2048(不带选项-c=dos),如果用 阅读全文
posted @ 2014-02-15 00:36 silmerusse 阅读(1626) 评论(0) 推荐(2) 编辑

GRUB2 分析 (四)

摘要: 接上一篇kernel.img由startup.S以及一堆c文件编译而成。这是一个ELF格式的文件。(其实前面的boot.img、 diskboot.img、lzma_decompress.img本来也都是ELF格式文件,但是经过了精简。)kernel.img链接时,目标装载地址是0x9000,这是在Makefile.core.dep中定义的:i386_pc_ldflags= '$(TARGET_IMG_BASE_LDOPT),0x9000';但是现在kernel.img被加载到了0x100000,startup.S里的代码开始执行。所以开头的几个指令首先是把startup_ra 阅读全文
posted @ 2014-01-30 08:39 silmerusse 阅读(1288) 评论(5) 推荐(1) 编辑

GRUB2 分析 (三)

摘要: 接上一篇从地址0x8200开始的是lzma_decompress.img。这是由startup_raw.S编译生成的。这个文件稍微复杂点。首先一开始就是个跳转指令:ljmp $0, $ABS(LOCAL (codestart)) /* 机器码:ea 1c 82 */ 跳转到0x821c,这里是真正的开始代码。0x8203到0x821b之间存放的是一些特殊数据,如压缩数据前后的长度、冗余数据的长度等,由GRUB安装时填写,后面会用到。接下来设置实模式堆栈后,切换到保护模式:DATA32 call real_to_prot然后打开Gate A20,即第21根地址线的控制线: call grub_g 阅读全文
posted @ 2014-01-29 14:58 silmerusse 阅读(1068) 评论(0) 推荐(0) 编辑

GRUB2 分析 (二)

摘要: 接上一篇实际上在512字节的MBR中,真正可用的空间并不多。除了一开始的跳转指令外,起始部分是一个被称为BPB的区域,即BIOS参数块(BISO Parameter Block)。主要是FAT和NTFS文件系统会使用这块区域。所以GRUB在安装时会避开BPB,这也是为什么一开始就跳转到偏移量0x65处,这里才是真正的开始代码。而MBR被装载到内存中后,BPB对应的内存区域就被GRUB利用来存放DAP,即磁盘地址数据包(Disk Address Packet),用于提供参数给BIOS中断0x13来读取磁盘数据。boot.S完成了对1号扇区的装载。而1号扇区安装的是bootdisk.img,也是正 阅读全文
posted @ 2014-01-29 12:27 silmerusse 阅读(1014) 评论(0) 推荐(0) 编辑

快速填充像素的方法

摘要: 假定我们要用同一种颜色填充100M个像素,每个像素占4个字节,什么方法最快?第一种方法,也是最简单的方法,就是用一个循环不断填充每一个像素。#include #include #define MAX_PIXELS 0x6400000#define COLOR 0xaabbccddint main () { int *p = new int[MAX_PIXELS]; clock_t start, finish; start = clock(); for (long i=0; i#include #include #define MAX_PIXELS 0x6400000#d... 阅读全文
posted @ 2014-01-29 10:34 silmerusse 阅读(1464) 评论(1) 推荐(0) 编辑

GRUB2 分析 (一)

摘要: GRUB是目前较流行启动引导程序。其第二版被主流Linux发行版所包括。本文将探索和分析GRUB的设计和实现机制。boot.S是第一个研究对象,因为boot.S将被编译成boot.img(512字节),安装时安装在0号扇区,即主引导扇区(MBR)。BIOS引导时会把主引导扇区装载到0x7c00开始的512字节内存区域,并设置CS:IP为0x0000:7c00。接着CPU会执行0x7c00处的指令,即boot.img(boot.S)中的第一条指令: jmp LOCAL(after_BPB) /* 机器码: eb 63 */ ,跳转到偏移量0x65的地方。 接下去的代码检查并设置正确的引导驱动器号 阅读全文
posted @ 2014-01-28 23:34 silmerusse 阅读(1709) 评论(0) 推荐(0) 编辑

自制Linux映像和发行版Robomind

摘要: 通常ARM开发板厂商会提供已编译好的Linux映像供用户使用。我手上的MarS Board的厂商提供了Ubuntu映像,只是版本有点老,文件系统也比较大。之前我已经移植了较新的Linux内核,现在我想按自己的想法定制Linux文件系统。Freescale官方提供的BSP是基于yocto project的,可以使用bitbake、hob等工具来定制Linux映像,甚至可以加入包管理、桌面等功能来自制完整的发行版。BSP里已经包括sabre和wandboard等config和recipes。但是没有marsboard的。我就参考其他板子来加入对marsboard的支持。首先下载Freescale的 阅读全文
posted @ 2013-09-06 13:50 silmerusse 阅读(3849) 评论(1) 推荐(1) 编辑

为MarS Board安装无线网卡Linux驱动

摘要: 玩了几天MarS Board,发现要了解Linux是如何工作的,从嵌入式开发板玩起最有效率。因为会遇到无数的问题和未知领域,然后在解决问题的过程中有深入了解Linux的机会。为这块开发板专门买了块TL823N的无线网卡,小巧可爱,不占地方。不过Linux下的驱动安装是没有Windows方便的。就像显卡一样,厂商对Linux不大重视。这个网卡果然不能即插即用。查了下它的芯片是rt8192cu,虽然较新的内核里有驱动,但是不能稳定工作。于是在RealTek官方页面下载驱动包,再编译进内核。为交叉编译设置环境变量:ARCH=armCROSS_COMPILE=/arm-eabi-修改driver下的M 阅读全文
posted @ 2013-08-08 23:04 silmerusse 阅读(894) 评论(0) 推荐(0) 编辑