
嵌入式Linux
文章平均质量分 73
曼巴精神传承人
一个热爱自由的技术宅
展开
-
什么是I/O内存?
I/O内存也称为Memory-Mapped I/O(MMIO), 它是指一种编址方式,不同cpu平台使用的编址方式不同,一种是“IO内存”方式,也叫统一编址方式,是指内存和外设的地址是在同一个地址空间上的,比如我们常见的ARM、MIPS等平台;还有另外一种叫独立编址方式,是指内存的地址空间和外设的地址空间是分开的,比如x86平台。原创 2022-09-18 10:55:04 · 1471 阅读 · 0 评论 -
CMake实战(三)
原文首发于:http://kobe-onepiece.work/archives/5048前言前面两篇《CMake实战(一)》,《CMake实战(二)》,主要是介绍单目录和多目录的编译,接下来看一下自定义编译选项和交叉编译。使用实例下面源码在《CMake实战(二)》的基础上进行修改(1) 修改main.c的内容如下:#include<stdio.h>#include "hello.h"#include "config.h"int main(void){ printH原创 2021-02-18 15:15:10 · 6164 阅读 · 0 评论 -
CMake实战(二)
原文首发于:http://kobe-onepiece.work/archives/5030前言上一篇《CMake实战(一)》我们是把所有文件放在同一个目录下,而平常开发时,我们会将源文件进行分类,放到不同的目录下。接下来我们来看一下具体要怎么操作。使用实例(1)文件内容同上一篇,目录结构如下:./test2 | +--- main.c | +--- hello/ | +--- hello.c |原创 2021-02-07 15:49:06 · 6102 阅读 · 0 评论 -
CMake实战(一)
原文首发于:http://kobe-onepiece.work/archives/5011前言CMake和Autotools一样,都是项目构建工具。可以简单理解为,帮助我们生成Makefile,方便编译。使用实例(1) 创建main.c/hello.c/hello.h文件,内容如下://hello.c#include<stdio.h>#include "hello.h"int printHello(void){ printf("Hello,World\n");}原创 2021-02-04 19:08:05 · 6251 阅读 · 3 评论 -
Linux应用开发之coredump
程序崩溃往往是最不好调试的,如果是很容易复现的现象,可能我们还可以比较容易分析出问题所在。但是对于那种需要几天,或者在某种特殊条件下才能触发的现象。我们总...原创 2020-07-28 18:32:00 · 11501 阅读 · 0 评论 -
gdb调试段错误
前言 使用gdb来调试程序应该算是Linux开发的必备技能吧,今天来看看如何使用gdb调试段错误(Segmentation fault)。 如何...原创 2020-07-08 22:10:27 · 12887 阅读 · 1 评论 -
Linux下实现sleep
sleep:一、 普通版本1、基本设计思路:注册SIGALRM信号的处理函数;调用alarm(nsecs)设定闹钟;调⽤pause等待,内核切换到别的进程运行;nsecs秒之后,闹钟超时,内核发SIGALRM给这个进程 ;从内核态返回这个进程的⽤户态之前处理未决信号,发现有SIGALRM信号,其处理函数是sig_alrm;切换到用户态执行sig_alrm函数,进⼊sig_alrm...转载 2020-05-07 10:24:30 · 20273 阅读 · 0 评论 -
socket返回值为0的问题
一、问题描述socket_id为0,1,2的是给标准输入输出用的。当调用socket()来创建套接字时,返回值确实0,这时候如果进行读写,就是直接打印到控制台了。二、什么情况下socket返回值为01. 如果我们调用close(0)之后,socket_id = 0的便处于“空闲”状态。用户利用socket函数创建套接字时,便可能会将0分配给新创建的socket。这种情况下,一般是套接字声明...原创 2020-04-15 14:50:13 · 29377 阅读 · 0 评论 -
深入理解Socket的读写
前言对于Linux网络编程,有很多坑需要我们去踩。在这个时候,我们才会知道理论知识的重要性。无论是哪种语言,网络编程都可以写成厚厚的一本书。举个例子,比如“当网络断掉,我们调用write去往socket中写入数据,为什么返回正常写入呢?”。所以有空多看看《TCP/IP详解》,《UNIX网络编程》等经典书籍来补充网络知识。深入理解write首先,我们来解决上面的问题。为什么网络断了,还能wri...原创 2020-03-10 20:25:36 · 24421 阅读 · 0 评论 -
linux高精度struct timespec 和 struct timeval
一、struct timespec 定义:typedef long time_t;#ifndef _TIMESPEC#define _TIMESPECstruct timespec { time_t tv_sec; // seconds long tv_nsec; // and nanoseconds };#endifstruct timespec有两个成员,一个是秒,一个是...转载 2019-12-25 10:15:22 · 23809 阅读 · 0 评论 -
嵌入式开发资料汇总
一、单片机51单片机普中开发板资料:https://pan.baidu.com/s/1eQgPuL0原创 2019-10-23 13:38:07 · 27660 阅读 · 0 评论 -
一道C面试题的思考
一、前言C语言真的是学无止境的感觉,大部分同学大学都会开设C语言课程。很多人把C语言二级过了就感觉入门了;对于那些在做嵌入式开发的工程师,几乎每天都要接触C语言,很多人会感觉自己C语言学得很溜了。那好,咱们用一道C语言面试题来测试一下。二、面试题首先给出题目:定义一个宏,求两个数中的最大数OK,很多人应该能很快写出#define MAX(x,y) x > y ? x : y...原创 2019-08-17 17:01:37 · 23642 阅读 · 0 评论 -
select函数中的坑(C语言)
最近写了一个测试驱动的poll函数的应用程序,在应用层中调用select进行操作,设置好timeout之后,如果只对select()调用一次,就没有问题。但一旦多次调用后,就变成只有第一次timeout有效,后面的都没有效果了。#include <sys/types.h>#include <sys/stat.h>#include <sys/time.h>...原创 2019-06-28 10:17:58 · 24470 阅读 · 0 评论 -
[DTS]设备树基本概念
一、什么是设备树 在Linux3.x之前的内核源码中,存在大量对板级细节信息描述的代码。这些代码充斥在/arch/arm/plat-xxx和/arch/arm/mach-xxx目录。为了解决这个问题而引入设备树。 官方对设备树的描述是,一种描述硬件资源的数据结构。 它通过bootloader将硬件资源传给内核,使得内核和硬件资源描述相对独立。 设备树的主要优势:对于同一SOC的不同主板,只需...原创 2019-02-28 21:20:51 · 24173 阅读 · 0 评论 -
Linux用户空间和内核空间
一、用户空间和内核空间现在操作系统都是采用虚拟存储器,对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。为保证内核的安全,用户进程是不能直接操作内核的,所以Linux将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。二、 用户空间和内核空间的内存分配linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,...原创 2019-01-31 21:07:21 · 22637 阅读 · 0 评论 -
Linux启动过程详解(inittab、rc.sysinit、rcX.d、rc.local)
启动第一步--加载BIOS当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它。这是因为BIOS中包含了CPU的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息、PnP特性等等。在此之后,计算机心里就有谱了,知道应该去读取哪个硬件设备了。启动第二步--读取MBR众所周知,硬盘上第0磁道第一个扇区被称为MBR,也就是Mast...转载 2018-12-27 20:58:34 · 23175 阅读 · 0 评论 -
Linux设备驱动中的并发
一、什么是并发并发就是多个执行单元或多个进程并行执行,而这多个执行单元对资源进行共享,比如访问同一个变量或同一个硬件资源,这个时候就很容易出现竞态(说简单点就是竞争同一个”女朋友”)。二、如何处理并发带来的问题为了处理并发带来的问题,Linux有几种处理方法: 1. 中断屏蔽 2. 原子操作 3. 自旋锁 4. 信号量 5. 互斥体 6. 完成量以上几种处理并发的方式各原创 2018-07-07 20:37:15 · 22976 阅读 · 0 评论 -
C语言中的sizeof与strlen
前言sizeof和strlen函数基本在所有公司的嵌入式软件笔试题中都会出现。反正我是遇到了好几次。虽然很多人都会用,但是又很经常会出错,这是因为很多人没有好好的去总结。好了,废话不多说,进入今天的主题。sizeofsizeof()用来判断数据类型长度或数组长度。数据类型sizeof(char) //1sizeof(short)//2 sizeof(int) //4...原创 2018-06-23 21:23:54 · 23171 阅读 · 0 评论 -
Linux 无线驱动接口 wext 和 nl80211
一、对比1.wext为linux-2.6.18版本之前实现方式;用户空间使用ioctl方式访问驱动,设置无线参数或者获取无线参数,配置无线驱动进行联网操作;无线驱动事件到应用层的传递采用的netlink socket技术。2.linux-2.6.18以后wifi驱动实现方式增加了nl80211,无论是用户层访问驱动还是驱动事件通知应用层、都采用的netlink技术。相应的在Androi...转载 2018-02-26 20:59:03 · 20857 阅读 · 0 评论 -
U-Boot2010.06移植(2440)-----移植NorFlash驱动
1、修改include/configs/smdk2440.h(1)注释掉AM29LV400和AM29LV800的定义,并添加AM29LV160的定义#if 0 #define CONFIG_AMD_LV400 1 /* uncomment this if you have a LV400 flash */ #define CONFIG_AMD_LV800 1 /* uncommen原创 2017-03-17 15:43:18 · 20799 阅读 · 0 评论 -
U-Boot2010.06移植(2440)-----移植网卡DM9000驱动
1、修改include/configs/smdk2440.h(1)注释掉CS8900配置,添加DM9000配置#if 0 #define CONFIG_NET_MULTI #define CONFIG_CS8900 /* we have a CS8900 on-board */ #define CONFIG_CS8900_BASE 0x19000300 #define CO原创 2017-03-17 16:39:31 · 20646 阅读 · 0 评论 -
U-Boot2010.06移植(2440)-----移植NandFlash驱动
1、修改include/configs/smdk2440.h(1)添加Nand的定义:/*NAND flash settings*/ #define CONFIG_CMD_NAND#if defined(CONFIG_CMD_NAND)#define CONFIG_NAND_S3C2440#define CONFIG_SYS_NAND_BASE 0x4E000000 //N原创 2017-03-17 16:31:00 · 20629 阅读 · 0 评论 -
U-Boot2010.06移植(2440)-----添加MTD(NAND)分区
1、修改include/configs/smdk2440.h(1)加入MTDPARTS命令/* MTDPARTS settings */#define CONFIG_CMD_MTDPARTS 1#define CONFIG_MTD_DEVICE 1 #define CONFIG_MTD_PARTITIONS1(2)加入MTD分区信息#define MTDIDS_DE原创 2017-03-18 16:00:59 · 20914 阅读 · 0 评论 -
U-Boot2010.06移植(2440)-----添加支持YAFFS2文件系统
1、修改include/configs/smdk2440.h(1)加入支持YAFFS的配置/* YAFFS */#define ENABLE_CMD_NAND_YAFFS 1 #define ENABLE_CMD_NAND_YAFFS_SKIPFB 12、修改common/cmd_nand.c文件(1)在do_nand函数中的读写操作中加入yaffs的选项if (!原创 2017-03-18 16:21:35 · 20934 阅读 · 0 评论 -
U-Boot2010.06移植总结
U-Boot2010.06目录结构需要移植的文件原创 2017-03-20 09:08:24 · 20907 阅读 · 0 评论 -
Linux3.2.81内核移植(2440)
一、内核基本配置1、 修改顶层的MakefileARCH?=(SUBARCH)CORSS_COMPILE?=修改为ARCH=armCROSS_COMPILE=arm-linux- 2、 修改arch/arm/mach-s3c2440/mach-smdk2440.c文件的时钟频率将s3c24xx_init_clock(16934400)改为s3c24x原创 2017-03-20 10:53:49 · 20754 阅读 · 0 评论 -
Bootloader学习笔记
1、“Boot parameters”分区中存放一些可设置的参数,比如IP地址、串口波特率、要传递给内核的命令行参数等。 2、正常启动时,Bootloader首先运行,然后它将内核复制到内存中,并且在内存某个固定地址设置好要传递给内核的参数,最后运行内核。内核启动后,它就挂接根文件系统,启动文件系统中的应用程序。3、Bootloader一般分两个阶段,第一个阶段使用汇编实现,第二阶段使用原创 2017-02-24 15:14:16 · 21416 阅读 · 0 评论 -
Linux内核笔记
1、Linux的启动过程可以分为两部分:架构/开发板相关的引导过程、后续的通用启动过程。原创 2017-03-17 11:03:07 · 21337 阅读 · 0 评论 -
Linux文件系统
一、Linux文件系统 Linux以树状结构管理所有目录、文件,其他分区挂接在某个目录上,这个目录被称为挂接点或安装点,然后就可以通过这个目录来访问这个分区上的文件了。比如根文件系统被挂接在根目录“/”上后,在根目录下就有根文件系统的各个目录、文件:/bin、 /sbin 、 /mnt等;再将其他分区挂接到/mnt目录上,/mnt目录下就有这个分区的各个目录、文件。 在一个分区上存储文原创 2017-03-31 13:16:05 · 20534 阅读 · 0 评论 -
ROM、RAM、DRAM、SRAM和FLASH的区别
ROM和RAM指的都是半导体存储器,ROM在系统停止供电的时候仍然可以保持数据,而RAM通常都是在掉电之后就丢失数据,典型的RAM就是计算机的内存。 RAM有两大类,一种称为静态RAM(Static RAM/SRAM),SRAM速度非常快,是目前读写最快的存储设备了,但是它也非常昂贵,所以只在要求很苛刻的地方使用,譬如CPU的一级缓冲,二级缓冲。另一种称为动态RAM(Dynamic转载 2017-07-31 10:14:49 · 20599 阅读 · 0 评论 -
Uboot的bootargs引导参数说明
一、bootargs的作用bootargs是Uboot设置的启动参数,引导内核启动后,内核会去解析该启动参数。从而保证系统的正常启动。二、bootargs常用参数介绍1、root指定根文件系统的位置,比如:root=/dev/mtdblock3 , mtdblock3 代表mtdparts的第4分区 (第一个分区为mtdblock0)2、console原创 2017-09-10 10:28:27 · 24394 阅读 · 0 评论 -
每天一篇Makefile(一)
前言网络上有很多讲解Makefile的文章和博文,看完之后感觉挺简单的,但是真正让我们自己写一份Makefile,又感觉很困难,没办法完成这项“简单”的任务。O(∩_∩)O哈哈~。这种学习方法有点像我们很多人在学习英语是一样的。我们经常看语法,感觉都看懂了,但是其实还是不懂。考出来的成绩也不如意。所以我希望用一种新的方式去分享知识,与大家共同成长。水平有限,如有错误,还请指出。原创 2017-09-24 20:43:30 · 20697 阅读 · 0 评论 -
MAKECMDGOALS 变量
make 在执行时会设置一个特殊变量 -- "MAKECMDGOALS" ,该变量记录了命令行参数指定的终极目标列表,没有通过参数指定终极目标时此变量为空。该变量仅限于用在特殊场合(比如判断),在 Makefile 中最好不要对它进行重新定义。下面通过一个实例来说明此变量的意思,设一 Makefile 内容如下:复制代码ifeq ("$(MAKECMDGOALS)"转载 2017-10-30 10:20:56 · 20556 阅读 · 0 评论 -
在 Linux 下使用 rfkill 软开关蓝牙及无线功能
很多计算机系统包含无线电传输,其中包括Wi-Fi、蓝牙和3G设备。这些设备消耗电源,在不使用这些设备时是一种能源浪费。 RFKill 是Linux内核中的一个子系统,它可提供一个接口,在此接口中可查询、激活并取消激活计算机系统中的无线电传输。当取消激活传输时,可使其处于可被软件重新激活的状态( 软锁定 )或软件无法重新激活的位置( 硬锁定 )。RFKill 为内核子系统提供应用程序转载 2017-10-22 10:02:04 · 27309 阅读 · 1 评论 -
每天一篇Makefile(二)
好,废话不多说,进入正题,来看我们今天的要讲的Makefile:lcd.bin: start.o main.o led.o clock.o uart.o lib.o lcd.o arm-linux-ld -Ttext 0x20000000 -o lcd.elf $^ arm-linux-objcopy -O binary lcd.elf $@ arm-linux-objdump -D原创 2017-10-13 20:00:44 · 20383 阅读 · 0 评论 -
U-Boot2010.06移植(2440)-----基本移植
1、修改顶层Makefile文件(1)添加(第二行前面有个TAB):smdk2440_config :unconfig@$(MKCONFIG) $(@:_config=) arm arm920t smdk2440 samsung s3c24x0(2)指定交叉编译器:CROSS_COMPILE ?=arm-linux-2、在board/samsung目录下新建smdk24原创 2017-03-17 15:32:15 · 20702 阅读 · 0 评论