自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(89)
  • 资源 (1)
  • 问答 (3)
  • 收藏
  • 关注

原创 内核stack_protector导致异常崩溃

##问题描述:DMA写完数据后,产生DMA中断,中断中wake_up_interruptible唤醒等待队列(wait_event_interruptible_timeout),唤醒后,中断上下文程序会先执行,但偶尔唤醒的进程上下文会先于中断上下文执行。某次wake_up_interruptible唤醒等待队列后导致内核崩溃。崩溃堆栈打印pc是在__wake_up_common_lock,大致如下:Unable to handle kernel NULL pointer dereference at v

2020-11-06 19:05:56 842 1

原创 git下载remix-ide代码用node v10版本install各种错误

估计是node v10和remix-ide不兼容,用node v9版本可以安装成功,折腾了我好几天针对下列remix-idegit clone https://github.com/ethereum/remix-ide.gitgit clone https://github.com/ethereum/remix.git # only if you plan to link remix and...

2019-07-01 08:44:34 435

原创 npm安装remixd失败

之前安装remixd各种失败,用这个命令终于装好了sudo npm install --unsafe-perm=true --allow-root --save-dev grunt

2019-06-28 07:42:34 724

原创 笔记三:模拟uboot打印环境变量代码实现

#include<stdio.h>#include<stdlib.h>#include<string.h>#define uchar unsigned char#define BOOTARGS "movi 0x30000800"#define BOOTDELAY "3"#define BOOTT

2018-04-01 12:53:50 463

原创 ARM相关伪指令

一. 伪指令的意义 伪指令不是指令,伪指令和指令的根本区别是经过编译后不会生成机器码 伪指令的意义在于指导编译过程 一般的伪指令是以.标号开头的二. .号在gnu汇编中表示当前指令的地址 1.汇编中的标号_TEXT_BASE: .word TEXT_BASE_TEXT_BASE为一个标号,可以通过标号访问.word TEXT_BASE定义的地址,类似int a,通过...

2018-03-18 10:34:31 405

原创 笔记2:210的SoC时钟系统

一. SoC时钟系统简介1.1 什么是时钟?SoC为什么需要时钟? (1)时钟是同步工作系统的同步节拍。 (2)SoC内部有很多器件,譬如CPU、串口、DRAM控制器、GPIO等内部外设,这些东西要彼此协同工作,需要一个同步的时钟系统来指挥。这个就是我们SoC的时钟系统。1.2 时钟一般如何获得 (1)SoC的时钟获得一般有: * 外部直接输入时钟信号,SoC有个引脚用来输...

2018-02-23 11:41:49 702

转载 中本聪和拜占庭将军问题

作者:苏江同学 链接:https://www.jianshu.com/p/5fea30b25f0a 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。拜占庭将军问题很多人可能听过,但不知道是什么意思,本文从非专业的角度来讲讲,拜占庭将军问题到底是说什么的。拜占庭将军问题(Byzantine Generals Problem),首先由Leslie Lamp...

2018-02-17 09:38:26 645

转载 区块链分叉

比特币采用的工作量证明机制(pow),就是让矿工互相竞争求解一个数学题,谁先解出来了,他就大喊一声:“我的工作量证明成功了,你们快来看。”全体矿工就都过来把那一页目抄写一份(打包区块),贴在自己账本的最后面,然后又开始新的记账过程。在这个过程中,经常会出现这样一种情况:两个矿工同时解出了题目,这时要怎么办呢? 由于距离远近,不同的矿工看到这两个区块是有先后顺序的。通常情况下,矿工们会把自己先...

2018-02-16 23:58:32 404

原创 笔记1:汇编代码重定位

参考文件:重定位反汇编后代码,重定位汇编代码,链接脚本 三星开发板S5PV210参考文件一:链接脚本链接脚本的理解: SECTION{} 这个是整个链接脚本 . 点号在链接脚本中代表当前位置 .text:代码段 .data:数据段 .bss:bss段SECTIONS{ . = 0xd0024000; .text : { start

2018-02-04 23:54:21 2082

原创 笔记二:uboot要解决的问题

一. 自身可开机直接启动1 一般的SoC都支持多种启动方式,譬如SD卡启动、NorFlash启动、Nand启动等…uboot要能够开机启动,必须根据具体的SoC的启动设计来设计uboot 1 uboot必须进行和硬件相对应的代码级别的更改和移植,才能够保证可以从相应的启动介质启动。uboot中第一阶段的start.S文件中具体处理了这一块。二.. 能够引导操作系统内核启动并给内核传参

2018-01-25 09:16:46 215

原创 笔记一:为什么要有uboot

一.为什么要有uboot1.1 计算机系统就是由CPU来做核心进行运行的系统。典型的计算机系统有:PC机、嵌入式设备(手机、平板)、单片机(电饭锅、空调) 1.2 计算机系统的组成部件非常多,不同的计算机系统组成部件也不同。但是所有的计算机系统运行时需要的主要核心部件都是3个东西:CPU + 外部存储器(Flash/硬盘) + 内部存储器(DDR SDRAM/SDRAM)

2018-01-24 21:34:32 329

原创 笔记16:内核链表的设计思路

一.内核链表的设计思路(1)内核链表中自己实现了一个纯链表(纯链表就是没有数据区域,只有前后制作)的封装以及纯链表的各种操作函数(节点创建/插入/删除/遍历…)。 这个纯链表本身自己没有任何用处,它的用法是给我们具体链表作为核心来调用。(2)list.h文件简介 内核中核心纯链表的实现在include/linux/list.h文件中 list.h中就是一个纯链表的完整封装,包含节点定

2018-01-22 21:15:09 255

原创 笔记15:C语言链接属性

一.C语言程序的组织架构:多个C文件 + 多个h文件1.庞大、完整的一个C语言程序由多个c文件和多个h文件组成的。 2.程序的生成过程就是:编译 + 链接。编译是为了将函数、变量等编程.o二进制的机器码格式,链接是为了将各个独立分开的二进制的函数链接起来形成一个整体的二进制可执行程序。二.编译以文件为单位、链接以工程为单位1.编译器工作时是将所有源文件依次读进来,单个为单位进行编

2018-01-22 21:08:39 248

原创 笔记14:C语言中的NULL

C语言中的NULL一.NULL不是C语言关键字,本质上是一个宏定义二.NULL的标准定义:#ifdef _cplusplus#define NULL 0#else#define NULL (void *)0 //对应C语言情况#endif解释:C++的编译环境中,编译器预先定义了一个宏_cplusplus,程序中可以用条件编译来判断当前的编译环境是C++的还是C的

2018-01-22 20:57:17 845

原创 笔记13:存储类型关键字volatile

(1)volatile的字面意思:可变的。C语言中volatile用来修饰一个变量,表示这个变量可以被编译器之外的东西改变。编译器之内的意思是变量的值的改变是代码的作用,编译器之外的改变就是这个改变不是代码造成的,或者不是当前代码造成的,编译器在编译当前代码时无法预知。譬如在中断处理程序isr中改变了这个变量的,譬如多线程中在别的线程中更改了这个变量的值,譬如硬件自动更改了这个变量的值(一般这个变

2018-01-09 20:11:43 277

原创 笔记12:Linux下的文件映射区和内核映射区

一. 文件映射区文件映射区就是进程打开了文件后,将这个文件的内容从硬盘读到进程的文件映射区,以后就直接在内存中操作这个文件,读写完了后在保存时再将内存中的文件写到硬盘中去。二. 内核映射区(上图)(1)内核映射区就是将操作系统内核程序映射到这个区域了。 (2)对于linux中的每一个进程来说,它都以为整个系统只有它自己和内核而已。它认为内存地址0xC0000000以下都是它自己的活动

2018-01-09 19:46:00 1832

原创 笔记11:创建函数库(静态和动态)

注意:库函数不需要main函数一.创建静态库文件1.自己制作静态链接库 首先使用gcc -c只编译不链接,生成.o文件;然后使用ar工具进行打包成.a归档文件 举例: Makefile中添加 all: gcc aston.c -o aston.o ar -rc libaston.a aston.o 库名不能随便乱起,一般是lib+库名称,后缀名是.

2018-01-09 19:39:34 242

原创 笔记10:函数库介绍

一.函数库1.什么是函数库 1.1 函数库就是一些事先写好的函数的集合。 1.2 函数是模块化的,因此可以被复用。我们写好了一个函数,可以被反复使用。也可以A写好一个函数然后共享出来,当B有相同的需求时就不需要自己写直接用A写好的这个函数即可。二.函数库的由来1.最开始是没有函数库,每个人写程序都要从零开始自己写。时间长了慢慢的早期的程序员积累下来了一些有用的函数。 2.早期

2018-01-09 19:17:36 1825 1

原创 笔记9:递归函数

一.什么是递归函数1.1 递归函数就是函数中调用了自己本身这个函数的函数 1.2 递归函数和循环的区别。递归不等于循环 1.3 递归函数解决问题的典型就是:求阶乘、求斐波那契数列二.函数递归调用的原理2.1 实际上递归函数是在栈内存上递归执行的,每次递归执行一次就需要耗费一些栈内存。 2.2 栈内存的大小是限制递归深度的重要因素三.使用递归函数的原则:收敛性、栈溢出

2018-01-09 19:15:08 272

原创 笔记8:offsetof宏和container_of宏

###一.offsetof宏做个引子: 用指针访问结构体成员 TYPE是结构体类型,MEMBER是结构体中一个元素的元素名 这个宏返回的是member元素相对于整个结构体变量的首地址的偏移量,类型是int#define offsetof(TYPE, MEMBER) ((int) &((TYPE *)0)->MEMBER) 1.offsetof宏的作用是:用宏来计算结构体中

2018-01-03 20:23:44 303 1

原创 笔记7:结构体内存对齐

结构体中,用指针偏移量访问结构体元素时。因为结构体要考虑元素的对齐访问,所以每个元素实际占的字节数和自己本身的类型所占的字节数不一定完全一样(譬如char c实际占字节数可能是1,也可能是2,也可能是3…)一般来说,我们用.的方式来访问结构体元素时,我们是不用考虑结构体的元素对齐的。因为编译器会帮我们处理这个细节。但是C语言本身是很底层的语言,而且做嵌入式开发经常需要从内存角度,以指针的方式来

2018-01-03 20:16:59 203

原创 笔记6:字符数组和字符串的本质差异(内存分配角度)

字符数组和字符串的本质差异(内存分配角度)1.字符数组char a[] = “linux”; 定义一个数组a,数组a占6字节,右值”linux”本身只存在于编译器中,编译器将它用来初始化字符数组a后丢掉(也就是说内存中是没有”linux”这个字符串的);这句话就相当于是:char a[] = {‘l’,’i’,’n’,’u’,’x’,’\0’};2.字符串char *p = “linux”; 定

2018-01-03 20:11:21 437 1

原创 笔记5:程序中获取内存的方法

程序中获取内存的方法内存分配:栈,堆,数据段一.栈内存:反复使用:栈内存在程序中其实就是那一块空间,程序反复使用这一块空间。临时性:函数不能返回函数局部变量的地址,因为函数执行完返回后这个局部变量已经不在了 这个局部变量是分配在栈上的,虽然不在了但是栈内存还在还可以访问,但是访问实际上这个内存地址已经和当时那个变量无关了。二.堆内存:操作系统堆管理器管理;堆管理器是操作系统的一个模块,堆管理内存分

2018-01-03 20:08:43 325

原创 笔记4:指针和数组、函数结合分析

一.指针数组和数组指针分析指针数组和数组指针的表达式int *p[5]; int (*p)[5]; int *(p[5]);总结:我们在定义一个符号时,关键在于:首先要搞清楚你定义的符号是谁(第一步:找核心);其次再来看谁跟核心最近、谁跟核心结合(第二步:找结合);以后继续向外扩展(第三步:继续向外结合直到整个符号完)。 例如:核心是指针,就表示该结合是什么什么的指针。如果核心和*结合,表

2018-01-03 20:02:46 192

原创 笔记3:指针和使用时一些注意事项

一.左值和右值赋值号左边的叫左值,右边的叫右值 当一个变量做左值时,编译器认为这个变量符号的真是含义是这个变量所对应的那个内存空间;当一个变量做右值时,编译器认为这个变量符号的真实含义是这个变量的值,也就是这个变量对应的内存空间中存储的那个数。int a = 3, b =5; a = b; //当a做左值时,我们关心的是a所对应的内存空间,而不是其中存储的3 b = a; //当a做右值时

2018-01-01 19:45:50 308

原创 笔记2:位操作实例解析

嵌入式系统中研究的移位操作都是无符号的。 ARM是内存与IO统一编址的,ARM中有很多内部外设,SoC中CPU通过向这些内部外设的寄存器写入一些特定的值来操控这个内部外设,进而操控硬件动作。所以说,读写寄存器就是操控硬件。寄存器的特点是按位进行定义,但是寄存器的读写却是整体32位一起进行的(也就是说你只想修改bit5~bit7是不行的,必须整体32位bit一起写入)寄存器操作的要求就是,在设定特定

2018-01-01 19:20:51 240

原创 浅析内存这个大话题

关键:内存编址是以字节为单位的。一.介绍内存如果把内存比喻为一栋大楼,那么这个楼里面的一个一个房间就是一个一个内存格子,这个格子的大小是固定的8bit,就好像这个大楼里面所有的房间户型是一样的。 数据类型和内存的关系就在于: 数据类型是用来定义变量的,而这些变量需要存储、运算在内存中。所以数据类型必须和内存相匹配才能获得最好的性能,否则可能不工作或者效率低下。在很多32位环境下,我们实际定义

2017-12-28 21:43:51 206

原创 ARM汇编指令级

一.指令与伪指令指令:CPU机器指令的助记符,经过编译后会得到一串10组成的机器码,可以由CPU读取执行。 伪指令:本质上不是指令(只是和指令代码一起写在代码中),它是编译器环境提供的,目的是用来指导编译过程,经过编译后伪指令最终不会生成机器码。二:ARM汇编特点:2.1:LDR/STR架构ARM采用RISC架构,CPU本身不能直接读取内存,而需要先将内存中内容加载入CPU中通用寄存器中才能被CP

2017-12-23 14:22:59 430

原创 ARM异常处理方式简单介绍

什么是异常1.正常工作之外的流程都叫异常 2.异常会打断正在执行的工作,并且一般我们希望异常处理完成后继续回来执行原来的工作 3.中断是异常的一种异常向量表1.所有的CPU都有异常向量表,这是CPU设计时就设定好的,是硬件决定的。 2.当异常发生时,CPU会自动动作(PC跳转到异常向量处处理异常,有时伴有一些辅助动作) 3.异常向量表是硬件向软件提供的处理异常的支持。ARM的异常处理机制当异

2017-12-17 20:25:19 383

原创 ARM的37个寄存器详解

ARM共有37个寄存器,都是32位长度 37个寄存器中30个为“通用”型,1个固定用作PC,一个固定用作CPSR,5个固定用作5种异常模式下的SPSR。注意:System模式使用User模式寄存器。当ARM从用户模式(User)切换到快速中断模式(FIQ),寄存器r0~r7,r15是不变的,FIQ的寄存器r8~r14切换User模式下的同名寄存器。其它几种模式之间切换同理。ARM总共有37个寄存器

2017-12-17 19:55:15 4480

转载 ARM编程模式和7种模式

ARM采用的是32位架构ARM阅读--Byte: 8 bits--Halfword: 16 bits(2 byte) 半字--Word: 32 bits(4 byte)大部分ARM core提供: core(核心)–ARM指令集(32 bit) (有些占内存、时间快)–Thumb指令集(16 bit) (省内存、但是浪费时间)–Thu

2017-12-16 19:58:44 798

原创 S5PV210的启动过程详解

内存: SRAM (静态内存) 容量小、价格高,优点是不需要软件初始化上电就能用 DRAM(动态内存) 容量大、价格低,缺点就是上电后不能直接使用,需要软件初始化后才能使用。外存: NorFlash:特点是容量小,价格高,优点是可以和CPU直接总线式相连,CPU上电后可以直接读取,

2017-12-16 13:58:29 314

原创 NorFlash和NandFlash

Flash编程原理都是只能将1写为0,而不能将0写成1.所以在Flash编程之前,必须将对应的块擦除,而擦除的过程就是将所有位都写为1的过程,块内的所有字节变为0xFF.因此可以说,编程是将相应位写0的过程,而擦除是将相应位写1的过程,两者的执行过程完全相反.SoC常用外存:一.NorFlash:总线式访问,接到SROM bank,优点是可以直接总线访问,一般用来启动。 NandFlash:(SL

2017-12-16 12:45:46 311

原创 统一编址和独立编址

一.什么是IO?什么是内存? IO是输入输出接口,是CPU和其它外部设备之间的通道。一般的,IO就是指CPU的各种内部或外部外设。二.内存的访问方式 内存通过CPU的地址总线来寻址定位,然后通过CPU数据总线来读写。三.IO的访问方式 IO指的是与CPU连接的各种外设。CPU访问外设有两种方式,一种类似于访问内存的方式,即把外设的寄存器当作一个内存地址来读写,从而以访问内存相同的方式来操作外设

2017-12-12 09:27:03 1540

原创 可编程器件的编程原理

一.从源代码到CPU的执行过程 源代码通过编译器编译、汇编,生成Elf格式二进制可执行文件,将该生成的文件拷贝到flash中,然后CPU通过总线将数据和代码拷贝到内存,然后CPU通过总线在内存取指令,先解码,然后执行。然后再解码,再执行。直到指令执行结束。二.汇编语言的实质 汇编的实质是机器指令的助记符 举例:汇编:RLA(左移) 机器指令:10101101010 RLA就是助记符机器指令:

2017-12-12 08:05:07 377

原创 CPU的设计原理,数据总线和地址总线

如上图: SOC中包含了CPU,Flash,串口和内存 在嵌入式平台工作时,编译好的二进制文件先放在flash里面(暂存作用),开机的时候,CPU把二进制文件从flash拷贝到内存运行。总线:地址总线和数据总线 CPU说的32位就是数据总线的位数为32位,单次通信数量为2的32次方注意:CPU的位数指的是数据总线位数,而决定最大支持内存的则是地址总线位数。举例:内存为4G,地址总线位数为32,

2017-12-10 16:07:13 13840 1

原创 SoC和CPU的区别

SoC:(英语:System on Chip,缩写:SoC)是一个将电脑或其他电子系统集成到单一芯片的集成电路。系统芯片可以处理数字信号、模拟信号、混合信号甚至更高频率的信号。系统芯片常常应用在嵌入式系统中。系统芯片的集成规模很大,一般达到几百万门到几千万门。(摘自维基百科) 如上图:SoC:SoC里CPU和控制器都放在芯片里,运行速度很快,现在的外设可以叫内部外设,即在芯片内部的外设 SoC里

2017-12-10 15:44:32 18841

原创 ARM的商业模式和ARM各种版本号区分

一. ARM的商业模式ARM公司商业模型:IP授权为核心的无晶圆半导体公司与Intel不同,ARM公司也是Fabless无晶圆半导体,这一点跟NVIDIA以及卖掉晶圆厂之后的AMD是一样的,不过ARM公司自己不产任何处理器,主要是提供IP授权给半导体合作伙伴(高通、苹果、AMD及三星等),后者使用ARM的架构、设计以及开发工具推出自己的处理器,然后再供应给OEM客户(各种手机、平板厂商就是这样的),

2017-12-10 15:17:04 3745

原创 笔记1:C语言变量与常量

一.变量1.1普通局部变量和全局变量的对比1.定义同时没有初始化,则局部变量的值是随机的,而全局变量的值是默认为0的。 2.使用范围上:全局变量具有文件作用域,而局部变量只有代码块作用域。 3.生命周期上:全局变量是在程序开始之前的初始化阶段就诞生的,到整个程序结束退出的时候才死亡;而局部变量在进入局部变量所在的代码块时诞生,在该代码块退出的时候死亡。 4.变量分配位置:全局变量分配在数据段上

2017-12-03 16:06:11 258

原创 物联网的三层框架

物联网的三层架构

2017-12-02 18:33:53 3296

支持lua的md5加密库

该库是找了很久的支持lua-md5的加密库,可编译至x86,mips平台供md5加密使用。 编译后生成core.so和md5.lua,des56.so。移植后用起来很方便。

2017-09-11

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除