第一篇:如何在嵌入式LINUX中增加自己的设备驱动
如何在嵌入式LINUX中增加自己的设备驱动程序 北京邮电大学电子工程学院 强磊
------------------
驱动程序的使用可以按照两种方式编译,一种是静态编译进内核,另一种是编译成模块以供动态加载。由于uClinux不支持模块动态加载,而且嵌入式LINUX不能够象桌面LINUX那样灵活的使用insmod/rmmod加载卸载设备驱动程序,因而这里只介绍将设备驱动程序静态编译进uClinux内核的方法。下面以UCLINUX为例,介绍在一个以模块方式出现的驱动程序test.c基础之上,将其编译进内核的一系列步骤:
(1)改动test.c源带代码 第一步,将原来的:
#include
#ifdef MODULE #include
result=register_chrdev(254,“test”,&test_fops);
(2)将test.c复制到/uclinux/linux/drivers/char目录下,并且在/uclinux/linux/drivers/char目录下mem.c中,int chr_dev_init()函数中增加如下代码: #ifdef CONFIG_TESTDRIVE init_test();#endif
(3)在/uclinux/linux/drivers/char目录下Makefile中增加如下代码: ifeq($(CONFIG_TESTDRIVE),y)L_OBJS+=test.o Endif(4)在/uclinux/linux/arch/m68knommu目录下config.in中字符设备段里增加如下代码: bool 'support for testdrive' CONFIG_TESTDRIVE y
(5)运行make menuconfig(在menuconfig的字符设备选项里你可以看见我们刚刚添加的'support for testdrive'选项,并且已经被选中);make dep;make linux;make linux.text;make linux.data;cat linux.text linux.data > linux.bin。(6)在 /uclinux/romdisk/romdisk/dev/目录下创建设备: mknod test c 254 0 并且在/uclinux/appsrc/下运行make,生成新的Romdisk.s19文件。
到这里,在UCLINUX中增加设备驱动程序的工作可以说是完成了,只要将新的linux.bin与Romdisk.s19烧入目标板中,你就可以使用自己的新设备test了。
第二篇:基于嵌入式Linux的设备驱动程序设计
基于嵌入式Linux的设备驱动程序设计
Linux为是一个成熟而稳定的操作系统。将Linux植入嵌入式设备具有众多的优点,包括可剪裁和容易移植等,所以Linux操作系统在嵌入式领域获得了广泛的应用。嵌入式Linux一直是嵌入式领域的研究热点,与PC架构不同,嵌入式系统的硬件具有多样性和差异性,嵌入式系统的开发需要对特定系统进行硬件设计,同时还要针对这些硬件来编写驱动程序。Linux内核就是通过驱动程序来同外围设备打交道的,系统设计人员必须为每个设备编写驱动程序,否则设备无法在操作系统下正常工作。设备驱动程序设计的基本概念与模型
设备驱动程序是操作系统内核与机器硬件之间的接口,它为应用程序屏蔽了硬件的细节,在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作,设计驱动程序是内核的一部分,可以实现以下功能:
对设备初始化和释放;
把数据从内核传送到硬件,以及从硬件读取数据;
读取应用程序传送给设备文件的数据,以及回送应用程序请求的数据;
检测和处理设备出现的错误。
前面已经提到驱动程序的作用,而编写驱动程序就是构造一系列可供应用程序调动的函数(包括open、release、read、write、llseek、ioctl等)。在用户自己的驱动程序中,首先要根据驱动程序的功能,实现file_operations结构中的函数,不需要的函数接口可以直接在file_operations结构中初始化为NULL;file_operations变量会在驱动程序初始化时注册到系统内部。当操作系统对设备操作时,会调用驱动程序注册的file_operations结构中的函数指针。
以下是嵌入式linux2.4设备驱动程序的最简模型。
具体实现前面定义的函数时,需注意下面几点:
1)在test_init函数中要通过调用register_chrdev()函数来向内核注册字符设备驱动程序。如果是块设备,则还需调用mmmap()进行地址空间的映射,再调用register_blkdev()函数来向内核注册块设备驱动程序,在Linux系统中,对中断的处理是属于系统核心部分,因而如果设备与系统之间以中断方式进行数据交换,则必须把该设备的驱动程序作为系统核心的一部分,也就是说设备驱动程序要通过调用request_irq()函数来申请中断,通过free_irq()函数来释放中断(在test_cleanup中实现)。
2)open()函数和release()函数的具体实现有着一定的对应性,在open()函数中主要是执行打开设备时的一些初始化代码,如果该驱动程序需要管理多个设备,那么还要获取从设备号,根据从设备号来判断需要操作的设备,其中,从设备号可通过调用函数MINOR(inode->i_rdev)来获得,然后再调用宏MOD_INC_USE_COUNT来使得驱动程序使用计数器加1,而在release()函数中则要进行相反的处理。即调用宏MOD_DEC_USE_COUNT来减小驱动程序使用计数器。
3)归根到底,驱动函数的实现就是调用内核所支持的函数(包括内核提供的API和用户自己定义的寄存器操作函数)来完成对设备的操作,虽然嵌入式系统设备的种类众多,不同设备操作的具体实现方法不可能相同,但是Linux操作系统提供了一系列特殊API,为开发内核驱动程序带来了很大的方便,调用这些API时需要注意的是:通常情况下,应用程序是通过内核接口访问驱动程序的(这是驱动程序的主要使用方式),因此驱动程序需要与应用程序交换数据,但是操作系统内核和驱动程序在内核空间中运行,而用户程序在用户空间中运行,用户程序不能访问内核空间,操作系统内核和驱动程序也不能使用指针或memcpy()等常规的C库函与用户空间传输数据,造成这种状况的主要原因是linux操作系统使用了虚拟内存机制,使用了虚拟内存机制后,用户空间的内存可能被换出,当内核使用用户空间指针时,对应的页面可能已经不在内存中了,因此在使用调用函数时要注意:设备驱动程序在申请和释放内存时不是调用malloc()和free(),而调用kmalloc()和kfree();用于内核空间与用户空间进行数据拷贝的函数主要有access_ok()(检查某内存空间是否有权访问),copy_to_user()和put_usr()(内核函数向用户空间传输数据),copy_from_user()和get_user()(用户空间向内核空间传输数据);关于内核空间与I/O空间的数据交换,不同体系结构的处理器对I/O的处理方式也不同,x86系列处理器中,I/O与内存完成不同,它是分开编址的,访问它要使用专用的指令;而对ARM体系结构的处理器来说,则是不区分I/O和内存,统一编址的,可以使用同样的指令访问,在驱动程序中可以使用一系列函数来访问I/O口,如outb()、outw()、outl()inb()、inw()、inl()、outsb()、outsw()、outsl()、insb()、insw()和insl()等。
Linux2.6与2.4内核驱动程序的区别
为了彻底防止对正在被使用的内核模块进行错误操作,linux2.6内核在加载和导出内核模块方面都较2.4内核有所改进,避免了用户执行将导致系统崩溃的操作(例如强制删除模块等)。同时,当驱动程序需要在多个文件中包含 头文件时,不必定义宏来检查内核的版本。与2.4内核相比,2.6内核在可扩展性、吞吐率等方面有较大提升,其新特性主要包括:使用了新的调度器算法;内核抢占功能显著地降低了用户交互式应用程序;多媒体应用程序等类似应用程序的延迟;改进了线程模型以及对NPTL的支持,显著改善了虚拟内存在一定成程度负载下的性能;能够支持更多的文件系统;引进了内存池技术;支持更多的系统设备,在2.4内核中有约束大型系统的限制,其支持的每一类设备的最大数量为256,而2.6内核则彻底打破了这些限制,可以支持4095种主要的设备类型,且每个单独的类型又可以支持超过一百万个的子设备;支持反向映射机制(reverse mapping),内存管理器为每一个物理页建立一个链表,包含指向当前映射页中每个进程的页表条目的指针。该链表叫PTE链,它极大的提高了找到那些映射某个页的进程的速度。
Linux操作系统的设备驱动程序是在内核空间运行的程序,其中涉及很多内核的操作,随着Linux内核版本的升级,驱动程序的开发必然也要作出相应的修改,总之,在linux2.6内核上编写设备驱动程序时具体要注意以下几个方面:
1)Linux2.6内核驱动程序必须由MODULE_LICENSE(“Dual BSD/GPL”)语句来定义许可证,而不能再用2.4内核的MODULE_LICENSE(“GPL”)。否则,在编译时会出现警告提示。
2)Linux2.6内核驱动程序可以用int try_module_get(&module)来加载模块,用module_put()函数来卸载模块,而以前2.4内核使用的宏MOD_INC_USE_COUNT和MOD_DEC_USE_COUNT则可不用。
3)前面给出的字符型设备驱动程序模型中结构体file_operations的定义要采用下面的形式。这是因为在Linux内核中对结构体的定义形式发生了变化,不再支持原来的定义形式。
4)就字符型设备而言,test_open()函数中向内核注册设备的调用函数register_chrdev()可以升级为int register_chrdev_region(dev_t from,unsigned count,char * name),如果要动态申请主设备号可调用函数int alloc_chrdev_region(dev_t * dev,unsigned baseminor,unsigned count,char * name)来完成;原来的注册函数还可以用,只是不能注册设备号大于256的设备,同理,对于块设备和网络设备的注册函数也有着相对应的代替函数。
5)在声明驱动程序是否要导出符号表方面有着很大的变化。当驱动程序模块装入内核后,它所导出的任何符号都会变成公共符合表的一部分,在/proc/ksyms中可以看到这些新增加的符号。通常情况之下,模块只需实现自己的功能,不必导出任何符号,然而,如果有其他模块需要使用模块导出的符号时,就必须导出符号,只有显示的导出符号才能被其他模块使用,Linux2.6内核中默认不导出所有的符号,不必使用EXPORT_NO_SYMBOLS宏来定义;而在2.4内核中恰恰相反,它默认导出所有的符号,除非使用EXPORT_NO_SYMBOLS,因此在上面给出的范例中可以省略去该定义语句。
6)Linx内核统一了很多设备类型,同时也支持更大的系统和更多的设备,原来Linux2.4内核中的变量kdev_t已经被废除不可用,取而代之的是dev_t。它拓展到了32位,其中包括12位主设备号和20位次设备号。调用函数为unsigned int iminor(struct inode * inode)和unsigned int imajor(struct inode * inode),而不再用Linux2.4版本中的int MAJOR(kdev_t dev)和int MINOR(kdev_t dev)。
所有的内存分配函数不再包含在头文件 中,而是包含在 中,而原来的 已经不存在。所以当在驱动程序中要用到函数kmalloc()或kfree()等内存分配函数时,就必须要定义头文件 而不是。同时,前面提到的申请内存和释放内存函数的具体参数也有了一定的改变,包括:分配标志GFP_BUFFER被取消,取而代之的是GFP_NOIO和GFP_NOFS;新增了_GFP_REPEAT、_GFP_NOFAIL和_GFP_NORETRY分配标志等,使得内存操作更加方便。
8)因为内核中有些地方的内存分配是不允许失败的,所以为了确保这种情况下得成功分配,linux2.6版本内核中开发了一种称为“内存池”的抽象。内存池其实相当于后备的高速缓存,以便在紧急状态下使用。要使用内存池的处理函数时,必须包含头文件。内存池处理函数主要有以下几个:mempool_t *mempool_create()、void*mempool_alloc()、void mempool_free()、int mempool_resize();
另外值得一提的是:2.6内核为了区别以.o为扩展名的常规对象文件,将内核模块的扩展名改为.ko,所以驱动程序最后是被编译为ko后缀的可加载模块,在应用程序中加载驱动程序模块时要注意。结语
驱动程序的开发作为嵌入式linux系统开发过程当中最重要的环节之一,与硬件特性和操作系统的内核有着紧密的联系。随着linux内核版本的升级,内核驱动程序必然要作出相应的改进,相信随着嵌入式Linux系统在各个领域中的广泛应用,具有可抢占实时性的Linux2.6内核必定会在嵌入式领域大显身手。本文会对广大的驱动程序开发人员有一定的帮助。
第三篇:基于ARM的嵌入式设备中uCLinux系统开发.
基于ARM的嵌入式设备中uCLinux系统开发
1引言信息家电和手持设备大大加速了嵌入式系统的发展,而ARM体系32位高性能、低功耗处理器和嵌入式操作系统Linux无疑成为佼佼者。因为Linux源代码开放、免费,任何将其定制于PDA、掌上机或者便携式设备感兴趣的人都可以从因特网免费下载其内核和应用程序,并开始移植或开发,所以Linux在嵌入式开发领域得到稳步发展。uCLinux即是目前嵌入式linux中最流行的一种,它是针对微控制领域而设计的Linux系统,其最大特征就是没有MMU(内存 1 引言
信息家电和手持设备大大加速了嵌入式系统的发展,而ARM体系32位高性能、低功耗处理器和嵌入式操作系统Linux无疑成为佼佼者。因为Linux源代码开放、免费,任何将其定制于PDA、掌上机或者便携式设备感兴趣的人都可以从因特网免费下载其内核和应用程序,并开始移植或开发,所以Linux在嵌入式开发领域得到稳步发展。uCLinux 即是目前嵌入式linux 中最流行的一种,它是针对微控制领域而设计的Linux系统,其最大特征就是没有MMU(内存管理单元模块),适合嵌入式系统小型化应用。
uCLinux支持多任务,支持多种文件系统,提供了对网络的强大支持,具有完整的TCP/IP协议栈,以及标准丰富的API。由于它的很多核心代码都为没有被MMU的处理器重新编写过,对标准Linux庞大的应用程序库和驱动程序库作了删改,所以它的内核要比常规的Linux 内核小很多;uCLinux包含Linux常用的API和小于512k的内核及相关的工具,总代码只有900k左右,但同时保留了常规Linux 操作系统绝大多数的优点。2 基于ARM的硬件平台
嵌入式领域32位处理器以ARM公司的ARM核最为流行,本文以Samsung公司的ARM7TDMI芯片S3C4510为处理器开发板为硬件平台,开发板上与S3C4510相关的部分主要集成了如下器件:
(2M+512k)B 的Flash,其中AT29C010A为512B作为BootLoader,一片SST49VF160为1M×16bitFlash;
16MB 的DRAM,由两片4M×16bits的HY57V641620提供 ; 16MB 的SRAM,由M-systems的新一代闪存盘DOC2000构成; Ethernet接口; ARM JTAG 接口。
开发板上与S3C4510相关部分功能框图如图1 所示。
IO
UART
S3C4510 JTAG
Ethernet
FLASH
F
DOC2000
232串口
JTAG接口
LED
以太网接口
用户自定义逻辑
DRAM uCLinux内核移植
嵌入式 Linux 开发大致涉及三个层次:引导装载程序、Linux 内核和驱动及应用程序。我们将讨论涉及这三层的一些基本概念;深入了解引导装载程序、内核和文件系统是如何交互的。
引导程序BootLoader的主要作用包括初始化处理器;初始化必备的设备;下载系统映象;初始化操作系统系统并准备执行。
引导装载程序有两种方法:专用软件和微小的引导代码。专用软件可以直接与远程系统上的闪存设备进行交互并将引导装载程序安装在闪存的给定位置中。而某些种类的嵌入式设备具有微小的引导代码:根据几个字节的指令,它将初始化一些 DRAM 设置并启用目标上的一个串行(或者USB,或者以太网)端口与主机程序通信;然后,主机程序或装入程序可以使用这个连接将引导装载程序传送到目标上,并将它写入闪存。
嵌入式设备上一些流行的并可免费使用的 Linux 引导装载程序有
Blob、Redboot 和 Bootldr。所有这些引导装载程序都用于基于 ARM 设备上的 Linux,并需要Jflash-linux 工具用于安装。一旦将引导装载程序安装到目标的闪存中,它就会执行我们上面提到的所有初始化工作。然后,它准备接收来自主机的内核和文件系统。一旦装入了内核,引导装载程序就将控制转给内核。
Linux内核移植首先需要配置内核,可以用make menuconfig进行,根据板卡选择必要的选项。主要包括系统类型选定(ARM system type),配置SDRAM/Flash地址;对块设备、字符设备进行选择和配置;配置文件系统;是否配置图形用户界面(GUI)。修改内核,我们选用上的uClinux-2.4.26-uc0.diff,已经为S3C4510移植好的内核,需要修改的地方很少。编译内核,首先要在宿主机(安装有Linux)上建立交*编译环境,下载arm-elf-tools安装在Linux 宿主机上的/usr/local/bin 目录下。现在的BLOB 和将来的uClinux 都要在这个环境下编译。开始编译uClinux 编译内核:执行命令:
make menuconfig 在出现的对话框选Samsung/4510B 和 uC-libc,然后退出。如果选择uC-libc编译出错,可以改选uClibc!
make dep
make lib_only
make user_only
make romfs
make image 产生 romfs.o,这一步将会出现一些错误报告,可忽略继续下面的命令
make 如果make无错误,在images的目录下你会看到有 image.ram 和 image.rom 两个二进制的内核文件。即image.ram和image.rom。image.ram可以通过Bootloader下载到SDRAM中运行。image.rom可以写入到Flash SST39VF160中直接运行。
down image.ram看看能不能运行
最后一步,uClinux调试完毕,通过jflashp将其写入到Flash中:开发板断电,把JTAG仿真器接到计算机的并口和板子的14PinJTAG插座上;接通5V电源;执行 FlashP w-f image.rom,大约30分钟以后烧写完毕。撤掉JTAG仿真器以后再上电就应该运行uClinux了。如果想把BootLoader写回Flash,执行FlashP w-f bios.img即可。4 uCLinux驱动程序开发
嵌入式系统通常有许多设备用于与用户交互,象触摸屏、小键盘、滚动轮、传感器、RS232接口、LCD等等。除了这些设备外,还有许多其它专用设备,包括闪存、USB、GSM、GPS等。内核通过所有这些设备各自的设备驱动程序来控制它们,包括 GUI 用户应用程序也通过访问这些驱动程序来访问设备。uClinux 的驱动程序库不可能包括实际项目系统中所有外围硬件的驱动,所以在应用开发中,编写驱动程序是一个重要步骤,驱动程序设计的好坏直接影响系统运行的稳定性和运行效率。
在uClinux 内核编写驱动程序并不像其他操作系统那么复杂,实际上,所要做的只是为相应的设备编写几个基本函数并向VFS(virtual file system)注册即可。当上层应用要使用该设备时,VFS 就会调用相应的设备函数。设备驱动程序通常可归为以下3 类: a)块设备(block),以块为单位,允许随机访问,多用缓存技术; b)字符设备(char),以字节为单位,只能按顺序访问,不用缓存; c)网络接口(net)。
在本系统中,DOC作为块设备可被模拟为IDE设备进行识别,系统用主设备号(MAJOR)和次设备号(MINOR)来唯一标识一般设备;相同主设备号表示同一类设备,次设备号表示同类设备的个数。所有设备在适当的目录(通常是/dev目录)下必须有相应的文件,这样字符设备和块设备都可以通过文件操作的系统调用完成。不同的是,块设备操作经常和缓冲区联系在一起。
字符设备的驱动程序通过在device_struct数据结构的chrdevs向量中增加一项的方法来向内核注册自己。然后对这个设备的所有调用都用这个设备号来实现;
块设备和字符设备都需要定义功能函数:对于每一个驱动函数来说,都有一些和此设备密切相关的功能函数,就最常用的字符设备来说,都存在着诸如open()、read()、write()、ioctrol()这一类的操作。当系统调用这些操作时,将自动的使用file-operations 结构中对应的函数来实现具体的操作;块设备由于使用高速缓存,其驱动程序不需要保护自己的read()、write()和fsync()函数,但必须使用自己的open()、release()和ioctl()函数,函数原型为:
static int my_open(struct inode *inode,struct file *file);static int my_release(struct inode *inode,struct file *file);static int my_ioctl(struct inode *inode,struct file *file,unsigned int cmd,unsigned long age);
块设备驱动程序的请求处理函数一般通过中断实现。驱动程序被调用时CPU由内核程序控制,故不可抢占,驱动程序必须调用sleep_on()函数释放对CPU的占用,在中断服务子程序将数据复制到内核内核后,再发出wake_up()调用。
字符设备如LCD、USB应用广泛,下面以此为例详细说明添加设备驱动的过程。设备名称为scre,设备号为254。块设备与网络设备可以比照处理。
在目录/linux_2.4/drives/char编写源程序scre.c,编写字符设备的处理函数。
1.设备驱动原文件必须包括这样的一个函数:
void scre_init(void){register(254, 'scre', &scre_fops)} 这个函数完成注册.在linux-2.4.x/driver/mem.c 将会调用它。2.修改 linux-2.4.x/driver/char/Makefile 在适当位置添加一行:obj_$(CONFIG_SCRE)+= scre.o 3.修改linux-2.4.x/driver/char/Config.in, 添加一行:
bool 'scre device' CONFIG_SCRE,便于在 make menuconfig 时选择
4.修改linux-2.4.x/driver/char/mem.c,在适当位置(你去找就会发现,在文件头部)添加:
#ifdef CONFIG_SCRE
extern void scre_init(void);
#endif
在chr_dev_init()函数添加:
#ifdef CONFIG_SCRE
scre_init();
#endif
5.修改vendor/Samsung/4510b/Makefile,建立设备节点;在12---35行间,DEVICE 部分添加如下内容 :scre,c,254,0。
6.make menuconfig 选中scre device,编译,下载;启动后你会看到 /proc/devices 中字符设备多了一项 scre 254。
uClinux的Web技术,主要有三个Web服务器:httpd,thttpd和boa。Httpd简单,但只能Web浏览,不支持认证、CGI,thttpd和boa Web服务器功能较全;而boa Web代码简单、速度快,适合嵌入式应用。Boa作为一个简单的http服务器,与传统服务器的主要区别是它是单进程的。boa在uClinux下的实现需要对boa.conf和mime.types作一些配置和修改,并且需在命令行指定配置文件所在目录。配置完成后需要重新编译内核,并选中boa选项,将编译好的内核下载到开发板,启动uClinux,完成IP设置,启动boa Web后便可通过IE访问网页了。5 结语
uClinux在嵌入式领域凭借其稳定、良好的移植性,优秀的网络功能,灵活完备的文件系统以及众多的技术支持等优点得到广泛应用,并将有更广阔的应用前景。本文针对uClinux的开发应用步骤作了大致的阐述,对ARM应用平台上的系统移植和应用开发作了分析,具有一定的指导意义。
参考文献
[1].刘安昱 温晓辉 刘志红,基于S3C44B0X的uClinux的移植,《单片机与嵌入式系统应用》[J]2003.12.[2].徐雪松等,基于嵌入式Linux的DiskOnChip设备的驱动开发实现,《电子设计应用》[J]2003.12 [3].Linux on module project-Lom ARM7 ,.[4].朱珂等译,《Linux编程白皮书》[M],机械工业出版社,2000.[5].赵炯,《Linux内核完全注释(内核版本0.11)》[M],2003
第四篇:浅谈基于嵌入式系统在教学中的应用论文
论文关键词:嵌入式系统 Proteus ARM 应用
论文摘要:本文指出在嵌入式系统课程的各教学环节引入Proteus、ARM(重点介绍Proteus软件)软件,通过动态仿真模型的设计,能用到毕业设计以及创新设计当中。
1、嵌入式系统的概述
(1)从技术的角度定义:嵌入式系统是以应用为中心,基础是计算机,能够适应应用系统对功能、可靠性、及功耗严格要求的专用计算机。
(2)从系统的角度定义:嵌入式系统是能够完成复杂功能的软件和硬件的组合,并使其紧密粘合在一起的计算机系统。“嵌入式”反映出的这些系统是更大系统中的一个完整部分,称为嵌入式系统。
2、Proteus、ARM软件介绍
Proteus是由英国Labcenter公司开发的嵌入式系统仿真及开发平台,该软件具有以下特点:
(1)能进行智能原理布图;进行单片机软件调试和单片机与外围电路的协同仿真;满足单片机软件仿真系统的标准。
(2)支持常见的单片机类型和飞利浦公司ARM7(LPC系列)处理器及常见的外围器件如8255,ADC0809。
(3)可以与Keil Version3,ADS1两个集成开发环境结合,把用汇编和C语言编写的程序编译后,进行软、硬件结合的系统仿真。
3、Proteus软件的应用
3.1 Proteus软件在教学中的应用
在教学的过程中,老师可以将Proteus和Keil 建立的虚拟实验平台搬到课堂上,能够将实践教学和理论教学融为一体,从而让教学的效果得到提高。下面笔者引进一个实际的课堂教学实例。在讲到外部中断处理过程这一章节时,我们可以将Proteus和Keil进行联调,然后通过仿真处理的步骤,可将单片机处理中断的软件执行过程以及单片机内部资源变化的情况以一种直观地感受呈现给学生,从而能够达到单纯的理论教学难以达到的效果。
在运行Protues软件的状态下,按住Proteus中的电路闭合键,P3.2引脚会有一个下跳沿,PC= 0x0003H,指向AJMP INT0的转移命令,堆栈的指针SP= 0.9H,数据存储器的0.8H和0.9H单元存放着0.1H和0.5H,即该处存放着下一条指令的地址。因此,学生能够迅速的知道,当外部有中断地请求时,程序的自动存储功能可以保存断点的地址,同时程序将会转到中断服务程序的入口地址,因为中断请求是由外部中断0产生的,因此程序就会转到外部中断0的入口地址0003H。通过外部中断执行的例子我们可以看出,在课堂教学上使用Protues和Keil 联调建立的实验平台,我们可以将许多抽象概念直观的介绍给学生,使学生不仅能观察到软件执行时单片机内部的I/ O口和存储器的变化,还可以观察到软件程序和外围电路之间的互动过程。
3.2 Proteus软件的应用
目前所拥有的单片机实验教学包括两个关键的环节,即课内的实验以及课程的设计。所有的实验操作步骤基本上都是在实验箱上完成的。由于受硬件实验箱结构以及资源的限制,学生在做实验的时候不能将所学的知识和软件充分的融会贯通。所以当我们的学生进行自主设计的时候,很多的学生几乎无法完成综合性的实验。假设采用了Proteus软件的仿真实验,就可以弥补硬件实验能力的不足。基于Proteus软件的实验可以分为以下3个阶段。
(1)验证阶段。此阶段的主要任务是让学生熟悉Proteus与Keil软件的运行环境,使学生对单片机虚拟系统的仿真有自身的认识。实验指导方面的教材只需要列出实验的任务和要求、Proteus软件的实验原理图、操作的步骤、流程以及和程序相关的源代码等。学生就可可自行根据实验步骤或实验操作得到录像进行操作、调试,以及观察程序的运行结果。
(2)程序设计阶段。这个阶段主要是培养学生用Proteus绘制系统原理图,以及使用Keil软件进行源程序设计的能力,学生可以根据实验的原理图用Proteus绘制硬件电路图,按照实验的要求完成程序的设计,在Keil的环境下编写出源代码,调试成功后,加载程序到Proteus硬件图仿真。
(3)综合学习阶段。此阶段的主要目的是激发学生学习兴趣,提高学生的主观能动性、以及培养学生的创新能力。学生自主的根据实验的任务和要求设计出硬件额电路(包括CPU型号、元器件及参数的设置等)并绘制出Proteus的硬件原理图;根据硬件的功能模块对软件进行设计。完成对软硬件设计之后,需对两者进行联调,充分利用Proteus与Keil软件间的联合仿真的功能,及时的发现并改正硬件电路以及程序源代码的错误。系统仿真成功后,再进行实物的制作。在对课程的设计环节中,需要学生在Proteus环境下绘制出硬件的电路图,在Keil软件中编写出设计程序的源代码,并且在设计硬件电路时后尽可能的考虑到实验箱的有限资源,便于在Keil中编写的程序能够更好的被移植到实验箱上。学生可以针对不同的应用类型,选择最适合的单片机,而不是仅仅局限于课堂上常讲解到的单片机。学生也可在联合仿真成功之后,再去进行电路的焊接、软件系统的调试以及程序的固化等,可以避免因设计方案的不正确所造成的不必要的浪费。
4、结语
Proteus和ARM的嵌入式软件在教学中的运用,能充分的利用机房的现有设备,减少了实验设备的硬件维护又与实际的工程系统接近,拉近学习和就业之间的距离。实践证明,这种嵌入式的教学方法不但能降低成本,经济优势明显,而且还具有较高的推广价值。
参考文献
[1]万军,马正华.嵌入式系统及应用课程实践教学的研究[J].中国现代教育装备,2009(15):7779.[2]李芳,李家庆.基于Proteus+Keil的单片机实验仿真平台[J].中国教育技术装备,2009(4):78.[3]陈燕,李娜娜.Proteus和Keil在单片机教学中的应用[J].中国科技信息,2009(20):194195.[4]王玮,曹会宁.Proteus仿真软件在单片机一体化教学中的应用[J].机电产品开发与创新,2009,22(5)
第五篇:在平凡中耕耘自己
在平凡中耕耘自己
各位领导、各位同事,大家好!
很高兴能有这样的机会和大家在一起畅谈工作中的一些感想和体会,我汇报的题目是:在平凡中耕耘自己。
我叫xxx,是铁通xx分公司客服中心的一名受理员,自2003年从事该项工作。刚到客服中心工作时,我认为做好客服工作是件很简单的事情,“不就是接接电话嘛,有什么大不了的”。但是,随着工作的不断深入,在分公司对客服工作的高标准、严要求下,面对千千万万不同用户各种不同的问题,我深深地感觉到自己原来的认识是多么错误和幼稚。10050客户服务中心并不只是接电话、听听用户投诉那么简单,它是体现铁通形象和声誉的窗口,是塑造铁通品牌、赢得更多市场的平台,也是解答和解决客户每一个问题的服务站。肩负着如此重要的责任和使命,我清楚地知道,作为一名客服受理员,不但要有良好的职业道德,还必须具备熟练的服务技能。
为了达到这个目的,从那时起,我就暗下决心,要从工作中的每件小事做起,把业务做到最好最精,赢得客户的信任。为此,我积极参加岗前学习,认真钻研《中华人民共和国电信条例》、《中华人民共和国消费者权益保护法》、《铁通客户服务行为规范》、《用户申诉管理办法》、《话费争议处理办法》等服务条例、流程和标准;自觉参加分公司举办的《商务礼仪》、《铁通各项业务资费标准、使用方法》、《电脑和互联网基础知识》、《简单故障处理》等培训班。并虚心向有服务经验的同志学习,不断提高自己的服务水平,立志达到“一口清”、“问不倒、考不倒”。近两年来,通过学习和在工作中的实践,我写下了566页近10万字的学习笔记,并总结出了客服工作的 “四多”、“十要”。“四多”就是:“用户的需求多问一句、用户的难题多想一点、用户的不会多说一次,用户的不快多管一事”;“十要”就是:“一要嘴巴甜、二要微笑诚、三要动作轻、四要脾气小、五要肚量大、六要少讲客观理由、七要行动快、八要效率高、九要观察勤、十要脑筋活”。
今年六月的一天下午,一位用户投诉说他们全家四月上旬就出国旅游,直到前几天才回来,现在来交话费时,发现五月份竟然有三十多元的话费,认为铁通乱收费,拒绝交费,同时扬言要到法院去控告铁通。我接到投诉后马上联系相关部门将用户有疑问的话费清单打印出来,通过一一拨打清单上被叫方电话询问对方是否认识这位用户,但拨完了所有的电话,对方都说不认识。问题到这里一下子就陷入了僵局,我也觉得很迷惑:难道真的是被人盗打了?我立刻通知分局人员上门检查线路,结果没有问题,话单也未发现异常。我清楚,如果这件事情处理不好,势必会影响到铁通的信誉和在用户中的形象,无论如何我是绝对不能放弃的。于是,我决定再从被叫方进行突破,再次给清单上的号码打电话,在了解到这些被叫方都是年轻人时,就试着询问有没有认识与用户同姓的人或者记得打电话的人,结果他们都一致说出一个人的名字。经过近5天的努力,当我把这个意外得来的线索向用户反馈时,用户说这个人是他们的侄子。后来经过核实,确实是用户的侄子在夫妇俩出国期间过来帮用户看房子时使用了电话。了解情况后,用户主动打来电话道歉并深有体会地说:“你们的服务真是太好了,没想到这么快就把问题查清楚了,铁通真的名不虚传”。对用户的“四多”、“十要”,使我感受到做一个铁通人的自豪与骄傲。
把用户作为镜子可以正视自己,把意见作为鞭了可以驱动自己,只有用户满意了,我们的工作才能算完成。两年多的工作,使我深深地爱上了客服受理员这一岗位,并在服务用户、塑造铁通形象中,实现了人生价值的提高。我知道,我的成长离不开用户,因此,我要在平凡的客服岗位上,耕耘自己,回报用户。为了达到这个目的,我一直把“用户的需要作为我的工作方向,用户的满意作为我的工作追求”,并在日常的服务中做到“三个坚持”:坚持把感情融入服务;坚持“多问一句,多想一点,多说一句,多管一事”;坚持“服务上讲求优质,责任上讲求尽职”,把为客户服务作为自己工作中的最大快乐,以真情打动用户,以亲情感动用户,通过服务实现自己的人生价值。
2005年2月10日晚上九点多,那天正好是大年初二,家人团圆,合家欢聚的时候,一位xx宽带用户来电反映宽带一天都上不了网,觉得很气愤,要求退款,语气非常强硬。接到申诉后,我先是好言安抚用户,然后慢慢向用户了解情况,但用户态度的非常强硬,什么也不愿意说,只是要求退款。我再次向用户表示歉意,同时请求用户再给我一次为他服务的机会,并保证一定能处理好这件事。经过反复做用户的思想工作,用户最后是半信半疑答应了。受理完这件投诉之后,我马上与分局长联系,将用户的情况详细向分局长说明,并要求分局连夜派人到用户家去处理。维修人员经过仔细检查后确信是外线问题,但当时天又黑又冷,而且又是大过年的,维修人员要求第二天再去处理。“客户问题无小事”!我清楚,只有通过贴心的服务才可能重新赢得用户的心。于是,我耐心地说服了分局维修人员克服重重困难为用户更换新线后解决了故障问题。上网问题解决后,用户主动给我打来了电话:“你们的服务赢得了我的信任,选择铁通是正确的,我决定不退了!”
一分耕耘一分收获,我的辛苦付出不仅为铁通、为xx分公司树立了良好的形象,也获得了用户的肯定,成为用户信任的朋友。去年大年三十的晚上,刚好轮到我值夜班,听着外面的爆竹声声,想到不能陪伴父母吃年夜饭时,心里不禁有些伤感,就在这时,我的同事将一个话筒递给了我,说有人找。我一听是一个男人的声音,他说:x x号小姐,你好!我是你们的用户,多次得到了你的良好服务,我一直铭记在心,今天打电话来也没什么事,只是想和你说一声,你们辛苦了,大过年的还要为我们这些老百姓服务,真是太感谢你们了,祝你们新年快乐!说实话,那一刻,我真的好感动,我觉得自己的辛苦没有白费,用户其实是理解我们的,我们不要把他们反映问题、提出建议看成是给我们找麻烦。正是这些用户的问题、建议,使我们看到了自己缺点和工作中的不足,正是他们的意见,使我们在提高服务质量、参与市场竞争中找到了努力的方向,也正是他们的“不满意”,促使我们不断改善服务品质,在激烈的市场竞争中站稳脚跟!
一分汗水,一分荣耀,我的努力不仅得到了用户的肯定,也得到了分公司的认可,在xx分公司开展的13次月度、客服考试中,我有11次获得了第一名,2次获得第2名,多次被评为分公司的“学习标兵”。在8月11日铁通总部在xx举行的由xx个省xx名选手参加的比赛中,我也是凭着自己的长期积累,一路过关斩将,最终夺得了个人和团体第二名的优异成绩,为xx铁通赢得了荣誉。
此文共有2页12