嵌入式&C&C++&单片机
文章平均质量分 71
shengDay
这个作者很懒,什么都没留下…
展开
-
C/C++堆与栈详悉
C/C++堆与栈详悉-----------------堆与栈一、预备知识—程序的内存分配一个由c/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注转载 2017-05-10 20:19:26 · 284 阅读 · 0 评论 -
C/C++堆、栈及静态数据区详解
C/C++堆、栈及静态数据区详解五大内存分区在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释转载 2017-05-10 20:17:49 · 324 阅读 · 0 评论 -
C/C++结构体的一个高级特性――指定成员的位数
在大多数情况下,我们一般这样定义结构体:struct student{ unsigned int sex; unsigned int age;};对于一般的应用,这已经能很充分地实现数据了的“封装”。但是,在实际工程中,往往碰到这样的情况:那就是要用一个基本类型变量中的不同的位表示不同的含义。譬如一个cpu内部的标志寄存器,假设为16 b转载 2017-05-11 15:59:04 · 1168 阅读 · 0 评论 -
从两道经典试题谈C/C++中联合体(union)的使用
试题一:编写一段程序判断系统中的CPU是Little endian还是Big endian模式?分析:作为一个计算机相关专业的人,我们应该在计算机组成中都学习过什么叫Little endian和Big endian。Little endian和Big endian是CPU存放数据的两种不同顺序。对于整型、长整型等数据类型,Big endian认为第一个字节是最高位字节(按照从低地址转载 2017-05-11 16:03:45 · 341 阅读 · 0 评论 -
编译结果中各段意义
编译器编译出来的结果在map 或try文件中可以看到很多.text .bss等段却不知道具体的意义,现在就来整理分析一下各段的含义可执行代码段,.text Windows 3.1和WindowsNT之间的一个区别就是WindowsNT默认的做法是将所有的代码段(正如它们在Windows3.1中所提到的那样)组成了一个单独的段,名为 “.text”。既然WindowsNT使用转载 2017-05-11 17:19:11 · 378 阅读 · 0 评论 -
嵌入式audio基础(一)接口
audio接口不少,这里就做一个总结介绍。 最常见的3.5mm 衍生出来6.25mm 6.3mm和2.5mm接口 2.5mm接口相对于3.5mm有点就是尺寸小,一些mp3等便携超薄设备上经常使用,缺点就是接触面积小导致噪声比较大。6.25mm和6.3mm的个他正好相反,主要用与一些音响的接口上。 XLR XLR 是由James H. Cannon, 于美国加州转载 2017-05-11 17:23:37 · 760 阅读 · 0 评论 -
C-宏
可变参数宏__VA_ARGS__:总体来说就是将左边宏中 ... 的内容原样抄写在右边 __VA_ARGS__ 所在的位置也就是说 define debug(a,b,c... ) printf(a,b,c,__VA_ARGS_)等于是对于不确定有多少的变量都可以先明确调用#define test(format, ...) fprintf (st转载 2017-05-11 17:26:08 · 259 阅读 · 0 评论 -
main和_main的区别
arm启动程序中当所有的系统初始化工作完成之后,就需要把程序流程转入主应用程序,即呼叫主应用程序。最简单的一种情况是: IMPORT main b main 直接从启动代码跳转到应用程序的主函数入口,当然主函数名字可以由用户根据自己的喜好随意定义。 我们还经常见到另一种使用方法 IMPORT __main B __main转载 2017-05-11 17:32:14 · 1597 阅读 · 0 评论 -
DLL编写教程
半年不能上网,最近网络终于通了,终于可以更新博客了,写点什么呢?决定最近写一个编程技术系列,其内容是一些通用的编程技术。例如DLL,COM,Socket,多线程等等。这些技术的特点就是使用广泛,但是误解很多;网上教程很多,但是几乎没有什么优质良品。我以近几个月来的编程经验发现,很有必要好好的总结一下这些编程技术了。一来对自己是总结提高,二来可以方便光顾我博客的朋友。好了,废话少说,言归正传转载 2017-05-23 18:11:56 · 447 阅读 · 0 评论 -
__I、 __O 、__IO&volatile&const解惑
__I、 __O 、__IO是什么意思?这是ST库里面的宏定义,定义如下:#define __I volatile const /*!#define __O volatile /*!#define __IO volatile /*!转载 2017-05-07 16:05:26 · 347 阅读 · 0 评论 -
高性能IO模型浅析
服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种:(1)同步阻塞IO(Blocking IO):即传统的IO模型。(2)同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK。注意这里所说的NIO并非Java的NIO(New IO)库。(3)IO多路复用(IO Multiplexi转载 2017-05-07 16:09:27 · 212 阅读 · 0 评论 -
汇编器构造
汇编器构造 一、 汇编器简介前面介绍了编译器构造和静态链接器构造的具体方法,而且我们实现了一个将高级语言转化为汇编语言的编译器,同时又实现了一个将多个目标文件链接为一个可执行文件的链接器。现在需要一个连接这两个模块的功能模块——汇编器,它能将一个单独的汇编文件转换为一个可重定位目标文件,如图1-1反映出汇编器在整个编译系统中的地位和功能。 图 1-1转载 2017-05-07 16:14:39 · 957 阅读 · 1 评论 -
为何计算机人应该懂一点编译知识?
为何计算机人应该懂一点编译知识?2009年冬,本科计算机《编译原理》课程结业考试结果公布,虽然取得了不错的考试成绩,可是自己除了熟练掌握了那些艰涩难懂的文法分析算法之外,对编译器的工作原理仍然貌似“一无所知”。这让我下定决心在本科毕业设计时,选定了《自定义语言编译器的设计与实现》这个题目,从此与编译领域结下了不解之缘。2012年读研期间,在之前实现的编译器的基础上继而实现了汇编器和静态转载 2017-05-07 16:21:58 · 362 阅读 · 0 评论 -
虚函数与虚继承寻踪
虚函数与虚继承寻踪封装、继承、多态是面向对象语言的三大特性,熟悉C++的人对此应该不会有太多异议。C语言提供的struct,顶多算得上对数据的简单封装,而C++的引入把struct“升级”为class,使得面向对象的概念更加强大。继承机制解决了对象复用的问题,然而多重继承又会产生成员冲突的问题,虚继承在我看来更像是一种“不得已”的解决方案。多态让对象具有了运行时特性,并且它是软件设计复用的转载 2017-05-07 16:36:08 · 419 阅读 · 0 评论 -
那些陌生的C++关键字
那些陌生的C++关键字 学过程序语言的人相信对关键字并不陌生。偶然间翻起了《C++ Primer》这本书,书中列举了所有C++的关键字。我认真核对了一下,竟然发现有若干个从未使用过的关键字。一时间对一个学了六年C++的自己狠狠鄙视了一番,下决心一定要把它们搞明白!图1红色字体给出的是我个人感觉一般大家都会比较陌生的关键字,下边我们逐个学习。图1 C++ 关键字一、typei转载 2017-05-07 16:40:57 · 380 阅读 · 0 评论 -
静态链接器构造
静态链接器构造 一、 链接器简介众所周知,高级语言程序编写后需要经过编译、汇编、链接、加载的步骤才能在机器上正常执行。Gcc的处理步骤更加复杂:如果是C语言程序(*.c)作为gcc的输入,gcc首先对高级语言程序进行预编译,然后利用文法分析程序将程序翻译为通用的中间代码,接着gcc对中间代码进行优化后最终生成x86的汇编程序(*.S);下一步gcc的汇编器开始工转载 2017-05-07 16:44:00 · 712 阅读 · 0 评论 -
C中#if 0 和#if 1&&#ifdef, #else, #endif, #if详细
当注释掉大块代码时,使用"#if 0"比使用"/**/"要好,因为用"/**/"做大段的注释要防止被注释掉的代码中有嵌套的"/**/",这会导致注释掉的代码区域不是你想要的范围, 当被注释掉的代码很大时容易出现这种情况,特别是过一段时间后又修改该处代码时更是如此。 在这里顺便对条件编译(#ifdef, #else, #endif, #if等)进行说明。以下分3种情况: 1. 情况1:转载 2017-05-07 19:02:23 · 851 阅读 · 0 评论 -
I2C总线协议学习笔记
I2C总线协议学习笔记I2C协议 2条双向串行线,一条数据线SDA,一条时钟线SCL。 SDA传输数据是大端传输,每次传输8bit,即一字节。 支持多主控(multimastering),任何时间点只能有一个主控。 总线上每个设备都有自己的一个addr,共7个bit,广播地址全0. 系统中可能有多个同种芯片,为此addr分为固定部分和可编程部份,细节视芯转载 2017-05-08 14:44:08 · 399 阅读 · 0 评论 -
STM32各种时钟的区别
[转] STM32各种时钟的区别[原创]:http://m.oschina.net/blog/129357我在原创的基础又从另一位博主处引用了一些内容。 时钟系统是处理器的核心,所以在学习STM32所有外设之前,认真学习时钟系统是必要的,有助于深入理解STM32。 下面是从网上找的一个STM32时钟框图,比《STM32中文参考手册》里面的是中途看起来清晰一些:转载 2017-05-09 11:30:50 · 1598 阅读 · 0 评论 -
应用程序和驱动中使用I2C的流程
应用程序和驱动中使用I2C的流程编写I2C设备驱动有两种方法。一种是利用系统给我们提供的i2c-dev.c来实现一个i2c适配器的设备文件。然后通过在应用层操作i2c适配器来控制i2c设备。另一种是为i2c设备,独立编写一个设备驱动。注意:在后一种情况下,是不需要使用i2c-dev.c的。前一种方法也就是说只要系统实现了I2C适配器的驱动并生成了设备文件, 那么挂在其上面的I2C设备也可以转载 2017-05-10 14:43:52 · 2491 阅读 · 0 评论 -
Linux I2C核心、总线与设备驱动
Linux I2C核心、总线与设备驱动本章导读I2C总线仅仅使用SCL、SDA两根信号线就实现了设备之间的数据交互,极大地简化对硬件资源和PCB板布线空间的占用。因此,I2C总线被非常广泛地应用在EEPROM、实时钟、小型LCD等设备与CPU的接口中。Linux定义了系统的I2C驱动体系结构,在Linux系统中,I2C驱动由3部分组成,即I2C核心、I2C总线驱动和I2C设备驱动。这3转载 2017-05-10 14:52:48 · 886 阅读 · 0 评论 -
用GPIO模拟SPI协议的实现
用GPIO模拟SPI协议的实现一 SPI协议概括SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只转载 2017-05-10 15:02:51 · 1099 阅读 · 0 评论 -
解析 STM32 的启动过程
解析 STM32 的启动过程解析STM32的启动过程当前的嵌入式应用程序开发过程里,并且C语言成为了绝大部分场合的最佳选择。如此一来main函数似乎成为了理所当然的起点——因为C程序往往从main函数开始执行。但一个经常会被忽略的问题是:微控制器(单片机)上电后,是如何寻找到并执行main函数的呢?很显然微控制器无法从硬件上定位main函数的入口地址,因为使用C语言作为开发语言后,转载 2017-06-05 19:06:25 · 451 阅读 · 0 评论 -
【stm32f407】GPIO原理以及跑马灯的应用
1. GPIO介绍1)介绍:GPIO:(GeneralPurpose Input Output (通用输入/输出)简称为GPIO) 基本结构:stm32f407VGT6这款单片机上共有PA‐PE共5×16共80个复用IO口,每个通用I / O端口有4个32位配置寄存器(GPIOx_MODERGPIOx_OTYPER GPIOx_OSPEEDR转载 2017-06-05 19:47:41 · 1740 阅读 · 0 评论 -
【stm32f407】时钟树以及SystemInit剖析
一. 时钟树众所周知,时钟系统是CPU的脉搏,就像人的心跳一样。所以时钟系统的重要性就不言而喻了。 STM32F4的时钟系统比较复杂,不像简单的51单片机一个系统时钟就可以解决一切。于是有人要问,采用一个系统时钟不是很简单吗?为什么STM32要有多个时钟源呢?因为首先STM32本身非常复杂,外设非常的多,但是并不是所有外设都需要系统时钟这么高的频率,比如看门狗以及RTC只需要几十k的时钟即转载 2017-06-05 19:49:26 · 1333 阅读 · 0 评论 -
自己早期写的一个简单上下班打卡统计工时的考勤系统【整理版】
原本这个帖子,是由回复组成的,整个代码分布在各个回复里面,读者不好阅读,现在整个把它们放到正文,方便查看。这是早期写的一个,仅仅是简单的考勤系统,大致功能是有的,但并未写的很牛叉,采用了文本来记录考勤数据,供小菜一览。 [cpp] view plain copy//头文件:emp_head.h #ifndef转载 2017-06-01 16:50:23 · 5327 阅读 · 0 评论 -
详细分析stm32f10x.h
/**这里是STM32比较重要的头文件 ****************************************************************************** * @file stm32f10x.h ST 标准的头文件 * @author MCD Application Team 微转载 2017-06-02 20:56:57 · 3124 阅读 · 0 评论 -
typedef的用法进阶1
typedef的用法在C语言中,可以使用typedef命令给已有的数据类型起“别名”,用来代替原有的数据类型名。用途一:定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。 例: char* pa, pb; 注:它只声明了一个指向字符变量的指针和一个字符变量,不太符合我们一般地意图。 typedef char* PCHAR转载 2017-06-19 17:26:31 · 419 阅读 · 0 评论 -
C语言学习之路-由浅入深(快速掌握c基础)
注明:本博客只适用于有Java基础的人观看,因为java是c的升级版,所以下面我们会用java来与c比较1.第一个C程序:HelloWorld.c首先我这里是使用这个软件编写的:下载地址安装过程一直next就好了安装后在你的代码目录创建一个HelloWorld.c,代码目录可以随意,然后双击打开HelloWorld.c就可以默认进入我们下载的c开发软件中,如图:转载 2017-06-03 21:23:13 · 696 阅读 · 0 评论 -
GPIO 输入—按键检测
这里要用到一定的模电知识。电容两端电压不能突变,电感两端电流不能突变。这里利用了电容的放电延时实现硬件消抖。按键按下会有抖动,波形有毛刺,使得高低电平显现不明显,而按键按下时,电容放电一下,马上又被充电,此时电容两端的电压不会突然变化,这个延时时间恰好可以达到消抖作用。这里需要使用一个固件库函数: /** * @brief Reads the specified转载 2017-06-29 17:45:44 · 1616 阅读 · 1 评论 -
什么叫做“假学习”?什么叫做“真学习”?
什么叫做“假学习”? 一、QQ群 一天上班开始看QQ群,聊到下班。里面争论的火热。美其名曰在学习,实际上你什么都没学到。好记性不如烂笔头。争论百变,不如看则帖子。 因为你在QQ群里争论的都是你会的东西(不会的东西,你也不会争论)。所以你永远学不到新的东西。不如看看看一则你能学到的贴子。 二、看书 买一堆书,有空看看。看书,这是典型的假学习。看书看不懂转载 2017-07-10 20:47:52 · 1224 阅读 · 0 评论 -
linux下Makefile学习
linux下Makefile学习转自陈皓 (CSDN),加上自己的学习体会!概述什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和 professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解转载 2017-07-10 20:57:31 · 649 阅读 · 0 评论 -
C语言再学习 -- 详解C++/C 面试题 2
分类: C语言再学习(74) 版权声明:本文为博主原创文章,未经博主允许不得转载。目录(?)[+](经典)C语言测试:想成为嵌入式程序员应知道的0x10个基本问题。参看:嵌入式程序员面试问题集锦1、用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SENCONDS_PER_YEAR (60*60*24*365)UL解答:转载 2017-06-21 18:33:22 · 375 阅读 · 0 评论 -
二维图形的矩阵变换(一)——基本概念
二维图形的矩阵变换(一)——基本概念基本的二维变换可包括旋转、缩放、扭曲,和平移四种, 而这些几何运算则可以转换为一些基本的矩阵运算: 这几个变换都是线性的,但平移运算不是线性的,不能通过2*2矩阵运算完成。若要将点 (2, 1)在 x 方向将其平移 3 个单位,在 y 方向将其平移 4 个单位。 可通过先使用矩阵乘法再使用矩转载 2017-06-09 21:28:28 · 1605 阅读 · 0 评论 -
2D平面中关于矩阵(Matrix)跟图形变换的讲解
2D平面中关于矩阵(Matrix)跟图形变换的讲解原文:http://blog.csdn.NET/linmiansheng/article/details/18801947在二维平面上,常用的有以下三种基本的图形变化:1)Translation2)Scale3)Rotation在Android的开发中,我们也经常会用到这样转载 2017-06-09 21:51:01 · 680 阅读 · 0 评论 -
图形变换矩阵
图形变换矩阵 |包括平面的和空间的如果把点定义为行向量,那么根据矩阵的乘法,变换矩阵的形式只能是这样的:P'=PT其中的P’是变换后的点坐标,而P为变换前的坐标,T为变换矩阵空间图形的几何变换和前面类似,采转载 2017-06-22 21:42:58 · 1128 阅读 · 0 评论 -
图形变换之基本矩阵变换
图形变换之基本矩阵变换1)平移变换从一个位置到另一个位置的变换可以用平移矩阵T表示,该矩阵通过向量t=(tx,ty,tz)对实体进行平移操作。其实还有另外一种形式(以左手坐标系为基准):第一种形式(以右手坐标系为基准的)进行变换时将T与需要变换的点或向量A(列向量)相乘,即TA。第二种形式(以左手坐标系为基准)将需要变换的点或向量(行向量)与T相乘,转载 2017-06-22 21:45:09 · 6599 阅读 · 0 评论 -
二维图形的矩阵变换(一)——基本概念
二维图形的矩阵变换(一)——基本概念基本的二维变换可包括旋转、缩放、扭曲,和平移四种, 而这些几何运算则可以转换为一些基本的矩阵运算: 这几个变换都是线性的,但平移运算不是线性的,不能通过2*2矩阵运算完成。若要将点 (2, 1)在 x 方向将其平移 3 个单位,在 y 方向将其平移 4 个单位。 可通过先使用矩阵乘法再使用矩转载 2017-06-22 21:46:42 · 923 阅读 · 0 评论 -
图形学学习笔记]OpenGL视图矩阵变换
[图形学学习笔记]OpenGL视图矩阵变换模型矩阵这个三维模型,是由一组顶点定义的。顶点的XYZ坐标是相对于物体中心定义的:也就是说,若某顶点位于(0, 0, 0),它就在物体的中心。也许玩家需要用键鼠控制这个模型,所以我们希望能够移动它。这简单,只需学会:缩放 旋转 平移就行了。在每一帧中,用算出的这个矩阵,去乘(在GLSL中乘,不是C++中!)所有的顶点,物体就动了转载 2017-06-22 21:49:04 · 888 阅读 · 1 评论 -
转]C语言图形编程(五) -二维图形变换①
转]C语言图形编程(五) -二维图形变换① 从这一部分开始,进入了图形编程的比较烦琐的部分,要真正对图形编程有所了解,这一部分的内容是必须要掌握的。 在计算机绘图过程中,经常需要进行绘图变换,主要包括二维图形变换和三维图形变换。这一部分讨论二维图形变换,其内容有用户坐标到屏幕坐标的变换、图形的比例变换、对称变换、错切变换、旋转变换、平移变换转载 2017-06-22 21:53:17 · 5040 阅读 · 0 评论