自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

maple

如逆水行舟,不进则退。

  • 博客(109)
  • 资源 (1)
  • 收藏
  • 关注

转载 stm8 Slave

宏定义#define SLAVE_ADDR 0x51#define I2CSPEED 400000 //i2c速度123stm8l051 i2c从机初始化 /* I2C clock Enable*/ CLK_PeripheralClockConfig(CLK_Peripheral_I2C1, ENABLE); I2C_DeInit(I2C1);

2016-11-02 16:28:38 1025

转载 用户空间与内核空间,进程上下文与中断上下文[总结]

1、前言  最近在学习linux内核方面的知识,经常会看到用户空间与内核空间及进程上下文与中断上下文。看着很熟悉,半天又说不出到底是怎么回事,有什么区别。看书过程经常被感觉欺骗,似懂非懂的感觉,很是不爽,今天好好结合书和网上的资料总结一下,加深理解。2、用户空间与内核空间    我们知道现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为

2016-08-26 16:06:28 687

原创 一定要弄懂GetMemory

堆栈栈中分配局部变量空间,是系统自动分配空间。定义一个 char a;系统会自动在栈上为其开辟空间。由于栈上的空间是自动分配自动回收的,所以栈上的数据的生存周期只是在函数的运行过程中,运行后就释放掉,不可以再访问。堆区分配程序员申请的内存空间,堆上的数据只要程序员不释放空间,就一直可以访问到,不过缺点是一旦忘记释放会造成内存泄露。静态区是分配静态变量,全局变量空间的。

2016-08-23 17:28:43 1592

转载 Linux系统结构 详解

Linux系统一般有4个主要部分:内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。部分层次结构如图1-1所示。 1. linux内核        内核是操作系统的核心,具有很多最基本功能,它负责管理系统的进程、内存、设备驱动程

2016-08-23 15:30:37 603

转载 八大排序算法

概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。我们这里说说八大排序就是内部排序。        当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。   快速排序:是目前基于比较的内部排序中被认为是最好的方法,

2016-08-23 15:22:56 757

转载 linux体系结构与内核结构图解

1.当被问到Linux体系结构(就是Linux系统是怎么构成的)时,我们可以参照下图这么回答:从大的方面讲,Linux体系结构可以分为两块:(1)用户空间:用户空间中又包含了,用户的应用程序,C库(2)内核空间:内核空间包括,系统调用,内核,以及与平台架构相关的代码 2.Linux体系结构要分成用户空间和内核空间的原因:    1)现代CPU通常都实现了不同的工作模式,

2016-08-22 18:13:33 528

原创 嵌入式linux启动过程详解

前言  在多数计算机上,从Linux启动到进入系统的命令行或者图形界面时间并不长。嵌入式Linux启动过程中都做了什么工作,会展现出一个功能强大的系统,本文分析Linux系统启动过程。学习和掌握Linux启动的过程对了解Linux内核工作流程有很大帮助。Linux系统初始化可以分成两大部分:内核初始化和系统初始化。本文分析从打开电源开关到进入用户界面Linux系统的工作过程。  操

2016-08-22 17:56:05 4227

转载 connect()函数阻塞问题

1.采用select在学习嵌入式Linux网络编程中,很多同学都发现了一个问题,那就是调用connect函数时,如果服务端关闭,客户 端调用connect()函数时,发现阻塞在那里,而且利用ctrl+c信号去停止客户端程序时,需要等待一个较为长的时间才能响应了,这个时间如果大家 细心会发现,每次都是75秒的时间。那么有没有什么比较好的办法,可以以用户能接受的一个时间响应来停止掉一个正在

2016-08-09 11:21:59 7939

翻译 操作系统思考 第零章 前言

第零章 前言作者:Allen B. Downey原文:Chapter 0 Preface译者:飞龙协议:CC BY-NC-SA 4.0在许多计算机科学的课程中,操作系统都是高级话题。学生在上这门课之前,它们已经知道了如何使用C语言编程,他们也可能上过计算机体系结构(组成原理)的课程。通常这门课的目标是让学生们接触操作系统的设计与实现,并带有一些他们未来在该领域所研究

2016-07-18 09:56:30 502

翻译 操作系统思考 第十一章 C语言中的信号量

第十一章 C语言中的信号量作者:Allen B. Downey原文:Chapter 11 Semaphores in C译者:飞龙协议:CC BY-NC-SA 4.0信号量是学习同步的一个好方式,但是它们实际上并没有像互斥体和条件变量一样被广泛使用。尽管如此,还是有一些同步问题可以用信号量简单解决,产生显然更加合适的解决方案。这一章展示了C语言用

2016-07-18 09:06:32 3498 1

翻译 操作系统思考 第十章 条件变量

第十章 条件变量作者:Allen B. Downey原文:Chapter 10 Condition variables译者:飞龙协议:CC BY-NC-SA 4.0像上一章所展示的那样,许多简单的同步问题都可以用互斥体解决。这一章中我会介绍一个更大的挑战,著名的“生产者-消费者”问题,以及一个用于解决它的新工具,条件变量。10.1 工作队列在一些多线

2016-07-16 15:18:29 1080

翻译 操作系统思考 第九章 线程

第九章 线程作者:Allen B. Downey原文:Chapter 9 Threads译者:飞龙协议:CC BY-NC-SA 4.0当我在2.3节提到线程的时候,我说过线程就是一种进程。现在我会更仔细地解释它。当你创建进程时,操作系统会创建一块新的地址空间,它包含text段、static段、和堆区。它也会创建新的“执行线程”,这包括程序计数器和其它硬件状态

2016-07-16 11:27:49 1021

翻译 操作系统思考 第八章 多任务

第八章 多任务作者:Allen B. Downey原文:Chapter 8 Multitasking译者:飞龙协议:CC BY-NC-SA 4.0在当前的许多系统上,CPU包含多个核心,也就是说它可以同时运行多个进程。而且,每个核心都具有“多任务”的能力,也就是说它可以从一个进程快速切换到另一个进程,创造出同时运行许多进程的幻象。操作系统中,实现多任务的这部

2016-07-16 09:09:02 2024 1

翻译 操作系统思考 第七章 缓存

第七章 缓存作者:Allen B. Downey原文:Chapter 7 Caching译者:飞龙协议:CC BY-NC-SA 4.07.1 程序如何运行为了理解缓存,你需要理解计算机如何运行程序。你应该学习计算机体系结构来深入理解这个话题。这一章中我的目标是给出一个程序执行的简单模型。当程序启动时,代码(或者程序文本)通常位于硬盘上。操作系统创建新

2016-07-15 13:57:07 2671

翻译 操作系统思考 第六章 内存管理

第六章 内存管理作者:Allen B. Downey原文:Chapter 6 Memory management译者:飞龙协议:CC BY-NC-SA 4.0C提供了4种用于动态内存分配的函数:malloc,它接受表示字节单位的大小的整数,返回指向新分配的、(至少)为指定大小的内存块的指针。如果不能满足要求,它会返回特殊的值为NULL的指针。ca

2016-07-15 09:40:15 919

翻译 操作系统思考 第五章 更多的位与字节

第五章 更多的位与字节作者:Allen B. Downey原文:Chapter 5 More bits and bytes译者:飞龙协议:CC BY-NC-SA 4.05.1 整数的表示你可能知道计算机以二进制表示整数。对于正数,二进制的表示法非常直接。例如,十进制的5表示成二进制是0b101。对于负数,最清晰的表示法使用符号位来表明一个数是正数

2016-07-14 17:55:20 1211

翻译 操作系统思考 第四章 文件和文件系统

第四章 文件和文件系统作者:Allen B. Downey原文:Chapter 4 Files and file systems译者:飞龙协议:CC BY-NC-SA 4.0当一个进程运行完毕(或崩溃)时,任何储存在主存的数据都会丢失。但是储存在机械硬盘(HDD)或固态硬盘(SSD)的数据是“持久”的。也就是说,它在进程结束之后,甚至关机之后仍旧存在。机

2016-07-14 17:26:35 1204

翻译 操作系统思考 第三章 虚拟内存

第三章 虚拟内存作者:Allen B. Downey原文:Chapter 3 Virtual memory译者:飞龙协议:CC BY-NC-SA 4.03.1 简明信息理论比特是二进制的数字,也是信息的单位。一个比特有两种可能的情况,写为0或者1。如果是两个比特,那就有四种可能的组合,00、01、10和11。通常,如果你有b个比特,你就可以表示2 **

2016-07-13 17:49:42 1248

翻译 操作系统思考 第二章 进程

第二章 进程作者:Allen B. Downey原文:Chapter 2 Processes译者:飞龙协议:CC BY-NC-SA 4.02.1 抽象和虚拟化在我们谈论进程之前,我打算先定义几个东西:抽象(Abstraction):抽象是复杂事物的简单表示。例如,如果你开车的话,应该知道车轮向左转的时候车也会向左行驶,反之亦然。当然,方向盘由一系

2016-07-13 17:11:23 1036

翻译 操作系统思考 第一章 编译

第一章 编译作者:Allen B. Downey原文:Chapter 1 Compilation译者:飞龙协议:CC BY-NC-SA 4.01.1 编译语言和解释语言人们通常把编程语言描述为编译语言或者解释语言。前者的意思是程序被翻译成机器语言,之后由硬件执行;而后者的意思是程序被软件解释器读取并执行。例如,C被认为是编译语言,而Python被认为是解释语

2016-07-13 09:28:42 886

转载 详解SPI中的极性CPOL和相位CPHA

详解SPI中的极性CPOL和相位CPHA           SPI由于接口相对简单(只需要4根线),用途算是比较广泛,主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。即一个SPI的Master通过SPI与一个从设备,即上述的那些Flash,ADC等,进行通讯。而主从设备之间通过SPI进行通讯,首先要保证两者之间时钟SCLK要一致,互相要

2016-07-12 10:14:06 723

原创 STM32启动文件详解及SystemInit函数分析(转)

;先在RAM中分配系统使用的栈,RAM的起始地址为0x2000_0000;然后在RAM中分配变量使用的堆;然后在CODE区(flash)分配中断向量表,flash的起始地址为0x0800_0000,该中断向量表就从这个起始地址开始分配;分配完成后,再定义和实现相应的中断函数,;所有的中断函数全部带有[weak]特性,即弱定义,如果编译器发现在别处文件中定义了同名函数,在链接时用别处的地址进

2016-07-12 09:45:45 1846

转载 关于stm32 HardFault_Handler 异常的处理 死机

在系统开发的时候,出现了HardFault_Handler硬件异常,也就是死机,尤其是对于调用了os的一系统,程序量大,检测堆栈溢出,以及数组溢出等,找了半天发现什么都没有的情况下,估计想死的心都有了。如果有些程序开始的时候一切没有问题,但是运行几个小时候,会发现死机了,搞个几天下来估计蛋都碎了一地吧。。。一般来说运行操作系统  是以下几个问题1.开始的时候给ucos分配的堆栈太小

2016-07-02 14:37:56 4077

转载 上拉下拉电阻总结

一、定义:上拉就是将不确定的信号通过一个电阻嵌位在高电平!电阻同时起限流作用!下拉同理!上拉是对器件注入电流,下拉是输出电流;弱强只是上拉电阻的阻值不同,没有什么严格区分;对于非集电极(或漏极)开路输出型电路(如普通门电路)提升电流和电压的能力是有限的,上拉电阻的功能主要是为集电极开路输出型电路输出电流通道。二、上下拉电阻作用:1、提高电压准位:  a.当TTL电路

2016-05-10 16:49:33 955

转载 STM32中的PWM的频率和占空比的设置

网上看到一篇文章,不是很完整,但是有助于我理解,个人觉得还可以,具体的代码,网上有很多,大家可以参考参考计算一下。下面的这个是stm32的定时器逻辑图,上来有助于理解:TIM3的ARR寄存器和PSC寄存器,确定PWM频率。这里配置的这两个定时器确定了PWM的频率,我的理解是:PWM的周期(频率)就是ARR寄存器值与PSC寄存器值相乘得来,但不是简

2016-03-03 16:16:38 10606 2

转载 常见的嵌入式linux学习和如何选择ARM芯片问答

常见的ARM嵌入式学习问答,设计者和学习者最关心的11个问题:1.          ARM嵌入式是学习硬件好还是学习软件好?2.          嵌入式软件和硬件,哪一种职位待遇更高?或者说,在设计中哪一个更重要?3.        学完51单片机后,想买ARM开发板继续学习,是买ARM7还是ARM9?4.        到底是学习哪种内核:ARM7、CORTEX-M3、COR

2016-02-27 16:09:00 4033

转载 并发编程系列之一:锁的意义

背景 C/C++语言的并发程序(Concurrent Programming)设计,一直是一个比较困难的话题。很多朋友都会尝试使用多线程编程,但是却很难保证自己所写的多线程程序的正确性。多线程程序,如果涉及到对共享资源的并发读写,就会产生资源争用(Data Race)。解决资源争用,最直接的想法是引入锁,对并发读写的数据进行保护(更高级的则包括无锁编程—— Lock Free

2016-01-18 15:40:40 3170 1

转载 多线程程序中操作的原子性

多线程程序中操作的原子性0. 背景原子操作就是不可再分的操作。在多线程程序中原子操作是一个非常重要的概念,它常常用来实现一些同步机制,同时也是一些常见的多线程Bug的源头。本文主要讨论了三个问题:1. 多线程程序中对变量的读写操作是否是原子的?2. 多线程程序中对Bit field(位域)的读写操作是否是线程安全的?3. 程序员该如何使用原子操作?1. 多线程环境下

2016-01-18 14:54:58 441

转载 C/C++ Volatile关键词深度剖析

背景前几天,发了一条如下的微博 (关于C/C++ Volatile关键词的使用建议): 此微博,引发了朋友们的大量讨论:赞同者有之;批评者有之;当然,更多的朋友,是希望我能更详细的解读C/C++ Volatile关键词,来佐证我的微博观点。而这,正是我写这篇博文的初衷:本文,将详细分析C/C++ Volatile关键词的功能 (有多种功能)、Volati

2016-01-18 14:53:12 412

转载 编程修养(七)

28、||和&&的语句执行顺序————————————条件语句中的这两个“与”和“或”操作符一定要小心,它们的表现可能和你想像的不一样,这里条件语句中的有些行为需要和说一下:    express1 || express2            先执行表达式express1如果为“真”,express2将不被执行,express2仅在express1为“假”时才被执行。因为

2016-01-13 15:34:28 273

转载 编程修养(六)

23、static的使用————————static关键字,表示了“静态”,一般来说,他会被经常用于变量和函数。一个static的变量,其实就是全局变量,只不过他是有作用域的全局变量。比如一个函数中的static变量:char*getConsumerName(){    static int cnt = 0;        ....    cnt++;

2016-01-13 15:33:49 291

转载 编程修养(五)

16、把相同或近乎相同的代码形成函数和宏—————————————————————有人说,最好的程序员,就是最喜欢“偷懒”的程序,其中不无道理。如果你有一些程序的代码片段很相似,或直接就是一样的,请把他们放在一个函数中。而如果这段代码不多,而且会被经常使用,你还想避免函数调用的开销,那么就把他写成宏吧。千万不要让同一份代码或是功能相似的代码在多个地方存在,不然如果功能一

2016-01-13 15:31:46 298

转载 编程修养(四)

11、出错信息的处理—————————你会处理出错信息吗?哦,它并不是简单的输出。看下面的示例:    if ( p == NULL ){        printf ( "ERR: The pointer is NULL/n" );    }    告别学生时代的编程吧。这种编程很不利于维护和管理,出错信息或是提示信息,应该统一处理,而不是像上面这样,写成一个“硬

2016-01-13 15:31:05 247

转载 编程修养(三)

6、if 语句对出错的处理———————————我看见你说了,这有什么好说的。还是先看一段程序代码吧。    if ( ch >= '0' && ch         /* 正常处理代码 */    }else{        /* 输出错误信息 */        printf("error ....../n");        return ( FALSE

2016-01-13 15:29:49 286

转载 编程修养(二)

1、版权和版本———————好的程序员会给自己的每个函数,每个文件,都注上版权和版本。对于C/C++的文件,文件头应该有类似这样的注释:/**************************************************************************   文件名:network.c**   文件描述:网络通讯函数集**

2016-01-13 15:28:36 295

转载 编程修养(一)

编程修养————什么是好的程序员?是不是懂得很多技术细节?还是懂底层编程?还是编程速度比较快?我觉得都不是。对于一些技术细节来说和底层的技术,只要看帮助,查资料就能找到,对于速度快,只要编得多也就熟能生巧了。我认为好的程序员应该有以下几方面的素质:  1、有专研精神,勤学善问、举一反三。  2、积极向上的态度,有创造性思维。  3、与人积极交流沟通的能力,有团队

2016-01-13 15:27:22 330

转载 跟我一起写 Makefile(十四)

使用make更新函数库文件———————————函数库文件也就是对Object文件(程序编译的中间文件)的打包文件。在Unix下,一般是由命令"ar"来完成打包工作。一、函数库文件的成员一个函数库文件由多个文件组成。你可以以如下格式指定函数库文件及其组成:    archive(member)这个不是一个命令,而一个目标和依赖的定义。一般来说,这种用法基本上就是为了"ar"

2016-01-07 15:38:02 291

转载 跟我一起写 Makefile(十三)

五、定义模式规则你可以使用模式规则来定义一个隐含规则。一个模式规则就好像一个一般的规则,只是在规则中,目标的定义需要有"%"字符。"%"的意思是表示一个或多个任意字符。在依赖目标中同样可以使用"%",只是依赖目标中的"%"的取值,取决于其目标。有一点需要注意的是,"%"的展开发生在变量和函数的展开之后,变量和函数的展开发生在make载入Makefile时,而模式规则中的"%"则发生

2016-01-07 15:36:17 306

转载 跟我一起写 Makefile(十二)

隐含规则————在我们使用Makefile时,有一些我们会经常使用,而且使用频率非常高的东西,比如,我们编译C/C++的源程序为中间目标文件(Unix下是[.o]文件,Windows下是[.obj]文件)。本章讲述的就是一些在Makefile中的“隐含的”,早先约定了的,不需要我们再写出来的规则。“隐含规则”也就是一种惯例,make会按照这种“惯例”心照不喧地来运行,那怕我们的

2016-01-07 15:35:25 310

转载 跟我一起写 Makefile(十一)

make 的运行——————一般来说,最简单的就是直接在命令行下输入make命令,make命令会找当前目录的makefile来执行,一切都是自动的。但也有时你也许只想让make重编译某些文件,而不是整个工程,而又有的时候你有几套编译规则,你想在不同的时候使用不同的编译规则,等等。本章节就是讲述如何使用make命令的。一、make的退出码make命令执行后有三个退出码:

2016-01-07 15:34:39 277

空空如也

空空如也

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

TA关注的人

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