自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(19)
  • 资源 (1)
  • 收藏
  • 关注

原创 gcc编译器

通常我们都是使用的是的vim+gcc编译 编译一个c文件的命令是 gcc hello.c -o hello 殊不知气质这个编译语句包括 预处理 编译 汇编 链接预处理主要的作用就是头文件的扩展 宏定义 条件编译等 打印出预处理后的结果 gcc -E hello.c gcc 在这里调用了 cpp(虽然通过 gcc -v 仅看到 cc1),cpp 即 The C Preprocessor,主

2017-11-15 14:27:22 399

原创 uboot和spl的区别

使用的是通用的同一份代码 前面的arch的初始化都是一样的 最主要的区别就是spl代码部分会用 CONFIG_SPL_BUILD来选择编译 以am335x而言,前期arch的初始化流程基本上是一致的,出现本质区别的是在board_init_f开始的。 spl中board_init_f是自己实现的 使用CONFIG_SPL_BUILD选择编译的 主要是做ddr pinmx之类的初始化 d:

2017-11-15 14:26:20 3199

原创 uboot中命令行模式以及命令处理

AM335X中的宏定义 1、需要打开哪些宏 CONFIG_CMDLINE 表示是否支持命令行模式,定义如下: configs/am335x_evm_defconfig :CONFIG_CMDLINE=y CONFIG_SYS_GENERIC_BOARD 用于定义板子为通用类型的板子。打开这个宏之后,common/board_f.c和common/board_r.c才会被编译进去,否则

2017-11-15 14:25:40 4856 1

原创 cache的工作方式

带有cache的CPU一般是先从cache中取出数据 而不是从内存里取数据而CPU是怎么访问cache的cache访问cache使用的类似的地址编码方式。处理器访问存储器时 会把地址传递给TLB和cache cpu把虚拟地址 页帧号传递给TLB 行索引(index)传递给cache匹配到相关的cache line TLB里是一个用于存储虚拟地址到物理地址转换的小缓存 处理器先使用EPN在

2017-11-15 14:22:52 4946

原创 am335x uboot参数 说明

1、U-Boot启动参数解析: 进入U-Boot命令行使用printenv命令可以看到U-Boot启动参数,如使用默认参数,类似如下: 默认的U-boot启动参数设置的启动顺序为: (1) SD卡启动脚本 (2) SD卡 (3) EMMC 若检测到 SD 卡已插入,则加载 SD 卡 boot 分区中的 zImage 内核镜像和 rootfs 分区文件系统。 若没有检测到 SD 卡插入

2017-11-15 14:20:21 3397

原创 armv7A 架构的页表

当cpu访问cache时 会发送虚拟地址到TLB上 TLB是一个TLB 是一块高速缓存,用于缓存页表转换的结果,从而 减少内存访问的时间。一个完整的页表翻译和查找的过程叫作页表查询(Translation table walk),页表查询的过程由硬件自动完成,但是页表的维护需要软件来完成。页表查询是一 个相对耗时的过程,理想的状态下是TLB 里存有页表相关信息。当TLB Miss 时,才会去

2017-11-15 14:17:10 5732 1

原创 CP15协处理器详解以及操作

我相信对很多驱动工程师而言 对于bootloader这部分还是有很多研究的 但是我相信大部分的工程师都是简要的看下bootloader的初始化流程 对于一些具体的操作还是不懂 比如cp15协处理的操作 而且大部分的博客都也是简单的详细的介绍下这句话实现了什么功能 而并不懂这行代码是怎么操作的 比如这里的CP15协处理器的操作在arch/arm/cpu/armv7/Start.S 对于uboot一

2017-11-15 14:12:29 4446

原创 内核定时器

内核的软中断提供了定时器软中断的类型 TIMER_SOFTIRQ 所以我们可以使用这个软中断来实现定时运行我们的程序 内核提供的API和数据结构如下 struct timer_list { /* * All fields that change during normal runtime grouped to the * same cacheline

2017-11-15 14:10:31 256

原创 编译乱序和执行乱序

编译乱序也就是编译器对访存的执行进行乱序 减少逻辑上不必要的访存 已经尽量提高cache命中率和cpu的load/store单元的工作效率 因此在打开编译器优化以后 看到生成的汇编码并没有严格按照代码的逻辑顺序 怎么解决这个问题 设置编译屏障 barrier(); 这样的话就能解决编译乱序所造成的问题 那么你可能会说 volatile也可以实现这个功能啊 其实在编译乱序的问题上 volatil

2017-11-15 14:09:47 1707

原创 原子变量

原子变量适用在共享资源是一个简单的整数值的情况下使用的 完整的锁机制对一个简单的整数来讲就有些浪费 数据定义 atomic_t v; 原子变量保存一个int值 但是不能记录大于24位的整数 使用的是ldrex和strex指令 适用于多核间的并发具体的API如下 void atomic_set(atomic_t *v, int i); atomic_t v = ATOMIC_INIT(

2017-11-14 20:48:12 2935

原创 自旋锁

自旋锁主要是为了解决对临界资源的互斥访问 也就是适合在smp或者单cpu可抢占的系统中比如在SMP 多核处理器中的情况 现在的处理器大多是这种类型的 可以使用自旋锁来解决对临界资源互斥访问 当一个CPU在访问自旋锁保护的临界区时 临界区锁被锁上 也就是spin_lock(lock) 将自旋锁置0 这时其他访问此临界区的CPU 或者本地CPU的其他进程想要访问此临界区时会忙等待 直到第一个访

2017-11-14 20:47:51 391

原创 线程间同步机制之完成量

完成量主要是用来完成线程间的同步机制 而信号量是为了完成某一资源临界区的同步而使用struct completion { unsigned int done; wait_queue_head_t wait; };这个结构体有两个成语 一个是done 表示已完成 一般初始化为0 还有一个是等待队列 表示一个完成量未唤醒的时候 加入等待队列 struct completion

2017-11-14 20:47:04 403

原创 mutex互斥体

linux内核也有正宗的互斥体 并且新的内核多使用mutex互斥体我们这里只介绍怎么使用互斥体定义一个互斥体并且初始化它 struct mutex my_mutex; mutex_init(&my_mutex);然后获取互斥体 extern void mutex_lock(struct mutex *lock); extern int __must_check mutex_lock_int

2017-11-14 20:46:28 402

原创 信号量

linux上有很多地方可能导致并发竞态的现象 比如smp多核的时候 不同的处理器上同时执行我们的代码 多个用户进程也能在一起访问我们的代码 还要很多可延迟机制 比如workqueue tasklet以及timer都可能会使得代码在任何时候执行 所以就会导致并发执行代码 访问公共资源导致出现很多问题 对这个问题最明显的应用就是避免使用全局变量 所以为了只能让一个操作在一个时间内只能有一个执行线

2017-11-14 20:45:57 294

转载 中断管理之下半部软中断

Linux中断管理中有个非常重要的设计理念就是上下半部机制 上半部就是硬件中断管理 中断设计为上下半部的原因如下 1.硬件中断处理程序以异步方式进行 它会打断其他重要的代码执行 因此为了避免被打断的程序停止时间太长 硬件中断处理程序必须尽快完成 2.硬件中断处理程序通常在关闭中断的情况下执行 关闭中断就是关闭本CPU的所有中断响应 关闭中断后 本地CPU就不能响应所有的中断响应 因此硬件中断处

2017-11-14 20:32:17 299

转载 中断上下文简要概述

中断上下文主要是硬件中断上下文 软件中断上下文 和 BH临界区上下文中断上下文你主要分为以下两种情况 (1)执行该中断的处理函数(我们一般称之interrupt handler或者叫做top half),也就是hard interrupt context (2)执行软中断处理函数,执行tasklet函数,执行timer callback函数。(或者统称bottom half),也就是softwa

2017-11-14 20:30:52 902

原创 创建进程

进程:处于执行期的程序 相当于“进程=程序+执行” 但是进程不局限于一段可执行代码(代码段) 还包括进程需要的其他资源 例如打开的文件 挂起的信号量 内存管理 处理器状态 一个或者多个线程 数据段之类的 进程控制块就是task_struct进程和线程的区别 :线程是操作系统调度的最小单位 进程拥有独立的资源空间而线程则共享进程的资源空间 但是linux内核并没有特别的调度算法或定义特别的数据结构来标

2017-11-14 20:22:46 277

原创 软中断机制之tasklet机制

tasklet也是利用软中断实现的一种下半部机制 软中断的一种变种 运行在软中断上下文中 struct tasklet_struct { struct tasklet_struct *next;//多个tasklet串成一个链表 unsigned long state;//代表此刻tasklet的状态,一般为TASKLET_STATE_SCHED,表示此tasklet已被调

2017-11-14 20:18:44 581

原创 workqueue机制

workqueue和其他的bottom half最大的不同是它是运行在进程上下文中的,它可以睡眠,这和其他bottom half机制有本质的不同,大大方便了驱动工程师撰写中断处理代码。当然,驱动模块也可以自己创建一个kernel thread来解决defering work,但是,如果每个driver都创建自己的kernel thread,那么内核线程数量过多,这会影响整体的性能。因此,最好的方法就

2017-11-14 20:18:08 5359

u-boot-1.1.6

2016-03-28

空空如也

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

TA关注的人

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