嵌入式linux

作为一个新人,怎样学习嵌入式Linux?(转载)

一个人想着一个人 提交于 2019-12-15 21:37:55
特此声明此文章为转载,如有侵犯,请告知删除。 原文章地址:http://blog.sina.com.cn/s/blog_7880d33501013j2r.html 作为一个新人,怎样学习嵌入式Linux?被问过太多次,特写这篇文章来回答一下。 在学习嵌入式Linux之前,肯定要有C语言基础。汇编基础有没有无所谓(就那么几条汇编指令,用到了一看就会)。 C语言要学到什么程度呢?越熟当然越好,不熟的话也要具备基本技能。比如写一个数组排序、输入数字求和什么的。 学C语言唯一的方法是多写程序多练习,编译出错没关系,自己去解决;执行出错没关系,自己去分析。以前我是用 VC来练习C语言的,经常去尝试着写一些C语言竞赛的题目。它们是纯C、纯数学、纯逻辑的题目,不涉及界面这些东西, 很适合煅炼你的编程能力。 回到主题,首先我们要明白你的目的是什么,大概来说所谓嵌入式Linux可以分为两部分:底层系统、应用开发。 如果你是想做应用开发,那么你去把C语言、数据结构、JAVA什么的学好吧。嵌入式应用开发和PC上的 应用开发并没有什么特别要注意的。也许你说在嵌入式上要做些优化,是的,要优化,但是未经优化的程序 和PC上的程序开发没什么差别。另外,当你有能力去优化时,你已经不用来问这个问题了。具体到某个例子, 比如说开发界面,在PC上我们用VC;在嵌入式Linux里也许我们用QT也许用Android

嵌入式Linux系统:基础知识_虚拟内存与物理内存

血红的双手。 提交于 2019-12-13 12:04:54
在很久以前,还没有虚拟内存概念的时候,程序寻址用的都是物理地址。程序能寻址的范围是有限的,这取决于CPU的地址线条数。比如在32位平台下,寻址的范围是2^32也就是4G。并且这是固定的,如果没有虚拟内存,且每次开启一个进程都给4G的物理内存,就可能会出现很多问题: 物理内存是有限的,当有多个进程要执行的时候,都要给4G内存,很显然你内存小一点,这很快就分配完了,于是没有得到资源的进程就只能等待。当一个进程执行完了以后,再将等待的进程装入内存。这种频繁的装入内存的操作是很没效率的, 由于指令都是直接访问物理内存的,那么我这个进程就可以修改其他进程的数据,甚至会修改内核地址空间的数据,这是我们不想看到的。 因为内存是随机分配的,所以程序运行的地址也是不正确的。 于是针对上面会出现的各种问题,虚拟内存就出来了。 每一个进程运行时都会得到4G的虚拟内存。这个虚拟内存你可以认为,每个进程都认为自己拥有4G的空间,这只是每个进程认为的,但是实际上,在虚拟内存对应的物理内存上,可能只对应的一点点的物理内存,实际用了多少内存,就会对应多少物理内存。 进程得到的这4G虚拟内存是一个连续的地址空间(这也只是进程认为),而实际上,它通常是被分隔成多个物理内存碎片,还有一部分存储在外部磁盘存储器上,在需要时进行数据交换。 进程开始要访问一个地址,它可能会经历下面的过程: 每次我要访问地址空间上的某一个地址

linux下IO口模拟I2C的一些总结

非 Y 不嫁゛ 提交于 2019-12-09 21:13:37
以前一直在用I2C接口,因为总是有线程的例子就一直没有去深入的了解,今天分析了一下在linux下通用GPIO模拟I2C的程序。 I2C的驱动是用杂项设备实现的,这也是一种比较简单的实现方式。通过 misc_register(&mygpioi2c_dev);来注册自己的杂项设备,此函数中会自动创建设备节点,即设备文件。无需mknod指令创建设备文件。因为misc_register()会调用class_device_creat或者device_creat。主设备号也不用管,是最简单的一种驱动了。注册后通过miscdevice结构体关联的file_operations的操作来实现驱动程序的open,read,write接口。 [cpp] view plain copy static struct file_operations gpioi2c_fops = { .owner = THIS_MODULE, .ioctl = gpioi2c_ioctl, .open = gpioi2c_open, .release = gpioi2c_close }; 具体的操作在IOCTL中实现 [cpp] view plain copy int gpioi2c_ioctl( struct inode *inode, struct file *file, unsigned int cmd,

基于s5pv210嵌入式linux系统sqlite3数据库移植

为君一笑 提交于 2019-12-07 09:20:44
基于s5pv210嵌入式linux系统sqlite3数据库移植 1、下载源码 http://www.sqlite.org/download.html 最新源码为3080100 2、解压 tar xvf XXXXX 3、配置编译环境 运行 ./configure –host=你的交叉编译工具的前缀 –prefix=你想编译安装的位置 我的host为arm-none-linux-gnueabi,prefix为/home/linux/sqlit3-arm 运行后会生成Makefile文件。 4、编译并安装 编译:make 安装:make install 安装完成后会在你设定的目录下生成安装好的文件: bin、include、lib、share bin:为编译完成的sqlite3可执行文件 include:开发数据库程序时需要引用的头文件 lib:开发数据库程序需要引用的库文件,当然sqlite3可执行文件运行也得需要 share:说明文件 5、移植 将bin下的sqlite3可执行文件拷入你自己制作的busybox文件系统相应的目录; 将include下的所有文件拷入制作的busybox文件系统下的/usr/include文件夹下,如果没有该目录自己建立并拷入; 将lib文件夹下的所有文件拷入busybox文件系统的/lib目录下, 从上面可以看出两个软链接文件都是生成自本目录

嵌入式软件环境构建:uboot、kernel、rootfs、app布局(转载)

瘦欲@ 提交于 2019-12-06 06:26:06
嵌入式开发涉及硬件和软件两部分,个人目前主要是做嵌入式软件部分,使用uboot+linux的整体方案。这里所说的“嵌入式软件环境”,不是指宿主机上的嵌入式开发环境,而是指目标机中的运行软件环境,只是简要介绍一种布局及相应的实现步骤。 一、软件环境的布局 开发板的datasheet中都有详细的地址空间的划分,其中比较重要的两块是:DDR地址空间和Flash地址空间。DDR空间是系统和应用的运行空间,一般由linux系统自身进行使用和管理;Flash空间是系统和应用载体的存放空间,一般需要在使用前进行划分,由应用开发者进行管理。在这里以我现在正在做的项目进行简单的示例和说明。 其中,Flash的整体地址空间为:0x34000000~0x34FFFFFF,共16MB,使用的是Nor Flash芯片。布局需要做的工作是: 确定uboot二进制文件的大小,使用的地址范围 确定linux kernel镜像文件的大小,使用的地址范围 确定rootfs 根文件系统的镜像文件大小,使用的地址范围 估计整体应用方案所需的空间大小,选择可使用的地址范围 完成上述工作后,项目的布局如下: uboot:0x34000000~0x34080000, 512KB kernel : 0x34080000~0x34180000, 1MB, 文件大小为952.8KB rootfs : 0x34180000

韦东山嵌入式Linux学习笔记07--Nandflash

ぃ、小莉子 提交于 2019-12-05 15:45:57
jz2440 v3上面用的nandflash是 K9F2G08U0C, 大小为256MB. 一个页的大小为(2k+64)byte,一个块的大小为(128k+4k)byte,原理图如下: nand的命令集: 那应该如何访问nand里面的数据呢?只要读写s32440的相关寄存器,就可以驱动nand的一些引脚. Makefile objs := head.o init.o nand.o main.o #依赖于这些文件 nand.bin : $(objs) arm-linux-ld -Tnand.lds -o nand_elf $^ #链接nand.lds $^表示所有依赖目标的集合 arm-linux-objcopy -O binary -S nand_elf $@ #规则中的目标文件集 arm-linux-objdump -D -m arm nand_elf > nand.dis %.o:%.c arm-linux-gcc -Wall -c -O2 -o $@ $< %.o:%.S arm-linux-gcc -Wall -c -O2 -o $@ $< clean: rm -f nand.dis nand.bin nand_elf *.o nand.lds SECTIONS { firtst 0x00000000 : { head.o init.o nand.o} /

嵌入式Linux全攻略 ACE程序移植过程详细讲解

徘徊边缘 提交于 2019-12-05 00:17:11
1、在安装有Linux操作系统的PC上安装交叉编译器,笔者使用的是Moxa tool chain for DA66x,(其它的嵌入式Linux系统都是一样的做法),可以从 Moxa网站上下载 :   2、将ACE程序包下载到Linux PC上,并解压   3、设置环境变量:   A、交叉编译工具的路径:export PATH=“/usr/local/xscale_be/bin:$PATH”   B、ACE_ROOT:export ACE_ROOT=“/home/jun/ACE_wrappers”(根据实际路径设置)   4、将$ACE_ROOT/ace/config-linux.h复制成$ACE_ROOT/ace/config.h   cp $ACE_ROOT/ace/config-linux.h $ACE_ROOT/ace/config.h   5、将$ACE_ROOT/include/makeinclude/platform_linux.GNU复制成   $ACE_ROOT/include/makeinclude/platform_macros.GNU并修改   $ACE_ROOT/include/makeinclude/platform_macros.GNU文件:   添加:   CC = xscale_be-gcc   CXX = xscale_be-g++   删除:  

韦东山嵌入式Linux学习笔记05--存储管理器

。_饼干妹妹 提交于 2019-12-04 15:55:41
问题 :   为什么两个DDR可以合在一起变成32位? SDRAM:    原理图如下:    jz2440 v3开发板上面用的内存芯片为钰创科技公司生产的EM63A165TS,一片内存大小为32MB大小,一共有两块,共64MB的大小. SDRAM接的是BANK 6,所以他的起始地址是 0x30000000. SDRAM的基本寻址关系 SDRAM的存储结构逻辑如上图, SDRAM内部是一个存储阵列,阵列就如同表格一样,将数据"填进去".和表格的检索原理一样,先指定一个行,再指定一个列,两点确定一个坐标,就可以准确地找到所需要的 单元格,这就是SDRAM寻址的基本原理.这个单元被称为存储单元,这个表格(存储阵列)就是逻辑Bank(就是L-Bank).SDRAM一般含有四个L-Bank. 对SDRAM的访问可以分为如下几个步骤:   1.CPU发出的片选信号nSCS0有效,它选中SDRAM芯片.   2.SDRAM有四个L-Bank,需要两根地址线来选中其中的一个,根据开发板的设计, 选用了ADDR24和ADDR25作为L-Bank的选择信号.   3.对被选中的芯片进行统一的行/列(存储单元)寻址.     根据SDRAM芯片的列地址线数目设置CPU的相关寄存器后,CPU就会从32位的自动分出L-Bank选择信号, 行地址信号,列地址信号,然后发出行地址信号,列地址信号. L

BusyBox制作Initramfs嵌入式Linux根文件系统

被刻印的时光 ゝ 提交于 2019-12-04 12:42:37
嵌入式Linux系统由linux内核与根文件系统两部分构成,两者缺一不可(无根文件系统的内核无法启动) 使用busybox构建嵌入式根文件系统目录结构,配置内核,并且使用Initramfs制作成根文件系统,根文件系统与内核都一起烧写在镜像中 起步骤如下; 创建目录结构 根目录的目录结构主要包含如下目录 /dev /etc /lib /usr /var /proc /tmp /home /root /mnt /bin /sbin /sys 1:创建一个目录 /forlinx/rootfs(根据实际情况选择目录创建在哪个路径下) mkdir /forlinx/rootfs 2:在/forlinx/rootfs的目录下创建如下目录 cd /forlinx/rootfs mkdir dev usr bin sbin lib etc dev proc tmp sys var root mnt 使用busybox构建/bin /sbin 目录 使用busybox创建根目录下/bin /sbin等目录下面的文件 下载、解压busybox源码:busybox-1.23.2.tar.bz2 tar xjf busybox-1.23.2.tar.bz2 进入解压busybox后的文件夹目录 cd /forlinx/busybox-1.23.2/ 执行如下指令,并配置 make distclean

韦东山嵌入式Linux学习笔记04--点亮开发板的一个LED灯

╄→尐↘猪︶ㄣ 提交于 2019-12-04 12:32:48
搜索开发板原理图LED的走线 LED8是网线接口的指示灯. 在这里我们尝试用汇编代码控制D10, 也就是LED1,它连接到EINT4/GPF4,读取芯片手册 有原理图可知,如果需要点亮LED1,需要控制s3c2440的GPF4引脚输出低电平. GPFCON = 0x56000050 GPFDAT = 0x56000054 GPFUP = 0x56000058 ========================= 直接set 0x56000050 = 0x100 设置GPF4为引脚为输出模式 set 0x56000054 0x00 设置GPF4输出电平为0 set 0x56000058 0x10 不使能GPF4内部拉高 这样就可以控制改灯常亮,汇编应该怎么写? 首先需要配置交叉工具链才能够编译代码,请参照链接: https://jingyan.baidu.com/article/647f01151899607f2148a8f2.htm source /etc/profile 使生效 表示已经生效. 如果仍然提示找不到命令,就像下图一样 运行 arm-linux-gcc -v的时候也提示 bash: /usr/local/arm/2.3.6/bin/arm-linux-gcc: No such file or directory 这时候应当注意,因为未安装32位库,执行sudo apt