自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

  • 博客(57)
  • 收藏
  • 关注

原创 #include

被包含的文件用尖括号括起来是直接到系统指定的路径找;- z3 z, [5 @5 R; ]  Z被包含的文件用双引号括起来是除了到系统指定的路径找之外,还会在源文件所在的文件夹找;建议用双引号括起文件名好了。

2008-12-09 14:34:00 214

原创 函数 宏函数 内联函数的区别

宏:优点:在编译预处理阶段完成,不占用编译时间,同时,省去了函数调用时间,运行效率高。缺点:不进行类型检查,多次宏替换会导致代码体积变大,而且由于宏本质上是字符串替换,故可能会由于一些参数的副作用导致得出错误的结果。函数:优点:进行类型检查,计算正确性更有保证。缺点:函数调用需要参数、返回地址等的入栈、出栈开销,效率没有带参数宏高。PS:宏与内联函数的区别      内

2008-12-05 14:22:00 389

原创 情人

过去我与你随缘聚散恨极无奈一转眼两心分开经数载这晚再与你重逢后心里极意外想不到醉心始终这份爱情人你可知道也许知道没有未来情人如你早知道已经知道花不再开问你怎么要付出所有爱情人你可知道也许知道没法替代情人如你早知道已经知道不可变改为了不想染尘埃若最终只有离开恨慨你对我说过人无后悔夜夜期待这一晚痛哭方知喜与哀我对你说过无论是风雨或障碍得不到更想珍惜这份爱

2008-12-01 19:59:00 215

转载 Type & Object attribute

Type attributes Type attributes define how a function is called, or how a data object is accessed. This means that if you use a type attribute, it must be specified both when a function or data ob

2008-11-25 17:41:00 555

原创 MISRA C Coding Standard

MISRA (The Motor Industry Software Reliability Association 汽车工业软件可靠性联会) 是位于英国的一个跨国汽车工业协会,其成员包括了大部分欧美汽车生产商。其核心使命是为汽车工业提供服务和协助,帮助厂方开发安全的、高可靠性的嵌入式软件。这个组织最出名的成果是所谓的MISRA C Coding Standard,这一标准中包括了127条C语言编

2008-11-22 13:36:00 482

转载 C语言中的内存管理

相比静态地分配内存空间,使用动态内存分配具有明显的优势:1, 分配空间的大小够精确: 设想一个读取用户输入行的程序, 如果使用静态分配的数组作为buffer, 那么, 你如何确定该数组的长度呢? 太大或太小都不合适. 因为你无法事先知道用户输入字符串的长度. 而使用动态内存分配就精准多了.2, 静态分配的空间大小无法更改, 而动态分配的内存大小是可调的.所以, 理解C语言中的动态内存分

2008-11-13 19:26:00 404

原创 POSIX

操作系统标准  术语解释:POSIX是Portable Operating System Interface of Unix的缩写。由IEEE(Institute of Electrical and Electronic Engineering)开发,由ANSI和ISO标准化。  由来:POSIX的诞生和Unix的发展是密不可分的,Unix于70年代诞生于Bell lab,并于

2008-11-13 19:14:00 183

转载 编译程序的分类

编译程序的工作情况有三种:汇编型、解释型和编译型。汇编型编译程序用来将汇编语言编写的程序,按照一一对应的关系,转换成用机器语言表示的程序。解释型编译程序将高级语言程序的一个语句,先解释成为一组机器语言的指令,然后立即执行,执行完了,取下一组语句解释和执行,如此继续到完成一个程序为止。用解释型编译程序,执行速度很慢,但可以进行人和计算机的"对话",随时可以修改高级语言的程序。BASIC语言就

2008-11-12 19:33:00 314

转载 ADT 抽象数据类型

从数据结构的角度来说顺序结构的存储空间固定,可扩展性差,但是如果数据元素个数已知,较链式存储节省空间。他的优点是随机读取任意一个元素(因为元素时顺序存储的,所以元素的存储位置之间有一定的关系)但是顺序存储的缺点是删除,插入操作需要花费很多时间在移动元素上。 对于链式存储而言,插入和删除元素开销小,操作简便。可扩展性强。 综上所述,如果元素个数已知,且插入删除较少的可以使用顺序结构,而对于频

2008-11-12 19:27:00 226

原创 链式存储方式和顺序存储方式的比较

链式表的特点和优点就是插入和删除方便,但是要遍历也就是浏览就比较费时了.他是根据每个元素存储的下一位的地址来访问的.比如要访问第九个就必须从第一个开始,第一的问第二,第二问第三.比较费时 顺序表特点和优点就是遍历方便.他遍历的时候只要输入你要查找的位置,他可以自己计算内存大小,直接访问,比如我一个对象数组,每个对象的大小是10字节.然后我要访问第三个.他就可以直接10*3,然后去访问那块内存再

2008-11-12 18:56:00 4243 1

转载 C语言嵌入式系统编程修炼之六:性能优化

使用宏定义  在C语言中,宏是产生内嵌代码的唯一方法。对于嵌入式系统而言,为了能达到性能要求,宏是一种很好的代替函数的方法。  写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个:  错误做法:#define MIN(A,B)  ( A <= B ? A : B )  正确做法:#define MIN(A,B) ((A)<= (B)

2008-11-10 11:24:00 273

转载 C语言嵌入式系统编程修炼之三:内存操作

数据指针  在嵌入式系统的编程中,常常要求在特定的内存单元读写内容,汇编有对应的MOV指令,而除C/C++以外的其它编程语言基本没有直接访问绝对地址的能力。在嵌入式系统的实际调试中,多借助C语言指针所具有的对绝对地址单元内容的读写能力。以指针直接操作内存多发生在如下几种情况:  (1) 某I/O芯片被定位在CPU的存储空间而非I/O空间,而且寄存器对应于某特定地址;  (2)

2008-11-10 11:22:00 171

转载 C语言嵌入式系统编程修炼之二:软件架构篇

模块划分  模块划分的"划"是规划的意思,意指怎样合理的将一个很大的软件划分为一系列功能独立的部分合作完成系统的需求。C语言作为一种结构化的程序设计语言,在模块的划分上主要依据功能(依功能进行划分在面向对象设计中成为一个错误,牛顿定律遇到了>相对论),C语言模块化程序设计需理解如下概念:  (1) 模块即是一个.c文件和一个.h文件的结合,头文件(.h)中是对于该模块接口的声明;  (2)

2008-11-10 11:21:00 150

转载 函数调用的底层机制

这是一篇介绍c语言中的函数调用是如何用实现的文章。写给那些对c语言各种行为的底层实现感兴趣人的入门级文章。如果你是c语言或者汇编、底层技术的老鸟或是对这个问题不感兴趣,那么这篇文章只会耽误您的时间,您大可不必阅读他。当然如果前辈们愿意为我指出不足,我将十分感谢您的指导,并对耽误您宝贵的时间致歉。好了,废话少说!要研究这个问题,让我们先打开vc++吧。最好是6.0的,:-p。(什么你没有vc++,倒

2008-11-09 15:34:00 392

转载 函数调用约定

在C语言中,假设我们有这样的一个函数:int function(int a,int b)调用时只要用result = function(1,2)这样的方式就可以使用这个函数。但是,当高级语言被编译成计算机可以识别的机器码时,有一个问题就凸现出来:在CPU中,计算机没有办法知道一个函数调用需要多少个、什么样的参数,也没有硬件可以保存这些参数。也就是说,计算机不知道怎么给这个函数传递参

2008-11-09 15:33:00 182

转载 内存对齐

对于大部分程序员来说,“内存对齐”对他们来说都应该是“透明的”。“内存对齐”应该是编译器的“管辖范围”。编译器为程序中的每个“数据单元”安排在适当的位置上。但是C语言的一个特点就是太灵活,太强大,它允许你干预“内存对齐”。如果你想了解更加底层的秘密,“内存对齐”对你就不应该再透明了。 一、内存对齐的原因大部分的参考资料都是如是说的:1、平台原因(移植原因):不是所有的硬件平台都能访问任意地

2008-11-09 14:30:00 168

转载 NULL和NUL

C程序员应该明白, 在指针上下文中 NULL 和 0 是完全等价的, 而未加修饰的 0 也完全可以接受。任何使用 NULL (跟 0 相对) 的地方都应该看作一种温和的提示, 是在使用指針; 程序员 (和编译器都) 不能依靠它来区别 指針 0 和整数 0。非指針的上下文中 不要用NULL来代替0 ( ANSI允许把NULL定义为 ((void *)0 )

2008-11-08 22:51:00 238

转载 指针的大小

指针的大小是问:一个指针变量占用多少内存空间? 分析:既然指针只是要存储另一个变量的地址,。注意,是存放一变量的地址,而不是存放一个变量本身,所以,不管指针指向什么类型的变量,它的大小总是固定的:只要能放得下一个地址就行!(这是一间只有烟盒大小的“房间”,因为它只需要入一张与着地址的纸条)。   存放一个地址需要几个字节?答案是和一个 int 类型的大小相同:4字节。   所以

2008-11-08 22:42:00 359

转载 指向指针的指针

先看一个例子:         #include ;     char buf[10] = "hello";     void pro(char *out)     {         out = buf;     }     main()     {         char *p = NULL;                 pro(p);         printf("%

2008-11-08 17:26:00 175

转载 推荐的加强C语言学习的书籍

自认为C(嵌入式方面)的功底比较扎实,这里推荐几本我认为非常好的书给大家,首推的就是林锐博士的《高质量C编程指南》,这真的是一本非常不错的书,精短。呵呵,我们公司招聘的笔试题目都是从这本书上抄下来的。我也相信你看懂了总共才这本百来页的书的C的部分(还有一些C++)的,你就能找到一份不错的C语言的工作了。对了,顺便提一句,现在的大学生就像我当时读书一样,认为C太“低级”了,学了一点C的语法就到处问下

2008-11-08 16:51:00 434

转载 uCOSII操作系统移植笔记

笔记一:今天粗略的看了一下周立功关于uc/osII在lpc2104上的移植方面的说明,这之中印象最深的应该是irq中断和软中断方面的处理,由于arm芯片的特殊性(拥有7种处理器模式),即每种处理器模式都有自己的堆栈,这样在处理堆栈的时候就会相应的麻烦一些。在响应异常时,该移植计划在初始代码里面比在没有操作系统的初始代码多了irq的处理,移植里面的irq处理多了由汇编语言编写的对任务环境的保存,

2008-11-08 15:52:00 793

原创 volatile两篇

volatile修饰的变量表示它的值会可能被意想不到的改变了                   比如输入口,或者是一些反映什么状态的寄存器,即使不操作,它的值也有     可能被改变了。             加上volatile修饰之后,编译器就不会假设它的值了,而是每次都重新读取。         volatile 影响编译器编译的结果,指出,volatil

2008-11-07 23:16:00 195

转载 指针数组和数组指针的区别

对于复杂类型的描述(这个还不太算很复杂),首先你一定要知道构造符号的三对(个)运算符:*     []     ()     []和()的结合性很强,而*的结合力较弱;     []和()采用从左到右的结合方式,而*是从右向左。         你的例子中:     int  *a[N];/*首先a是一个数组,因为a的后面紧跟了一个[],它的优先级是很高的(比*高),其次它的

2008-11-07 21:29:00 168

原创 内存泄露

在计算机科学中,内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏与许多其他问题有着相似的症状,并且通常情况下只能由那些可以获得程序源代码的程序员才可以分析出来。然而,有不少人习惯于把任何不需要的内存使用的增加描述为内存泄漏,即使严格意义上来说这是不准确

2008-11-07 18:17:00 214

原创 C基础知识:函数指针和指针函数的基本概念

在程序运行中,函数代码是程序的算法指令部分,它们和数组一样也占用存储空间,都有相应的地址。可以使用指针变量指向数组的首地址,也可以使用指针变量指向函数代码的首地址,指向函数代码首地址的指针变量称为函数指针。1.函数指针定义函数类型 (*指针变量名)(形参列表);“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函

2008-11-07 18:16:00 558

原创 例程(routines)

例程的作用类似于函数,但含义更为丰富一些。例程是某个系统对外提供的功能接口或服务的集合。比如操作系统的API、服务等就是例程;Delphi或C++Builder提供的标准函数和库函数等也是例程。我们编写一个DLL的时候,里面的输出函数就是这个DLL的例程。  可以这么简单地来理解:把一段相对独立的代码写成单独的一个模块就是函数的概念。我们可以在自己的程序中编写很多个函数,从而实现模块化编程。但

2008-11-07 18:02:00 234

转载 任务状态(Task States)

睡眠态(DORMANT)——指任务驻留在程序空间,还没有交给µC/OS-II来管理。把任务交给µC/OS-II,是通过调用下述2个函数之一:OSTaskCreate()或OSTaskCreateExt()来实现的。这些调用只是用于告诉µC/OS-II,任务的起始地址在哪里;任务建立时,用户给任务赋予的优先级是多少;任务要使用多少栈空间等。就绪态(READY)——任务一旦建立,这个任务就进入了就

2008-11-03 10:01:00 749

原创 前后台系统

早期的嵌入式系统中没有操作系统的概念,程序员编写嵌入式程序通常直接面对裸机及裸设备。在这种情况下,通常把嵌入式程序分成两部分,即前台程序和后台程序。  前台程序通过中段来处理事件,其结构一般为无限循环;后台程序则掌管整个嵌入式系统软、硬件资源的分配、管理以及任务的调度,是一个系统管理调度程序。这就是通常所说的前后台系统。一般情况下,后台程序也叫任务级程序,前台程序也叫事件处理级程序。在程序运行

2008-10-30 22:48:00 305

原创 BSP板级支持包

BSP板级支持包(board support package),是介于主板硬件和操作系统中驱动层程序之间的一层,一般认为它属于操作系统一部分,主要是实现对操作系统的支持,为上层的驱动程序提供访问硬件设备寄存器的函数包,使之能够更好的运行与硬件主板。在嵌入式体统软件的组成中,就有BSP。BSP是相对于操作系统而言的,不同的操作系统对应于不同定义形式的BSP,例如VxWorks的BSP和Linux

2008-10-30 22:47:00 464

原创 SWI 指令

SWI指令---软件中断实例详解2008-09-17 17:30SWI指令---软件中断实例详解 关键字: SWI,指令,软件中断,实例,详解SWI,即software interrupt软件中断。该指令产生一个SWI异常。意思就是处理器模式改变为超级用户模式,CPSR寄存器保存到超级用户模式下的SPSR寄存器,并且跳转到SWI向量。其ARM指令格式如下:S

2008-10-29 00:12:00 1079

转载 实时操作系统μCOS-II在LPC2210上的移植研究与实现

摘  要:嵌入式实时操作系统在目标处理器平台上的移植是嵌入式软件开发的基础和前提。论文实现了源码公开的嵌入式实时操作系统μC/OS-II在ARM7微控制器LPC2210上的成功移植,并研究了在移植过程中的关键问题。构成了一个功能强大的嵌入式开发基础平台。 关键词:实时操作系统;μC/OS-II;LPC2210微控制器;移植 Abstract: The porting embedded RT

2008-10-28 20:31:00 905

原创 Linux内核源代码数量已经超过1000万行

Linux版本2.6.27更新后,人们发现,这一内核的源代码数量已经超过了1000万行.当然,这些行数仅仅是计算机统计出来的行数,包括空白行,为了代码的可读性增加的注释等,当然Linux和所有的长期项目一样,随着时间的推移,旧的代码会被丢弃和更换,但总体规模来说,Linux的内核在不断增强,以下是一些有趣的统计数字,它们可以告诉你Linux内核都在干什么:使用David Wheel

2008-10-28 20:15:00 692

原创 μC/OS-II在的移植概要

移植工作主要集中在与处理器相关的3个文件,OS_CPU.H,OS_CPU_C.C,OS_CPU_A.S。其中OS_CPU.H文件中主要包含与编译器相关的数据类型定义、堆栈类型定义、两个宏定义和几个函数说明。由于ADSv1.2的C语言编译器只支持满递减堆栈,这里定义堆栈的增长方向为从上往下。OS_CPU_C.C中包含与移植有关的6个C函数,它们为OSTaskStkInit(), OSTaskCr

2008-10-28 20:08:00 360

原创 μC/OSII中的时钟中断技术研究

μC/OSII中的时钟中断技术研究1系统中断与时钟节拍1.1系统中断中断是一种硬件机制,用于通知CPU有个异步事件发生了。中断一旦被系统识别,CPU则保存部分(或全部)现场(context),即部分(或全部)寄存器的值,跳转到专门的子程序,称为中断服务子程序(ISR)。中断服务子程序做事件处理,处理完成后执行任务调度,程序回到就绪态优先级最高的任务开始运行(对于可剥夺型内核)。中断使得CPU可以在

2008-10-27 16:46:00 412

原创 关于实模式和保护模式

首先说明实模式,虚拟模式,保护模式是X86中的概念。我从寻址方式来说,CPU的IP(EIP)中存放的是虚地址,把一个虚地址转换为物理地址,模式不同,转换方式不同:实模式下-虚地址到实地址转换,段寄存器左移四位与偏移相加,得到物理地址,寻址空间1M保护模式下--虚地址到实地址转换经过MMU,也就是分段和分页机制(具体了解这个比较复杂,但其实也不难),寻址空间4G。另外,保护有两层含义,一是保护操作系

2008-10-26 23:00:00 279

原创 C与C++嵌入式系统编程 不断更新中......

2008-10-26 19:53:00 166

原创 #define rGPACON(*(volatile unsigned long *)0x56000000)

 对于不同的计算机体系结构,设备可能是端口映射,也可能是内存映射的。如果系统结构支持独立的IO地址空间,并且是端口映射,就必须使用汇编语言完成实际对设备的控制,因为C语言并没有提供真正的“端口”的概念。如果是内存映射,那就方便的多了。 举个例子,比如像寄存器A(地址假定为0x48000000)写入数据0x01,那么就可以这样设置了。#define A (*(volati

2008-10-25 18:51:00 594

转载 避免编译器优化的用法

volatile的本意是“易变的”由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化。比如:static int i=0;int main(void){...while (1){if (i) dosomething();}}/* Interrupt service routine. */void ISR_2(void){i=1;}程序的本意是希望ISR_2中断产生时,在

2008-10-25 18:47:00 2009

转载 嵌入式中的C语言测试

C语言测试是招聘嵌入式系统程序员过程中必须而且有效的方法。这些年,我既参加也组织了许多这种测试,在这过程中我意识到这些测试能为面试者和被面试者提供许多有用信息,此外,撇开面试的压力不谈,这种测试也是相当有趣的。  从被面试者的角度来讲,你能了解许多关于出题者或监考者的情况。这个测试只是出题者为显示其对ANSI标准细节的知识而不是技术技巧而设计吗?这是个愚蠢的问题吗?如要你答出某

2008-10-25 18:12:00 216

原创 突然发现C里面没有幂运算符

为什么 C 不提供乘幂的运算符?因为提供乘幂指令的处理器非常少。 C 有一个 pow() 标准函数, 原型说明在 。而对于小的正整数指数, 直接用乘法一般会更有效。

2008-10-25 16:24:00 427

空空如也

空空如也

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

TA关注的人

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