⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 5.htm

📁 关于linux嵌入式的极好的详解
💻 HTM
📖 第 1 页 / 共 3 页
字号:
MODULE_PARM(ntests, "i");/*每次循环的遍数*/ <br>

MODULE_PARM(period, "i");/*周期的长度*/ <br>

MODULE_PARM(mode, "i");/*模式,0表示oneshot, 1表示周期性*/ <br>

  <br>

int fifo;/*FIFO设备打开后的文件描述符*/ <br>

_____________________________________________________________________ <br>

4.5.3.2 非实时部分 <br>

非实时部分实际上就是一个应用程序,可以在控制台下编写,也可以在X-Windows下编写。 <br>

不过需要获得对/dev/rtf0的读的权限的用户才能运行。一般将rtf设备设置为所有用户可 <br>

读,只对超级用户可写。 <br>

1)主函数 <br>

_______________________________________________________________main() <br>

int main(int argc, char* argv[]) <br>

{ <br>

        int fd0;/*用于打开rtf0设备*/ <br>

        int n; <br>

        struct data samp; <br>

  <br>

        if ((fd0 = open("/dev/rtf0", O_RDONLY)) < 0) { <br>

                fprintf(stderr, "Error opening /dev/rtf0\n"); <br>

                exit(1); <br>



        } <br>

  <br>

        printf("In every hundreds of loops, the schedule accuracy test.\n"); <br>

  <br>

        printf("MIN\t\tMAX\n"); <br>

        while (1) { <br>

                n = read(fd0, &samp, sizeof(samp)); <br>

                printf("%8d, %8d\n", (int) samp.min, (int) samp.max); <br>

                  /*打印出来*/ <br>

                fflush(stdout);/*标准输出清空*/ <br>

        } <br>

        return 0; <br>

} <br>

_____________________________________________________________________ <br>

2)程序头 <br>

_____________________________________________________________moniter.c <br>

#include <stdio.h> <br>

#include <errno.h> <br>

#include <sys/time.h> <br>

#include <sys/types.h> <br>

#include <fcntl.h> <br>

#include <unistd.h> <br>



#include <sys/ioctl.h> <br>

#include <rtl_fifo.h> <br>

#include "myheader.h" <br>

_____________________________________________________________________ <br>

4.5.3.3 公用头文件 <br>

    该头文件定义了向FIFO写数据的格式。文件名为myheader.h <br>

___________________________________________________________myheader.h <br>

struct sample {/*调度的最长时间和最短时间*/ <br>

        hrtime_t min; <br>

        hrtime_t max; <br>

};/*myheader.h*/ <br>

_____________________________________________________________________ <br>

4.5.4 程序执行结果 <br>

在一台Pentium120,40M内存,RTLinux2.2的机器上,如下进行编译: <br>

#gcc -I/usr/src/rtlinux-2.2/linux/include -I/usr/src/rtlinux-2.2/include -I/us <br>

r/src/rtlinux-2.2 -I/usr/src/rtlinux-2.2/include/posix -Wall -Wstrict-prototyp <br>

es -O2 -fomit-frame-pointer -D__RTL__ -D__KERNEL__ -DMODULE -pipe -fno-strengt <br>

h-reduce -m386 -DCPU=386   -c -o mymeasument.o mymeasument.c <br>

#gcc -I/usr/src/rtlinux-2.2/linux/include -I/usr/src/rtlinux-2.2/include -I/us <br>

r/src/rtlinux-2.2 -Wall -O2 -o monitor monitor.c <br>

生成两个文件mymeasument.o和monitor,前者是模块方式的实时任务,后者是非实时部分 <br>

的应用程序。如下执行程序: <br>



#insmod mymeasument.o ntests=500 period=1000000 mode=0 <br>

    说明是采用每次进行500个循环寻找最大值和最小值,每次进入循环的周期为1百万个纳 <br>

  <br>

,也即1个毫秒,使用的是oneshot的方式。 <br>

#./monitor <br>

In every hundreds of loops, the schedule accuracy test. <br>

MIN             MAX <br>

12288,            12224 <br>

12224,           12320 <br>

12256,           12320 <br>

12192,           12320 <br>

……(单位为纳秒) <br>

如果如下执行程序: <br>

#insmod mymeasument.o ntests=500 period=1000000 mode=1 <br>

    说明是采用每次进行500个循环寻找最小值和最小值,每次进入循环的周期为1百万个微 <br>

  <br>

,也即1个毫秒,使用的是periodic模式。 <br>

#./monitor <br>

In every hundreds of loops, the schedule accuracy test. <br>

MIN             MAX <br>

5978,             5974 <br>

5976,            5978 <br>



5970,            5972 <br>

5968,            5972 <br>

5978,            5972 <br>

5970,            5966 <br>

……(单位为纳秒) <br>

4.6 嵌入式RTLinux的设计 <br>

Linux因为本身的特性,使得我们可以利用Linux内核做出很多有意义的事情。比如,把Li <br>

nux内核放在一张软盘上,并且利用ramdisk技术在内核导入到内存之后在内存中申请出一 <br>

片空间,存放root文件系统。我们也可以使用Linux做一个网络启动的无盘系统。我们可以 <br>

设想两个通过现有的RTLinux实现嵌入式RTLinux的方案: <br>

4.6.1 将RTLinux嵌入EPROM中 <br>

我们可以成功的把Linux内核嵌入在EPROM中,从而可以在嵌入式设备中利用Linux内核启动 <br>

系统。因为毕业设计过程中不能提供使用EPROM的条件,我先用一张1.44M软盘作为在EPRO <br>

M中的固体状态盘(Solid State Disk. SSD)的模拟,让这张软盘可以启动一个系统。如 <br>

果这样可以成功的话,就可以把软盘的数据写到EPROM的SSD中去,并且把对1.44M 3.5寸软 <br>

盘的驱动改成对EPROM的驱动程序就可以完成设计任务。 <br>

我们可以发现,在软盘里面提供必要的工具,我们就可以把RTLinux提供的那几个实时模块 <br>

加进去,从而形成一个实时任务运行环境,这样的工作很有意义,因为这样做出来的系统 <br>

经过少许改动就可以利用于嵌入式环境的系统。 <br>

实现这样一个系统的技术支持是使用Linux的ramdisk技术,在系统启动之后,通过在内存 <br>

里面申请出一块空间,作为虚拟的硬盘空间,然后把软盘里面的数据装载上来。 <br>

    这张软盘准备使用Linux Router Project的工作成果。Linux Router Project是一个专 <br>



  <br>

开发将Linux嵌入在一张软盘上并且能启动起一个包含有路由功能、瘦服务器、瘦客户端功 <br>

能、网络应用等功能的系统。在这个工作的基础之上,自己定制一个Linux内核,并且将实 <br>

时功能嵌入,从而让这张软盘启动的一个系统不仅仅是一个提供了Web服务器和telnet服务 <br>

器的系统,而且还是一个实时任务运行的环境。 <br>

实现这样的环境有个最大的难点,就在于如何将内核的体积变小。因为在嵌入式系统中, <br>

对Linux内核这种现代操作系统得的强大功能需求并不是全部都需要,而应该根据需要实现 <br>

的功能,自行定制合适的内核。在功能和体积上都能满足需求的内核是我们的目的,在嵌 <br>

入到EPROM中或者Flash RAM中的时候,也能节省很大的一笔费用。 <br>

实现内核定制,从一定程度上说,就是我们在嵌入式系统开发过程中的“个性化定制内核 <br>

”的说法,需要将内核的所占体积尽量缩小,而不应该在内核中留有不需要的功能。进行 <br>

这样的工作需要有内核在线调试环境,作为毕业设计中的一部分内容,在第六章我将详细 <br>

介绍Linux内核调试环境的搭建,提供自行定制Linux内核的方法。 <br>

下面介绍如何自己做一张用来支持RT Linux内核的软盘系统。 <br>

1)需要自己做一个在软盘系统启动之后作为根文件系统的压缩文件。在Linux内核中对ra <br>

mdisk的支持可以直接支持使用gzip压缩方法的压缩文件作为一个根文件系统装载,具体做 <br>

法使先将这个文件解压缩,然后装载到/dev/ram0中。注意,/dev/ram0并不是一个硬盘, <br>

而是从内存重划分出去的一块作为根文件系统。在系统启动的时候可以给内核传递参数指 <br>

定ramdisk的大小,也可以利用rdev命令直接进行操作。在根文件系统需要提供一些简单的 <br>

应用程序和自己需要的一些函数库、RT Linux需要的模块等等,可以自行定制。 <br>

  <br>

ramdisk的做法如下步骤: <br>



#dd if=/dev/zero of=/dev/ram bs=1k count=4096 <br>

    先将/dev/ram设备前4096字节清零,并且该ramdisk大小为4M; <br>

#mkfs.minix –vm0 /dev/ram 4096 <br>

    创建文件系统,因为minix文件系统支持比ext2文件系统支持需要的内核体积小,因此  <br>

  <br>

用minix文件系统而不使用ext2文件系统; <br>

然后将/dev/ram装载上来,把自己需要的东西都拷贝到这个文件系统下面,然后卸载该文 <br>

件系统。然后: <br>

#dd if=/dev/ram bs=1k count=4096 | gzip –v9 > /tmp/ram_image.gz <br>

    ram_image.gz就是这张软盘的操作系统在启动的时候需要装载的根文件系统。 <br>

    定制自己的内核,假设这个内核大小为420K,那么将内核写到软盘上。使用dd命令直接 <br>

  <br>

: <br>

#dd if=zImage of=/dev/fd0 bs=1k <br>

    然后将ramdisk写到内核之后的位置,现在这种情况可以写在420K之后,1440K-ramdisk <br>

  <br>

小的任意一处,这里写到430K的位置: <br>

#dd if=/tmp/ram_image.gz of=/dev/fd0 bs=1k seek=430 <br>

     然后修改/dev/fd0的启动参数,利用rdev命令完成,使用rdev可以将内核启动参数直  <br>

  <br>

写到/dev/fd0上面。关于内核的ramdisk参数,是用两个字节表示的,从0到10位表示的是 <br>

ramdisk的位置(2^11表示最大的偏移量,为2096Bytes),第15位表示是否需要提示插入ra <br>



mdisk的软盘,第14位表示需要导入ramdisk,其它位目前还没有意义。那么,我们现在的 <br>

软盘参数应该是2^15+2^14+430=49582。如下操作: <br>

#rdev /dev/fd0 /dev/fd0 <br>

#rdev –r /dev/fd0 48952 <br>

    然后使用这张软盘,就可以启动一台无盘,8M内存的机器。在根文件系统种存放有RT L <br>

  <br>

nux的启动模块和程序,就可以正常运行RT Linux了。 <br>

  <br>

4.6.2 通过网络启动的方法设计嵌入式RTLinux。 <br>

Linux提供了一种很方便的方式来创建无盘工作站,这样的无盘工作站可以从一台网络服务 <br>

器启动。网络启动的时候,通过网络获得Linux内核、驱动程序模块和应用程序。这样的启 <br>

动过程如下所示; <br>

①从bootp或者dhcp服务器获得这台机器的IP地址; <br>

②从一台tftp服务器获得Linux的内核; <br>

③从一台NFS服务器上装载文件系统; <br>

④必要的话,可以装载进X-Server软件并且运行X Windows; <br>

⑤运行应用程序。 <br>

4.7 小结 <br>

本章详细介绍了Linux的实时变种——RT Linux的实现原理、编程原理和示例。RT Linux是 <br>

一种通过Linux实现的“硬实时系统”,系统的性能很好。 <br>

在4.6介绍了两种利用Linux创建“嵌入式系统”的方法:使用一张软盘模拟EPROM环境和使 <br>

用网络自举的系统设想。这些在Linux下都已经得到实现。 <br>



  <br>

-- <br>

紅酥手 黃滕酒 滿城春色尃m澚  <br>

 |風惡 歡情薄 一懷愁緒 幾年離索 <br>

錯 錯 錯 ! <br>

春如舊 人空瘦 満I奂t 捧o綃透 <br>

桃花落 槌f亻w 山盟雖在 鍟\

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -