当前位置:首页 » 编程软件 » 小型编译器的编程实现论文结论

小型编译器的编程实现论文结论

发布时间: 2022-07-05 17:20:34

A. 球一份关于单片机或c语言的论文!2000字左右的

一·基于MSP430 单片机的电源监控管理系统(单片机论文)

引言
大功率直流开关电源由PFC 和DC-DC 变换器组成,为了提高可靠性,并能够对其进行脱机或远程监控管理,在开关电源模块内设置监控管理系统。该系统对电源故障类进行监控,对电源输出的电压电流进行自动设定和调节,通过串行通信接口,与远程中心监控站进行远程监控和管理,这一功能在通信系统基站供电系统中尤为重要。本文提出了一种基于MSP430单片机的电源监控管理系统的设计和实现。

1 系统结构和硬件电路设计
系统的整体设计结构如图1所示。本系统采用的核心芯片为TI公司推出16位系列单片机MSP430。MSP430具有集成度高,外围设备丰富,超低功耗等优点。单片集成了多通道12bit的A/D转换、片内精密比较器、多个具有PWM功能的定时器、片内USART、看门狗定时器、片内数控振荡器(DCO)、大量的I/O端口以及大容量的片内存储器,采用串行在线编程方法,单片可以满足绝大多数的应用需要。 MSP430的这种高集成度使应用人员不必在接口、外接I/O及存储器上花太多的精力,而可以方便的设计真正意义上的单片系统,在许多领域得到了广泛的应用。下面介绍该系统可以实现的功能和基于MSP430F149的电控系统的设计。

1.1 系统功能:
a.开机控制。上电后,单片机开始工作,按下电源键,点亮指示灯后,将电网220V接入PFC,开关电源启动工作,然后接于负载。
b.电压设定和调节。用单片机A/D口采集开关电源的输出电压值,并显示于液晶屏上,通过单片机控制数字电位计调节输出电压值,实现自动调节;或者通过键盘的左右键选出电压调节页面,用上下键进行手动调节;也可以通过通信接口实现远程调节。

c.电流调节。多台开关电源并联使用时,要求各台电源的负载电压相等。单片机A/D口采集转换成电压值的负载电流值,通过通信口得到各台电流值,取电流平均值,控制数字电位计调节输出电压,使输出负载电流达到平均值;或者通过键盘的左右键选出电流调节页面,用上下键进行手动调节。

d.故障报警。单片机通过光电耦合器检测到各项输入输出故障时,扬声器产生蜂鸣,相应的报警灯闪烁,并在液晶屏上显示故障类型及处理方法。

e.监测。单片机A/D口对电网电压,输出电压,输出电流进行采集测量,当出现超限时进行报警。

f.通信。包括单片机与各台开关电源间的通信和单片机与中心监控站的通信。

1.2 电压调节电路
电压调节电路由单片机、数字电位计X9313和可调分流基准芯片TL431组成,其电路原理图如图2所示。Xicor9313是固态非易失性电位器,可用作数字控制的微调电位器。TL431是TI生产的一个有良好的热稳定性能的三端可调分流基准源,它的输出电压用两个电阻就可以任意地设置到从VREF(2.5V)到36V范围内的任何值。工作时,单片机的一个IO控制INC计数输入脚,为其提供计数脉冲,此输入端为下降沿触发。另一个IO控制U/D升降输入端,当U/D为高电平时,X9313内部计数器进行加法计数,VW端的输出电压上升,由于VW接地,使VH端电压降低,而TL431的REF输出端电压为恒定的2.5V,从而使Vcc处输出电压升高;同理当U/D为低电平时,Vcc处输出电压降低,这样就实现了电压输出调节。

1.3 模拟数据采集
MSP430F149内嵌入一个高精度的,具有采样与保持功能的12位ADC转换模块,内部提供各种采样与保持时钟源。MSP430有8个外部输入通道可选, 最高采样速度可达200KHZ,并且还内置温度传感器,可以测量芯片内的温度,如果测量温度高于或低于预设的温度是,可以通过外接部件显示告警信息,同时具有6种可编程选择的内部参考电压。该转换模块为一些需要模拟量采集的场合提供了便利。我们选择的参考电压是0~2.5V,这样MSP430F149的AD分辨率就是2.5/4096 = 0.61V左右。由于输入的模拟电压量较高,不能直接与单片机的ADC采样端口相连,因此用串联一个滑动变阻器的方法进行了降压处理,成功解决了上述问题。

1.4 人机对话设计
系统的人机操作界面由液晶显示屏、指示灯和键盘组成。液晶选用的是基于T6963C 的液晶模块YM12864。键盘采用的是3×3 的阵列接法,系统采用了图形用户界面,操作简单易行,显示实用美观。工作时,液晶屏可以实时显示采集到的电网电压、输出电压、输出电流及各种报警信息,操作相应键盘可以进行显示页面的切换,对输出电压,输出电流进行自动、手动及远程控制调节。当有报警信息产生时,相应得指示灯会闪烁警示,同时与单片机连接的扬声器会产生报警蜂鸣声,以提醒操作人员做出相应的处理。

2 系统软件设计
430 支持汇编语言和C 语言两种语言编程,因此可以在一个工程文件中同时用两种语言,使用汇编语言,便于在调试时寻找逻辑和指令的联系及地址的定位正确与否。使用C 语言进行编程大大减少了工作量,编好后的程序可读性好,易于修改和维护。开发工具使用IARSystems 公司的IAR Embedded Workbench,它集成了编辑、编译、链接、下载与在线调试(Debug)等多种功能,使用方便,并具备高效的C 语言编译能力。

考虑到软件开发效率及可维护性,系统软件设计遵循模块化的编程思想,将系统功能划分为几个相对独立的功能模块。它们包括:液晶显示模块、AD 转换模块、按键监测响应模块、报警监测响应模块、电压电流调节模块、数据处理模块、通信模块。每个模块都要进行独立的测试,最后结合到一起。整个系统的软件流程图如图3 所示。

按键监测模块是其中的重要组成部分,它控制着AD转换的启动,显示页面的切换,及电压电流的自动调节,手动调节,远程调节的启动和切换。报警监测模块对开关电源的保护起着至关重要的作用,它实时的监测着开关电源是否出现故障,当发生输入电压过压,输入电压欠压,PFC故障时应切断总电源,当发生输出电压过压,输出电压欠压,模块过热,及IPM保护故障时应关断DC-DC变换器。
在对各模块进行整合时,要注意各中断之间的冲突。由于在MSP430 的中断优先级中,ADC12 采样转换中断优先级高于TIMERA 中断,因此当在响应TIMERA 中断的过程中会执行ADC12 采样转换中断,或者TIMERA 的中断响应被迫延迟,这样就会影响在TIMERA中断中执行的报警监测响应程序,不能达到对开关电源故障类的实时检测。在本系统中,利用按键控制ADC12 采样转换中断的启动和关闭,从而解决中断冲突。

3 结论
本文在基于MSP430F149电源监控管理系统的设计和实现的基础上对MSP430的系统设计做了讨论,提出并解决了在设计中出现的问题。本文作者的创新点:利用MSP430的系统结构简单,外围电路少,效率高的特点,设计实现了简洁直观、使用方便、操作全程汉字提示、监控能力强、运行稳定、安全可靠的电源监控管理系统,大大降低了成本,取得了相当可观的经济效益,满足实际需求。

二·C语言论文:

嵌入式以门槛高,入门难的方式拦截了无数的学者。然而单片机作为嵌入式的入门课,如何以一种正确的方法学习单片机将关系到是否能学习好嵌入式。
纵所周知,学习嵌入式先玩ptotel,再做单片机。Protel简单的来说就是一个做PCB板的纯英文的软件。学习ptotel前必需具备一定的电路基础和英语能力,电路基础我想大部分同学都是有的,而英语这一块却是许多人所头疼的。这对英语基础差的同学是一种打击,再者如果毅力不强,我想你是自学不下去的。毅力是学任何东西所必需的一种能力、素质,是一种遇挫折而不言败的决心。
不管学的是protel还是单片机,首先要找一个能够指导你的人。何谓指导,指导并不是说他要一步一步地教你去做,而是一个在关键时刻能够为你指出一条道路的人。
我认为学习嵌入式方法最重要,在学protel和单片机之前应该想办法了解关于学习它们的方法。比如说protel吧,许多人理科的学生都是以一种纯理解的角度去学的,画一个导线、元件问一下为什么要这样画,生成网络表也追根溯源地问个网络表的由来。其实许多东西只是懂用就行,理论的东西懂得再多不懂用也是枉然的。
所以学习protel有地方不懂你就问你的指导员,有许多的东西是规定死了的,不是你想半天一夜就可以为你而改变的。这不同于软件设计,软件设计在你的苦思之下也许可以找到另一种更好的方法。

单片机嘛,不得不承认中国没一本单片机好书。我学习单片机的时候看过的单片机书有七本,大多数都是不尽人意的。在这里我冒昧地说:中国人写书确实缺乏一点“读者至上”的原则。我所看过的单片机书我想有很多都是以他的角度去写的,没有几个人是站稳在读者的角度上写的。书上的章节注释极不清楚,许多重要的地方都是没有说明的,说句不好听的话,作者似乎以为读者的水平也像他一样高。而外国人的书呢,同样的书,同样的知识点,有同样的中国人的书的两三倍那么厚,这是为什么。这是因为外国人的书点点滴滴都是面向着读者的。注释、说明、总结应有尽有。所以,我在这里发表一个也许同胞会扔鸡蛋到我身上的观点,那就是:不管学什么,优先选择外文翻译书,或是纯英文书。得到一本好书对我们的影响极为巨大。这一部分我用一句话来总结就是:中国人的书适合教学,而外国人的书不仅适合教学还适合自学。

中国人的单片机书往往都是先介绍单片机的内部结构、中断,定时器,然后再到I/O口。一开始就让我们学习单片机内部结构,中断、定时器的内部结构和原理,把我们弄得一塌糊涂的时候再和我们讲例子,怎样去操作实验板。如果自学的话我想许多同学是学不下去的,干嘛要把非得把单片机的内部结构像解剖学一样弄个彻底才实践去应用它呢?即使你把单片机全解剖清楚了还是不会用你手中的这块实验板的。我觉得如果在学单片机之前没有学过汇编语言就直接用C语言学的话,即使学完了单片机,对单片机的内部结构和单片机的工作原理也是不清楚的。学了汇编之后再学单片机的话效果将会好得多,所以不要心急,有些东西是急不来的。
所以我认为学习单片机要在实践中学习,先实践再去了解它的结构和原理,如果你实在不能了解它的结构和原理那也无所谓的,只要你懂得用就可以了!(没学过汇编的只能这么说了)
我们可以先从 I/O口学习,看一些例子烧录些程序,再看一下现象,之后再尝试了解一下所要用到的单片机的内部结构,最后在这个现象的知识基础上,编一个自己想要的程序、现象出来。这样学习的话既不无聊,成就感也有了。为什么有些人可以把学习当一种快乐,而许多人在唉声叹气,我想有一部分是出自这个原因。
不同的实验板有不同的PCB图,所以I/O的操作也是有所不同的。不过操作的原理都是一样的,有些同学可能会抱怨教程里的实验板和自己手中的实验板不同,这是大可不必多虑的。I/O这一步在调试中看现象的理念很重要,比如改变一个语句会产生何种现象,为什么会产生,这些都是要在调试中掌握的。
中断的学习方法也是类似的,先实践发现有陌生的地方就去查看相应的寄存器,等实现了自己想要的现实再慢慢地解剖一下单片机的寄存器,这样学起来会更有意义,记得更牢。中断也没复杂的东西的,只不过学几个中断函数,优先级之类的。有一定C语言基础的同学在优先级这一块可以联系C语言中运算符的优先级,我相信有了C语言基础定义一两个中断函数也不是什么问题了的。
我学过的单片机的内容在我文档的实例之中,实例的数量不多,但这些都是直接点击单片机知识点的。随着我的学习渐渐地深入后我再把我实现过的东西写入实例之中吧。

希望对你有所帮助,祝成功!

B. 编程心得

编程
这是每个游戏编程FAQ里都有的问题。这个问题每星期都会在游戏开发论坛上被问上好几次。这是个很好的问题,但是,没人能给出简单的答案。在某些应用程序中,总有一些计算机语言优于其他语言。下面是几种用于编写游戏的主要编程语言的介绍及其优缺点。希望这篇文章能帮助你做出决定。

1、C语言

如果说FORTRAN和COBOL是第一代高级编译语言,那么C语言就是它们的孙子辈。C语言是Dennis Ritchie在七十年代创建的,它功能更强大且与ALGOL保持更连续的继承性,而ALGOL则是COBOL和FORTRAN的结构化继承者。C语言被设计成一个比它的前辈更精巧、更简单的版本,它适于编写系统级的程序,比如操作系统。在此之前,操作系统是使用汇编语言编写的,而且不可移植。C语言是第一个使得系统级代码移植成为可能的编程语言。

C语言支持结构化编程,也就是说C的程序被编写成一些分离的函数呼叫(调用)的集合,这些呼叫是自上而下运行,而不像一个单独的集成块的代码使用GOTO语句控制流程。因此,C程序比起集成性的FORTRAN及COBOL的“空心粉式代码”代码要简单得多。事实上,C仍然具有GOTO语句,不过它的功能被限制了,仅当结构化方案非常复杂时才建议使用。

正由于它的系统编程根源,将C和汇编语言进行结合是相当容易的。函数调用接口非常简单,而且汇编语言指令还能内嵌到C代码中,所以,不需要连接独立的汇编模块。

优点:有益于编写小而快的程序。很容易与汇编语言结合。具有很高的标准化,因此其他平台上的各版本非常相似。

缺点:不容易支持面向对象技术。语法有时会非常难以理解,并造成滥用。

移植性:C语言的核心以及ANSI函数调用都具有移植性,但仅限于流程控制、内存管理和简单的文件处理。其他的东西都跟平台有关。比如说,为Windows和Mac开发可移植的程序,用户界面部分就需要用到与系统相关的函数调用。这一般意味着你必须写两次用户界面代码,不过还好有一些库可以减轻工作量。

用C语言编写的游戏:非常非常多。

资料:C语言的经典着作是《The C Programming Language》,它经过多次修改,已经扩展到最初的三倍大,但它仍然是介绍C的优秀书本。一本极好的教程是《The Waite Group's C Primer Plus》。

2、C++

C++语言是具有面向对象特性的C语言的继承者。面向对象编程,或称OOP是结构化编程的下一步。OO程序由对象组成,其中的对象是数据和函数离散集合。有许多可用的对象库存在,这使得编程简单得只需要将一些程序“建筑材料”堆在一起(至少理论上是这样)。比如说,有很多的GUI和数据库的库实现为对象的集合。

C++总是辩论的主题,尤其是在游戏开发论坛里。有几项C++的功能,比如虚拟函数,为函数呼叫的决策制定增加了一个额外层次,批评家很快指出C++程序将变得比相同功能的C程序来得大和慢。C++的拥护者则认为,用C写出与虚拟函数等价的代码同样会增加开支。这将是一个还在进行,而且不可能很快得出结论的争论。

我认为,C++的额外开支只是使用更好的语言的小付出。同样的争论发生在六十年代高级程序语言如COBOL和FORTRAN开始取代汇编成为语言所选的时候。批评家正确的指出使用高级语言编写的程序天生就比手写的汇编语言来得慢,而且必然如此。而高级语言支持者认为这么点小小的性能损失是值得的,因为COBOL和FORTRAN程序更容易编写和维护。

优点:组织大型程序时比C语言好得多。很好的支持面向对象机制。通用数据结构,如链表和可增长的阵列组成的库减轻了由于处理低层细节的负担。

缺点:非常大而复杂。与C语言一样存在语法滥用问题。比C慢。大多数编译器没有把整个语言正确的实现。

移植性:比C语言好多了,但依然不是很乐观。因为它具有与C语言相同的缺点,大多数可移植性用户界面库都使用C++对象实现。

使用C++编写的游戏:非常非常多。大多数的商业游戏是使用C或C++编写的。

资料:最新版的《The C++ Programming Language》非常好。作为教程,有两个阵营,一个假定你知道C,另外一个假定你不知道。到目前为止,最好的C++教程是《Who's Afraid of C++》,如果你已经熟知C,那么试一下《Teach Yourself C++》。

3、我该学习C++或是该从C开始

我不喜欢这种说法,但它是继“我该使用哪门语言”之后最经常被问及的问题。很不幸,不存在标准答案。你可以自学C并使用它来写程序,从而节省一大堆的时间,不过使用这种方法有两个弊端:

你将错过那些面向对象的知识,因为它可能在你的游戏中使得数据建模更有效率的东西。

最大的商业游戏,包括第一人称射击游戏很多并没有使用C++。但是,这些程序的作者即使使用老的C的格式,他们通常坚持使用面向对象编程技术。如果你只想学C,至少要自学OO(面向对象)编程技术。OO是仿真(游戏)的完美方法,如果你不学习OO,你将不得不“辛苦”的工作。

4、汇编语言

显然,汇编是第一个计算机语言。汇编语言实际上是你计算机处理器实际运行的指令的命令形式表示法。这意味着你将与处理器的底层打交道,比如寄存器和堆栈。如果你要找的是类英语且有相关的自我说明的语言,这不是你想要的。

确切的说,任何你能在其他语言里做到的事情,汇编都能做,只是不那么简单 — 这是当然,就像说你既可以开车到某个地方,也可以走路去,只是难易之分。话虽不错,但是新技术让东西变得更易于使用。

总的来说,汇编语言不会在游戏中单独应用。游戏使用汇编主要是使用它那些能提高性能的零零碎碎的部分。比如说,毁灭战士整体使用C来编写,有几段绘图程序使用汇编。这些程序每秒钟要调用数千次,因此,尽可能的简洁将有助于提高游戏的性能。而从C里调用汇编写的函数是相当简单的,因此同时使用两种语言不成问题。

特别注意:语言的名字叫“汇编”。把汇编语言翻译成真实的机器码的工具叫“汇编程序”。把这门语言叫做“汇编程序”这种用词不当相当普遍,因此,请从这门语言的正确称呼作为起点出发。

优点:最小、最快的语言。汇编高手能编写出比任何其他语言能实现的快得多的程序。你将是利用处理器最新功能的第一人,因为你能直接使用它们。

缺点:难学、语法晦涩、坚持效率,造成大量额外代码 — 不适于心脏虚弱者。

移植性:接近零。因为这门语言是为一种单独的处理器设计的,根本没移植性可言。如果使用了某个特殊处理器的扩展功能,你的代码甚至无法移植到其他同类型的处理器上(比如,AMD的3DNow指令是无法移植到其它奔腾系列的处理器上的)。

使用汇编编写的游戏:我不知道有什么商业游戏是完全用汇编开发的。不过有些游戏使用汇编完成多数对时间要求苛刻的部分。

资料:如果你正在找一门汇编语言的文档,你主要要找芯片的文档。网络上如Intel、AMD、Motorola等有一些关于它们的处理器的资料。对于书籍而言,《Assembly Language: Step-By-Step》是很值得学习的。

5、Pascal语言

Pascal语言是由Nicolas Wirth在七十年代早期设计的,因为他对于FORTRAN和COBOL没有强制训练学生的结构化编程感到很失望,“空心粉式代码”变成了规范,而当时的语言又不反对它。Pascal被设计来强行使用结构化编程。最初的Pascal被严格设计成教学之用,最终,大量的拥护者促使它闯入了商业编程中。当Borland发布IBM PC上的 Turbo Pascal时,Pascal辉煌一时。集成的编辑器,闪电般的编译器加上低廉的价格使之变得不可抵抗,Pascal编程了为MS-DOS编写小程序的首选语言。

然而时日不久,C编译器变得更快,并具有优秀的内置编辑器和调试器。Pascal在1990年Windows开始流行时走到了尽头,Borland放弃了Pascal而把目光转向了为Windows 编写程序的C++。Turbo Pascal很快被人遗忘。

最后,在1996年,Borland发布了它的“Visual Basic杀手”— Delphi。它是一种快速的带华丽用户界面的 Pascal编译器。由于不懈努力,它很快赢得了一大群爱好者。

基本上,Pascal比C简单。虽然语法类似,它缺乏很多C有的简洁操作符。这既是好事又是坏事。虽然很难写出难以理解的“聪明”代码,它同时也使得一些低级操作,如位操作变得困难起来。

优点:易学、平台相关的运行(Dephi)非常好。

缺点:“世界潮流”面向对象的Pascal继承者(Mola、Oberon)尚未成功。语言标准不被编译器开发者认同。专利权。

移植性:很差。语言的功能由于平台的转变而转变,没有移植性工具包来处理平台相关的功能。

使用Pascal编写的游戏:几个。DirectX的Delphi组件使得游戏场所变大了。

资料:查找跟Delphi有关的资料,请访问:Inprise Delphi page。

6、Visual Basic

哈,BASIC。回到八十年代的石器时代,它是程序初学者的第一个语言。最初的BASIC形式,虽然易于学习,却是可怕的无组织化,它义无返顾的使用了GOTO充斥的“空心粉式代码”。当回忆起BASIC的行号和GOSUB命令,没有几个人能止住眼角的泪水。

快速前进到九十年代早期,虽然不是苹果公司所希望的巨人,HyperCard仍然是一个在Windows下无法比拟的吸引人的小型编程环境。Windows下的HyperCard克隆品如ToolBook又慢又笨又昂贵。为了与HyperCard一决高下,微软取得了一个小巧的名为Thunder编程环境的许可权,并把它作为Visual Basci 1.0发布,其用户界面在当时非常具有新意。这门语言虽然还叫做Basic(不再是全部大写),但更加结构化了,行号也被去除。实际上,这门语言与那些内置于TRS-80、Apple II及Atari里的旧的ROM BASIC相比,更像是带Basic风格动词的Pascal。

经过六个版本,Visual Basic变得非常漂亮。用户界面发生了许多变化,但依然保留着“把代码关联到用户界面”的主旨。这使得它在与即时编译结合时变成了一个快速原型的优异环境。

优点:整洁的编辑环境。易学、即时编译导致简单、迅速的原型。大量可用的插件。虽然有第三方的DirectX插件,DirectX 7已准备提供Visual Basic的支持。

缺点:程序很大,而且运行时需要几个巨大的运行时动态连接库。虽然表单型和对话框型的程序很容易完成,要编写好的图形程序却比较难。调用Windows的API程序非常笨拙,因为VB的数据结构没能很好的映射到C中。有OO功能,但却不是完全的面向对象。专利权。

移植性:非常差。因为Visual Basic是微软的产品,你自然就被局限在他们实现它的平台上。也就是说,你能得到的选择是:Windows,Windows或Widnows。当然,有一些工具能将VB程序转变成Java。

使用Visual Basic编写的游戏:一些。有很多使用VB编写的共享游戏,还有一些是商业性的。

资料:微软的VB页面有一些信息。

7、Java

Java是由Sun最初设计用于嵌入程序的可移植性“小C++”。在网页上运行小程序的想法着实吸引了不少人的目光,于是,这门语言迅速崛起。事实证明,Java不仅仅适于在网页上内嵌动画 — 它是一门极好的完全的软件编程的小语言。“虚拟机”机制、垃圾回收以及没有指针等使它很容易实现不易崩溃且不会泄漏资源的可靠程序。

虽然不是C++的正式续篇,Java从C++ 中借用了大量的语法。它丢弃了很多C++的复杂功能,从而形成一门紧凑而易学的语言。不像C++,Java强制面向对象编程,要在Java里写非面向对象的程序就像要在Pascal里写“空心粉式代码”一样困难。

优点:二进制码可移植到其他平台。程序可以在网页中运行。内含的类库非常标准且极其健壮。自动分配合垃圾回收避免程序中资源泄漏。网上数量巨大的代码例程。

缺点:使用一个“虚拟机”来运行可移植的字节码而非本地机器码,程序将比真正编译器慢。有很多技术(例如“即时”编译器)很大的提高了Java的速度,不过速度永远比不过机器码方案。早期的功能,如AWT没经过慎重考虑,虽然被正式废除,但为了保持向后兼容不得不保留。越高级的技术,造成处理低级的机器功能越困难,Sun为这门语言增加新的“受祝福”功能的速度实在太慢。

移植性:最好的,但仍未达到它本应达到的水平。低级代码具有非常高的可移植性,但是,很多UI及新功能在某些平台上不稳定。

使用Java编写的游戏:网页上有大量小的Applet,但仅有一些是商业性的。有几个商业游戏使用Java作为内部脚本语言。

资料:Sun的官方Java页面有一些好的信息。IBM也有一个非常好的Java页面。JavaLobby是一个关于Java新闻的最好去处。

8、创作工具

上面所提及的编程语言涵盖了大多数的商业游戏。但是也有一个例外,这个大游戏由于它的缺席而变得突出。

“神秘岛”。没错,卖得最好的商业游戏不是使用以上任何一门语言编的,虽然有人说“神秘岛”99%是使用 3D建模工具制作的,其根本的编程逻辑是在HyperCard里完成的。

多数创作工具有点像Visual Basic,只是它们工作在更高的层次上。大多数工具使用一些拖拉式的流程图来模拟流程控制。很多内置解释的程序语言,但是这些语言都无法像上面所说的单独的语言那样健壮。

优点:快速原型 — 如果你的游戏符合工具制作的主旨,你或许能使你的游戏跑得比使用其他语言快。在很多情况下,你可以创造一个不需要任何代码的简单游戏。使用插件程序,如Shockware及IconAuthor播放器,你可以在网页上发布很多创作工具生成的程序。

缺点:专利权,至于将增加什么功能,你将受到工具制造者的支配。你必须考虑这些工具是否能满足你游戏的需要,因为有很多事情是那些创作工具无法完成的。某些工具会产生臃肿得可怕的程序。

移植性:因为创作工具是具有专利权的,你的移植性以他们提供的功能息息相关。有些系统,如Director可以在几种平台上创作和运行,有些工具则在某一平台上创作,在多种平台上运行,还有的是仅能在单一平台上创作和运行。

使用创作工具编写的游戏:“神秘岛”和其他一些同类型的探险游戏。所有的Shockwave游戏都在网络上。

资料:Director、HyperCard、SuperCard、IconAuthor、Authorware。

9、结论

你可能希望得到一个关于“我该使用哪种语言”这个问题的更标准的结论。非常不幸,没有一个对所有应用程序都最佳的解决方案。C适于快而小的程序,但不支持面向对象的编程。C++完全支持面向对象,但是非常复杂。Visual Basic与Delphi易学,但不可移植且有专利权。Java有很多简洁的功能,但是慢。创作工具可以以最快的速度产生你的程序,但是仅对某一些类型的程序起作用。最好的方法是决定你要写什么样的游戏,并选择对你的游戏支持最好的语言。“试用三十天”的做法成为工业标准是件好事情。

C. 求一篇数学编程论文!急....

〔论文关键词〕Viterbi 算法 编程�
〔论文摘要〕虽然Texas Instrument推出的C6000系列DSP使对信号处理的能力显着提高,但对信息处理能力要求的不断提升使提对DSP程序的优化越来越成为DSP开发工作中非常重要的环节。本文讨论2Mbps视频数据流的Viterbi算法的移植与优化策略、技巧。�
��

一、概述�
Viterbi译码算法是由Viterbi于1967年提出的一种最大似然译码办法,译码器根据接收序列R按最大似然准则力图找出正确的原始码序列。随着大规模集成电路技术的发展,采用Viterbi算法的卷积编码技术已成为广泛应用的纠错方案。Viterbi译码过程可用状态表示。Sj,t和Sj N/2,t表示t时刻的两个状态。在t1时刻,这两个状态值根据路径为0或者1,转移到状态S2j,t1和S2j1,t1。每一种可能的状态转移都根据接收到的有噪声的序列R计算路径度量,然后选择出各个状态的最小度量路径(幸存路径)。Viterbi算法就是通过在状态中寻找最小量路径向前回溯L步,最后得到的即为译码输出。�
在卷积码(n,k,m)表示法中,参数k表示每次输入信息码位数,n表示编码的输出卷积码位数,m称为约束长度(一些书中采用k=m1为约束长度,也可称(2,1,2)码网格图,r=k/n称为信息率,即编码效率。本文运用的是(2,1,3)码,约速长度为2,状态数为2�2=-4。
TMS320C6000系列DSPs(数字信号处理器)是TI公司推出的一种并行处理的数字信号处理器,是基于TI的VLIW技术的。本文采用的是TMS320C6211。该处理器的工作频率经过倍频可达到150MHz,每个时钟周期最多可并行执行8条指令,从而可以实现1200MIPS定点运算能力。�

二、编程实现及优化�
根据C6000的软件编程流程,对Viterbi算法的编程及其优化可分为三个阶段来进行。这三个阶段分别为:开发C代码、优化C代码、编写线性汇编代码。在代码编写和优化过程中,这三个阶段不是都要经过的,只要在某一阶段已经满足了算法代码的功能和性能要求,就不必继续进行下面的阶段。�
1.开发C代码。这一阶段完全是根据任务要求来完成算法的代码编写工作。在C6000的集成开发环境CCS(Code Composer Studio)下进行代码的编译和功能验证,然后可用CCS的调试工具(如Profiler),利用在程序中设置断点的办法可找出程序中耗时最多、最影响整体性能的代码段。为改进代码性能,可进入下一阶段。�
在验证了算法代码实现功能并以设置断点的办法测试代码的性能,这段循环运行耗时(时钟周期)为1790。显然,性能不能达到要求,就要进入代码优化的第二阶段了。�
2.一般在代码调试中,最影响性能的是其中的循环代码段。而软件流水是一种用于安排循环内的指令运行方式,尽可能充分利用CPU的功能单元等资源,使循环的多次迭代能够并行执行的一种技术。在C6000的C/C编译器里,采用软件流水使编译出来的程序代码优化是一项核心技术。所以在进一步优化之前,需要调整并尽可能简化代码的结构并去除影响软件流水的因素使其能够被编译器充分流水,这对大幅提高整个代码的性能非常重要。�
所以,在考虑影响因素同时对Viterbi算法的循环代码进行如下调整;�
*运用内联函数(intrinsics)替代复杂的C语言程序。C6000编译器提供了许多intrinsics,可以快速优化C代码。Intrinsics是直接参与C6000汇编指令映射的内联函数。在这里运用了_extu(x,y,z),以简化其中hamm代码部分。

D. 求大神帮忙写一份C语言编程的毕业论文,关于小型图书馆管理系统的;只要稿文就行了带流程图片的,不用带

图书馆管理系统
(C
语言程序设计
).txt
生活是一张千疮百孔的网,它把所有激情的水都漏光
了。寂寞就是你说话时没人在听,有人在听时你却没话说了!

网络知道
>
电脑
/
网络
>
程序设计
> C/C++
添加到搜藏已解决

图书管理系统
C
语言设计(
c#
免入)

悬赏分:
100 -
解决时间:
2010-6-25 14:38
1
、功能描述,新进图书基本信息的输入。

2.
图书基本信息的查询。

3.
对撤消图书信息的删除。

4.
为借书人办理注册。

5
.办理借书手续(非注册会员不能借书)


6
.办理还书手续

信息描述:有关该系统基本信息的描述,如:图书名称、图书编号、单价、作者、存在状态、
借书人姓名、性别、学号等

大一新生的课程设计,那个只能用
C
语言来做,拜托各位了,两天之后要上交,网上找的调
试都不成功。

记住一定要用
C
语言啊,千万不要用
C++
,调试成功后有悬赏分的

问题补充:我的邮箱是
[email protected]
各位大侠,答完后记得留自己的名字啊,这样我也好给分

对了,是要在
vc
的系统编译

提问者:
g080166 -
五级最佳答案
#include <dos.h>
#include <bios.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>

#define LEFT 0x4b00 /*

*/
#define RIGHT 0x4d00 /*

*/
#define DOWN 0x5000 /*

*/
#define UP 0x4800 /*

*/
#define SPACE 0x3920 /*
空格
*/
#define ESC 0x011b /* ESC

*/
#define ENTER 0x1c0d /*
回车键
*/
#define Backspace 0xe08 /*
擦除键
*/
#define ALT_B 12288 /*
组合键
ALT_B */
#define ALT_M 12800/*
组合键
ALT_M */
#define ALT_H 8960/*
组合键
ALT_H */

int key;/*
按键变量
*/
int textx,texty;/*
光标坐标
,x

,y

*/

struct menustruct/*
菜单用的结构体
*/
{
char name[10];/*
主菜单名
*/
char str[10][20];/*
选项
*/
int n;/*
选项数
*/
}ml[3];/*
使用了
3
个,可根据需要增删
*/

typedef struct BookList/*
书的结构体
*/
{
char num[20];/*
图书编号
*/
char name[20];/*
书名
*/
int price;/*
书的价格
*/
char person[20];/*
借阅人
*/
int yes;/*
判断书是否存在或者已经借出
,1
存在
,0
借出
*/
struct BookList *next;
}Book;

typedef struct MemberList/*
会员的结构体
*/
{
char name[20];/*
会员的姓名
*/
char sex[2];/*
会员的性别
*/
int age;/*
会员的年龄
*/
struct MemberList *next;
}Member;

char save[4096];/*
保存文本区域空间
*/
/*char sav1[4096];*/

char c[4096];/*
清屏专用空间
*/

int i,j;/*
常用变量
*/

void Menu();/*
初始化界面
*/
void Selectitem();/*
定义菜单
*/
void DrawSelectitem();/*
显示主菜单
*/
void BlackText(int x,int y,char *z);/*
选中菜单
*/
void RedText(int x,int y,char *z);/*
正常菜单
*/
void Run();/*
具体操作过程
*/
void DrawMl(int n);/*
显示下拉菜单
*/
void MoveMl(int n,int x);/*
菜单选项的控制
*/
void Enter(int m,int n);/*
菜单选项的具体功能
*/
void BookAdd();/*
添加图书
*/
void BookConsult();/*
图书查询
*/
void BookDel();/*
删除图书资料
*/

void BookBorrow();/*
借书
*/
void BookReturn(); /*
还书
*/
void MemberAdd(); /*
增加会员
*/
void MemberConsult();/*
查询会员
*/
void MemberDel(); /*
删除会员
*/
void MemberBook(); /*
查询会员借书信息
*/
void Help(); /*
帮助
*/
void Ver(); /*
版本信息
*/
void ClrScr();/*
自定义清屏函数
*/
void
DrawFrame(int
left,int
up,int
right,int
down,int
textcolor,int
backgroundcolor);/*
画边框
*/

/***
主函数
****/
void main(void)
{
Menu();/*
初始化界面
*/
Run();
/*
具体操作过程
*/
}
/*
初始化界面
*/
void Menu()
{
system("cls"); /*
调用系统的清屏命令
*/
textbackground(BLUE);/*
将背景设置为蓝色
*/
window(1,1,25,80);
clrscr();
textx=3;/*
光标初始化位置
*/
texty=2;
gotoxy(1,2);
printf("%c",218);/*
画左上角
*/
for(i=0;i<78;i++)
printf("%c",196); /*
画水平直线
*/
printf("%c",191);/*
画右上角
*/
for(i=3;i<=23;i++)
{
gotoxy(1,i);
printf("%c",179); /*
画垂直线
*/
gotoxy(80,i);
printf("%c",179);
}
printf("%c",192); /*
画左下角
*/
for(i=0;i<78;i++)
printf("%c",196);

E. 计算机毕业论文范文2000字

学术堂整理了一份2000字的计算机毕业论文范文,供大家进行参考:

论文题目:《计算机教育过程中的信息安全问题》

【摘 要】随着科学技术的不断发展,计算机网络技术得到飞速发展和应用,而在计算机教育过程中存在着很多的不安全因素,因此计算机网络安全越来越受到人们的高度关注.本文通过介绍计算机教育的发展现状,分析在计算机教育过程中的信息安全存在的问题,并针对计算机信息安全问题提出相应的防范措施,对今后计算机教育的信息安全研究具有重要的参考价值.

【关键词】计算机教育 信息安全 存在问题 防范措施 发展现状

一、计算机教育发展现状

计算机网络技术的不断普及,给人们的生活带来很多的便利,但也存在着极大的安全隐患,即计算机网络信息安全问题.而计算机信息系统安全包括有计算机安全、网络安全和信息安全,而一般提到的就是信息安全,它在计算机教育系统中发挥着非常重要的作用,贯穿着计算机教育的全过程.正是由于计算机信息安全在人们的生产生活中充当着极其重要的作用,因此要探讨计算机教育过程面临着怎样的信息安全问题,这值得我们加强对计算机教育过程中信息安全问题的防范,以此营造健康安全的计算机网络环境.

计算机教育信息系统是个复杂的系统性安全问题,它包含计算机系统中的硬件、软件、计算机运作系统以及计算机的查毒系统,更甚于有计算机的病毒等.而计算机教育过程中存在的信息安全问题一般包含有硬件破坏、软件错误、感染病毒、电磁辐射、管理不当以及病毒的恶意侵犯等问题都有可能威胁到计算机的信息安全问题.计算机网络系统是教育过程中一门重要的跨多个学科的综合性科学,在我国的教育教学中逐渐被广泛地应用起来,也同时受到社会各方面的高度关注.但计算机教育过程中存在很多的信息安全因素,需要我们加强对计算机教育信息安全的关注.

二、计算机教育过程中的信息安全存在的问题

(一)计算机病毒的危害

计算机病毒在我国颁布的计算机有关保护条例中明确将计算机病毒列为能干扰计算机功能或者破坏计算机数据,并影响计算机的正常使用的一种信息安全病毒.当前计算机容易受到很多病毒的侵害,如木马、火焰、网络蠕虫等,这些计算机病毒的危害极大,传播速度极快,影响范围极广,而且传播形式多种多样,后期的清除难度也更大,目前是计算机教育过程中信息安全面临的最主要的问题.

(二)IP地址被盗用

在计算机教育过程中,往往会出现许多的IP地址被盗用的问题,使用户无法正常地使用网络.IP地址被盗用一般更多地会发生在计算机IP地址权限比较高的用户中间,盗用者会通过网络隐藏其身份对高级用户进行干扰和破坏,导致用户无法正常使用计算机,可能带来较为严重的影响,甚至威胁到用户的信息安全和合法权益.

(三)网络攻击

网络是是指攻击者通过网络对用户的信息进行非法访问及破坏,而这其中包含有很多的形式,这完全取决于的个人主观动机.有些出于非常恶意的态度而对计算机信息安全进行破坏,这其中包括有对用户的的信息安全进行有意泄漏,对用户造成许多负面影响,还有些的行为较为严重,他们会窃取国家政治军事机密,损害国家的形象;非法盗用他人账号提取他人银行存款;对用户进行网络勒索或诈骗,这些的行为将对我国的计算机信息安全造成极大的破坏和攻击.

(四)计算机网络安全管理不健全

计算机网络安全管理中往往存在很多的问题,如计算机网络安全管理体制不健全,管理人员职责分工不明确,缺乏一定的网络安全管理机制,缺乏一定的计算机网络安全管理意识,这些使得计算机网络信息安全的风险更加严重,逐渐威胁计算机网络的信息安全.

三、针对计算机信息安全问题提出相应的防范措施

(一)计算机病毒的防范

计算机病毒应该采取的措施以防御为主,然后再加强对病毒的防范和管理.应该在计算机硬件或软件上安装全方位的防病毒查杀软件,定期地对计算机系统进行升级,从而保证计算机教育系统的信息安全.

(二)防技术

随着科学技术的不断进步,人们对身份的鉴别也有了一定的认识,人们也逐渐认识到身份认证的重要作用,因此用户应该做的是定期地修改用户账户和.而目前我国采用的最常见的防技术就是防火墙技术,防火墙技术可以对网络安全进行实时地监控,有效地防止了地干扰和破坏.

(三)提高计算机网络安全意识

计算机网络信息安全在很大程度上是由于人们对计算机信息安全的保护意识不强而引起的安全问题,计算机网络信息安全是一项综合性较强且复杂的项目,因此应该加强对计算机信息安全人员的技术培训,增强用户的计算机网络安全意识,从而发挥计算机技术的更大的优势.

四、结束语

计算机网络信息安全与我们的生活息息相关,计算机教育网络信息系统需要大家的共同维护,因此在建立健康安全的计算机信息技术平台环境,需要做的不仅仅是要建立安全的防护体系,更要做的是加强人们对计算机信息安全的防范意识,才可以建立一个通用安全的网络环境.

参考文献

[1]高瑞.浅议计算机教育过程中的信息安全问题[J].电子制作,2015,(8)15,58-69.

[2]张大宇.计算机教育过程中的信息安全问题探讨[J].中小企业管理与科技(下旬刊),2014,(6)25,45-53.

信息安全论文参考资料:

计算机信息安全论文

信息安全论文

信息网络安全杂志

网络信息安全论文

移动信息期刊

食品安全论文2000字

结论:计算机教育过程中的信息安全问题为关于对不知道怎么写信息安全论文范文课题研究的大学硕士、相关本科毕业论文信息安全论文开题报告范文和文献综述及职称论文的作为参考文献资料下载。

F. 理解基于对象编程的实质,写一篇关于编程方法分析或议论的课程小论文

一、最小化窗口

点击“X”或“Alt+F4”时,最小化窗口,

如:

protected override void WndProc(ref Message m)
{
const int WM_SYSCOMMAND = 0x0112;
const int SC_CLOSE = 0xF060;
if (m.Msg == WM_SYSCOMMAND && (int) m.WParam == SC_CLOSE)
{
// User clicked close button
this.WindowState = FormWindowState.Minimized;
return;
}
base.WndProc(ref m);
}

二、如何让Foreach 循环运行的更快

foreach是一个对集合中的元素进行简单的枚举及处理的现成语句,用法如下例所示:

using System;
using System.Collections;
namespace LoopTest
{
class Class1
{
static void Main(string[] args)
{
// create an ArrayList of strings
ArrayList array = new ArrayList();
array.Add("Marty");
array.Add("Bill");
array.Add("George");
// print the value of every item
foreach (string item in array)
{
Console.WriteLine(item);
}
}
}
}

你可以将foreach语句用在每个实现了Ienumerable接口的集合里。如果想了解更多foreach的用法,你可以查看.NET Framework SDK文档中的C# Language Specification。

在编译的时候,C#编辑器会对每一个foreach 区域进行转换。

IEnumerator enumerator = array.GetEnumerator();
try
{
string item;
while (enumerator.MoveNext())
{
item = (string) enumerator.Current;
Console.WriteLine(item);
}
}
finally
{
IDisposable d = enumerator as IDisposable;
if (d != null) d.Dispose();
}

这说明在后台,foreach的管理会给你的程序带来一些增加系统开销的额外代码。

三、将图片保存到一个XML文件

WinForm的资源文件中,将PictureBox的Image属性等非文字内容都转变成文本保存,这是通过序列化(Serialization)实现的,

例子:

using System.Runtime.Serialization.Formatters.Soap;
Stream stream = new FileStream("E:\\Image.xml",FileMode.Create,FileAccess.Write,FileShare.None);
SoapFormatter f = new SoapFormatter();
Image img = Image.FromFile("E:\\Image.bmp");
f.Serialize(stream,img);
stream.Close();

四、屏蔽CTRL-V

在WinForm中的TextBox控件没有办法屏蔽CTRL-V的剪贴板粘贴动作,如果需要一个输入框,但是不希望用户粘贴剪贴板的内容,可以改用RichTextBox控件,并且在KeyDown中屏蔽掉CTRL-V键,例子:

private void richTextBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
if(e.Control && e.KeyCode==Keys.V)
e.Handled = true;
}

五、判断文件或文件夹是否存在

使用System.IO.File,要检查一个文件是否存在非常简单:

bool exist = System.IO.File.Exists(fileName);

如果需要判断目录(文件夹)是否存在,可以使用System.IO.Directory:

bool exist = System.IO.Directory.Exists(folderName);

六、使用delegate类型设计自定义事件

在C#编程中,除了Method和Property,任何Class都可以有自己的事件(Event)。

百事通定义和使用自定义事件的步骤如下:

(1)在Class之外定义一个delegate类型,用于确定事件程序的接口
(2)在Class内部,声明一个public event变量,类型为上一步骤定义的delegate类型
(3)在某个Method或者Property内部某处,触发事件
(4)Client程序中使用+=操作符指定事件处理程序

例子: // 定义Delegate类型,约束事件程序的参数

public delegate void MyEventHandler(object sender, long lineNumber) ;
public class DataImports
{
// 定义新事件NewLineRead
public event MyEventHandler NewLineRead ;
public void ImportData()
{
long i = 0 ; // 事件参数
while()
{
i++ ;
// 触发事件
if( NewLineRead != null ) NewLineRead(this, i);
//...
}
//...
}
//...
}

// 以下为Client代码

private void CallMethod()
{
// 声明Class变量,不需要WithEvents
private DataImports _da = null;
// 指定事件处理程序
_da.NewLineRead += new MyEventHandler(this.DA_EnterNewLine) ;
// 调用Class方法,途中会触发事件
_da.ImportData();
}
// 事件处理程序
private void DA_EnterNewLine(object sender, long lineNumber)
{
// ...
}

七、IP与主机名解析

使用System.Net可以实现与Ping命令行类似的IP解析功能,例如将主机名解析为IP或者反过来:

private string GetHostNameByIP(string ipAddress)
{
IPHostEntry hostInfo = Dns.GetHostByAddress(ipAddress);
return hostInfo.HostName;
}
private string GetIPByHostName(string hostName)
{
System.Net.IPHostEntry hostInfo = Dns.GetHostByName(hostName);
return hostInfo.AddressList[0].ToString();
}

G. 编译器具体实现中比较巧妙的思想有哪些

这种做法的好处是:
可以作为解释器性能升级的一个简单路径,写解释器的代码而得到初级编译器的性能。事实上JamVM的解释器可以配置为多种实现方式:switch-threading、indirect-threading、direct-threading、inline-threading,它们的差别仅在于对opcode的dispatch方式不同;所有实现方式都共享同一份handler代码。
这种做法的缺点是:
这样写得到的“编译器”无论从代码组织还是程序思路都还是解释器的那套,从编译器的角度看很别扭。它最终实现出来效果跟从编译器角度出发的template-based JIT一样,但我觉得后者的思路更直观,代码也通常更清晰一些。
这种做法仍然无法跨越字节码边界做任何优化,因为每个opcode对应一个单独的handler,而这种做法的代码生成仅仅是把handler拷贝到一起而已。
要在它的基础之上进一步提高性能可以直接对字节码序列做些简单模式匹配,以便跨越字节码边界做优化。但这样做通常是自讨苦吃,工程上很难持续下去。

H. 编译原理 相关论文

擦!这是谁啊!肯定认识…………

I. 基于图结构应用《编码,译码器》的设计与实现 这个毕业设计应该从什么思路下手啊~~计算机专高手请指点

Turbo卷积码(TCC)是3G无线系统中所采用的前向错误校正(FEC)机制的整体部分。然而,Turbo译码器所带来的计算负担非常重,并不太适合采用传统DSP或RISC处理器实现。由于现场可编程逻辑阵列(FPGA)内在的并行结构,FPGA为解决3G基站收发器中所需要的符号速率FEC和其它计算密集的任务提供了一个高性能信号处理平台基础。

Turbo 编码

级联码方案(Concatenated coding schemes)是为了通过结合两个或更多相对简单的分量或构造模块码来获得较高的编码增益。Turbo码认为是对级联码结构的一种改进,其中采用迭代算法对相关的码序列进行译码。Turbo码是通过将两个或更多分量码应用到同一数据序列的不同交织版本上构成的。对于任何传统单分量编码,译码器的最后一级生成的都是硬判决译码数据位。为了使象Turbo码这样的级联码方案工作得更好,译码算法不应被限制为只能在译码器间传递硬判决。为最好地利用每个译码器获得的信息,译码算法必须可以实现软判决交换,而不是采用硬判决。对于采用两个分量码的系统,译码的概念是指将来自一个译码器的软判决输入到另一个译码器的输入,并将此过程重复几次以获得更好的判决,如图1所示 。

3GPP Turbo 编码器

图2为3GPP编码器。

输入数据流输入到RSC1,它为每个输入比特生成一个对等比特(Parity Bit)。输入数据还经过交织后由RSC2处理生成第二个对等比特流。
3GPP标准定义,输入块的长度在40至5114 位之间。编码器生成一个速率为1/3的包括原始输入位和两个对等位的系统码。通过打孔方法可以获得1/2编码速度的编码。递归系统编码器的实现比较直接,然而交织器则不那么简单,要比标准的卷积或块交织器复杂。

一旦将输入数据块长度K 提供给编码器以后,编码器将计算交织矩阵行数R和列数 C,并创建相应的交织数据结构。R 和 C 是数据块长度K的函数。在输入符号被加载到交织矩阵以后,那么将根据一定的顺序进行行间交换和列间交换。交换模式是根据块长度K选择的(即依赖于K)。行和列交换完成后,通过逐列读出交织矩阵数据就可以得到最终的交织序列。在数据读出时需要进行删减操作,以保证在输出中只有正确的输入符号,请注意,交织阵列包含的数据位通常比K个原始输入符号要多 ,因为R C>K。然后,新的序列经过RSC2编码生成第二个对等位流。
实现交织器的一种方法是在存储器中存储完整的交换序列。即,一旦K 给定,即调用一个初始化例程(运行在处理器上的软件例程或利用FPGA中的功能单元)生成相应的交换序列,然后将这一信息存储在存储器中。然而,这一方法需要大量的存储器。利用Virtex -E FPGA 技术提供的 4096位每块的片上存储器,将需要[5114 13/4096]=17个存储器块。

在我们的方法中,采用一个预处理引擎生成一个序列值(存储),这一序列值被存储起来,交织器地址发生器将使用这些序列值。这一硬件单元采用几个小型数据结构(素数表)来计算所需要的序列。这一准备过程需要的时钟周期数与信息块的长度成比例。例如,对于K=40的块需要280时钟周期,而对于最大块长度K=5114,则需要 5290个时钟周期。该过程只需要在块长度变化时进行。地址发生器利用这些更为紧凑的数据结构来实时生成交织地址。

3GPP Turbo 译码器

译码器包括两个MAP(最大后验概率)译码器和几个交织器。Turbo算法的优良的性能源于可以在两个MAP译码器间共享可靠性信息(extrinsic data,外数据,或称先验数据)。

在我们的设计中,MAP译码器采用的是Bahl, Cocke, Jelinek 和 Rajiv (BCJR) 算法。BCJR算法计算每个符号的最大后验对数似然率,并且是一种真正的软判决算法。考虑到数据是以块的形式传输的,因此可以在时间维中前向或反向搜索一个符号序列。对于任一序列,其出现概率都是单独符号出现概率的乘积。由于问题是线性的,因此序列概述可以利用概率的对数和来代替。

为了与一般文献中的习惯一致,我们将译码迭代的前向和反向状态概率分别利用 和 来表示。通常,BCJR算法要求在接收到整个信息后才开始解码。对于实时应用,这一限制可能太严格了。例如,3GPP Turbo译码器将需要大量存储器存储一个5114符号信息块的完全状态结构(state trellis)。对于单片FPGA设计来说,这需要的存储资源太多了。与维特比(Vitebi)算法类似,我们可以先从全零向量 O和数据{yk}(k 从 n 到 n-L) 开始反向迭代。L次反向迭代可获得非常好的 n-L近似值。只要L选择合适,最终的状态标志(state metric)就是正确的。可以利用这一性质在信息结束前就开始进行有效的位译码。

L 被称为收敛长度。其典型值大约是译码器约束长度的数倍(通常为5至10倍),并随着信噪比的降低而增加。

通常,Turbo译码算法将计算所有的 (对整块信息),将这些数值存储起来,然后在反向迭代中与反向状态概率一起用来计算新的外信息(extrinsic information,或称先验信息)。我们的设计中采用了窗口化方法。

译码过程以一个前向迭代开始,计算包含L 个接收符号的块i的 值。同时,对未来(i+1)块进行一个反向迭代(标号 )。对块i+1的反向迭代结束时,就获得了开始对块i 进行反向迭代所需要的正确的 初始向量。 与此同时对数似然函数(Lall)也在进行。 每一 和 处理过程都需要8个max* 操作 - 每个针对状态结构(tellis)中的8个结点之一。最终的对数似然计算需要14个并行max* 运算符。为了提供可接受的译码速率,在设计中采用了38个max* 功能单元。

从 C描述到FPGA设计

FPGA Turbo 编码译码器设计是利用基于C的设计和验证方法进行的,如图3所示。

算法开发阶段采用具有定点C类型的Art Library 来对定点计算的位真(bit-true)效应进行准确建模。在这一阶段考察了几种可能算法的定点性能。一旦选定正确的量化算法,就可利用A|rtDesignerPro创建一个专用DSP架构。A|rtDesignerPro的一个最强大的功能之一是可以插入和利用专用的数据通道核心(称为专用单元,ASU)。利用这些ASU加速器核心可以使我们处理Turbo译码器算法内在的计算复杂性。

A|rtDesignerPro可自动完成寄存器分配、调度和控制器生成。在Turbo编码译码器设计中, A|rtDesignerr的自动循环合并可获得最佳的;任务调度,MAP译码步骤的内部循环都只有一个周期长。

A|rtDesignerPro生成的最终结果是可综合的寄存器级(RT-level) VHDL或Verilog 描述。基于C的工具流支持FPGA专用功能。例如,可利用BlockRAM自动构造RAM,而寄存器文件也可利用分布式存储器而不是触发器来实现 。

最后,逻辑综合和Xilinx实施工具套件将RTL HDL 转换为 FPGA 配置位流。

FPGA Turbo 编码译码器实现

A|rtDesigner创建的Turbo编码器和译码器核心硬件结构包含许多专用ASU加速器。其中最重要的一个加速器完成max* 操作。max* 运算符根据下式计算两个幂值a 和 b:

max* (a,b)=ln(expc(a)+expc(b))。

如 图4所示, max* 运算是通过选择(a,b)最大值,并应用一个存储在查找表(LUT)中的校正因子近似进行的。这一近似算法非常适合利用Xilinx FPGA 实现,其中LUT是其最终基本构造单元。

结果

Turbo译码算法硬件字长的选择极大地影响总体性能。利用C-to-FPGA设计流程,这一定点分析是完全在C环境中完成的。结果示于图 5。

上图显示出了我们的浮点Turbo译码器算法和对应的定点算法之间的性能差别。仿真是在5114块长度、5次译码迭代和AWGN信道模型情况下进行的。结果清晰明显出性能的损失是非常小的。

我们的Turbo译码器的定点性能做为译码器迭代次数的函数 ,对于1.5 dB SNR,位错率为10-6。

译码器功能的实现非常具有挑战性,我们同时针对Virtex-E和 Virtex-II 器件进行了适配。Virtex-II 器件实施是采用运行在1.85 speedfile数据库上的Xilinx 4.1i 实施工具集完成的。利用XC2V1000BG575-5 FPGA实现的最终设计,达到了66 MHz 的时钟性能,消耗了3,060个逻辑片 和 16个块RAM。对于从40至 5114符号长度的块,采用5次译码迭代循环的情况下,译码器达到了2 至6.5 百万符号每秒(Msym/s)的吞吐量。编码器占用了903个逻辑片、3个块RAM并支持83 MHz时钟频率。对于从40至5114位的块长度,速率可达到9 至20 Msym/s。

J. c语言毕业论文课题做什么比较好 求高手给推荐

如果能力够的话可以写一个自创的小型语言编译器或解释器,保准通过。

具体你可以参考Brainfuck语言的源代码

#include <stdio.h>
#include <stdlib.h>
char g_DataBlock[30000] = {0}; // 堆数据区
char g_CodeSegment[100000]; // BF代码指令区
int g_CodeLen = 0; // 代码指令长度,尾指针
int g_Stack[100]; // 栈,当进入'[',']'时用于维护指令指针
int g_StackLen = 0; // 栈指针
int analysis(); // 解析指令
int main(int argc, char **argv)
{
FILE* fSrcCodeFile; // 用于读去源代码文件
if (argc == 2)
{
fSrcCodeFile = fopen(argv[1], "r");
if (fSrcCodeFile == NULL)
{
perror("fopen");
return 1;
}
while (fread(&g_CodeSegment[g_CodeLen], 1, 1, fSrcCodeFile) == 1)
{// 从源文件中读取代码指令
g_CodeLen++;
}
}
else
{
fprintf(stderr, "%s:%d\n", __FILE__, __LINE__);
return 2;
} // end of if (argc == 2)
fclose(fSrcCodeFile);
setbuf(stdout, NULL);
return analysis(); // 解析指令
}
int analysis()
{
int iCurrCodePos = 0; // 当前指令位置
char* pCurrData = g_DataBlock + 10000; // 让当前指针指向数据区10000号单元,以便在指针的前后都是有效操作区域
while (iCurrCodePos < g_CodeLen)
{
switch (g_CodeSegment[iCurrCodePos])
{ // 解析指令动作
case '+': // 当前数据加1
++(*pCurrData);
break;
case '-': // 当前数据减1
--(*pCurrData);
break;
case '>': // 指针右移动,向前移动
++pCurrData;
break;
case '<': // 指针做移动,向后移动
--pCurrData;
break;
case '.': // 数据当前数据
putchar((int)(*pCurrData));
//printf("put:%hd\n",*p);
break;
case ',': // 从IO获取一个输入作为当前数据
*pCurrData = getchar();
break;
case '[': // 循环指令处理
if (*pCurrData)
{// 当前数据不为0,将指令指针压入栈中
g_Stack[g_StackLen++] = iCurrCodePos;
}
else
{ // 当前数据为0,找到与其匹配的']',然后开始执行']'后的指令
int j, k;
for (k = iCurrCodePos, j = 0; k < g_CodeLen; k++)
{
g_CodeSegment[k] == '[' && j++;
g_CodeSegment[k] == ']' && j--;
if (j == 0) // 找到匹配的']', 退出循环
break;
}
if (j == 0)
{ // for循环因找到匹配的']'而退出
iCurrCodePos = k;
}
else
{
fprintf(stderr, "%s:%d\n" ,__FILE__, __LINE__);
return 3;
}
} // end of if(*p)
break;
case ']': // 从栈里获得指令指针,跳转到对应的'['位置
iCurrCodePos = g_Stack[g_StackLen - 1]; // 取出栈顶保存的指令指针,作为当前指针
iCurrCodePos -= 1; // 指令指针后退一位,指向上一条指令。(此处减1的原因的下一条语句要加加—— ++iCurrCodePos;)
--g_StackLen; // 移动栈指针
break;
default:
break;
} // end of switch (g_CodeSegment[iCurrCodePos])
++iCurrCodePos;
} // end of while (iCurrCodePos < g_CodeLen)
return 0;
}

热点内容
手机f加密 发布:2024-05-19 03:28:47 浏览:225
用什么密码写日记 发布:2024-05-19 03:27:57 浏览:303
数据库access2003 发布:2024-05-19 02:49:39 浏览:620
碧蓝航线pc挂机脚本 发布:2024-05-19 02:30:03 浏览:589
脚本fir 发布:2024-05-19 02:28:57 浏览:261
阿里云独享服务器 发布:2024-05-19 02:23:54 浏览:253
织梦源码ga 发布:2024-05-19 02:23:20 浏览:571
java文件名后缀 发布:2024-05-19 02:14:39 浏览:956
快手点榜脚本 发布:2024-05-19 02:08:44 浏览:163
pythonforinkeys 发布:2024-05-19 01:55:44 浏览:793