嵌入式linux

嵌入式linux学习笔记--20200224--JZ2440V3-S3C2440的Nor Flash启动流程分析以及参数修改测试

怎甘沉沦 提交于 2020-02-24 20:32:00
NOR Flash 是一种常见的存储设备。它可以向内存一样的读,但是不可以像内存一样写。 因为它的这一特性很多的嵌入式linux 设备都会有一块NOR flash 作为启动的芯片。在系统一上电之后就可以直接开始运行程序,执行初始化操作。但是由于价格的原因,NOR flash 一般都不会很大大多都是用作启动的芯片的(我觉得用来放boot loader 也是非常棒的 用来实现ISP 会简单很多) 我们先来分析开发板的主控芯片 S3C2440 ,很老很老的一款芯片了,也就比我小几岁。 这是S3C2440 不同的启动模式对应的内存图。 主要是两大类,一类是 NAND启动,一类是非NAND。 当进行nand启动的时候 CPU 会自动云心内部的程序把 NANDFlash 上面的前 4K的数据拷贝到片内仅有的 4K内存上 这时候这一段内存对应的地址就是0~ 4095 (程序上电是从 0地址开始运行的 ) 当启动模式是非 NAND 启动的时候(NOR启动) 程序是直接从0地址开始运行的 片内的4K ram 的地址变成 0x4000 0000以及之后的4K 空间 接下来我们分析一下时序部分 根据时序图 我们可以知道 读取的 时序的逻辑是 先发送地址线(A24:A0) 然后发送指定的片选线 nGCSx 和nOE(输出使能) 这是 JZ2440 开发板的 NOR flash 芯片我的 读取时序 NOR

嵌入式linux基础学习笔记

偶尔善良 提交于 2020-02-19 13:39:19
Linux是什么 1、 Linux的核心原型是1991年由托瓦兹(Linus Torvalds)写出来的。 2、 1973年:unix的正式诞生,Ritchie等人以C语言写出第一个正式unix核心。 3、 1977年:重要的unix分支——BSD(Berkeley Software Distribution)的诞生。 4、 目前被称为纯的unix指的就是System V(AT&T) 以及BSD(SUN)这两套。 5、 1984年,史托曼开始GNU计划,这个计划的目的是:建立一个自由、开放的unix操作系统(Free unix)。 6、 主、次版本为奇数:发展中版本。 7、 主、次版本为偶数:稳定版本。 8、 Distribution主要分为两大系统,一种是使用RPM方式安装软件的系统,包括red hat ,fedora,suse等这些;一种则是使用debian的dpkg方式安装软件的系统,包括debian,ubuntu,b2d等等。 9、 Linux的特点1、硬件需求低;2、架构开放;3、系统稳定性及保密性功能够强;4、完全免费。 10、 Linux distribution的组成含有:linux kernel + free software +documentations(tools) + 可完全安装的程序;所组成的一套完整的系统。 Linux怎么学习 1、

嵌入式linux 学习笔记-- 记录一次虚拟机Ubuntu无法联网的解决办法 找不到网络设备

只谈情不闲聊 提交于 2020-02-19 11:51:06
做嵌入式linux学习 需要用到虚拟机 我遇到的问题是虚拟机网络找不到 网卡的设备,只剩下了一个环路 背景是 我之前用一直没有问题 像这样 剩下 这个 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 我的解决办法是 挂起虚拟机(暂停播放) 关闭vmware 打开任务管理器 找到所有的跟 VMware有关的 进程和服务 全部关闭。 然后重新打开。。。。VMware 来源: CSDN 作者: 战神-B 链接: https://blog.csdn.net/weixin_41534481/article/details/104389113

嵌入式C高级用法

余生长醉 提交于 2020-02-19 11:38:00
1内存管理 我们需要知道——变量,其实是内存地址的一个抽像名字罢了。在静态编译的程序中,所有的变量名都会在编译时被转成内存地址。机器是不知道我们取的名字的,只知道地址。 内存的使用时程序设计中需要考虑的重要因素之一,这不仅由于系统内存是有限的(尤其在嵌入式系统中),而且内存分配也会直接影响到程序的效率。因此,我们要对C语言中的内存管理,有个系统的了解。 在C语言中,定义了4个内存区间:代码区;全局变量和静态变量区;局部变量区即栈区;动态存储区,即堆区;具体如下: 1>栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2>堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 3>全局区(静态区)(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的 另一块区域。 - 程序结束后由系统释放。 4>常量区 —常量字符串就是放在这里的。 程序结束后由系统释放。 5>程序代码区—存放函数体的二进制代码。 我们来看张图: 图1 首先我们要知道,源代码编译成程序,程序是放在硬盘上的,而非内存里!只有执行时才会被调用到内存中!我们来看看程序结构

嵌入式根文件系统的移植和制作详解

青春壹個敷衍的年華 提交于 2020-02-19 08:23:33
理论上说一个嵌入式设备如果内核能够运行起来,且不需要运行用户进程的话,是不需要文件系统的,文件系统简单的说就是一种目录结构,由于 linux操作系统的设备在系统中是以文件的形式存在,将这些文件进行分类管理以及提供和内核交互的接口,就形成一定的目录结构也就是文件系统,文件系统是为用户反映系统的一种形式,为用户提供一个检测控制系统的接口。   根文件系统,我认为根文件系统就是一种特殊的文件系统,那么根文件系统和普通的文件系统有什么区别呢?由于根文件系统是内核启动时挂在的第一个文件系统,那么根文件系统就要包括Linux启动时所必须的目录和关键性的文件,例如Linux启动时都需要有init目录下的相关文件,在 Linux挂载分区时Linux一定会找/etc/fstab这个挂载文件等,根文件系统中还包括了许多的应用程序bin目录等,任何包括这些Linux 系统启动所必须的文件都可以成为根文件系统。   Linux支持多种文件系统,包括ext2、ext3、vfat、ntfs、iso9660、jffs、romfs和nfs等,为了对各类文件系统进行统一管理,Linux引入了虚拟文件系统VFS(Virtual File System),为各类文件系统提供一个统一的操作界面和应用编程接口。   Linux启动时,第一个必须挂载的是根文件系统;若系统不能从指定设备上挂载根文件系统,则系统会出错而退出启动

嵌入式Linux应用编程-文件IO

十年热恋 提交于 2020-02-18 15:24:22
近期学习了下嵌入式Linux应用编程,一边学习一边记录下关键知识,也是在学习的过程进行下简单梳理。 文件I/O 用户在应用开发过程中会经常需要访问文件。Linux下访问文件的方式有两大类:标准I/O和文件I/O。 文件I/O特点: (1)posix(可移植操作系统接口)定义的一组函数。 (2)不带缓冲机制,每次操作都引起系统调用。 (3)通过文件描述符来访问文件。 (4)访问各种类型文件(7种:- d c b s l p)。 1、文件类型 -:普通文件:可执行文件、文本文档、脚本 d:目录文件 c:字符设备 b:块设备 s:网络设备、socket l:软链接 p:管道 2、文件描述符 每个打开的文件都对应一个文件描述符。 文件描述符是一个非负整数。Linux为程序中每个打开的文件分配一个文件描述符。 文件描述符从0开始分配,依次递增。 在文件IO中默认打开了三个文件描述符0,1,2。对应标准输入、标准输出、标准出错。 3、接口 打开文件 int open(const char *pathname, int flags); 功能:打开一个文件,并且返回一个文件描述符供后续读写类接口使用。 读文件 ssize_t read(int fd, void *buf, size_t count); 功能:从文件描述符为fd的文件/设备读取最大count个字节的数据 写文件 ssize_t

搞嵌入式的,为啥要有uboot

旧街凉风 提交于 2020-02-17 19:59:42
为什么要有uboot 1.1、计算机系统的主要部件 (1)计算机系统就是以CPU为核心来运行的系统。典型的计算机系统有:PC机(台式机+笔记本)、嵌入式设备(手机、平板电脑、游戏机)、单片机(家用电器像电饭锅、空调) (2)计算机系统的组成部件非常多,不同的计算机系统组成部件也不同。但是所有的计算机系统运行时需要的主要核心部件都是3个东西: CPU + 外部存储器(Flash/硬盘) + 内部存储器(DDR SDRAM/SDRAM/SRAM) 1.2、PC机的启动过程 (1)部署:典型的PC机的BIOS程序部署在PC机主板上(随主板出厂时已经预制了),操作系统部署在硬盘上,内存在掉电时无作用,CPU在掉电时不工作。 (2)启动过程:PC上电后先执行BIOS程序(实际上PC的BIOS就是NorFlash),BIOS程序负责初始化DDR内存,负责初始化硬盘,然后从硬盘上将OS镜像读取到DDR中,然后跳转到DDR中去执行OS直到启动(OS启动后BIOS就无用了) 1.3、典型嵌入式linux系统启动过程 (1)典型嵌入式系统的部署:uboot程序部署在Flash(能作为启动设备的Flash)上、OS部署在FLash(嵌入式系统中用Flash代替了硬盘)上、内存在掉电时无作用,CPU在掉电时不工作。 (2)启动过程:嵌入式系统上电后先执行uboot、然后uboot负责初始化DDR

嵌入式Linux 驱动编译添加基本流程,Makefile,Kconfig

安稳与你 提交于 2020-02-17 17:56:25
linux驱动程序——将驱动程序编译进内核 模块的加载 通常来说,在驱动模块的开发阶段,一般是将模块编译成.ko文件,再使用 sudo insmod module.ko 或者 depmod -a modprobe module 将模块加载到内核,相对而言,modprobe要比insmod更加智能,它会检查并自动处理模块的依赖,而insmod出现依赖问题时仅仅是告诉你安装失败,自己想办法吧。 将模块编译进内核 这一章节我们并不关注模块的运行时加载,我们要讨论的是将模块编译进内核。 在学习内核的Makefile规则的时候就可以知道,将驱动程序编译成模块时,只需要使用: obj-m += module.o 指定相应的源代码(源代码为module.c)即可,所以很多朋友就简单地得出结论:如果要将模块编译进内核,只要执行下面的的指令就可以了: obj-y += module.o 事实上,这样是行不通的,要明白怎么将驱动程序编译进内核,我们还是得先了解linux源码的编译规则。 关于linux源码的编译规则和部分细节可以查看我的另一篇博客 linux内核Makefile概览 本篇博客的所有实验基于arm平台,beagle bone开发板,内核版本为4.14.79 编译平台 注:在以下的讨论中,目标主机和本机指加载运行驱动程序的机器,是开发的对象。而开发机指只负责编译的机器,一般指PC机。

嵌入式交叉编译环境搭建

青春壹個敷衍的年華 提交于 2020-02-11 21:19:08
1.下载arm-linux-gcc文件 二选一即可: 密码:mm7t 密码: g8wp 2. 安装过程 mkdir /home/jiang/arm #创建 cp arm-linux-gcc-5.4.0.tar.gz /home/jiang/arm/ # cd /home/jiang/arm/ tar xzvf arm-linux-gcc-5.4.0.tar.gz vim /etc/profile export PATH = /home/jiang/arm/5.4.0/bin: $PATH source /etc/profile arm-linux-cc -v 来源: CSDN 作者: 未知的探索者 链接: https://blog.csdn.net/weixin_41272269/article/details/104267378

【嵌入式Linux+ARM】GPIO操作

[亡魂溺海] 提交于 2020-02-10 03:03:32
1.GPIO介绍 GPIO(general purpose i/o ports)意思为通用输入/输出端口,通俗的说就是一些引脚。 我们可以通过它们输出高低电平 或 读入引脚的状态。 s3c2440中有130个I/O端口,分为A~J共9组,GPA、GPB、..... GPJ 2.GPIO寄存器 既然要操作GPIO,必须对相应的寄存器进行操作,2440中gpio寄存器有: GPxCON——选择引脚功能(输入、输出、保留等) GPxDAT——用来读写引脚 GPcUP ——某一位是1时,相应的引脚无内部上拉电阻;为0时,有内部上拉电阻 3.原理图 LED: 按键: 4.实验代码: >>使用汇编语言实现点灯: led_on.S [cpp] view plain copy print ? .text .global _start _start: LDR R0, =0x56000050 //GPFCON寄存器地址 MOV R1, #0x00001500 //见技术手册相应的配置,一般01为输出引脚 STR R1, [R0] //设置为输出 LDR R0, =0x56000054 //GPFDAT寄存器 MOV R1, #0x00000000 STR R1, [R0] //往GPFDAT寄存器写值 MAIN_LOOP: B MAIN_LOOP //循环等待 Makefile: [cpp] view