自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(61)
  • 资源 (2)
  • 收藏
  • 关注

转载 SPI通讯随记

这里记录一些有关于SPI的知识点 详情移步: https://nxp.maclinux.top/wordpress/?p=353

2017-07-25 17:04:08 457

原创 linux外网ip获取命令

curl icanhazip.com

2017-03-27 22:39:40 562

原创 字符设备

long xxx_ioctl(struct file *filp,unsigned int cmd,unsigned long arg) { ...; switch(cmd) { case XXX_CMD1: ...; break; case XXX_CMD2; ...; break; case XXX_CMD3; ... break; default: /*不能支持

2017-02-22 20:11:23 454

原创 Linux驱动attribute

device_driver 和 device分别表示驱动和设备,而这两者都必须依赖于一种总线,因此都包含 struct bus_type指针,总线,这杯和驱动都会被落实为sysfs中的一个目录,总线,设备和驱动中的 attribute则直接落实为sysfs中的1个文件, attribute,bus_attribute,driver_attribute和device_attribute. s

2017-02-19 16:38:43 1186

原创 可变参数

摘自网络的 C语言网络参数的用法 C语言中会遇到一些参数可变的函数,例如printf(),函数原型为 int printf(const char * format,...);  函数编辑器。     首先编写一个简单的可变参数的C函数     该函数至少有一个整数参数,其后是占位符...,表示后面的参数不固定,例子中的输入参数必须是整型 用来打印所有的参数。 #include "s

2017-02-14 21:09:38 363

原创 设备,驱动,总线的结构

struct bus_type{ const char *name; const char *dev_name; struct device *dev_root; struct device_attribute *dev_attrs; /*Use dev_groups instead*/ const struct attribute_group **bus_groups;

2017-02-11 20:28:05 358

原创 套接字

Linux中设计强调的基本观点就是机制和策略分离。 机制是做某样事情的具体步骤,方法。而策略则是每个步骤所采取的不同方式。机制是相对固定的。 而每个步骤采用的策略是不固定的。机制是稳定的,而策略是灵活的。 设备的详细信息会通过netlink套接字发送出来: netlink的使用范例 #include static void die(char *s) { write(2,s,st

2017-02-11 16:07:02 302

原创 devfs

devfs出现使得设备驱动程序能够自主的管理设备。驱动程序应用下面的函数来进行设备文件的创建和撤销工作。/*创建设备目录*/devfs_handle_t devfs_mk_dir(devfs_handle_t dir,const char *name,void *info);/*创建设备文件*/dev_handle_t devfs_register(dev_handler_t dir,const

2017-02-10 00:09:24 1372

原创 设备节点

Linux文件系统与设备驱动 应用程序和VFS之间的接口是系统调用。而VFS与文件系统以及设备之间的接口是file_operation结构体 成员函数,这个结构体对文件进行打开,关闭,读写,控制的一系列成员函数。 字符设备的上层没有类似于磁盘的ext2文件系统,所以字符设备的file_oeration成员函数就直接由设备 驱动提供了。file_operation正是字符设备驱动的核心。

2017-02-08 22:36:03 2074

原创 目录结构

Linux文件系统与文件设备 字符设备与块设备良好的"一切都是文件"的设计思想。掌握Linux文件系统,设备文件系统的知识。 首先,驱动最终通过与文件操作相关的系统调用或C库函数(本质也是基于系统调用)被访问。而设备驱动结构 最终也是为了迎合提供给应用程序员的API。 驱动不可避免地会与设备文件系统打交道。 Linux文件操作 文件操作系统调用 文件操作系统调用(Window

2017-02-07 18:27:19 324

原创 模块继续

导出符号: Linux的 /proc/kallsyms 文件对应着内核符号表。它记录了符号以及符号所在的内存地址。 模块可以使用下面的宏导出符号到内核列表当中: EXPORT_SYMBOL(符号名); EXPORT_SYMBOL_GPL(符号名); 导出整数加减运算函数符号的内核模块: // 所谓的内核符号表就是在内核内部函数或变量中可供外部引用的函数。 #include

2017-02-07 00:36:38 304

原创 模块继续

模块的加载函数 加载函数一般以 __init标识声明.如下 static int __init initialization_function(void) //注意__init标识 { /*初始化代码*/ } module_init(initialization_function); 上面是模块的加载函数,他返回整形值,初始化成功,则返回0,在Linux里,初始化失败返回一个接近

2017-02-06 18:05:31 307

原创 模块的简单建立

Linux内核模块 Linux设备驱动会以内核模块的形式出现。学会编写Linux内核模块编程是学习Linux设备驱动的先觉条件。 Linux内核模块的简介 Linux提供模块机制,具有如下的特点: 模块本身不能被编译进入内核映像,从而控制了内核的大小 模块一旦被加载,他就和内核中的其他部分一样。 以下是一个简单的程序 /* *a simple kernel module

2017-02-06 02:28:16 400

原创 编译工具

一个典型的ARM Linux工具链包含 arm-linux-gnueabihf-gcc strip //可以删除可执行文件当中的符号表和调试信息来实现缩减程序体积的目的 objdump //是反汇编工具 ld gprof //gprof在编译过程中在函数入口插入计数器以收集每个函数的被调用情况和被调用次数 nm //用于显示关于对象文件、可执行文件以及对象文件库里的符号信息。 r

2017-02-05 17:32:58 375

原创 GNU C的区别

Linux 内核的引导 引导包括很多阶段。一般的SoC嵌入了bootrom,上电时bootrom运行。bootrom会去引导bootloader。 CPU0会发中断唤醒CPU1.之后CPU0和cpu1共同承担这些负载。进行负载均衡。 嵌入式Linux领域最著名的bootloader是U-Boot,关于内核启动,与驱动关系比较大的部分是每个平台的 是设备回掉函数和设备属性信息,他们通常包装在

2017-02-05 00:56:20 3255

原创 编译目录

应用实例:在内核中新增驱动驱动代码目录和子目录。 在drivers目录下为ARM体系结构新增用于 test driver 的属性目录 |--test |-- cpu | -- cpu.c |-- test.c |-- test_client.c |-- test_ioctl.c |-- test_proc.c |-- test_queue.c 收线为新增的目录创建M

2017-02-04 13:48:35 362

原创 编译目录

应用实例:在内核中新增驱动驱动代码目录和子目录。 在drivers目录下为ARM体系结构新增用于 test driver 的属性目录 |--test |-- cpu | -- cpu.c |-- test.c |-- test_client.c |-- test_ioctl.c |-- test_proc.c |-- test_queue.c 收线为新增的目录创建M

2017-02-04 13:48:28 576

原创 编译与配置

Linux内核的编译以及加载 运行make menuconfig等时,配置工具首先分析体系结构对应/arch/xxx/Kconfig 文件(xxx即为传入的arch参数) 文件中除了包含一些与体系结构相关的配置项和配置菜单以外,还通过source语句引入了一系列的Kconfig文件,而这 些Kconfig又有可能通过source引入下一层的Kconfig,配置工具更具Kconfig包含的菜单

2017-02-03 16:20:47 622

原创 内核的结构

Linux内核的主要部分 Linux内核主要由进程调度(SCHED)、内存管理(MM)、虚拟文件系统(VFS),网络接口(NET)和 进程间通信(IPC) 5个子系统 进程调度 进程调度控制系统中的多个进程对CPU的访问,使得多个进程鞥够在CPU中“围观串行,宏观并行”。进 程调度处于系统的中心位置,内核中的其他系统都依赖于它,因为每个系统都需要挂起或恢复进程。 睡眠分为可中断睡眠和不

2017-02-02 18:13:09 495

原创 目录的层级结构

在Linux2.6以后的内核版本当中,一个内核任务可以被抢占,从而提高系统的实时性。可以极大地增强 系统的用户交互性。就如用户觉得鼠标单击的时候得到了更快速的相应。但是2.6以后的内核还是存在一些 不可抢占的区间,例如中断上下文,软中断上下文和自旋锁锁住的区间。如果给Linux打上RT-Preempt补丁, 则软中断和中断都被线程化了,自旋锁也被互斥体替换,Linux内核变得能支持硬实时,L

2017-02-02 01:37:29 3433

原创 硬件的一些粗浅总结

以太网有MAC(以太网媒体接入控制器)和PHY(物理接口收发器)组成。以太网MAC由IEEE802.3以太网标准定义,实现了数据链路层。 常用的MAC支持10Mbit/s和100Mbit两种速度。吉比特以太网是快速下一代以太网的下一代技术。将速度提高到了1000Mbit/s。 PCI和PCI-E PCI(外围部件互联)是有intel1991年推出的一种局部总线。PCI总线的特点如下: 数据

2017-02-01 20:46:13 409

原创 设备驱动概述以及开发环境的构建继续1

在没有操作系统的情况下,设备驱动的接口被直接提交给应用软件工程师。应用软件没有跨越任何层次就直接访问设备 的接口,驱动包含的接口函数也与硬件的功能直接吻合。没有任何的附加功能。 另一种不合理的设计在于在应用用操作硬件的寄存器,而不单独设计驱动模块。 有操作系统时的是设备驱动 无操作系统时设备驱动的硬件操作工作仍让是比不可少的。没有这一部分,驱动不可能与硬件打交道。 其次,我们还要将驱动融

2017-02-01 01:30:05 301

转载 virtualbox 获取COM失败的方法

Failed to instantiate CLSID_VirtualBox w/ IVirtualBox, but CLSID_VirtualBox w/ IUnknown works. PSDispatch looks fine. Weird. 返回 代码: E_NOINTERFACE (0x80004002) 组件: VirtualBoxClientWrap 界面: IVirtual

2017-01-31 22:20:51 1653

原创 设备驱动的简单理解

硬件是底层基础,是所有软件得意运行的平台.计算机的软件和硬件相互成就了对方.   计算机软件和硬件之间的悖论:软件和硬件不应该相互深透入对方的领地.也就是说,应用软件工程师需要看到 一个没有硬件的纯粹的软件世界.硬件必须透明的呈现给他.这个光荣而间距的任务就交给了驱动程序.   设备的驱动程序:按照硬件设备的具体工作方式,读写设备的寄存器,完成设备的轮询,中断处理,DMA通信 进行物理内存

2017-01-31 01:09:19 617

原创 Linux同步的实现初步学习

内核的同步方法: Limux提供了一组相当完备的内核同步方法。这些方法使得内核开发者们能编写出高效而又自由竞争的代码。内容主要包括他们的接口,行为和用途。        同步方法的基石是原子操作。他是其他同步方法的基础。原子操作保证指令以原子的方式执行。即执行过程不会被打断。原子操作也指的是不能够被分割的指令。        内核提供了两组原子操作接口——一组针对整数进行操作,另一组针对单独

2017-01-30 22:22:07 382

转载 make menuconfig时出现 #include CURSES_LOC错误

In file included from scripts/kconfig/lxdialog/checklist.c:24:0: scripts/kconfig/lxdialog/dialog.h:31:20: fatal error: curses.h: 没有那个文件或目录  #include CURSES_LOC                     ^ compilation te

2017-01-29 16:56:32 1050

原创 linux锁学习记录

临界区和竞争条件:        所谓的临界区,就是访问和操作共享数据的额代码段,多个执行线程并发访问同一个资源通常是不安全的。为了避免在临界区中并发的执行,必须保证这些代码原子的执行。如果两个执行线程有可能处于同一临界区中同事执行,那么这就是程序的bug,如果情况真的发生,就称之为竞争条件。这种情况出现的机会往往非常小。        这样,避免并发和防止竞争条件成为同步。       

2017-01-29 15:50:24 300

原创 工作队列

工作队列是一个用于创建内核线程的接口。通过他创建的进程负责执行由内核其他部分排到队列里的任务。工作队列的最基本的形式,就是把需要推后执行的任务交给特定的通用线程的这样一种接口。        缺省的工作线程叫做event/n,n代表处理器的编号。缺省线程会从多个地方得到被推后的工作。        工作这线程用workqueue_struct来表示。 Struct workqueue_str

2017-01-29 01:56:47 241

原创 tasklet继续

1.28学习记录 调度自己的taasklet 可以使用task_disable()来禁止某个指定的tasklet,若正在执行,那么就会等待其执行完毕再结束。 也可以使用tasklet_disable_nosync()强制禁止。 使用tasklet_enable()可以激活一个tasklet(); 使用tasklet_kill()函数从挂起列队中去掉一个tasklet。

2017-01-28 17:30:59 298

原创 Linux Tasklet

linux 软中断的使用软中断保留给系统中对时间要求最严格以及最重要的下半部使用。目前只有两个子系统直接使用了软中断 (网络和SCSI)内核定时器和tasklet也是建立在软中断上的编译期间在<linux/interrupt.h>定义一个枚举类型来静态的申明一个软中断注册你的处理程序 open_softirq();//注册中断处理函数例如: open_softirq(NET_TX_SOFTIRQ,n

2017-01-28 02:48:16 346

转载 regfile.v

module regfile( input wire clk, input wire rst, //写端口 input wire we, input wire['RegAddrBus] waddr, input wire['RegBus] wdata, //读端口 input wire re1, input wire['RegAddrBus]

2017-01-26 17:27:46 2593

原创 简单的ori指令实现

`include "defines.v" module if_id( input wire clk, input wire rst, input wire[`InstAddrBus] if_pc, input wire[`InstBus]          if_inst, output reg[`InstAddrBus]      id_pc,

2017-01-25 22:04:46 4045

原创 简单MIPS处理器的设计蓝图

设计目标        教学版OpenMips处理器,具有哈佛结构的32位标量处理,兼容MIPS32 Release1指令架构,这样可以使用现有的MIPS编译环境。设计目标如下        五级整数流水线,分别是:取址,译码,执行,访存,回写。        哈佛结构,分开的指令,数据接口。        32个32位指令存储器。        大端模式        向量化异常处理

2017-01-24 13:51:13 1671

原创 hdl 简单设计举例

电路设计举例        本节设计一个简化的处理器取指令,体会HDL的使用:        处理器一般有一个PC寄存器,其中存储指令地址,本次尝试包括两个部分:PC模块,指令存储器。 1、 PC模块的设计与实现 PC模块的功能就是给出取指令地址,同时每个时钟周期取指令地址递增。   1、 rst 宽度为1 输入 作用为复位信号 2、 clk 宽度为1 输入 作用为时钟信号 3、

2017-01-23 22:00:43 821

原创 HDL基础

Verlog        定义的模块一般包括过程语句,其中过程语句分为两种:initial 和alwa Initial用于仿真当中的初始化,always用于不断重复执行的。Always过程是可以用于综合的,initial是不可综合的。        Always过程语句:               Always@()               Begin            

2017-01-22 20:55:51 879

原创 更新一些堆栈的操作实现

堆栈的实现包括有使用指针的实现方式和使用数组的实现方式。 下面为指针的实现方式: //堆栈也叫做LIFO结构 /* 堆栈的基本操作包括清空栈和判断是否是空栈都是栈的操作的一部分 *栈顶是唯一可见的操作 *栈的本质其实也是一个表,任何表的方法都可以用来实现栈 *栈的实现包括两种流行的方法,一种是使用指针来实现,另一种是使用数组来实现 */ //栈的链表实现 //1.使用单链表来实现 //

2017-01-21 16:07:55 677

原创 C++的一些笔记

初学C++ 今天回忆了一下,遇到了在成员函数后面添加一个const字符的情况,其作用是: 通过把成员函数申明为const以表明他们不修改类对象。任何不会修改数据成员的函数都应该

2016-12-23 21:19:02 222

转载 linux system call

1 SYSCALL_DEFINE4(reboot,   2                 int ,magic1,   3                 int, magic2,   4                 unsigned int ,cmd   5                 void _user *,ang)   6 {   7         if(!capa

2016-11-12 13:01:55 614

翻译 Linux调度的实现

在讨论了采用CFS调度算法的动机和内部逻辑以后,可以适当探索CFS的部分具体实现。相关代码位于文件kernel/sched_fair.c当中。可以查看其中四个组成部分。 ·时间记账 ·进程选择 ·调度器入口 ·睡眠和唤醒 1.5.1 时间记账: 调度器要为每个进程做时间记账,在多数的Unix系统当中,

2016-11-02 18:08:35 588

翻译 Linux进程的管理

1.1 多任务 多任务操作系统就是能同时并发地交互执行郭哥进程的操作系统。在单处理机器上,这会产生多个进程在同时运行的错觉。在多处理机上,着会使多个进程在不同机器上真正同时,并行地运行。无论在单处理机还是多处理器机器上,多任务操作系统都能使多个进程处于堵塞或者睡眠的状态,也就是说,实际上并没有被真正的投入运行。进程利用内核堵塞自己,直到某些事件的产生。 多任务系统可以分为两类:非抢占式多任务和

2016-11-01 09:52:02 314

AD实用教程

AD画板,实用的AD画板教程,从入门到精通

2015-09-29

黑苹果 macos sierra usb installer

黑苹果安装

2017-08-02

空空如也

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

TA关注的人

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