2006-12-26 18:02:00 yesky12 阅读数 0
//前言:
编写目的:
大学计算机相关专业课程都已经包含计算机组成原理.c计算机编程语言.c计算机体系结构.c计算机操作系统,4甚至还包
括电子技术和半导体技术.a尽管已经具备这些嵌入式Linux系统的基础知识,4但是多数大学毕业生不清楚到底该如何开发嵌
入式Linux系统.
编写本书的目的就是阐述嵌入式Linux系统的各组成部分,5从概念上和实践上说明嵌入式Linux系统开发的基本过程.a这
本书可以帮助具备计算机基础知识的开发者迅速进入嵌入式系统开发领域.
希望本书能够帮助读者更好地理解嵌入式Linux系统,6并且参与到嵌入式Linux系统开发中来.

//主要内容:
本书以嵌入式Linux系统开发流程为主线,8剖析了嵌入式Linux系统构建的各个环节.a从嵌入式系统基础知识和Linux编
程技术讲起,8接下来说明了建立嵌入式Linux交叉开发环境,8然后分析了嵌入式Linux系统的引导程序.c内核和文件系统三
大组成部分,8最后介绍了嵌入式Linux系统集成和部署的方法.

//评论:
很无聊的一本书,名字取就不错就买了,里面的内容Linux和ARM到是都说到了,但是讲的都不深,并且两者好象没什么联系,各讲各的

没有谈驱动程序开发(//入门的书就不用将驱动开发了吧,跟书的定位有关系吧)

客观评价一下,这本书作者花了不少心思,作者的技术功底也比较深,如果因为一些细节方面的问题把这本书说得一无是处,也有点过分了,有谁能从现在市面上找出一本没有错别字的书?

看过目录,堆积成分较多。对新手有点点参考价值。
不要被 “嵌入式”这几个字吓倒。
其实没什么的。
多找找Linux的经典书看看就成。
要真想学“嵌入式Linux”, 找块开发板练手,而好的供应商的参考文档会几乎包含该书的所有内容。

对于老手来说简单了点!对于新手来说就象是复习原来的知识!只能说是一本参考书!不能算的上一本帮助学习新知识的书!

//me
bootloader的那个章节在csdn可以试读,在华清远见培训的主页上也有下载(http://farsight.com.cn/download/)
暂时先只用到bootloader这个章节,读了一段觉得不错,购买意向很强...
2019-06-14 20:04:39 qq_41035588 阅读数 3603

嵌入式知识点复习一

1、 嵌入式系统的一般组成结构

在这里插入图片描述

2、嵌入式硬件系统的结构
(1)嵌入式处理器+外围硬件
(2)常见的外围硬件:电源、时钟、内存、I/O、通信、调试;
3、嵌入式处理器
(1)ARM、S3C6410、STM32单片机、华为海思、高通骁龙等
(2)Intel /AMD 都不是嵌入式处理器
4、嵌入式操作系统
功能:
种类:嵌入式linux;WinCE;Vxworks;μC/OS-II;Android;IOS。注意:linux不是嵌入式操作系统;MAC OS WINDOWS XP/7/8/10都不是

嵌入式知识点复习二 --体系结构

1、ARM:ADVANCED RISC MACHINES,是一款嵌入式微控制器,也是一家嵌入式处理器设计厂商。设计高性能、低功耗的嵌入式处理器。
2、ARM微处理器工作状态:两种指令对应两种状态(通常情况)
(1)Thumb状态、ARM状态;
(2)32位定长ARM指令,16位定长Thumb指令。
(3)ARM1176支持ARM指令、Thumb指令、Jazelle指令,故有三种状态:ARM状态、Thumb状态、Jazelle状态。
3、异常:
(1)处理器执行某些区别于用户指令的任务,如中断处理、复位、调试等;为了区分用户指令,因此称为异常;
(2)异常的种类与类型(1176为例):7种,中断(IRQ)、快中断(FIQ)、未定义(Undef)、数据中止(DABT)、预取指中止(PABT)、软中断、复位(reset)
4、工作模式:根据系统执行正常或异常指令不同,分为8种工作模式:用户模式、系统模式、中断模式、快中断模式、未定义模式、中止模式(对应数据中止异常、预取指中止)、SVC管理模式(软中断、复位)、SM安全监视器模式。
5、寄存器:
(1)ARM处理器均为32位寄存器;
(2)ARM1176寄存器数量:40个
(3)ARM1176寄存器包括:未分组寄存器、分组寄存器、CPSR、SPSR;
(4)未分组寄存器(所有模式通用):9个,R0~R7;R15(PC)
(5)分组寄存器(不同工作模式下专用,不同模式稍有不同):
① R8~R14;
② 6个不同模式下的SPSR寄存器:SPSR_irq,SPSR_fiq,SPSR_abt,
SPSR_und,SPSR_svc,SPSR_mon
(6)可复用寄存器:
① SP堆栈指针寄存器-R13,用于保存子程序调用或异常处理的临时数据;
② LR连接寄存器-R14,用于保存子程序调用或异常处理时,主程序调用指令/中断跳转指令的下一条指令的入口地址,以便于恢复主程序;
③ PC程序计数器-P15,用于保存要执行的指令的地址。
(7)PSR程序状态寄存器:
① 包括CPSR当前程序状态寄存器和SPSR备份的程序状态寄存器;
② CPSP用于保存当前模式下处理器模式、状态、中断使能、大小端模式及条件位等信息;
③ SPSR用于备份异常发生前的CPSR寄存器的值,以便异常处理结束时能返回用户程序状态。
6、ARM支持两种中断:IRQ和FIQ
7、ARM数据存储格式:大端(big endian)和小端(little endian)
8、采用RISC架构的ARM微处理器一般具有如下特点:
 
① 体积小、低功耗、低成本、高性能;
② 支持Thumb(16位)/ARM(32位)双指令集,能很好地兼容8位/16位器件;
③ 大量使用寄存器,指令执行速度更快;
④ 大多数数据操作都在寄存器中完成;
⑤ 寻址方式灵活简单,执行效率高;
⑥ 指令长度固定;
⑦ 指令支持按 条件执行;
⑧ 内存访问采用load/store实现。

嵌入式知识点复习三 --ARM-LINUX嵌入式开发环境

一、交叉开发模式
1、组成结构
(1)宿主机:开发主机,一般由PC、发行版linux系统、开发工具(本地及交叉编译)(代码编辑器Vi,编译器GCC、调试器GDB、工程管理器MAKE、NFS等)组成;
(2)目标机:嵌入式系统,一般由ARM硬件、BOOTLOADER、内核、根文件系统构成;
(3)连接工具:串口线、网线、USB线等。
2、理解编译工具链与交叉编译工具链的异同
(1)相同点:
① 用于支持的语言的编译、链接与调试,编译器用法相同;
② 通常都有编译器、链接器、调试器、库及其他二进制工具构成。
(2)不同点:
① 编译工具链一般用于本机编译、本机执行的开发模式;
② 交叉编译工具链用于宿主机编译,目标机运行的交叉开发模式;
③ 编译器一般Linux发行版都配备,直接调用gcc命令即可;
④ 交叉编译器一般需根据宿主机软硬件环境,进行gcc、相关库、工具进行有针对性的定制。
⑤ 实验室使用的OK6410开发板定制的编译器为32位的,其交叉编译工具链主要arm-linux-gcc,arm-linux-g++arm-linux-gdb等构成。
二、开发工具的用法
1、Vi的工作模式及其切换-掌握使用Vi完成源代码编辑、保存及退出的常见按键操作;
2、GCC:GNU Compiler Collection,GUN编译器套件,特点:
① 支持绝大多数高级语言的编译,既支持传统的C/C++,Fortan,Objective-C ,也支持java,python,go等语言;
② 支持汇编语言;
③ 支持绝大多数的主流处理器平台;
④ 便于构建交叉编译工具链。
3、gcc/arm-linux-gcc用法:
① 基本用法:gcc hello.c;arm-linux-gcc hello.c;输出a.out
② 推荐用法:gcc hello.c -o hello/arm-linux-gcc hello.c -o hello ,可以指定输出文件名称;
③ 主要的编译参数
-Wall 打印全部警告信息;
-O{0-3,s} 支持代码优化,0无优化;
-g 支持gdb调试;
-lpthread 支持多线程。

4、make及Makefile
(1)make:工程管理器,利用执行Makefile文件实现工程管理(编译、链接、生成工程镜像、安装、清理、卸载等);
(2)make用法:编写Makefile,在终端下执行make命令即可。
(3)Makefile文件编写示例:
一个工程,2个源文件testa.c ,testb.c,一个头文件testb.h,编译器为arm-linux-gcc,生成的可执行文件为test,需支持代码优化、打印警告信息,支持gdb调试等编译选项,其Makefile文件如下:
SRC=testa.testb b.c testb.h
EXEC=test
CC=arm-linux-gcc
CFLAGS=-Wall -O2 -g
(EXEC):(EXEC):(SRC)
$(CC) $(SRC) -o $(EXEC) $(CFLAGS)

嵌入式知识点复习四 --arm-linux文件编程

1、linux文件编程概述
(1)文件描述符:Linux中文件分为4种:普通文件、目录文件、链接文件、设备文件要区分这些文件就要了解“文件描述符”;
文件描述符是一个非负的整数,他是一个索引值,并指向内核中每个进程打开文件的记录表。当打开一个现存文件或创建一个新文件时,内核就向进程返回一个文件描述符,当需要读/写文件时,也需要把文件描述符作为参数传递给相应的函数。
(2)基本I/O操作
Linux的输入/输出(I/O)操作,通常为5个方面:打开,读取,写入,和关闭
对应的有5个系统调用:
open,read,write,close,lseek
所需要的头文件:
#include <sys/types.h>
#include <unistd.h>
1.open函数
open函数的原型如下:
int open(const char *pathname, int flags, mode_t mode)
函数传入参数含义如下:
pathname:为字符串,表示被打开的文件名称,可以包含路径。
flags :为一个或多个标志,表示文件的打开方式,常用标志如表所示:
O_RDONLY 只读方式打开
O_WRONLY 只写方式打开
O_RDWR  读/写方式打开
O_CREAT 如果文件不存在,就创建新的文件
O_EXCL 如果使用O_CREAT时文件存在,则可返回错误消息
O_TRUNC  如果文件已存在,且以只读或只写成功打开,则先全部删除文件中原有的数据
O_APPEND  以添加方式打开文件,在打开文件的同时,文件指针指向文件的末尾、
注意:在open函数中,flags参数可以用过“|”组合而成,O_RDONLY,O_WRONLY,O_RDWR这三种方式是互斥的,不可同时使用,因此这3个参数只能出现一个。

mode 被打开文件的存取权限模式,可以使用八进制数来表示新文件的权限,也可以采用<sys/stat.h>中定义的符号常量,当打开已有文件时,将忽略这个参数,函数返回值:成功则返回文件描述符,出错返回-1。

文件模式符号常量:
S_IRWXU   00700    所属用户读。写和执行权限
S_IRUSR   00400   所属用户读权限
S_IWUSR   00200   所属用户写权限
S_IXUSR   00100   所属用户执行权限

S_IRWXG  00070   组用户读,写和执行权限
S_IRGRP   00040   组用户读权限 
S_IWGRP   00020  组用户写权限
S_IXGRP   00010  组用户执行权限

S_IRWXO  00007  其他用户读,写和执行权限
S_IROTH  00004  其他用户读权限
S_IWOTH  00002  其他用户写权限
S_IXOTH  00001  其他用户执行权限
2.read和write函数
函数原型如下:
ssize_t read(int fd, void *buf,size_t count)
ssize_t write(int fd,const void *buf, size_t count)
函数传入参数含义如下:
fd 文件描述符
buf 指定存储器独处数据的缓冲区
count 指定读出或写入的字节数
3.close函数
当使用完文件时可以使用close关闭文件,close会让缓冲区中的数据写回磁盘,并释放文件所占的资源,close的原型如下:
int close(int fd)
函数传入参数:fd文件描述符
函数返回值:若文件顺利关闭则返回0,发生错误则返回-1,并置errno,通常文件在关闭时出错是不常见的,但也不是不可能的情况,他别是在关闭通过网络访问的文件时就会出现这种情况。
4.lseek函数
主要用于移动文件读写指针,主要用于获取文件大小和拓展文件(先分配空间、然后再填充内容),函数原型如下:
off_t lseek(int fd, off_t offset, int whence)
参数 fd:文件描述符。
offset:偏移量,每一读写操作所需要移动的距离,单位是字节的数量,可正可负(向前移,向后移)
whence
(当前位置基点): SEEK_SET:当前位置为文件的开头,新位置为偏移量的大小。
SEEK_CUR:当前位置为文件指针的位置,新位置为当前位置加上偏移量。
SEEK_END:当前位置为文件的结尾,新位置为文件的大小加上偏移量的大小。
返回值 成功:文件的当前位移
-1:出错

实例:(1)参考实验2:linux文件编程;
(2)网盘:/linux编程源代码/IO(readwrite、fcntl)下相关代码

嵌入式知识点复习五 --arm-linux进程编程

一、Linux进程编程
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是操作系统进行资源分配和调度的基本单位,是操作系统结构的基础。
1 进程控制
子进程创建:fork()函数
在Linux中创建一个新进程的唯一方法是使用fork()函数。fork()函数是Linux中一个非常重要的函数,和以往遇到的函数有一些区别,因为fork()函数看起来执行一次却返回两个值。
1)fork()函数说明
fork()函数用于从已存在的进程中创建一个新进程。新进程称为子进程,而原进程称为父进程。
使用fork()函数得到的子进程是父进程的一个复制品,它从父进程处继承了整个进程的地址空间,包括进程的上下文、代码段、进程堆栈、内存信息、打开的文件描述符、符号控制设定、进程优先级、进程组号、当前工作目录、根目录、资源限制和控制终端等,而子进程所独有的只有它的进程号、资源使用和计时器等。
因为子进程几乎是父进程的完全复制,所以父子两进程会运行同一个程序。这就需要用一种方式来区分它们,并使它们照此运行,否则,这两个进程不可能做不同的事。
实际上是在父进程中执行fork()函数时,父进程会复制一个子进程,而且父子进程的代码从fork()函数的返回开始分别在两个地址空间中同时运行,从而使两个进程分别获得所属fork()函数的返回值,其中在父进程中的返回值是子进程的进程号,而在子进程中返回0。因此,可以通过返回值来判断该进程的父进程还是子进程。
2)fork()函数语法
在这里插入图片描述
进程等待函数
1)wait()函数,无条件等待,父进程阻塞直到子进程结束
在这里插入图片描述
2)waitpid()函数,指定等待某个子进程结束以及等待的方式(阻塞或非阻塞)
所需头文件 #include <sys/types.h>
#include <sys/wait.h>
函数原型 pid_t waitpid(pid_t pid, int *status, int options)
函数参数 pid pid>0:只等待进程ID等于pid的子进程,不管已经有其他子进程运行结束退出了,只要指定的子进程还没有结束,waitpid就会一直等下去。
pid=-1:等待任何一个子进程退出,此时和wait作用一样。
pid=0:等待其组ID等于调用进程的组ID的任一子进程。
pid<-1:等待其组ID等于pid的绝对值的任一子进程。
status 同wait
options WNOHANG:若由pid指定的子进程并不立即可用,则waitpid不阻塞,此时返回值为0
WUNTRACED:若某实现支持作业控制,则由pid指定的任一子进程状态已暂停,且其状态自暂停以来还未报告过,则返回其状态。
0:同wait,阻塞父进程,等待子进程退出。
函数返回值 正常:结束的子进程的进程号
使用选项WNOHANG且没有子进程结束时:0
调用出错:-1
所需头文件 #include <sys/types.h>
#include <sys/wait.h>

函数原型 pid_t waitpid(pid_t pid, int *status, int options)
函数参数 pid pid>0:只等待进程ID等于pid的子进程,不管已经有其他子进程运行结束退出了,只要指定的子进程还没有结束,waitpid就会一直等下去。
pid=-1:等待任何一个子进程退出,此时和wait作用一样。
pid=0:等待其组ID等于调用进程的组ID的任一子进程。
pid<-1:等待其组ID等于pid的绝对值的任一子进程。
status 同wait
options WNOHANG:若由pid指定的子进程并不立即可用,则waitpid不阻塞,此时返回值为0
WUNTRACED:若某实现支持作业控制,则由pid指定的任一子进程状态已暂停,且其状态自暂停以来还未报告过,则返回其状态。
0:同wait,阻塞父进程,等待子进程退出。
函数返回值 正常:结束的子进程的进程号
使用选项WNOHANG且没有子进程结束时:0
调用出错:-1

进程结束:exit()和_exit()

所需头文件 exit:#include <stdlib.h>
_exit:#include <unistd.h>
函数原型 exit:void exit(int status);
_exit:void _exit(int status);
函数传入值 status是一个整型的参数,可以利用这个参数传递进程结束时的状态。
通常0表示正常结束;其他的数值表示出现了错误,进程非正常结束。
在实际编程时,可以用wait系统调用接收子进程的返回值,进行相应的
处理。

所需头文件 exit:#include <stdlib.h>
_exit:#include <unistd.h>
函数原型 exit:void exit(int status);
_exit:void _exit(int status);
函数传入值 status是一个整型的参数,可以利用这个参数传递进程结束时的状态。
通常0表示正常结束;其他的数值表示出现了错误,进程非正常结束。
在实际编程时,可以用wait系统调用接收子进程的返回值,进行相应的
处理。

两者的区别:
(1)_exit()函数的作用最为简单:直接使进程终止运行,清除其使用的内存空间,并销毁其在内核中的各种数据结构;
(2)exit()函数则在这些基础上作了一些包装,在执行退出之前加了若干道工序。
(3)exit()函数在调用exit系统调用之前要检查文件的打开情况,把文件缓冲区中的内容写回文件,就是"清理I/O缓冲"。
Linux下的进程间通信
进程间通信用于实现参数传递及通信功能;Linux支持的常用的进程间通信方法:管道、消息队列、共享内存、信号量、套接口等等。
实例:(1)实验三:Linux进程编程;
(2)网盘linux编程源代码目录下fork文件下相关实例(FIFO、msgque、shm)。

嵌入式知识点复习六 --arm-linux网络编程

1、程序流程
(1)网络通信程序架构-客户端/服务器架构
(2)流程如下图:
在这里插入图片描述
TCP通信

2、函数说明
socket()
Sockfd=socket(AF_INET,SOCK_STREAM,0);

Bind()
s_add.sin_family=AF_INET;IPV4协议
s_add.sin_addr.s_addr=inet_addr(“192.168.1.123”);IP地址192.168.1.123
s_add.sin_port=htons(0x8888);端口号是8888

if(-1 == bind(Sockfd,(struct sockaddr *)(&s_add), sizeof(struct sockaddr)))

listen()服务器端侦听函数
listen(Sockfd,5)服务器侦听来自客户端的请求
accept()服务器端接受客户端连接请求
nfp = accept(Sockfd, (struct sockaddr *)(&c_add), sizeof(struct sockaddr);

send()数据发送函数
send(nfp,“hello,welcome to my server”,32,0)
recv()数据接收函数
recv(nfp,buffer,1024,0)
关闭连接
Close(nfp)
关闭服务器
Close(Sockfd)
实例:(1)实验四:网络聊天室设计
(2)网盘/linux编程源代码/socket下相关代码

嵌入式知识点复习七 --linux字符型设备驱动初步

一、Linux字符设备驱动初步
1、Linux设备类型
(1)字符设备:只能一个字节一个字节的读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后顺序进行。字符设备是面向流的设备,常见的字符设备如鼠标、键盘、串口、控制台、LED等。
(2)块设备:是指可以从设备的任意位置读取一定长度的数据设备。块设备如硬盘、磁盘、U盘和SD卡等存储设备。
(3)网络设备:网络设备比较特殊,不在是对文件进行操作,而是由专门的网络接口来实现。应用程序不能直接访问网络设备驱动程序。在/dev目录下也没有文件来表示网络设备。

2、开发流程

3、关键函数讲解(以2.6以下版本内核为例)
(1)驱动模块注册register_chrdev()函数
原型:register_chrdev(unsigned int major, const char *name,const struct file_operations *fops);
major:主设备号,该值为 0 时,自动运行分配。而实际值不是 0 ;
name:设备名称;
fops:操作函数,实现驱动定义的open、read、write、close等内核函数与应用程序调用的open、read、write、close间的映射;
返回值:
major 值为 0 ,正常注册后,返回分配的主设备号。如果分配失败,返回 EBUSY 的负值 ( -EBUSY ) 。major 值若大于 linux/major.h (2.4内核)中声明的最大值 (#define MAX_CHRDEV 255) ,则返回EINVAL 的负值 (-EINVAL) 。指定 major 值后,若有注册的设备,返回 EBUSY 的负值 (-EBUSY)。若正常注册,则返回 0 值
(2)驱动注销unregister_chrdev()函数
原型:
#include <linux.fs.h>
int unregister_chrdev (unsigned int major, const char *name)
变量:
major 主设备号
name 设备文件
返回值:
major 值若大于 linux/major.h (2.4 内核)中声明的最大值 (#define MAX_CHRDEV 255),返回 EINVAL的负值 (-EINVAL)。指定了 major的值后,若将要注销的 major 值并不是注册的设备驱动程序,返回 EINVAL的负值 ( -EINVAL )。正常注销则返回 0值。
(3)File_operation结构体
file_operations结构是建立驱动程序和设备编号的连接,内部是一组函数指针,每个打开的文件,也就是file结构,和一组函数关联,这些操作主要用来实现系统调用的
struct file_operations {
  struct module *owner;//拥有该结构的模块的指针,一般为THIS_MODULES
loff_t (*llseek) (struct file *, loff_t, int);//用来修改文件当前的读写位置
ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);//从设备中同步读取数据
ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);//向设备发送数据
ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t);//初始化一个异步的读取操作
ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t);//初始化一个异步的写入操作
  int (*readdir) (struct file *, void *, filldir_t);//仅用于读取目录,对于设备文件,该字段为NULL
unsigned int (*poll) (struct file *, struct poll_table_struct *); //轮询函数,判断目前是否可以进行非阻塞的读写或写入
  int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long); //执行设备I/O控制命令
  long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); //不使用BLK文件系统,将使用此种函数指针代替ioctl
  long (*compat_ioctl) (struct file *, unsigned int, unsigned long); //在64位系统上,32位的ioctl调用将使用此函数指针代替
  int (*mmap) (struct file *, struct vm_area_struct *); //用于请求将设备内存映射到进程地址空间
  int (*open) (struct inode *, struct file *); //打开
  int (*flush) (struct file *, fl_owner_t id);
  int (*release) (struct inode *, struct file *); //关闭
  int (*fsync) (struct file *, struct dentry *, int datasync); //刷新待处理的数据
  int (*aio_fsync) (struct kiocb *, int datasync); //异步刷新待处理的数据
  int (*fasync) (int, struct file *, int); //通知设备FASYNC标志发生变化
  int (*lock) (struct file *, int, struct file_lock *);
  ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);
  unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
  int (*check_flags)(int);
  int (*flock) (struct file *, int, struct file_lock *);
  ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);
  ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);
  int (*setlease)(struct file *, long, struct file_lock **);
};
实例:见网盘/linux编程源代码/ok6410ledrv

2008-12-02 14:12:00 dongliqiang2006 阅读数 6134

《ARM嵌入式Linux系统开发从入门到精通》勘误

很高兴收到第一位读者的勘误信,内容如下:

看了你的书觉得不错,有点勘误给您指出来 ,P41页#../bulid-gcc/configure........应该改为#../gcc-3.3.6/configure......
在42页中书上的代码写的 都是2.2.3版本/不过你光盘里面的源码是2.3.2版本的// 
 
结论:P41页#../bulid-gcc/configure........应该改为#../gcc-3.3.6/configure......
 
特别感谢这位读者,将赠送该书一本。
 
 

by mikelyf | 2007-9-20 12:10:00 | 阅读全文(1037) | 回复(37) | 引用通告(0) | 编辑



Re:《ARM嵌入式Linux系统开发从入门到精通》勘误

下面是一位读者的来信,非常感谢!



发现了三个地方有问题,希望该书下个版本能更改过来。
(一)、
P43,表2.2
linux-libc-headers-2.6.12.0.tar.bz2,原书写的下载地址为ftp.gnu.org
应更正为:
下载地址:ftp://ftp.lfs-matrix.net/pub/linux-libc-headers/

此外,建议其他几个文件的下载地址最好写详细些,例如gcc-3.3.6.tar.gz 原书写的下载地址ftp.gnu.org
建议写为: http://ftp.gnu.org/gnu/gcc/gcc-3.3.6.tar.gz


(二)、
P105,第9行,myroofs/sbin应该为myroofs/user/sbin,事实上,在实际编译的时候,根本没有书本上P105第6行
的user/bin和usr/sbin,不知道为何?在编译中还会出现如下错误:
applets/applets.c:15:2: warning: #warning Static linking against glibc produces buggy executables
applets/applets.c:16:2: warning: #warning (glibc does not cope well with ld --gc-sections).
applets/applets.c:17:2: warning: #warning See sources.redhat.com/bugzilla/show_bug.cgi?id=3400
applets/applets.c:18:2: warning: #warning Note that glibc is unsuitable for static linking anyway.
applets/applets.c:19:2: warning: #warning If you still want to do it, remove -Wl,--gc-sections
applets/applets.c:20:2: warning: #warning from scripts/trylink and remove this warning.
applets/applets.c:21:2: error: #error Aborting compilation.
make[1]: *** [applets/applets.o] Error 1

修改文件 applets/applets.c ,将
#error Aborting compilation.
注释掉:
/*#error Aborting compilation.*/
编译才能成功,
而且,关于busybox的配置,书上写的不是很清楚。建议写详细点。

给出以下参考:
ARCH =arm
CROSS_COMPILE = /usr/local/arm/3.3.2/bin/arm-linux-


3.定制 busybox
#make menuconfig
设置静态编译方式

# make menuconfig
Busybox Settings --->
Build Options --->
[*] Build BusyBox as a static binary (no shared libs) //(1)
Installation Options --->
[*] Don't use /usr //(2)

Linux System Utilities --->
[*] mdev //(3)
[*] Support /etc/mdev.conf
[*] Support command execution at device addition/removal

Shells --->
Choose your default shell (msh) ---> //(4)

4.执行 make 编译
#make
编译出错, 信息如下:
applets/applets.c:15:2: warning: #warning Static linking against glibc produces buggy executables
applets/applets.c:16:2: warning: #warning (glibc does not cope well with ld --gc-sections).
applets/applets.c:17:2: warning: #warning See sources.redhat.com/bugzilla/show_bug.cgi?id=3400
applets/applets.c:18:2: warning: #warning Note that glibc is unsuitable for static linking anyway.
applets/applets.c:19:2: warning: #warning If you still want to do it, remove -Wl,--gc-sections
applets/applets.c:20:2: warning: #warning from scripts/trylink and remove this warning.
applets/applets.c:21:2: error: #error Aborting compilation.
make[1]: *** [applets/applets.o] Error 1

//////////////////////////////////////////////////////////////////////////////////
make[1]: *** [miscutils/taskset.o] Error 1
  make: *** [miscutils] Error 2
  
make menuconfig
找到[Miscellaneous Utilities],去掉[task set]
//////////////////////////////////////////////////////////////////////////////
按照提示,修改 scripts/trylink, 将此文件里面有 -Wl,--gc-sections 的行都删除掉,
然后重新 make
#make
还是出错, 信息如下:
applets/applets.c:15:2: warning: #warning Static linking against glibc produces buggy executables
applets/applets.c:16:2: warning: #warning (glibc does not cope well with ld --gc-sections).
applets/applets.c:17:2: warning: #warning See sources.redhat.com/bugzilla/show_bug.cgi?id=3400
applets/applets.c:18:2: warning: #warning Note that glibc is unsuitable for static linking anyway.
applets/applets.c:19:2: warning: #warning If you still want to do it, remove -Wl,--gc-sections
applets/applets.c:20:2: warning: #warning from scripts/trylink and remove this warning.
applets/applets.c:21:2: error: #error Aborting compilation.
make[1]: *** [applets/applets.o] Error 1
make: *** [applets] Error 2
修改文件 applets/applets.c 第 21 行, 将
#error Aborting compilation.
注释掉:
/*#error Aborting compilation.*/
执行 make 重新编译
#make
编译通过, busybox 被生成了, 然后执行
#make install
busybox 就被安装到默认的临时目录 _install 下了


(三)、p44,倒数第11行,TARGET=arm-linux-,运行arm.sh后,
creating libtool

updating cache ./config.cache

loading cache ./config.cache

configure: error: Unrecognized target system type; please check config.sub.

make: *** [configure-bfd] 错误 1

应该为:TARGET=arm-linux-

by mikelyf | 2008-10-16 16:52:00 | 个人主页 | 引用 | 返回 | 删除 | 回复



Re:《ARM嵌入式Linux系统开发从入门到精通》勘误

建一个qq书友群吧,不然会忙死你的.

ps:用cygwin的那个朋友,只要用chmod改下属性777就可以了

以下为blog主人的回复:

 

你的建议很好,我们已经建了QQ群,群号:6525774,欢迎你的加入!

by 阿达(游客) | 2008-9-26 14:55:00 | 个人主页 | 引用 | 返回 | 删除 | 回复



Re:《ARM嵌入式Linux系统开发从入门到精通》勘误

Mike好:
前一阵子好像网站down了吧.
看到这么多留言和回复,感觉你的售后服务还是蛮到位的.不过这也不是个办法.我建议你建一个书友qq群,其实有些问题相互问一下,是可以解决的.

ps:前面有位用cygwin的朋友,只要把当前目录的属性chmod为777就有权限了.

以下为blog主人的回复:

 

谢谢你的建议,之前朋友说过让我建一个QQ群,不过由于太忙,没时间挂QQ,你要是方便可以帮忙弄一个QQ群,帮我收集以下读者的问题,然后我和你直接交流就可以,看你有没有兴趣,前段时间blog断了一段时间。

by 阿达(游客) | 2008-9-26 14:50:00 | 个人主页 | 引用 | 返回 | 删除 | 回复



Re:《ARM嵌入式Linux系统开发从入门到精通》勘误

谢谢李老师。我已经通过crosstool成功的建立交叉编译环境。不过2.2.2中3中的配置文件TARGET=arm-linux- 应改为TARGET=arm-linux 即去掉linux后的-才会编译成功。

以下为blog主人的回复:

 

这是本书的一个错误,的确正如你说,应该是TARGET=arm-linux,谢谢你的指证!

by killercyp(游客) | 2008-7-26 18:45:00 | 个人主页 | 引用 | 返回 | 删除 | 回复



Re:《ARM嵌入式Linux系统开发从入门到精通》勘误

李老师您好!大家基本上都在分步构建交叉编译环境时都在编译glibc时遇到了同样的问题,您说可能是glibc的bug。有没有什么办法可以跳过这个bug,让大家可以用分步的办法将交叉编译环境构建起来。

以下为blog主人的回复:

 

应该可以通过注释掉出错的代码可用解决这个问题。

by killercyp(游客) | 2008-7-24 21:38:00 | 个人主页 | 引用 | 返回 | 删除 | 回复



Re:《ARM嵌入式Linux系统开发从入门到精通》勘误

李老师您好!您的这本书写的非常实用,对我的帮助很大,我非常感谢您!我在执行本书中2.2.2中的4.执行脚本时./arm.sh出错。错误信息为:configure: error : unrecognized target system type; please check config.sub.我应该怎么办?希望李老师指教,谢谢诶

以下为blog主人的回复:

 

请检查一下你的配置文件是否正确。

 

by killercyp(游客) | 2008-7-24 21:31:00 | 个人主页 | 引用 | 返回 | 删除 | 回复



编译内核的问题

李老师,你好,我参考你出版的:《ARM嵌入式Linux系统开发从入门到精通》一书编译内核时出现一些问题。虚拟机上的linux系统是redhat linux enterprise as 4.0(内核是2.6.9.5-el),想编译的内核是linux-2.6.10,按照你书中P88-P97的步骤和方法出现如下错误:(交叉编译器crosstool是s3c2410自带的,工作正常)
#cd linux2-6-10
#make mrproper
#cp arch/arm/configs/smdk2410_defconfig .config
#make menuconfig
HOSTCC scripts/basic/fixdep
/bin/sh:scripts/basic/fixdep:cannot execute binary file
make[1]:***[scripts/basic/fixdep] Error 126
make:***[scripts_basic]Error 2
弄不清楚这是什么问题,请老师指点

以下为blog主人的回复:

 

请确认一下你的编译内核配置文件是否正确,其次确认你内核的根目录下Makefile的交叉编译器和CPU类型是否配置正确。

by 东少(游客) | 2008-7-11 11:00:00 | 个人主页 | 引用 | 返回 | 删除 | 回复



Re:《ARM嵌入式Linux系统开发从入门到精通》勘误

李老师:
您好! 我是您的一位忠实读者。想问您的《ARM嵌入式LINUX系统开发入门到精通》中提及的GNU make3.79或更新,GCC3.2或更新,GNU binutils 2.13 或更新 在那里下载
谢谢!

以下为blog主人的回复:

 

一般在ftp.gnu.org 站点上进行下载。

 

 

by zhaoch888 | 2008-7-10 11:51:00 | 个人主页 | 引用 | 返回 | 删除 | 回复



Re:《ARM嵌入式Linux系统开发从入门到精通》勘误

以下引用xwf72(游客)在2007-12-5 20:19:00发表的评论:

我在做到 40p 时 输入命令是:
#make ARCH=arm COSS_COMPLILE=arm-linux- menuconfig 后检查目录include/linux下是否有 version.h 和 autoconf.h时候,只能看到有 autoconf.h 而看不到version.h 不知道这个是为什么?





以下为blog主人的回复:


 


 


不好意思,这是本书出现的一个失误,你需要执行make编译之后才会产生version.h文件。


李老师,可不可以说得具体点啊,我也是出现这种问题,配置完内核以后,我没有出现version.h和autoconf.h文件,现在应该怎么做才能有呢,谢谢!

以下为blog主人的回复:

 

需要编译内核。

by 陈兵(游客) | 2008-6-27 17:27:00 | 个人主页 | 引用 | 返回 | 删除 | 回复



Re:《ARM嵌入式Linux系统开发从入门到精通》勘误

我的电子邮件地址为:bwm_007@163.com

by bwm(游客) | 2008-5-29 15:13:00 | 个人主页 | 引用 | 返回 | 删除 | 回复



Re:《ARM嵌入式Linux系统开发从入门到精通》勘误

李老师:
你好!我完全按照您在书中的步骤进行交叉编译环境的建立,但是在编译glibc-2.3.2这一步的时候老是出现一下错误:
/tmp/ccoawU3W.s: Assembler messages:
/tmp/ccoawU3W.s:71: Error: junk at end of line, first unrecognized character is `,'
/tmp/ccoawU3W.s:73: Error: junk at end of line, first unrecognized character is `,'
make[2]: *** [/home/honghong/Basic_experiments/cross-tool/build-tools/build-glibc/intl/localealias.o] 错误 1
make[2]: Leaving directory `/home/honghong/Basic_experiments/cross-tool/build-tools/glibc-2.3.2/intl'
make[1]: *** [intl/subdir_lib] 错误 2
make[1]: Leaving directory `/home/honghong/Basic_experiments/cross-tool/build-tools/glibc-2.3.2'
make: *** [all] 错误 2
不知该怎么办,还要请教李老师啊,多谢啦!

以下为blog主人的回复:

 

该问题好多读者也遇到了,本人怀疑是glibc的一个bug,建议你使用crosstool工具编译来制作交叉编译器,这样就可以验证该glibc是否可以被正确运行。

by bwm(游客) | 2008-5-29 15:08:00 | 个人主页 | 引用 | 返回 | 删除 | 回复



Re:《ARM嵌入式Linux系统开发从入门到精通》勘误

我有个疑问,在本书中提到的liunx是那种Linux呢?
因为linux有好多版本的啊,什么uclinux,rtlinux在文中却没有说明.

以下为blog主人的回复:

 

你好,书中所用Linux是基于标准Linux内核的Linux操作系统,而uclinux,rtlinux等是经过修改标准Linux内核后的操作系统。

by 阿达(游客) | 2008-5-26 8:52:00 | 个人主页 | 引用 | 返回 | 删除 | 回复



Re:《ARM嵌入式Linux系统开发从入门到精通》

我是初学者,购买了您的书,能否告之哪里可购买S3C2410开发板(与您书中技术指标要求一致),按书中指导做下实验.请老师于百忙之中指导下发到我邮箱mike.choo@vip.163.com 非常感谢! 祝好! 朱

by mike.choo(游客) | 2008-5-24 13:25:00 | 个人主页 | 引用 | 返回 | 删除 | 回复



Re:《ARM嵌入式Linux系统开发从入门到精通》勘误

老师你好,我刚刚买了你的书,在做p41时出现以下错误,麻烦老师帮我分析一下,谢谢!!!
/tmp/ccSChCZL.s: Assembler messages:
/tmp/ccSChCZL.s:36: Warning: rest of line ignored; first ignored character is `@'
/tmp/ccSChCZL.s:37: Warning: rest of line ignored; first ignored character is `@'
/tmp/ccSChCZL.s:38: Error: no such instruction: `stmfd sp!,{r4,r5,lr}'
/tmp/ccSChCZL.s:39: Error: no such instruction: `ldr r5,.L10'
/tmp/ccSChCZL.s:40: Error: no such instruction: `ldrb r3,[r5,'
/tmp/ccSChCZL.s:41: Error: expecting operand after ','; got nothing
/tmp/ccSChCZL.s:42: Error: no such instruction: `ldmnefd sp!,{r4,r5,pc}'
/tmp/ccSChCZL.s:43: Error: no such instruction: `ldr r4,.L10+4'
/tmp/ccSChCZL.s:44: Error: no such instruction: `ldr r3,[r4,'
/tmp/ccSChCZL.s:45: Error: no such instruction: `ldr r2,[r3,'
/tmp/ccSChCZL.s:46: Error: expecting operand after ','; got nothing
/tmp/ccSChCZL.s:47: Error: no such instruction: `beq .L9'
/tmp/ccSChCZL.s:49: Error: no such instruction: `ldr r3,[r4,'
/tmp/ccSChCZL.s:50: Error: too many memory references for `add'
/tmp/ccSChCZL.s:51: Error: invalid char '[' beginning operand 2 `[r4'
/tmp/ccSChCZL.s:52: Error: too many memory references for `mov'
/tmp/ccSChCZL.s:53: Error: too many memory references for `mov'
/tmp/ccSChCZL.s:54: Error: no such instruction: `ldr r3,[r4,'
/tmp/ccSChCZL.s:55: Error: no such instruction: `ldr r2,[r3,'
/tmp/ccSChCZL.s:56: Error: expecting operand after ','; got nothing
/tmp/ccSChCZL.s:57: Error: no such instruction: `bne .L6'
/tmp/ccSChCZL.s:59: Error: no such instruction: `ldr r3,.L10+8'
/tmp/ccSChCZL.s:60: Error: expecting operand after ','; got nothing
/tmp/ccSChCZL.s:61: Error: no such instruction: `ldrne r0,.L10+12'
/tmp/ccSChCZL.s:62: Error: no such instruction: `movne lr,pc'
/tmp/ccSChCZL.s:63: Error: no such instruction: `movne pc,r3'
/tmp/ccSChCZL.s:65: Error: expecting operand after ','; got nothing
/tmp/ccSChCZL.s:66: Error: invalid char '[' beginning operand 2 `[r5'
/tmp/ccSChCZL.s:67: Error: no such instruction: `ldmfd sp!,{r4,r5,pc}'
/tmp/ccSChCZL.s:78: Warning: rest of line ignored; first ignored character is `@'
/tmp/ccSChCZL.s:79: Warning: rest of line ignored; first ignored character is `@'
/tmp/ccSChCZL.s:80: Error: invalid char '[' beginning operand 2 `[sp'
/tmp/ccSChCZL.s:82: Error: no such instruction: `bl __do_global_dtors_aux'
/tmp/ccSChCZL.s:84: Error: no such instruction: `ldr pc,[sp],'
/tmp/ccSChCZL.s:90: Warning: rest of line ignored; first ignored character is `@'
/tmp/ccSChCZL.s:91: Warning: rest of line ignored; first ignored character is `@'
/tmp/ccSChCZL.s:92: Error: no such instruction: `ldr r3,.L16'
/tmp/ccSChCZL.s:93: Error: expecting operand after ','; got nothing
/tmp/ccSChCZL.s:94: Error: invalid char '[' beginning operand 2 `[sp'
/tmp/ccSChCZL.s:95: Error: no such instruction: `ldr r0,.L16+4'
/tmp/ccSChCZL.s:96: Error: no such instruction: `ldr r1,.L16+8'
/tmp/ccSChCZL.s:97: Error: no such instruction: `movne lr,pc'
/tmp/ccSChCZL.s:98: Error: no such instruction: `movne pc,r3'
/tmp/ccSChCZL.s:100: Error: no such instruction: `ldr r0,.L16+12'
/tmp/ccSChCZL.s:101: Error: no such instruction: `ldr r3,[r0,'
/tmp/ccSChCZL.s:102: Error: expecting operand after ','; got nothing
/tmp/ccSChCZL.s:103: Error: no such instruction: `ldreq pc,[sp],'
/tmp/ccSChCZL.s:104: Error: no such instruction: `ldr r3,.L16+16'
/tmp/ccSChCZL.s:105: Error: expecting operand after ','; got nothing
/tmp/ccSChCZL.s:106: Error: no such instruction: `ldreq pc,[sp],'
/tmp/ccSChCZL.s:107: Error: no such instruction: `ldr lr,[sp],'
/tmp/ccSChCZL.s:108: Error: no such instruction: `b _Jv_RegisterClasses'
/tmp/ccSChCZL.s:120: Warning: rest of line ignored; first ignored character is `@'
/tmp/ccSChCZL.s:121: Warning: rest of line ignored; first ignored character is `@'
/tmp/ccSChCZL.s:122: Error: invalid char '[' beginning operand 2 `[sp'
/tmp/ccSChCZL.s:124: Error: no such instruction: `bl frame_dummy'
/tmp/ccSChCZL.s:126: Error: no such instruction: `ldr pc,[sp],'
make[1]: *** [crtbegin.o] Error 1
make[1]: Leaving directory `/home/whb/armlinux/build-tools/build-gcc/gcc'
make: *** [all-gcc] Error 2
[root@localhost build-gcc]#

以下为blog主人的回复:

 

该问题好多读者也遇到了,本人怀疑是glibc的一个bug,建议你使用crosstool工具编译来制作交叉编译器,这样就可以验证该glibc是否可以被正确运行。

by 读者(游客) | 2008-5-21 22:52:00 | 个人主页 | 引用 | 返回 | 删除 | 回复



Re:《ARM嵌入式Linux系统开发从入门到精通》勘误

你好,我在分步构建交叉编译链时 出现了一个问题
在这本书的40页, 配置编译内核使其生成正确的头文件时, 配置内核选择处理器的类型 在 ARM System Type下面没有Samsung S3C2410, 只有 Surrport ARM6 processor 和 Surrport ARM9 processor 和Surrport StrongARM processor

这是为什么?希望能解答!

by Tony(游客) | 2008-5-21 21:35:00 | 个人主页 | 引用 | 返回 | 删除 | 回复



Re:《ARM嵌入式Linux系统开发从入门到精通》勘误

您好,我在参考该书的61页到72页将u-boot移植到s3c2410时,遇到一个问题。在pc上交叉编译时,出现如下错误:(代码的完全按照书中所述、交叉编译器工作正常)
nand.c:41:error:'CFG_NAND_BASE' undecleared here(not in a function)
nand.c:41:error: initializer element is not constant
nand.c:41:error:(near initialization for 'base_address[0]')
make[1]:***[nand.o] Error 1
在u-boot源代码检查CFG_NAND_BASE时,发现有多个头文件定义了它,但都没有用到这些头文件,请问CFG_NAND_BASE 是不是要根据目标板自己定义?

以下为blog主人的回复:

 


是的

by 东东(游客) | 2008-5-17 9:32:00 | 个人主页 | 引用 | 返回 | 删除 | 回复



Re:《ARM嵌入式Linux系统开发从入门到精通》勘误

最近在做建立交叉编译链安装glibc时,make后有这样的错误:
/tmp/ccuvNa6j.s: Assembler messages:
/tmp/ccuvNa6j.s:71: Error: junk at end of line, first unrecognized character is `,'
/tmp/ccuvNa6j.s:73: Error: junk at end of line, first unrecognized character is `,'
make[2]: *** [/home/chenxunuo/armlinux/build-tools/build-glibc/intl/localealias.o] 错误 1
make[2]: Leaving directory `/home/chenxunuo/armlinux/build-tools/glibc-2.3.2/intl'
make[1]: *** [intl/subdir_lib] 错误 2
make[1]: Leaving directory `/home/chenxunuo/armlinux/build-tools/glibc-2.3.2'
make: *** [all] 错误 2

请问怎么解决?谢谢!

by aNuo(游客) | 2008-5-10 0:05:00 | 个人主页 | 引用 | 返回 | 删除 | 回复



新手请教

你好,
我两周前买了你的书,感觉很好。但因为此前对linux下的驱动开发不懂,所以现在有一些基本操作不会。能否指教?

开发linux下的驱动是不是应该这样:
1. 写所有需要的函数;
2. 编译成.object文件;
3. 当成模块添加的linux里面;

但是第三步我不知道具体该怎么做,能指导一下吗?

以下为blog主人的回复:

 

编写驱动程序不像你说的那么简单的三步,一般需要理解硬件实现原理,根据硬件功能设计驱动程序实现,最主要的工作也就是在设计驱动程序过程中,因为你的驱动程序不仅要满足硬件的功能还要不影响系统的性能。其次,一般驱动程序可以作为模块的形式加载到内核中,或者在配置内核时直接静态编译进内核。至于具体驱动程序的实现过程,我不能用简短的文字回答你。

by 王成城(游客) | 2008-5-3 17:14:00 | 个人主页 | 引用 | 返回 | 删除 | 回复



Re:《ARM嵌入式Linux系统开发从入门到精通》勘误

第12章(295页)那个configure可能有点问题,会编译不通过,在我vmware+redhat9下是这样。应该使用qt自带的freetype包,默认是系统那个。这样命令行应该是:./configure -embedded x86 -qvfb -qt-freetype,在arm下似乎不需要指定。我不知道大家都这样。
另外,12.2.1 frame buffer那个测试程序在哪里?光盘上没有。

以下为blog主人的回复:

 

由于疏忽没有将代码附到光盘上,你可以用下面的源代码自己编译:

 #i nclude <stdlib.h>
#i nclude <unistd.h>
#i nclude <stdio.h>
#i nclude <fcntl.h>
#i nclude <linux/fb.h>
#i nclude <sys/mman.h>
#i nclude <sys/ioctl.h>

int main()
{
int fbfd = 0;
struct fb_var_screeninfo vinfo;
struct fb_fix_screeninfo finfo;
long int screensize = 0;
char *fbp = 0;
int x = 0, y = 0;
long int location = 0;

// open the file for reading and writing
fbfd = open("/dev/fb0", o_rdwr);
if (fbfd == -1) {
perror("error: cannot open framebuffer device");
exit(1);
}
printf("the framebuffer device was opened successfully./n");

// get fixed screen information
if (ioctl(fbfd, fbioget_fscreeninfo, &finfo) == -1) {
perror("error reading fixed information");
exit(2);
}

// get variable screen information
if (ioctl(fbfd, fbioget_vscreeninfo, &vinfo) == -1) {
perror("error reading variable information");
exit(3);
}

printf("%dx%d, %dbpp/n", vinfo.xres, vinfo.yres, vinfo.bits_per_pixel);

// figure out the size of the screen in bytes
screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;

// map the device to memory
fbp = (char *)mmap(0, screensize, prot_read | prot_write, map_shared,
fbfd, 0);
if ((int)fbp == -1) {
perror("error: failed to map framebuffer device to memory");
exit(4);
}
printf("the framebuffer device was mapped to memory successfully./n");

x = 100; y = 100; // where we are going to put the pixel

// figure out where in memory to put the pixel
for (y = 100; y < 300; y++)
for (x = 100; x < 300; x++) {

location = (x+vinfo.xoffset) * (vinfo.bits_per_pixel/8) +
(y+vinfo.yoffset) * finfo.line_length;

if (vinfo.bits_per_pixel == 32) {
*(fbp + location) = 100; // some blue
*(fbp + location + 1) = 15+(x-100)/2; // a little green
*(fbp + location + 2) = 200-(y-100)/5; // a lot of red
*(fbp + location + 3) = 0; // no transparency
} else { //assume 16bpp
int b = 10;
int g = (x-100)/6; // a little green
int r = 31-(y-100)/16; // a lot of red
unsigned short int t = r<<11 | g << 5 | b;
*((unsigned short int*)(fbp + location)) = t;
}

}
munmap(fbp, screensize);
close(fbfd);
return 0;
}

 

 

by 碧月(游客) | 2008-4-19 15:15:00 | 个人主页 | 引用 | 返回 | 删除 | 回复



Re:《ARM嵌入式Linux系统开发从入门到精通》勘误

李老师:你好
我想问一下:
framebuffer是linux自己支持的吧,不需要做任何改动?
那我如何来测试我的fb是否正常呢?
我的dev下面只有一个fb的文件夹,里面什么东西都没有
这是正常的吗?

以下为blog主人的回复:

 

Linux内核中提供framebuffer机制,但是作为编写LCD驱动时,需要编写调用framebuffer提供API的驱动代码。关于如何测试framebuffer,请参考上面给出的测试程序。

 

by 影子(游客) | 2008-4-10 17:22:00 | 个人主页 | 引用 | 返回 | 删除 | 回复



Re:《ARM嵌入式Linux系统开发从入门到精通》勘误

你好!我是你的一位读者,我最近开始学习linux下的软件开发,最近试验2.2.2节中,用Crosstool工具构建交叉工具链时,按照上面的答复应该要切换用户。

我在winxp系统中有两个用户,一个是管理员,一个是普通用户。可在SYGWIN中就是切换不了用户,提示密码输入,按下键盘的任意键就是没有响应。
按下回车键后提示如下“su: incorrect password,or insufficient privileges to change user(see http://cygwin.com/sygwin-ug-net/ntsec.html#ntsec-setuid):Permission denied”。请问为什么切换不了用户?期待您的回复,谢谢。

以下为blog主人的回复:

 

根据提示,是由于你的权限不够,建议你使用虚拟机安装Linux系统进行制作交叉编译器。

by zyj(游客) | 2008-3-31 0:47:00 | 个人主页 | 引用 | 返回 | 删除 | 回复



Re:《ARM嵌入式Linux系统开发从入门到精通》勘误

求助:
在安装内核头文件时,按照书上敲入命令,发现include/linux内没有version.h,后来敲入:make进行编译,却出现错误:
CC arch/i386/kernel/asm-offsets.s
In file included from include/asm/thread_info.h:17,
from include/linux/thread_info.h:21,
from include/linux/spinlock.h:12,
from include/linux/capability.h:45,
from include/linux/sched.h:7,
from arch/i386/kernel/asm-offsets.c:7:
include/asm/processor.h:68: 错误:‘CONFIG_X86_L1_CACHE_SHIFT’ 未声明 (不在函数内)
include/asm/processor.h:68: 错误:要求的对齐边界不是常量
make[1]: *** [arch/i386/kernel/asm-offsets.s] 错误 1
make: *** [arch/i386/kernel/asm-offsets.s] 错误 2
然后我在FC4下做,出现同样的错误,我不知道怎么回事.我用的是红旗linux server4.0,和redhat9.0一样。

以下为blog主人的回复:

 

应该是内核配置问题,请检查配置内核选项是否正确。

by 求助(游客) | 2008-3-27 19:17:00 | 个人主页 | 引用 | 返回 | 删除 | 回复



Re:《ARM嵌入式Linux系统开发从入门到精通》勘误

我刚刚开始做嵌入式系统的课题时间并不太久,您的这本教材给了我很大的其实和帮助,我在按照您书中提供的方法建立交叉工具编译链时,当进行到39页
#../ binutils-2.15/configure --target=$TARGET --prefix=$PREFIX
这一条命令时,屏幕显示
-bash: ../: is a directory
当我把../换成binutils-2.15的绝对路径执行后,屏幕出现了几条check信息,接着上出现CC:command not found
***the command 'cc -o confest -g confest.c' faild
***You must set the environment variable CC to a working compiler
接着执行# make和# make install命令,屏幕均显示为
make:***No target specified and no makefile found.Stop.
请教您我是在哪里出现了问题,该怎样才能解决啊?

以下为blog主人的回复:

 

怀疑是环境变量或配置制定的路径不正确引起。

by jesfei(游客) | 2008-3-10 17:17:00 | 个人主页 | 引用 | 返回 | 删除 | 回复



Re:《ARM嵌入式Linux系统开发从入门到精通》勘误

您好:
我在用的MYBIOS时出现如下问题,请分析一下是什么原因:
在读nandflash的数据到ram时,读完3个PAGE后就在下面的for语句中做死循环:
for(i=0; i<512; i++)
buf[i] = RdNFDat();
NFChipDs();
}
这时AXD中显示的内存地址为:0x30200600.
make时没有出现问题.
串口打印如下:
************************************
* Welcome study ARM & Linux *
************************************
Read chip id = ec76
Nand flash status = c0
The LoadRun function is called!
cptoram =
cptoram =
cptoram =
" cptoram ="是我设置的打印,每读一page打印一次.

by jeef(游客) | 2008-3-9 22:45:00 | 个人主页 | 引用 | 返回 | 删除 | 回复



Re:《ARM嵌入式Linux系统开发从入门到精通》勘误

你好,书中第41页,还有一个错误的地方:
“6.建立glibc库”的上面一段中“/home/mike/armlinux/tools/bin”应该为“/tools/bin”,不知道是不是因为我用的ubuntu7.10版本的原因,我在你提供的路径下面找不到,但在/tools/bin目录下找到了arm-linux-gcc等工具。

以下为blog主人的回复:

 

这个路径根据你编译时配置选项所定。

by ottor(游客) | 2008-3-2 13:17:00 | 个人主页 | 引用 | 返回 | 删除 | 回复



Re:《ARM嵌入式Linux系统开发从入门到精通》勘误

请教一个问题:我在安装编译boot-trap gcc时,make后出现如下错误:make[2]: arm-linux-ar:命令未找到
make[2]: *** [libgcc.a] 错误 127
make[2]: Leaving directory `/home/jeef/armlinux/build-tools/build-gcc/gcc'
make[1]: *** [libgcc.a] 错误 2
make[1]: Leaving directory `/home/jeef/armlinux/build-tools/build-gcc/gcc'
make: *** [all-gcc] 错误 2
但是我在bin文件架下发现已经有这个命令。

以下为blog主人的回复:

 

应该是环境变量PATH路径指定不正确导致。

by jeef(游客) | 2008-2-21 22:48:00 | 个人主页 | 引用 | 返回 | 删除 | 回复



Re:《ARM嵌入式Linux系统开发从入门到精通》勘误

我按书中做2.2.1与2.2.2都无法做出。
1、2.2.1中的6.建立glibc库时,在build-glibc下仅产生1个config.log文件其他什么也没有是什么回事?
2、2.2.2中的4.执行脚本时./arm.sh出错。也不知道怎么回是。
我用的是fedora8(linux2.6.23,你书中例子与linux版本有关?或与fedora中的软件包设置有关?能否给个回答。
建议你在改版时,能够在书前介绍一下你的系统设置,让读者能够将系统配置与你书中相同,否则很难得到正确的结果。

以下为blog主人的回复:

 

1.首先检查一下你的配置是否有问题,也就是执行configure时选项有没有正确,执行./configure后会产生makefile文件。

2.执行./arm.sh执行错误有可能是crosstool本身的一个bug,请参考我blog中该问题的解决方法。

 一般情况下驱动程序是和内核版本有关系的,应用程序和内核版本的关系不大。

by pth(游客) | 2008-2-10 17:52:00 | 个人主页 | 引用 | 返回 | 删除 | 回复



Re:《ARM嵌入式Linux系统开发从入门到精通》勘误

ARM嵌入式Linux系统开发从入门到精通是一本很好的书,在学习中碰到一些问题,希望很大家交流,共同学习
QQ:13363958 msn lufengjie@live.cn

by 小路(游客) | 2008-1-16 17:57:00 | 个人主页 | 引用 | 返回 | 删除 | 回复



有问题想问一下

我是一名初学者,我第二张都看完了,可是里面都已经介绍了很多操作过程,比如交叉编译什么的。可我不知道在电脑怎么操作,也按你书上所说的步骤去下载了软件,但后面就不知道怎么做了,希望给予解释。谢谢

以下为blog主人的回复:

 

你好!我收到过许多读者的来信,他们根据我书上的步骤都成功做出来过交叉编译器,当然中间确实出现过一些问题,所以我建议你按书中所写的步骤做一遍,当你遇到问题时请发信告诉我,这样便于你做出自己的交叉编译器,你现在提出的问题太笼统,我没办法给你回答。

by 令君(游客) | 2007-12-17 16:19:00 | 个人主页 | 引用 | 返回 | 删除 | 回复



Re:《ARM嵌入式Linux系统开发从入门到精通》勘误

你好,我是一个初学者,刚买了你的这本书当看到2.2.2章节是出现了问题想请教一下,当把环境变量添加后,前面按照书上做的一切正常,测试hello.c
时当输入执行#arm-linux-gcc -o hello hello.c 结果提示bash:arm-linux-gcc :command not found,不知道何故?看了一下在/opt/crosstool/gcc-3.6.3-glibc-2.3.2/arm-linux/bin目录下面有arm-linux-gcc这个文件啊?环境变量也是按照书上写的,怎么会不对呢?

以下为blog主人的回复:

 

应该是环境变量的PATH路径没有指定正确!

by hilter(游客) | 2007-12-10 1:39:00 | 个人主页 | 引用 | 返回 | 删除 | 回复



Re:《ARM嵌入式Linux系统开发从入门到精通》勘误

以下引用xwf72(游客)在2007-12-5 20:20:00发表的评论:

undefined


未定义???什么undefined 按书上一步步做的,为何没有呢?要不两个文件都不存在。怎么只存在一个?

以下为blog主人的回复:

 

 

不好意思,这是本书出现的一个失误,你需要执行make编译之后才会产生version.h文件。

by zero(游客) | 2007-12-6 0:28:00 | 个人主页 | 引用 | 返回 | 删除 | 回复



Re:《ARM嵌入式Linux系统开发从入门到精通》勘误

undefined

by xwf72(游客) | 2007-12-5 20:20:00 | 个人主页 | 引用 | 返回 | 删除 | 回复



Re:《ARM嵌入式Linux系统开发从入门到精通》勘误

我在做到 40p 时 输入命令是:
#make ARCH=arm COSS_COMPLILE=arm-linux- menuconfig 后检查目录include/linux下是否有 version.h 和 autoconf.h时候,只能看到有 autoconf.h 而看不到version.h 不知道这个是为什么?

以下为blog主人的回复:

 

 

不好意思,这是本书出现的一个失误,你需要执行make编译之后才会产生version.h文件。

by xwf72(游客) | 2007-12-5 20:19:00 | 个人主页 | 引用 | 返回 | 删除 | 回复



Re:《ARM嵌入式Linux系统开发从入门到精通》勘误

作者,您好!
我刚购买您的这本书,感觉真的不错,非常适合我。目前我也正好在做相关的项目。看到第二章,碰到了和上面一位朋友(清风)一样的问题。
我的做法和他一样,系统也提示不成功;另外,如果我不用mike做文件夹名,而用别的名字(比如David),当然也改了arm.sh文件中的相关地方(把/home/mike/downloads改为/home/David/downloads),运行./arm.sh时,系统提示找不到文件。
比较着急,自己一时无法解决,盼望您的指点和解答,谢谢!
我的E-mail:huaxin@wxzte.com,也请感兴趣的朋友帮忙和交流!

以下为blog主人的回复:

 

该问题你可以参考我对(清风)的回答,应该和你的问题是一个。再一个关于你提到的把文件名mike替换为David等,这个完全没有问题,书中以mike作为一个例子,文件名你可以任意取,但是保证你的脚本中指定的路径能找到你的编译工具文件就可以。

 

by DavidHua(游客) | 2007-11-21 11:53:00 | 个人主页 | 引用 | 返回 | 删除 | 回复



Re:《ARM嵌入式Linux系统开发从入门到精通》勘误

我是一名初学者,觉得你的书写的非常适合我,很多概念都清楚了,非常感谢你.
现有个问题请教您:在学习第二章时,2.2.2节,我用您书中的方法做了,但不成功.提示说有的设置重复了,有的没设置,总之不能执行arm.sh脚本.
我是这样做的:将6个资源拷贝到downloads下,一个拷到mike下解压,然后将光盘提供的arm.sh,arm.dat,gcc-3.3.6-glibc-2.3.2.dat拷贝到mike/crosstool-0.42下,然后执行脚本arm.sh.不成功,希望您帮忙看下问题出在哪?期待您的答复.谢谢!!!

以下为blog主人的回复:

 

你好,很高兴看到你提出的这个问题,该问题我也发现了,我怀疑是crosstool工具本身的一个bug,不过可以通过这种方式来解决:首先假设你是以root方式登录的系统,你在执行./arm.sh脚本时,它会提示错误建议你不要用root权限执行这个脚本。这个时候你切换以用户权限登录,比如执行:su mike   (切换到以mike用户登录),这个时候你再执行./arm.sh脚本,它又会提示错误说权限不够,所以不能执行。这个时候你再执行:su    切换到root登录,这个时候再执行./arm.sh就可以编译了。希望我回答的这个问题就是你所遇到的这个问题。

 

 

by 清风(游客) | 2007-11-15 23:52:00 | 个人主页 | 引用 | 返回 | 删除 | 回复



一位读者请教问题

你好!我是你的一位读者,我最近开始学习linux下的软件开发,我的问题是:linux下很多软件包的makefile文件都是自动生成的,这样我们下载后执行#./configure

#make

#make install 就可以了,但是这种情况下编译器肯定是用的gcc,我现在要编译可以在uclinux下执行的代码,应该怎么办呢??

我看到你在书第2章介绍交叉编译工具的时候有这么一句话:

#./configure --target=arm-linux.............是不是加上这个选项生成的Makefile文件执行#make时就使用arm-linux-gcc了呢? 我仿照上面写了

#./configure --target=arm-elf 发现不能达到我的目标,请问问题出在哪?还有我发现你在编译内核时有这样一条指令

#make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig这是不是和上面的意思一样,告诉使用arm-linux-gcc编译器???

期待你的回复,谢谢!!

以下为blog主人的回复:

 

 

关于在普通PC机上编译uclinux程序,首选你需要安装关于uclinux的交叉编译器,假如你的目标板是ARM平台,那么你的交叉编译器的名字就应该为:arm-uclibc-gcc

安装好交叉编译器后,你在编译单个文件时,就把平时用的gcc命令替换为arm-uclibc-gcc就可以编译成uclinux可执行的程序。如果用make时,就可以用make CROSS_COMPILE=arm-uclibc- 选项替代make CROSS_COMPILE=arm-linux- 选项。

by zssmcu(游客) | 2007-11-14 13:39:00 | 个人主页 | 引用 | 返回 | 删除 | 回复



Re:《ARM嵌入式Linux系统开发从入门到精通》勘误

第二位读者的刊物信:

你好:
我是一名ARM linux的初学者,从你的书中收益很大,你的书逻辑性强,条理清晰,是一本不可多得的好书,真的很感谢你写了这样一本好书。
你的书P103页的最下一行:“BusyBox是很多标准Linux工具的单个可执行实现。”时是否应该为:“BusyBox是很多标准Linux工具的单个可执行实现工具”。另外介绍busybox这个工具时,用下面的比喻不错:“busybox是一个集成了100多个最常用linux命令和工具的软件,平时用的linux命令好比分立的电子元件,而busybox好比一个集成电路,把常用的工具和命令集成压缩在一个可执行文件里,功能基本不变,而容量却小了许多倍,非常有利于嵌入式系统设计。”这样让初学者更容易看明白。
书P105页的第七行:“文件的符合连接,”应为“符号连接”。
总之,你的书不错,谢谢你,期待你的新书。

湖南科技大学物理学院电子系
姓罗的学生

2009-12-16 09:37:00 Linuxdianc 阅读数 0

 

随着超大规模集成电路的发展,计算机处理器技术不断提高,计算机芯片的处理能力越来越强,体积越来越小,计算机技术应用到生活的方方面面。与人们日常生活打交道最多的就是嵌入式系统,从目前广泛使用的手机、MP3播放器到家用电器,嵌入式系统的应用无处不在。嵌入式系统的开发占整个计算机系统开发的比重也越来越高。

嵌入式系统开发与传统的PC程序开发不同。嵌入式系统开发涉及软件硬件的开发,是一个协同工作的统一体。目前,已经有许多的嵌入式系统硬件和操作系统软件,其中应用最广泛的是ARM嵌入式处理器和Linux系统,本书也将以ARM处理器和Linux作为讲解对象,帮助读者进入嵌入式开发领域。

目前嵌入式开发的书籍种类繁多,但是内容都比较有针对性。主要可以分成3类,一类是侧重嵌入式硬件开发;一类侧重嵌入式操作系统原理和设备驱动开发;还有一类是针对嵌入式系统应用程序开发。由于以上3类图书都是针对某个特定领域编写的,内容针对性强,不便于初学者学习。

本书从嵌入式初学者的角度出发,力求由浅入深地介绍嵌入式系统开发的各部分知识,帮助初学者快速进入嵌入式开发领域,掌握嵌入式开发的基本技术。

本书特色

1.配视频讲解光盘

为了让读者更加快速、直观地学习本书内容,作者专门为本书录制了大量多媒体语音视频进行讲解,读者可以结合视频讲解更高效地学习,学习效果更好。

2.循序渐进,由浅入深

为了让初学者快速进入嵌入式系统开发领域,本书一开始对嵌入式系统的软件和硬件做了全面的介绍,让读者对嵌入式系统有一个基本的认识。同时,在书中讲解的知识点都配备了完整的实例,读者可以通过实例学习嵌入式系统开发的相关知识。

3.技术全面,内容充实

作者本人从事嵌入式系统开发多年,深入了解嵌入式系统开发的各个方面,在书中讲解了嵌入式Linux开发的各个要点,包括Linux内核的构成、工作流程、驱动程序开发、文件系统、程序库等知识,使读者全面了解嵌入式Linux开发的各个知识点。

4.实例讲解,理解深刻

嵌入式Linux开发书籍众多,很多书籍偏重理论。本书所有的实例都经过作者验证,并且有详细的操作过程和实验结果。其次,本书的操作实例有完整的实验环境描述,读者可以通过实例加深对知识点的理解。

5.化整为零,深入剖析

嵌入式系统开发涉及知识面广,技术复杂。本书剥茧抽丝,力求找出开发过程中关键的知识点。从关键点入手,通过简单易懂的例子剖析技术原理,帮助读者掌握复杂的技术。

本书内容

1章:介绍嵌入式系统的基本概念。本章从日常生活的例子入手,给读者对嵌入式系统一个初步认识。然后介绍了嵌入式系统的发展历程,以及基本的嵌入式系统开发知识。

2章:嵌入式软件和硬件知识。从模拟电路和数字电路的对比入手,介绍嵌入式系统硬件的基本知识。在此基础上,讲解软件的基本概念和开发流程,最后是操作系统的基础知识。

3章:全面介绍ARM处理器。先比较了微控制器和微处理器的异同,然后介绍ARM嵌入式处理器。讲解ARM处理器的指令集和结构,最后是处理器选型需要考虑的因素。

4章:引入本书的重点——嵌入式Linux操作系统。本章可以分成两部分,前半部分介绍常见的几种嵌入式操作系统,通过对比得出Linux系统在嵌入式领域的优势。后半部分讲解嵌入式Linux相关的知识。

5章:本章介绍如何搭建一个嵌入式Linux系统的开发环境。嵌入式Linux系统开发可以在Linux系统上进行,也可以在其他系统(如Windows系统)上进行。因此,本章介绍了在两种平台下搭建开发环境的知识点,并且给出了详细的操作步骤。

6章:由一个最基本的Linux应用程序入手,讲解应用程序的工作原理和工作流程。最后还介绍了Linux管理编译程序的方法。

7章:讲解Linux应用程序开发的关键技术之一,如何操作内存和文件。内存和文件是应用程序使用最多的两种资源。

8章:讲解多线程和多进程程序开发。多线程和多进程程序可以提高应用程序的并发处理能力,是现代计算机应用中重要的技术。

9章:讲解目前应用最广泛的网络功能,如何在应用程序中通过套接字在网络中传输数据。

10章:串口是嵌入式系统应用最广泛的基本数据传递方式之一,本章讲解串口的基本工作原理、在应用程序中使用串口传递数据。

11章:图形界面是嵌入式系统的一个热点。本章讲解了如何开发嵌入式系统的图形界面,以应用广泛的Qt图形程序库为例,讲解了嵌入式系统移植和开发Qt程序的全        过程。

12章:嵌入式系统开发通常涉及多个人相互协作,软件管理的必要性尤为突出。本章讲解了嵌入式系统开发中常见的集中软件管理方法。包括文档管理、代码管理等。每种管理方法都是基于实际的管理软件,并且给出了实际的操作过程。

13章:本章在第3章的基础上深入讲解ARM处理器。主要内容包括ARM处理器的体系结构、编程模型、内存管理、外部设备访问等关键技术。在最后给出S3C2440 ARM处理器的操作实例。

14章:讲解Bootloader工作原理。介绍了嵌入式系统常见的集中Bootloader,以U-Boot为例讲解了Bootloader的工作原理,移植U-BootARM开发板等知识。

15章:解析Linux内核。包括Linux内核的代码工程结构,主要工作原理等知识。本章内容理论较多,需要结合相关章节理解。

16章:Linux内核启动过程涉及到软硬件多方面知识,学习Linux内核启动过程对理解Linux内核结构有很大帮助。

17章:讲解Linux文件系统工作原理和制作方法。以ARM平台为例制作嵌入式Linux系统常用的闪存文件系统。

18章:讲解嵌入式Linux系统开发交叉编译工具链的创建和使用。

19章:介绍嵌入式Linux常用的命令系统BusyBox工作原理、裁剪和交叉编译等知识。

20章:讲解嵌入式Linux内核移植的全部过程。

21章:介绍Linux内核和应用程序的调试技术。

22章:讲解Linux系统设备驱动程序开发的基本知识,包括设备驱动的分类、特点、内核模块编写实例。在最后给出了一个字符设备开发实例。

23章:在第22章的基础上详细讲解Linux网络设备驱动开发,描述Linux内核网络体系结构,并且用实例分析了DM9000网络适配器驱动程序。

24章:这一章讲解嵌入式系统中广泛应用的Flash设备驱动程序开发,用实例分析了NORNAND Flash设备驱动。

25章:讲解USB体系结构和设备驱动开发。内容包括USB接口标准、工作流程等,最后给出了USB设备驱动开发实例。

本书读者对象

q      嵌入式系统移植程序员

q      嵌入式系统应用程序开发人员

q      大中专院校的学生

q      社会培训学生

2011-12-30 14:17:10 xiaomifengxxxx 阅读数 613
 ARM嵌入式Linux系统开发从入门到精通