第一篇:uocs-ii和单片机结合的心得体会
从寒假开始接触操作系统到今天初步完成一个基于STC89C52单片机,使用UC/OS-II微内核的时钟应用程序也有一段时间了.在这不长不短的一段时间里,可以说我每天都有新的发现.知识就是这样一点一点的积累起来的.我相信只要这样继续下去,我的水平一定能上一个层次.在没有看<操作系统概念>这本书之前,通过一些平时模糊的了解,就只能把进程这样的一些概念理解为许多个不同的应用程序在处理器上通过某种方法轮流地切换来实现处理器资源的使用率的最大化.还有更多的其他一些概念甚至是连听都没有听说过的.由于基础比较差,加上寒假在家里较封闭.少有信息获取渠道,所以在看<操作系统概念>这本书的时候比较吃力.可以说那一段时间看书真是一种煎熬.不过后来提前来了学校,情况就好多了.之前看书时有许多不懂的概念,在学校里可以通过上网查找资料了.最开始看到进程的时候,感觉进程就是跟之前理解的差不多嘛,但是当看到线程这里的时候一下子又蒙了.这个时候就把进程跟线程给弄混淆了,但是没办法,在家里条件艰苦,只好这样子带着混淆看下去啦.到了学校连了网立刻就在找到了一篇文章<进程与线程的区别>.它那里面举一个马车的例子来比喻进程与线程的关系.在后面的篇幅也很清晰的把进程和线程的各种关系说出来了.于是我就这样子理解:其实系统就是把一大堆资源分配给进程,由进程来管理它所获得的资源,它爱怎么用就怎么用.而线程又是进程里面的一小个环节.线程可以使用进程获得的资源来完成自己的事情.如果说进程要完成一个大的事情,那么它就必须把这样一个大的事情分成一个个小的事情.那么进程就是这些小的事情和必要的资源的集合,而线程就是完成这样一个个小的事情的实体.举个例子来说,比如一个人现在要做一道菜.如果我们把做一道菜看做是一个进程的话,那么我们先要找到这个会做菜的人.这个人就相当于我们的处理器.然后还必须要有煤气炉,锅.铲子.刀,一些调料之类等等一些工具,那这些就是我们必要的一些资源.我们的进程先要申请得到这些资源.首先我们要把做一道菜这个大任务分成一个个小的任务.这些任务包括有比如说切菜啦,煮水啦,炒菜啦,加调料啦,控制火候啦,还有等待啦.等等...而这些就可以看成是一个个线程了.那么当我们决定要做一道菜的时候可以看成是创建了一个进程了.接下来这个人开始做的时候就看做是进程开始运行了.首先这个人会开始切菜那这是第一个线程开始得到运行.就是在处理器上运行.切了一会的时候.他突然发现可以先煮一下水.那么他就会先放正在切着的菜转去煮水.这就是线程的切换啦.然后当把水放到锅里面去了就让它煮着吧,人不用去管它了.那这时处理器就可以空出来做其它的事情了.他可以返回去继续切菜,也可以转而去做其他事.我们假设他返回去继续切菜好了.当他切完之后就开始就开始炒菜了,而在炒菜的过程中他偶尔也可以做些其他事..如加调料啦.控制火候啦.等等.这样的一些工作可以是并发的.注意是并发不是同时.到最后必须要让这菜在锅里煮一下时.这时人也就是处理器就空闲下来了.他可以去做其他的事.那就相当于进程的切换了.只须要在菜煮熟的时候把它铲起来就行了.这样一个进程就算运行完毕了.当然我只是打了一个很粗略的比喻.并不能概括进程跟线程的全部关系.在后来当我看完了UC/OS-II的任务部分之后.虽然说UC/OS-II把进程和线程的概念模糊掉了,只有一个任务的概念.但是我还是不禁会把它跟进程跟线程联系起来.那这样的话我就认为UC/OS-II下只有一个应用程序.而把这个应用程序看作是一个进程.而把其中的每一个任务看做是一个个线程.不知道这样子理解对不对.好啦.进程跟线程好像纠结了好久的样子.其实在家里已经把<操作系统概念>这本书要看的章节都大概的看过一遍了虽然有看到进程的同步与通信那里有什么信号量啊,消息邮箱啊,还有消息队列之类,但是根本就不知道它们是什么东西.还有邵贝贝的UC/OS-II也看了一部分.只是由于第一次看看得相当纠心.只当是看天书了.所以到学校后.就拼命的找资料.看了一些操作系统比较基础的概念还有UC/OS-II的一些比较基础的东西之后.觉得操作系统那本书有必要再看一遍.但是后来第二遍还是没有看完,但是第二次看毕竟有不同看起来也比较没那么辛苦了.因为又发现了另一本更容易懂的讲UC/OS-II的书,就是任哲那本书.接下来的几天就一直看这本书了.他讲的还是比较浅显的.看完了他这本书之后呢又找时间看了一下UC/OS-II的源代码.感觉还是比较好懂的.这时候基本上对多任务的概念啊.任务之间的同步与通信啊及其具体的实现都有了初步的理解.接下来就讲一下我对UC/OS-II的理解吧.看过这样一篇文章说的是UC/OS-II的两个核心算法.该文章道出了UC/OS-II微内核的设计哲学:以空间换时间,因为UC/OS-II是一个嵌入式操作系统的内核.而大部分嵌入式讲究实时性.那要讲究实时性就必须知道任务切换的确定时间,而不应该因为任务数量而影响这个时间.因此UC/OS-II就是通过牺牲存储空间来保障其实时性的.两大核心算法其中一个是说基于优先级的任务调度的.Jean J.Labrosse也就是UC/OS-II的作者使用一个数组OSRdyTbl[]来记录具有某一优先级的任务的就绪情况,称为就绪表.并用另一个变量OSRdyGrp以方便查询某一任务的就绪情况.另外再加两张表得出查询结果.这样查询某一任务的就绪情况的时间就变成了一个可以预测的值了.现在看起来, UC/OS-II本身内容并不多.也就是一个基于优先级的任务调度,一个任务切换,一个任务管理,一个时间管理,还有几个任务同步与通信的事件控制.如信号量.消息邮箱,消息队列.标志组,等等...先说基于优先级的任务调度吧,基于优先级就是近似保证在每一个时间段内都是优先级最高的任务处于运行状态.至于什么情况下才会需要任务调度呢.那就有很多种情况了,比如说正在运行的任务由于某种需要,自行挂起自身或者调用时间延时一段时间.在这种情况下就会产生任务调度.又比如说某任务释放一定的信号量或者其他的什么任务之间的同步与通信的事件,从而使具有更高优先级的任务处于就绪状态,这时也会产生任务调度.总之,一个任务有运行,就绪,等待,挂起,中断等等各状态,通过各种调度使得任务在这些状态之间来回变换.再说任务切换吧.任务切换其实就通过修改sp指针和任务堆栈来起来保存当前任务断点而转去运行另一个任务.这个在后面说到UC/OS-II的移植的时候再具体的讲吧.再来谈谈任务管理.任务管理需要一个叫做tcb的任务控制块.tcb里面保存有本任务所必要的一些基本信息.处理器根据这些信息来得到对应的任务.至于其他的一些比如任务的建立啊.任务的删除啊,任务的初始化啊等等的一些具体实现在这就不多说了.还有就是时间管理了,系统维护一个全局时钟,应用程序可以对这个全局时钟进行读写操作.同时任务控制块里有一个变量记录本任务需要等待延时的时间片数,通过时间中断逐一减少,等减到为零时,该任务重新返回到就绪状态..UC/OS-II的时间管理比较简单.至于任务之间的同步与通信,信号量,消息邮箱,消息队列都要使用到一个叫做ecb的事件控制块.里面主要有一个信号计数变量,一个消息指针.还有一个类似于就绪表的任务等待队列表.当一个任务申请得到一个信号或消息时,在有信号或消息的情况下,会立即给这个任务信号或消息,但是当没有信号或消息时,就会把任务送进任务等待队列,并挂起任务.直到有信号或消息或者等待超时.这里有衍生出来一个新的问题.就是如果在等待队列中有多个任务在等待.而信号只有一个,那么谁该得到信号并运行呢? UC/OS-II有两个解决方法,要么只给优先级最高的那个任务,要么通知所有等待的任务有信号了,至于该谁运行,那就要看谁的优先级最高了.好啦.UC/OS-II的基本部分都讲了,下面讲一下关于UC/OS-II在具体处理器上的移植吧.一般情况下的移植就是要把一些与处理器相关的内容做具体修改咯.那哪些是与处理器相关的内容呢?比如说C语言中的各种数据类型在本处理器上具体是多少个字节啊,一些硬件的接口啊.具体的任务切换啊,任务的堆栈分配啊.等等...所以我们就要根据具体的处理器做出相应的修改了.比较难的地方可能就是任务切换的设计吧.当然在开始任务切换之前我们必须先约定一下堆栈的协议.就是必须按照一定的出栈入栈的规则来操作堆栈,否则将不能正确的返回到断点继续执行.所以就要先写一个堆栈初始化的函数,先规定每一个断点信息在堆栈的位置.任务的切换前面提到了一点,就是通过修改sp指针和任务堆栈来起来保存当前任务断点而转去运行另一个任务.为了有更好的实时性,这些一般都是用汇编语言写的.我们可以想象,要进行任务切换,那首先你要先把当前的任务的断点信息给保存起来.否则将来要重新运行这个任务的时候怎样继续执行,难道要重新开始运行?当然不可能!所以要保存断点,那断点是保存在哪呢,当然就是刚才讲的任务堆栈啦.所以我们要做的事情就是先把断点保存在任务堆栈里,然后才能去取出另一个任务的断点,再从它的断点开始继续运行.说到断点,断点具体包括一些什么东西呢.比如说有pc指针啦.有cpu寄存器啦.psw啦.sp指针啦.这些都是断点的一部分.可是pc指针也就是程序断点地址我们是不能够直接操作的,即我们不能对它进行读写,那该怎么办呢.通常有两种方式可以引发pc指针自动入栈.那就是函数调用或者是中断出现.其中中断出现是随机的,不是我们能够控制的.但是函数调用我们是可以用的.所以我们一般是通过函数调用来模拟一次中断的出现.这样就可以做到pc指针自动入栈了.在硬件支持的情况下,我们可以直接把sp指针指到要运行的任务的任务堆栈的入口上去来导出断点.但是有些处理器可能硬件不支持.比如说51单片机,它的sp指针只有八位,而任务堆栈又一般是放在外部存储器上的,它的寻址需要两个字节.那sp指针就到不了任务堆栈而不能直接操作任务堆栈了.在这种情况下,我们只好在内部ram里开辟一个系统堆栈.对这个系统堆栈操作,然后通过复制的方法把它送到任务堆栈里.当然这又要花费一定的cpu时间了.所以从整一个切换的过程来看的话,那就是先使用入栈指令push按照先前规定好的入栈规则把断点信息保存在系统堆栈里.然后再把这个断点信息复制到任务堆栈里.接着从要运行的任务的任务堆栈里把断点信息复制到系统堆栈里去再使用出栈指令pop弹出到处理器的相应位置.说了那么多,还没有说明白到底怎样找到这个任务堆栈呢.原来在我们的任务控制块tcb里有一个指针变量专门用来指向它的任务堆栈的.那只要沿着tcb地址就能找到任务堆栈的地址了.对了,移植时还有一个地方可以用汇编语言写的.就是UC/OS-II的时间中断函数.UC/OS-II自身有一个时钟,这个时钟就是通过时间中断函数来确保的.中断的频率不同那时钟在每一秒钟内的节拍就不同.当我把UC/OS-II移植到51单片机的时候基本上就是按照上面的思路进行的.但是由于51单片机的特殊性,有些地方还是要注意的.比如说.UC/OS-II里面会用pdata,data等来做函数的形参.可是由于这些都是keil里面的关键字.如果不改的话就会报错.编译不通过.那么就必须把它们全部都改成其他的以防止编译器报错.还有一点就是由keil编译器编译通过的程序是不可重入的.但是我们要求UC/OS-II里的大部分函数具有可重入性.这样我们就必须在每个函数后面加一个reentrant关键字.还有我考虑到由于我们把任务堆栈放到了外部ram里了.那为了让可使用的任务数最大化,最好仅有的256个字节的外ram全部用于任务堆栈.那就必须把其他的东西搬到内部ram去了.其中任务控制块在外部ram占了很大一个空间.故后来我就在任务控制块的定义那里加了一个idata使其只能存放于内部ram,再修改了任务切换函数让它只在内部ram寻找任务控制块的地址.这样就能保证外部ram全部用于任务堆栈,从而可以容纳多一个任务吧.再有就是我又把UC/OS-II的空闲任务的任务堆栈减小到18个字节.因为空闲任务不需要那么多字节的堆栈空间.总之,我是想尽各种办法尽量节省存储空间了.经过这么一次实战的移植,我对UC/OS-II有了一个比较全面的理解,对程序的可移植性和模块化有了深刻的体会,对51单片机有了一个新的了解,对keil软件有了一个新的认识.首先我们现在接触的UC/OS-II它并不是一个完整的操作系统.它只是一个微内核,它缺少文件系统.缺少虚拟内存,可视化界面,它甚至还缺少一个现代操作系统所具有的时间片的概念,更不要说它没有进程和线程的清晰概念和独立的任务调度器.当然它有它的优点,至少它是一个专门为嵌入式设计的操作系统.由于它小,我们可以很容易地把它移植到各种资源不足的嵌入式系统中去.另外它的实时性能也很好.并且它提供了许多优良的功能,可以使我们更专注于应用功能的设计,而不用具体考虑如信号量这样的一些东西.至于UC/OS-II在51上跑吧,对于资源奇缺的51来说还是挺有鸭梨的.并且比裸跑速度要慢一些.对于程序的可移植性.如果在写程序的时候就考虑到可移植性的话并用配合模块化设计.那么当我们以后要再一次使用到同样的或者相似的功能时,就可以直接使用或者仅做一些小改动即可使用了.这样就方便许多了.而不必总是重复同一内容的编写.那样未免也太低级趣味了点...另外对51单片机也有了进一步的了解.以前竟然不知道原来STC内有内置256个字节的外部ram.真是惭愧啊.还有对堆栈指针和pc指针也有了新的认识.以前对sp指针还是有比较清晰的概念的.可是对pc指针就是全完摸不着头脑了.现在知道了pc指针不在我们的读写范围之内.我们要通过另外的方法间接对它操作.对中断的出现,对函数的调用等等也有了比较本质的认识了.对ret指令,reti指令也比较知道了.中断和函数调用都会引发pc指针自动入栈.所以两者在这一方面没有什么区别.比如说,使用函数调用进入任务切换再使用reti退出不会有什么不妥.但是如果用ret退出就不行了.因为reti指令在执行的时候会重新允许中断的产生.而ret不会做这样的动作.这就是两者的区别.还有对keil也有了一定的新的了解.keil中有些关键字还是很有用的.如data,idata,pdata,bdata,xdata,code.这些都是用来指明存储位置的.data指的是将变量存储在内部ram的低128个字节里,idata指可以将变量存储在内部ram的全部256个字节里.pdata是指外部ram的低256个字节.bdata指内部ram的位寻址区.xdata指外部ram 64kb的范围.最后一个code指的是程序存储区rom.还有一个关键字reentrant它可以告知编译器产生可重入代码.keil中可以设置变量的默认的存储位置,有三种.Small的模式,Compact的模式, Large的模式..Small模式是默认把变量存储在内部ram中, Compact模式是默认存储在外部ram低256个字节中,而Large模式则是整个64kb的外部ram中.移植完之后我就考虑开始写一个时钟程序了吧.虽然之前写过时钟程序,但是此次却是以一种完全不同的方式来写,这次是在有操作系统的情况下来.之前写的只有一个.C文件,没有头文件.写的完全浑然一体,毫无模块化可言.可是这次不同.是用一种自己之前不大熟悉的方式写程序.要考虑到任务的划分,优先级的安排,要考虑到模块化.还要让别人能够看懂.这每一件事都是不容易做的啊.现在写完了.也收获了许多.其中就包括头文件的使用.我觉得模块化最重要的就是要把本模块的一些具体实现封装起来,那么本模块的头文件就成了进出模块的唯一通道了.模块要引用的一些全局变量要在这里声明.模块本地函数要在这里声明.模块本地全局变量也要在这里声明.还有模块对外接口函数也是要在这里声明.这样那我们就可以通过#ifdef _模块名_C_..本地内容..#else..对外接口..#endif这样的形式来区分本地的声明与对外的声明.并且在本模块的.C文件里define _模块名_C_ 这样就可以包含模块所必须的信息了.而当其他模块要使用这个模块的时候,它也可以用include来包括这个头文件,不过这时它包括的就不是那个模块的本地内容了.而是它的对外接口.这样就不会出现重复包含的情况了.这是写多文件一个很好的方法.好啦好啦..该收手了.貌似写了好多.想我高考作文怎么挤也就挤出了那可怜的800多字.这次好像有敲有6300多字.真是吓到我了.本来还在担心能不能写够800字的.这是从昨晚开始写的.写到现在是第二天的下午五点多吧.原本我是不怎么喜欢写这样的一些东西的,但是现在写完之后感觉挻有用的.也重新梳理了一下自己的思路.写完了没有怎样修改.其中不少很荒谬的东西.看了不要拿砖头砸我哦...好了.终于把一些小小的心得,小小的体会敲完了..2011-3-10 17:23完
第二篇:单片机心得体会(定稿)
课程设计心得体会
1、认真审题,看懂题目的要求!选择适当的课题,不益太简单或者太难。做到既能把课题完成又能锻炼自己的能力!
2、根据课题要求,复习相关的知识,查询相关的资料。
3、根据实验条件,找到适合的方案,找到需要的元器件及工具,准备实验。
4、根据课程设计的要求和自己所要增加的功能写好程序流程图,在程序流程图的基础上,根据芯片的功能写出相应的程序。然后再进行程序调试和相应的修改,以达到能够实现所要求的功能的目的。
5、还要根据实验的实际情况,添加些额外程序来使系统更加的稳定,如开关的消震荡(采用延迟)。
6、程序要尽量做到由各个子程序组成,在有些程序后面最好加注释,这样在程序出错的检查过程中可以更容易查找的到,也更简洁,更明白易懂。
7、该实验的程序可以参考DVCC系列单片机微机仿真实验系统实验指导书中的串并转换实验,也可自己根据自己熟悉的方法来编程。
8、在设计控制开关时,注意2个中断的打开和关闭的先后顺序,否则就会出错。
9、这次的单片机课程设计重点是理论与实际的相结合。不再只读书了。
10、该设计从头到尾都要自己参与,熟悉了对整个设计的过程,更系统的锻炼了自己。课题研究目的和意义及介绍
1、目的意义
通过本次课程设计加深对单片机课程的全面认识复习和掌握,对单片机课程的应用进一步的了解。
掌握定时器、外部中断的设置和编程原理。
通过此次课程设计能够将单片机软硬件结合起来,对程序进行编辑,校验。
该实验通过单片机的定时器/计数器定时和计数原理,设计简单的计时器系统,拥有正确的计时、暂停、清零、快加功能,并同时可以用数码管显示,在现实生活中应用广泛,具有现实意义
第三篇:单片机心得体会
单片机心得体会
下面我概括了几点我的学习经验和心得体会:
1、万事开头难、要勇敢迈出第一步。开始的时候,不要老是给自己找借口,说KEIL不会建项目啦、没有实验板啦之类的。遇到困难要一件件攻克,不会建项目,就先学它,这方面网上教程很多,随便找找看一下,做几次就懂了。然后可以参考别的人程序,抄过来也无所谓,写一个最简单的,让它运行起来,先培养一下自己的感觉,知道写程序是怎么一回事,无论写大程序还是小程序,要做的工序不会差多少,总得建个项目,再配置一下项目,然后建个程序,加入项目中,再写代码、编译、生成HEX,刷进单片机中、运行。必须熟悉这一套工序。个人认为,一块学习板还是必要的,写好程序在上面运行一下看结果,学习效果会好很多,仿真器就看个人需要了。单片机是注重理论和实践的,光看书不动手,是学不会的。
2、知识点用到才学,不用的暂时丢一边。厚厚的一本书,看着人头都晕了,学了后面的,前面的估计也快忘光了,所以,最好结合实际程序,用到的时候才去看,不必说非要把书从第一页看起,看完它才来写程序。比如你写流水灯,完全就没必要看中断的知识,专心把流水灯学好就是了,这是把整本书化整为零,一小点一小点的啃。
3、程序不要光看不写,一定要自己写一次。最开始的时候,啥都不懂,可以抄人家的程序过来,看看每一句是干什么用的,达到什么目的,运行后有什么后果,看明白了之后,就要自己写一次,你会发现,原来看明白别人的程序很容易,但到自己写的时候却一句也写不出来,这就是差距。。当你自己能写出来的时候,说明你就真的懂了。
4、必须学会掌握调试程序的方法。不少人写程序,把代码写好了,然后一运行,不是自己想要的结果,就晕了,然后跑到论坛上发个帖子,把程序一贴,问:为什么我的程序不能正常运行?然后就等别人来给自己分析。这是一种很不好的行为,应该自己学会发现问题和学会如何解决问题。这就需要学习调试程序的方法,比如KEIL里,可以下断点啦,查看寄存器内容等等,这些都是调试程序的手段,当你发现你写的程序运行结果和你想象中不一样的时候,你可以单步,也可以下断点,然后跟踪,查看各相关寄存器内容,看看程序运行过中是不是有什么偏差,找出影响结果的地方,改正过来。这一个过程非常重要,通过程序的排错,你可以学到的知识是书上得不到的。
5、多利用网络的搜索,学会提问题。一般来说,学习过程中,你遇上的问题,前人们多数也有遇上的,所以如果有什么不懂,在自己解决不了的时候,最好先到网上搜索一下,看能不能找到答案,找不到再到论坛里发问,发问也要有目的性,尽量简单明了的描述问题,让帮助你的人可以用最少的时间就看懂你说什么,毕竟人家帮助你是免费的,时间也是有限的。
第四篇:单片机学习心得体会
单片机的学习心得感受
随着大规模集成电路的出现及其发展,将计算机的CPU、RAM、ROM、定时/数器和多种I/O接口集成在一片芯片上,形成芯片级的计算机,因此单片机早期的含义称为单片微型计算机,直译为单片机。
单片机是微型计算机应用技术的一个重要分支,近年来在工业智能仪器仪表、光机电设备、自动检测、信息处理、家电等的得到广泛应用和迅速发展。单片机是自动地进行运算和控制,把实现计算和控制的步骤一步步地用命令的形式,即一条条指令预先存入到存贮器中,单片机在CPU的控制下,将指令一条条地取出来,并加以翻译和执行,得到你要的东西。
这学期在老师的带领下,我从对单片机一无所知的到现在终于有点了解,这期间虽然没有在这方面下很大的功夫,但是也学到了一点知识,从点亮一个灯,到流水灯再到数码管的显示以及后面独立按键。这都是我以前无法想象的。
单片机这门课是一科非常重视动手实践的科目,不能总是看书,但是也不能完全不看书。单片机并传统的数字电路或模拟电路那样比较直观,原因是除了“硬件”之外还存在一个“软件”的因素。正是这个“软件”的原因使得许多初学者怎么也弄不懂单片机的工作过程,怎么也不明白为什么将几个数送来送去就能让数码管显示一串字符或控制一个电机的变速。对初学单片机的人来说,需要从书中大概了解一下单片机的各个功能寄存器,如果看的多了反而容易搞乱,现在市场上大多数讲单片机的书一开始就讲解复杂的内存、地址、存储器什么的,更让初学者感到不知所云、难以入门。如果按教科书式的学法,上来就是一大堆指令、名词,学了半天还搞不清这些指令起什么作用,能够产生什么实际效果,那么也许用不了几天就会觉得枯燥乏味而半途而废。简单的说,使用单片机实际上就是用我们自己编写的软件去控制单片机的各个功能寄存器。再简单些,就是控制单片机哪些引脚的电平什么时候输出高电平,什么时候输出低电平。由这些高低变化的电平来控制外围电路,实现我们需要的各个功能。
学习单片机首先用到c语言,提到C语言源文件,大家都不会陌生。因为我们平常写的程序代码几乎都在这个XX.C文件里面。编译器也是以此文件来进行编译并生成相应的目标文件。作为模块化编程的组成基础,我们所要实现的所有功能的源代码均在这个文件里。理想的模块化应该可以看成是一个黑盒子。即我们只关心模块提供的功能,而不管模块内部的实现细节。在大规模程序开发中,一个程序由很多个模块组成,很可能,这些模块的编写任务被分配到不同的人。而你在编写这个模块的时候很可能就需要利用到别人写好的模块的借口,这个时候我们关心的是,它的模块实现了什么样的接口,我该如何去调用,至于模块内部是如何组织的,对于我而言,无需过多关注。而追求接口的单一性,把不需要的细节尽可能对外部屏蔽起来,正是我们所需要注意的地方。
谈及到模块化编程,必然会涉及到多文件编译,也就是工程编译。在这样的一个系统中,往往会有多个C文件,而且每个C文件的作用不尽相同。在我们的C文件中,由于需要对外提供接口,因此必须有一些函数或者是变量提供给外部其它文件进行调用。假设我们有一个LCD.C文件,其提供最基本的LCD的驱动函数。在当前位置输出一个字符 而在我们的另外一个文件中需要调用此函数,那么我们该如何做呢?头文件的作用正是在此。可以称其为一份接口描述文件。其文件内部不应该包含任何实质性的函数代码。我们可以把这个头文件理解成为一份说明书,说明的内容就是我们的模块对外提供的接口函数或者是接口变量。同时该文件也包含了一些很重要的宏定义以及一些结构体的信息,离开了这些信息,很可能就无法正常使用接口函数或者是接口变量。但是总的原则是:不该让外界知道的信息就不应该出现在头文件里,而外界调用模块内接口函数或者是接口变量所必须的信息就一定要出现在头文件里,否则,外界就无法正确的调用我们提供的接口功能。因而为了让外部函数或者文件调用我们提供的接口功能,就必须包含我们提供的这个接口描述文件----即头文件。同时,我们自身模块也需要包含这份模块头文件(因为其包含了模块源文件中所需要的宏定义或者是结构体,好比我们平常所用的文件都是一式三份一样,模块本身也需要包含这个头文件。
硬件的设计跟焊接都要我们自己动手去焊,软件的编程也要我们不断的调试,最终一个能完成课程设计的劳动成果出来了,很高兴它能按着设计的思想与要求运动起来。
当然,这其中也有很多问题,第一、不够细心比如由于粗心大意焊错了线,由于对课本理论的不熟悉导致编程出现错误。第二,是在学习态度上,这次课是对我的学习态度的一次检验。对于这次单片机综合课程,我的第一大心得体会就是作为一名工程技术人员,要求具备的首要素质绝对应该是严谨。我们这次课程所遇到的多半问题多数都是由于我们不够严谨。第三,在做人上,我认识到,无论做什么事情,只要你足够坚强,有足够的毅力与决心,有足够的挑战困难的勇气,就没有什么办不到的。
感谢老师的让我有了一个更好的认识,无论是学习还是生活,生活是实在的,要踏实走路。虽然课程时间很短,但我学习了很多的东西,可以使我接触接触,感受颇深。
第五篇:单片机学习心得体会
单片机学习心得体会
周新涛
2011013959
在上个学期学校举办电子设计竞赛,在比赛过程看过一些郭天祥的单片机教程,然后在这个学期真正的理论。通过上课理论与实践相互结合,使我对单片机的认识有了更深刻的理解。系统以51单片机为核心部件,利用汇编软件编程,通过键盘控制和数码管显示实现了基本时钟显示功能、时间调节功能,能实现本设计题目的基本要求和发挥部分。在平时上课中由于时间有限和本身知识水平的限制,有时做某些作业时,花上很多时间才能完成!但是在完成后,成功的喜悦充斥着。
在课上,我认识到计算机有运算器,计算器,控制器,输入输出设备组成。之前都是利用开发板,进行程序的仿真。现在不断利用软件仿真,但两者的作用是一样。在仿真过程中,总是会碰到程序出错的时候,只好苦思冥想,反复比对程序,在不断修改后,总会成功。
在第一次是点亮LED灯来熟悉,keil软件的使用和试验箱上器材。第一次实验体现了一个人对新事物的接受能力和敏感度。虽然之前做过许多种实验。但依旧发现自己存在一个很大的问题,对已懂的东西没耐心听下去,容易开小差;在听老师讲解软件使用时,思路容易停滞,然后就跟不上老师的步骤了,结果需要别人再次指导;对软件的功能没有太大的热情去研究探索,把一个个图标点开,进去看看。
在做实验中,由于没有课前准备的意识,每每都是到了实验室才开始编程,完成作业,导致每次时间都有些仓促。在与同学讨论,换种思路,换种方法,把问题给吃透。发现、提出、分析、解决问题和实践能力是作为我们这个专业的基本素质。依赖性很大,刚开始编程序时喜欢套用书上的语句,却对语句的理解不够。于是当程序出现问题时,不知道如何修改,眼前的程序都是一块一块的被拼凑整合起来的,没法知道哪里错了。但是编程是一件很严肃的事情,容不得半点错误。在错误中不断摸索中前行。