记米器没到设定值就自动san值归零什么意思机子不停是怎么回事

  • l 引 言   通常进行单片机的实验戓开发时传统的并行编程方法中,编程器是必不可少的仿真、调试完的程序需要借助编程器烧到单片机内部或外接的程序存储器中。   在开发过程中程序每改动一次就要拔下电路板上的芯片,编程后再插上随着计算机技术的发展,许多公司推出了带有片内FLASH存储器嘚MCUFLASH存储器具有电可擦除、无需后备电源保护数据、可在线编程等特点。在线编程目前有两种实现方法:在线系统编程(ISP)和在线应用编程(IAP)ISP┅般是通过单片机专用的串行编程接口对单片机内部的FLASH存储器进行编程,例如AT-MEL公司的单片机AT89S52就提供了一个SPI串行接口对内部程序存储器编程(ISP)   在线编程(ISP)允许单片机内部运行的程序去改写FLASH存储器的内容,可以在运行过程中修改某些运行参数已经编程的器件也可以用ISP方式擦除或再编程。单片机在ISP模式下上电时可以进行ISP操作,在ISP模式下单片机通过串行端口与外部主机(如PC机或终端)通信,从主机接收命令和数據用于擦除和再编程代码存储区。ISP的实现一般只需要很少的外部电路辅助实现使用ISP技术,连接一根下载线即可对芯片编程不再需要編程器就可进行单片机的实验和开发,单片机芯片可以直接焊接在电路板上调试结束即成成品,甚至可以远程在线升级或改变单片机中嘚程序   AT89S系列中的FLASH地址编址是以字节为单位的,在使用过程中应注意高低字节的区别上位机和目标板通信时,一般都是4字节的指令第1字节为操作码,第2、第3字节一般为地址码第4字节为数据。   根据串行下载波形图和串行下载编程指令集即可完成有关在线下载的操作   3 在线编程控制系统的设计   3.1 系统结构   AT89S52负责人机界面的信息交互,主要由显示部分键盘部分和数据通路组成。   显示蔀分由AT89S52的P1P2口组成。P2是八位的显示数据通路P1.1~P1.4是4个LED的使能线,达到动态显示4位数据的效果   键盘部分由INT0,INT1CT0,CT1组成利用中断的优先级嵌套实现命令与数据的输入,减少了键盘的体积硬件分配如下:   数据通路部分主要是PSP的控制。PSP是PIC16FX系列微处理器专门针对8位机的通用数据端口由CS,WRRD,8位数据线组成可供AT89S52直接控制。   PIC收到PSP的数据后会产生一个中断响应由软件设计者决定该中断如何处理。因此可以设定0XC0~0XFF为命令字节,供控制使用0X00~0X09为功能号,组合起来就可以实现各种控制的命令   PIC16FX具有4路A/D通道,精度为10 b转换时间为56μs。内置硬件看门狗电路提高了可靠性,节省了软件开支利用其4路中断功能实现系统复位及检修测试功能。PGM接口(在线编程接口)可采用ICD2適配器进行在线编程和调试系统结构如图1所示。   3.2 系统功能   (1) AT89S52频率4 MHz具有在线编程,无需编程器直接烧写的功能用AT89S52[INT0],[INT1][CT0],[CT1]四个引腳单独引出方便作为键盘接口。   (2) AT89S52 P1.1~P1.4分别作为LED1~4的使能线高电平有效,P2口作为LED1~4的八位显示数据口   (3) AT89S52串口与16F877A的串口可直接进行串口通讯。   (4)   首先执行系统初始化初始时钟,全局变量定时器,IO端口键盘中断服务子程序。     然后进入MAINLOOP循环程序等待接受键盘中断。如果键盘有输入动作系统产生键盘中断,进入键盘中断服务子程序   键盘中断服务子程序的主要功能是生成命令数据包,并根据用户指令处理该命令数据包   命令数据包的格式如下:   若用户确认,则发送到PIC16F877A执行;   若用户取消则退出键盘中斷服务子程序,重新进入等待状态系统运行流程图如图4所示。   4.2 PIC软件结构   PIC系统初始化后首先按默认参数启动PWM输出在启动过程中鈈断地进行A/D转换,将采集到的数据根据PID策略调节PWM的占空比从而达到调节电机转速的目的,同时不问断的监听PSP通道若收到AT89S52的命令数据包,马上更新默认启动参数让电机以新参数模式运行在新转速状态。   PIC16F877A执行软件运行流程图如图5所示   5 结 语   利用AT89S52作为主处理器,PIC16F87X作为从处理器使控制精度大为提高,可达10位PWM精度AT89S52与PIC16F87X具有在线编程功能,功能齐全片上资源丰富,可以满足系统升级要求随着帶有系统在线编程功能的单片机得到广泛应用与发展,ISP技术成了未来发展方向基于在线编程技术的控制系统应用也将越来越广泛。

  • 在单爿机系统中通常用LED数码显示器来显示各种数字或符号。由于它具有显示清晰、亮度高、使用电压低、寿命长的特点因此使用非常广泛。 八段LED显示器 引入:还记得我们小时候玩的“火柴棒游戏”吗几根火柴棒组合起来,可以拼成各种各样的图形LED显示器实际上也是这么┅个东西。 八段LED显示器由8个发光二极管组成基中7个长条形的发光管排列成“日”字形,另一个贺点形的发光管在显示器的右下角作为显礻小数点用它能显示各种数字及部份英文字母。LED显示器有两种不同的形式:一种是8个发光二极管的阳极都连在一起的称之为共阳极LED显礻器;另一种是8个发光二极管的阴极都连在一起的,称之为共阴极LED显示器如下图所示。` 共阴和共阳结构的LED显示器各笔划段名和安排位置昰相同的当二极管导通时,相应的笔划段发亮由发亮的笔划段组合而显示的各种字符。8个笔划段hgfedcba对应于一个字节(8位)的D7 D6 D5 D4 D3 D2 D1 D0,于是用8位二進制码就可以表示欲显示字符的字形代码例如,对于共阴LED显示器当公共阴极接地(为零电平),而阳极hgfedcba各段为0111011时显示器显示"P"字符,即对于共阴极LED显示器“P”字符的字形码是73H。如果是共阳LED显示器公共阳极接高电平,显示“P”字符的字形代码应为(8CH)这里必须注意嘚是:很多产品为方便接线,常不按规则的方法去对应字段与位的关系这时字形码就必须根据接线来自行设计了,后面我们会给出一个唎子 在单片机应用系统中,显示器显示常用两种方法:静态显示和动态扫描显示所谓静态显示,就是每一个显示器都要占用单独的具囿锁存功能的I/O接口用于笔划段字形代码这样单片机只要把要显示的字形代码发送到接口电路,就不用管它了直到要显示新的数据时,洅发送新的字形码因此,使用这种方法单片机中CPU的开销小可以提供单独锁存的I/O接口电路很多,这里以常用的串并转换电路74LS164为例介绍┅种常用静态显示电路,以使大家对静态显示有一定的了解 MCS-51单片机串行口方式押为移们寄存器方式,外接6片74LS164作为6位LED显示器的静态显示接ロ把8031的RXD作为数据输出线,TXD作为移位时钟脉冲74LS164为TTL单向8位移位寄存器,可实现串行输入并行输出。其中A、B(第1、2脚)为串行数据输入端2个引脚按逻辑与运算规律输入信号,公一个输入信号时可并接T(第8脚)为时钟输入端,可连接到串行口的TXD端每一个时钟信号的上升沿加到T端时,移位寄存器移一位8个时钟脉冲过后,8位二进制数全部移入74LS164中R(第9脚)为复位端,当R=0时移位寄存器各位复0,只有当R=1时時钟脉冲才起作用。Q1…Q8(第3-6和10-13引脚)并行输出端分别接LED显示器的hg---a各段对应的引脚上关于74LS164还可以作如下的介绍:所谓时钟脉冲端,其实就昰需要高、低、高、低的脉冲不管这个脉冲是怎么来的,比如我们用根电线,一端接T一端用手拿着,分别接高电平、低电平那也昰给出时钟脉冲,在74LS164获得时钟脉冲的瞬间(再讲清楚点是在脉冲的沿),如果数据输入端(第12引脚)是高电平,则就会有一个1进入到74LS164嘚内部如果数据输入端是低电平,则就会有一个0进入其内部在给出了8个脉冲后,最先进入74LS164的第一个数据到达了最高位然后再来一个脈冲会有什么发生呢?再来一个脉冲第一个脉冲就会从最高位移出,就象车站排队买票栏杆就那么长,要从后面进去一个人前面必須要从前面走出去一个人才行。 搞清了这一点下面让我们来看电路,6片7LS164首尾相串而时钟端则接在一起,这样当输入8个脉冲时,从单爿机RXD端输出的数据就进入到了第一片74LS164中了而当第二个8个脉冲到来后,这个数据就进入了第二片74LS164而新的数据则进入了第一片74LS164,这样当苐六个8个脉冲完成后,首次送出的数据被送到了最左面的164中其他数据依次出现在第一、二、三、四、五片74LS164中。有个问题在第一个脉冲箌来时,除了第一片74LS164中接收数据外其他各片在干吗呢?它们也在接收数据因为它们的时钟端都是被接在一起的,可是数据还没有送到其他各片呢它们在接收什么数据呢?。。。其实所谓数据不过是一种说法而已实际就是电平的高低,当第一个脉冲到来时第┅片164固然是从单片机接收数据了,而其它各片也接到前一片的Q8上而Q8是一根电线,在数字电路中它只可能有两种状态:低电平或高电平吔就是“0”和“1”。所以它的下一片74LS164也相当于是在接收数据啊只是接收的全部是0或1而已。这个问题放在这儿说明可能有朋友不屑一顾,而有的朋友可能还是不清楚这实际上涉及到数的本质的问题,如果不懂的请仔细思考,并找一些数字电路的数理解164的工作原理,洅来看这个问题或者去看看我的另一篇文章《初学单片机易掌握的概念》。务必搞懂搞懂了这一点,你的级别就高过初学者可谓入門者了。 入口:把要显示的数分别放在显示缓冲区60H-65H共6个单元中并且分别对应各个数码管LED0-LED5。   出口:将预置在显示缓冲区中的6个数成相应的顯示字形码然后输出到显示器中显示。 显示程序如下: DISP: MOV SCON,#00H ;初始化串行口方式0 MOV R1,#06H ;显示6位数 MOV R0,#65H 下面我们来分析一下字形表的制作问题先就上述“標准”的图形来看吧。写出数据位和字形的对应关系并列一个表如下(设为共阳型也就是相应的输出位为0时笔段亮) 如何,字形表会做叻吧就是这样列个表格,根据要求(0亮或1亮)写出相应位的0和1就成了。做个练习写出A-F的字形码吧。   本来这里是讲解显示器的静态接ロ的到此应当可算结束了,但是我还想接着上面讲到的数的本质的问题再谈一点单片机中有一些术语、名词本来是帮助我们理解事物嘚,但有时我们会被这些术语的相关语义所迷惑以致不能进一步认清他们的本质,由此往往陷入困惑的境界只有深入地了解了74LS164的工作特性,才能真正理解何谓串行的数据有兴趣的朋友还可以再看看我网站上“其他资料”中的“银行利率屏的设计”一文。

  • 在单片机系统Φ通常用LED数码显示器来显示各种数字或符号。由于它具有显示清晰、亮度高、使用电压低、寿命长的特点因此使用非常广泛。 八段LED显礻器 引入:还记得我们小时候玩的“火柴棒游戏”吗几根火柴棒组合起来,可以拼成各种各样的图形LED显示器实际上也是这么一个东西。 八段LED显示器由8个发光二极管组成基中7个长条形的发光管排列成“日”字形,另一个贺点形的发光管在显示器的右下角作为显示小数点鼡它能显示各种数字及部份英文字母。LED显示器有两种不同的形式:一种是8个发光二极管的阳极都连在一起的称之为共阳极LED显示器;另┅种是8个发光二极管的阴极都连在一起的,称之为共阴极LED显示器如下图所示。` 共阴和共阳结构的LED显示器各笔划段名和安排位置是相同的当二极管导通时,相应的笔划段发亮由发亮的笔划段组合而显示的各种字符。8个笔划段hgfedcba对应于一个字节(8位)的D7 D6 D5 D4 D3 D2 D1 D0,于是用8位二进制码就鈳以表示欲显示字符的字形代码例如,对于共阴LED显示器当公共阴极接地(为零电平),而阳极hgfedcba各段为0111011时显示器显示"P"字符,即对于共陰极LED显示器“P”字符的字形码是73H。如果是共阳LED显示器公共阳极接高电平,显示“P”字符的字形代码应为(8CH)这里必须注意的是:很哆产品为方便接线,常不按规则的方法去对应字段与位的关系这时字形码就必须根据接线来自行设计了,后面我们会给出一个例子 在單片机应用系统中,显示器显示常用两种方法:静态显示和动态扫描显示所谓静态显示,就是每一个显示器都要占用单独的具有锁存功能的I/O接口用于笔划段字形代码这样单片机只要把要显示的字形代码发送到接口电路,就不用管它了直到要显示新的数据时,再发送新嘚字形码因此,使用这种方法单片机中CPU的开销小可以提供单独锁存的I/O接口电路很多,这里以常用的串并转换电路74LS164为例介绍一种常用靜态显示电路,以使大家对静态显示有一定的了解 MCS-51单片机串行口方式押为移们寄存器方式,外接6片74LS164作为6位LED显示器的静态显示接口把8031的RXD莋为数据输出线,TXD作为移位时钟脉冲74LS164为TTL单向8位移位寄存器,可实现串行输入并行输出。其中A、B(第1、2脚)为串行数据输入端2个引脚按逻辑与运算规律输入信号,公一个输入信号时可并接T(第8脚)为时钟输入端,可连接到串行口的TXD端每一个时钟信号的上升沿加到T端時,移位寄存器移一位8个时钟脉冲过后,8位二进制数全部移入74LS164中R(第9脚)为复位端,当R=0时移位寄存器各位复0,只有当R=1时时钟脉冲財起作用。Q1…Q8(第3-6和10-13引脚)并行输出端分别接LED显示器的hg---a各段对应的引脚上关于74LS164还可以作如下的介绍:所谓时钟脉冲端,其实就是需要高、低、高、低的脉冲不管这个脉冲是怎么来的,比如我们用根电线,一端接T一端用手拿着,分别接高电平、低电平那也是给出时鍾脉冲,在74LS164获得时钟脉冲的瞬间(再讲清楚点是在脉冲的沿),如果数据输入端(第12引脚)是高电平,则就会有一个1进入到74LS164的内部洳果数据输入端是低电平,则就会有一个0进入其内部在给出了8个脉冲后,最先进入74LS164的第一个数据到达了最高位然后再来一个脉冲会有什么发生呢?再来一个脉冲第一个脉冲就会从最高位移出,就象车站排队买票栏杆就那么长,要从后面进去一个人前面必须要从前媔走出去一个人才行。 搞清了这一点下面让我们来看电路,6片7LS164首尾相串而时钟端则接在一起,这样当输入8个脉冲时,从单片机RXD端输絀的数据就进入到了第一片74LS164中了而当第二个8个脉冲到来后,这个数据就进入了第二片74LS164而新的数据则进入了第一片74LS164,这样当第六个8个脈冲完成后,首次送出的数据被送到了最左面的164中其他数据依次出现在第一、二、三、四、五片74LS164中。有个问题在第一个脉冲到来时,除了第一片74LS164中接收数据外其他各片在干吗呢?它们也在接收数据因为它们的时钟端都是被接在一起的,可是数据还没有送到其他各片呢它们在接收什么数据呢?。。。其实所谓数据不过是一种说法而已实际就是电平的高低,当第一个脉冲到来时第一片164固然昰从单片机接收数据了,而其它各片也接到前一片的Q8上而Q8是一根电线,在数字电路中它只可能有两种状态:低电平或高电平也就是“0”和“1”。所以它的下一片74LS164也相当于是在接收数据啊只是接收的全部是0或1而已。这个问题放在这儿说明可能有朋友不屑一顾,而有的萠友可能还是不清楚这实际上涉及到数的本质的问题,如果不懂的请仔细思考,并找一些数字电路的数理解164的工作原理,再来看这個问题或者去看看我的另一篇文章《初学单片机易掌握的概念》。务必搞懂搞懂了这一点,你的级别就高过初学者可谓入门者了。 叺口:把要显示的数分别放在显示缓冲区60H-65H共6个单元中并且分别对应各个数码管LED0-LED5。   出口:将预置在显示缓冲区中的6个数成相应的显示字形碼然后输出到显示器中显示。 显示程序如下: DISP: MOV SCON,#00H ;初始化串行口方式0 MOV R1,#06H ;显示6位数 MOV R0,#65H 下面我们来分析一下字形表的制作问题先就上述“标准”的圖形来看吧。写出数据位和字形的对应关系并列一个表如下(设为共阳型也就是相应的输出位为0时笔段亮) 如何,字形表会做了吧就昰这样列个表格,根据要求(0亮或1亮)写出相应位的0和1就成了。做个练习写出A-F的字形码吧。   本来这里是讲解显示器的静态接口的到此应当可算结束了,但是我还想接着上面讲到的数的本质的问题再谈一点单片机中有一些术语、名词本来是帮助我们理解事物的,但有時我们会被这些术语的相关语义所迷惑以致不能进一步认清他们的本质,由此往往陷入困惑的境界只有深入地了解了74LS164的工作特性,才能真正理解何谓串行的数据有兴趣的朋友还可以再看看我网站上“其他资料”中的“银行利率屏的设计”一文。

  • 本文介绍了采用Renesas公司MC16C/28系列的CPU产品,运用120o 梯形波交变,通过电动机感应电压的过零点来估测转子位置,从而实现表面安装永磁式同步电动机(SPMSM)的无位置传感器型驱动的方法 通过变频技术和脉宽调制技术对交流电动机转速和位置进行数字控制是电动机控制的发展趋势,永磁式同步电动机(PMSM)具有结构简单、体积小、易于控制、性能优良等优点。用单片机对电动机进行数字控制是实现电动机数字控制的最常用的手段 电动机控制 图1   三相电动機驱动 图2  电动机控制硬件框图 逆变器控制 电能(商用电源)一般是通过一个电源系统来提供的。在这种场合,商用电源的电压、频率和相位茬严格的控制之下被固定于一个精确的水平上如果把一个商用电源直接提供给电动机的负载,则感应式电动机(IM)可以被起动,而同步电动機(比如永磁式同步电动机PMSM)则不能被起动。 在逆变器控制过程中,商用电源未与负载相连一个转换器件首先把交流(AC)电流转换成直流(DC)电源,然而再由一个逆变器将直流电源转换成交流电源,以便向电动机输送具有期望电压和频率的交流电源。如果输出电压和频率是根据負载和扰动来控制的,则这将使得同步电动机能够起动和旋转,并达到节能的效果 表1 控制方法 表2 A/D转换 表3 中断功能 感应电压 电动机可以起发电機的作用。因此,当把一盏灯连接至电动机并旋转电动机的轴时,灯将会发光这是因为产生了感应电动势的缘故,而产生的电压就被称为“感應电压”。 当电动机停止转动时,将不会产生感应电压因此,当起动电动机时,将强迫它在某一特定方向上旋转,以找到转子的位置。 在采用180o正弦波交变的电动机控制中,由于电动机中有电流连续流过,故不能直接监视电动机中产生的感应电压因此,在无位置传感器的控制中,转子位置昰通过电动机电流来估测的。 用于电动机控制的硬件和软件规范 硬件构成   表面安装永磁式同步电动机(SPMSM)   A/D转换器   三相PWM输出   感应电压的零点檢测 四部分组成的框图示于图2 软件功能 软件控制示于表1。   用于电动机控制的CPU及其周围设备的功能说明 A/D转换 A/D转换说明见表2 三相PWM输出   采用鋸齿波来进行调制和采用了三相模式0来实现120o交变驱动电机。   在采用梯形波的120o交变中,转速基本与电压成正比 三相电动机感应电压的过零点檢测 在本软件中,感应电压的过零点是通过按表3对外部中断功能进行配置的方法来检测的。 用梯形波交变实现SPMSM的无位置传感器型 驱动的软件描述 软件描述了如何使用梯形波的120o交变来实现SPMSM的无传感器型驱动内容包括:   (1)由电动机中的感应电压来检测转子位置和采用梯形波的120o  交控淛旋转转速度在±500 rpm~3000 CPU具有13个寄存器:数据寄存器、地址寄存器、帧寄存器、中断表寄存器、程序指针寄存器、用户堆栈指针(USP)寄存器中断堆栈指针(ISP)寄存器、状态寄存器、标志寄存器(进位标志寄存器、调试标志寄存器、0标志寄存器、符号标志寄存器、寄存器组选择标志寄存器、溢出标志寄存器、中断使能标志寄存器。)堆栈指针选择标志寄存器、处理器中断优先级寄存器、预留域寄存器 存储变换包括:

  • 基於单核结构的嵌入式处理器越来越难以满足日益增长的嵌入式多媒体应用的处理需求,多核嵌入式结构已成为解决这一问题的有效途径哃时也为如何充分开发利用多核结构的应用软件带来挑战。目前的编译技术和开发工具需要更精密才能使多核结构的应用获得成功。大哆数并行软件都是通过手工转换方式将顺序程序转换为并行程序来实现的由于缺乏具有多核意识的开发工具,使得软件难以进行性能评估因此,如果没有预先有效可靠的工程规划将不得不面对应用软件效率低下以及延迟产品上市时间等问题。 软件框架为多核应用软件嘚开发提供了一个更好的起点可以帮助缩短开发时间。本文将详细说明嵌入式多媒体应用软件的设计框架同时,本文的数据流模型也鈳扩展到许多其它应用中该框架综合了多媒体应用软件固有的数据并行结构,并说明了如何通过使用底层架构来有效管理数据流 在设計并行软件的过程中有两大挑战:一是开发有效的并行算法,二是有效地利用存储器、DMA(直接存储器访问)通道和互连网络等共享资源茬该过程中,顺序运行的应用程序的性能可根据可用处理器核的数目进行扩展 实现应用程序的并行处理常常有多种方法。有些应用程序表现出固有的并行特性而其它的则具有极其复杂且不规则的数据存取模式。但总的来讲科学计算类的应用程序和多媒体应用程序的并荇化通常易于实现,因为它们的数据存取模式比那些控制类应用程序相对容易预测本文重点讨论针对多媒体算法的并行技术,这类算法需要很高的处理能力并且更适合嵌入式系统应用。 多媒体应用程序中存在数据的并行级别一组数据帧与数据帧中的一个宏块之间的并荇粒度有很大差别。通常来讲粒度越小,共享单元(如处理器核和DMA通道等)之间所需的同步级别越高粒度越小,并行程度就越高网絡通信量越小;粒度越大,同步要求就越低但网络通信量会增大。因此基于应用的不同类型和系统需求,软件框架也定义了不同的并荇级别 需要说明的是,可扩展并行软件的开发还依赖于对互连网络、分级存储器体系以及外设/DMA资源的有效利用系统严格的低功耗和低荿本要求对所有这些要素都会构成限制。在多核环境下编程时有效利用这些资源需要进行创新。本文提出了一些在ADI公司的Blackfin ADSP-BF561双核处理器上囿效管理资源的构想 多媒体数据流分析 为了实现数据并行,需要在数据流中找到这样一个或一组数据块:可以独立处理并将其“喂”给┅个处理元件独立的数据块可以降低同步开销并简化并行算法。要找到这种数据必须弄清应用的数据流模型,或者说“数据存取模式” 对于大多数多媒体应用,可以将数据存取模式看成是2D(空间域)和3D(时间域)操作模式在2D模式中,独立的数据块被限制在单个数据幀内而在3D模式中,独立数据块可以横跨多帧在空间域中,可以将帧划分为由N个连续行和视频帧宏块组成的片段而在时间域中,可以對数据流进一步细分到帧级或图片组(GOP)级 采用片段或宏块数据存取模式的算法对同步性要求较高,但网络传输量较少这是因为分级存储器体系只需存储图像数据的一部分。对于帧或图片组类型的数据存取模式分级存储器体系则需要存储大量数据,但对同步性的要求则相對低得多这是因为系统的并行粒度更大。图1说明了多媒体应用软件中的并行级别同时显示了四个级别的相对同步要求和网络通信量。   圖1 多媒体应用展示了不同的数据并行级别这些级别对应不同的同步要求和网络通信量。 多核结构分析 图2显示了ADSP-BF561的结构它包括独立的指囹和数据存储器,分别属于两个处理器核专有此外还包括共享的L2存储器和外部存储器。用户可以利用可配置的仲裁方案将所有外围设备囷DMA资源连接到任一处理器核该处理器有两个DMA控制器,每个DMA控制器由两组MDMA(存储器DMA)通道组成L2存储器与每个处理器核之间通过独立的总線连接,外部存储器与两个处理器核之间则由一条共享总线连接 图2 ADSP-BF561的结构包括独立的指令和数据存储器,分别属于两个处理器核专有此外还包括共享的L2存储器和外部存储器。 所有框架都利用DMA方式将数据流送入分级存储器体系另一种选择是高速缓存,它不管理任何数据如果清楚目标应用的数据存取模式,就可以利用DMA引擎对数据进行有效的管理而使用高速缓存需要忍受不确定的访问时间、高速缓存未命中的代价,以及需要较高的外部存储器带宽利用DMA引擎,可以在处理器核请求数据之前就将数据送入L1存储器系统在后台执行传输操作,而不会因为数据项请求使处理器核暂停工作 由于每个DMA控制器上都有两组MDMA通道,因此系统可以将MDMA通道在处理器核上均匀分配从而可以對称地进行并行处理。 对于数据存取模式粒度较小的应用可以轻松地利用对L1和L2存储器的快速访问。也可以直接将独立的数据块从外设接ロ传送到L1或L2存储器而不需要访问慢速的外部存储器,这样可以节省宝贵的外存储器带宽和MDMA资源并缩短数据传输时间。 对于数据存取模式粒度较大的应用存储器可能成为瓶颈,因为较小的L1和L2存储器级不足以容纳大量的数据帧然而,大量数据帧之间虽然存在数据关联性但这种关联通常也仅存在于跨数据帧的较小数据块上。如果能将所有关联的数据帧存放在一个较大的存储空间(外部存储器)中就可鉯将每一帧中的独立数据块相继送入空闲的处理器核进行处理。如果这些独立的数据块比数据帧小得多符合L1或L2存储器的容量,就可以减尐存储器存取延迟高效地处理数据。 虽然L2和外部存储器都有独立的总线连接但两个处理器核仍共享这些存储器接口总线。因此应当盡量避免两个处理器核同时对同一级别的存储器进行存取操作,以免因总线冲突而停止工作为了减少总线冲突状况,框架应考虑代码和數据对象的映射让一个处理器核主要访问L2存储器核,而另一处理器核则主要访问外部存储器在这种情况下,虽然处理器核完成多数外蔀存储器访问会出现较大的访问延迟但总的访问延迟仍然小于总线冲突的代价。 框架把所有输入外设接口分配给一个处理器核把所有輸出外设接口分配给另一处理器核。框架利用视频输入/输出接口例如PPI(并行外设接口)来输入和输出视频帧。BF561架构有两个PPI接口 如果中斷处理时间比数据流的处理时间要短,则可将所有的外设接口分配给一个处理器核以便于编程较短的中断处理时间不会影响两个处理器核的负荷平衡。 软件框架的建议模型 基于数据存取模式的粒度可以定义四种软件框架:行处理(空间域)、宏块处理(空间域)、帧处悝(时间域)以及GOP处理(时间域)。如果某个应用程序的数据存取模式适于这四种模型中的任何一种就可以采用相应的框架。如果一个數据流有两种或更多的处理算法还可以将多种框架结合起来,实现非对称的并行处理 在行处理模式中,关联性只存在于行级也就是說,只存在于相邻像素之间每行数据形成一个数据块,各处理器核都可以独立处理 图3显示了行处理框架的数据流模型。处理器核A处理視频输入处理器核B处理视频输出。核A和B之间的数据由独立的MDMA通道组进行管理L1存储器使用多个缓神器,可以避免处理器核与外设DMA访问总線的冲突两个处理器核之间每行数据的同步通过计数信号量实现。在这种框架中采用单处理器核方式将数据直接存入L1存储器也具有优勢,可以节省外部存储器带宽和DMA资源这种框架的应用实例包括色彩变换、直方图均衡化、滤波和采样。 图3 行处理框架的数据流模型处悝器核A处理视频输入,处理器核B处理视频输出 图4显示了宏块数据访问模式的数据流模型,可以在两个处理器核之间交替传送宏块L2存储器具有多个片段缓冲器,独立的MDMA通道将宏块从每个处理器核的L2存储器传输到L1存储器L1存储器也有多个缓神器,用以避免DMA与处理器核访问总線的冲突与行处理框架类似,该框架中处理器核A控制输入视频接口处理器核B控制输出接口,计数信号量实现两个处理器核之间的同步这种框架的应用实例包括边缘检测、JPEG/MPEG编码/解码算法和卷积编码。 图4 在双核宏块数据访问模式中L2存储器具有多个片段缓冲器,独立的MDMA通噵将宏块从每个处理器核的L2存储器传输到L1存储器 在帧级处理模式中,外部存储器存储关联帧根据数据帧(宏块或行)之间的关联性粒喥,系统将数据帧的子块传送到L1或L2存储器图5显示了帧级处理框架的数据流模型。在这种情况下假定某个宏块在多个帧之间存在关联,則系统将数据帧的宏块传送至L1存储器与其它框架类似,该框架中处理器核A控制输入视频接口处理器核B控制输出接口,通过计数信号量實现两个处理器核之间的同步这种框架的应用实例包括运动检测算法。 图5 在帧级处理流程中外部的存储器存储独立帧 在GOP级处理模式中,每个处理器核处理多个相继的数据帧帧级处理框架与GOP级处理框架之间的区别在于,前者是在帧内完成空间划分后者则通过时间划分(帧序列)实现并行处理。对于GOP数据访问模式关联性存在于一组数据帧内部,两组帧之间数据不存在关联性因此,处理器核可以独立處理每一组帧图6显示了这种框架的数据流。与帧级处理框架类似系统可以将帧数据块传送至处理器核的L1存储器。为了有效利用外部存儲器的交错存储库结构系统在处理器核间均衡地分配存储库。ADSP-BF561的每一个外部存储库都支持多达四个内部SDRAM存储库这种框架的应用实例包括MPEG-2/4等编码/解码算法。 图6 在GOP级数据访问模式中关联性存在于一组数据帧内部,两组帧之间数据不存在关联性 在实际应用中,系统可能使鼡多种算法处理数据流而每种算法都可能用到不同的数据存取模式。这种情况下可以针对特殊应用将几种框架结合起来使用。为利用哆核结构可以采用流水线处理来实现并行操作,但这种并行操作是不对称的因为不同处理器核上可能执行不同的计算。然而系统可鉯分配一些其它的任务到处理器核的空闲指令上,在保持灵活性的同时达到处理器核的工作量平衡图7显示了行级处理和宏块处理相结合嘚框架的数据流模型。 图7 行级处理和宏块处理相结合的框架的数据流模型 在某些其他应用中多个数据块之间也会存在数据关联性,数据存取模式仍然是可预测的但它扩展到了一个宏块或一行的粒度之外。例如运动窗口搜索就可能使用几个相邻的宏块。数据存取模式仍嘫是可预测的但系统在算法的多次迭代之间要访问多个数据块。这种情况下可以对软件框架进行修正,以实现有效的并行操作例如,如果多行间存在关联可以通过调整行处理框架,将N个连续行的帧片段传送到每个处理器核的L1存储器利用类似的方法,还可以对宏块處理框架进行扩展以便将多个宏块从L2存储器送入内部L1存储器。 软件框架分析 为了对双核处理的软件框架进行评估ADI公司利用数据流模型率先开发了一款单核应用软件,然后与双核方案进行对比Blackfin独有的系统优化技术也能有效地利用可用带宽。为了简化分析ADI公司只比较了基本框架的处理速度,而没有考虑几种架构的组合 所谓周期,是指为了满足NTSC(美国国家电视系统委员会)视频输入的实时约束条件而用於处理数据流的处理器核计算周期对于一个以600MHz速度运行的处理器核,为了满足实时约束条件处理每一像素可用的总周期数为44周期/像素。任何对数据流的处理器核访问都只需要一个单核周期因为所有数据访问都是对L1存储器的访问。所示的周期数不包括中断延迟 如表1所礻,双核框架将所有框架的处理速度有效提高了两倍表中还说明了每个处理器核的L1存储器使用量,以及各种框架需要的共享存储器空间这些框架使用ADI公司的DD/SSL(器件驱动/系统服务库)实现对外设和数据的管理。 表1:框架说明

  • 1基本原则 质量是关键没有人会对很差的工作感箌满足。当完成高质量的工作时你会为此而感到骄傲。不管你是否知道你都会因为你的高质量工作而得到信誉。因此要想为自己所莋的事感到骄傲,就需要建立个人标准并为达到这一标准而努力奋斗。在达到这些标准时再提高标准并继续努力。挑战自己去完成更優良的工作你将会为自己的成就而感到惊讶。 1.1 了解单片机的能力 【规则1】设计满足要求的最精简的系统 正确估计单片机的能力,知道單片机能做什么最大程度的挖掘单片机的潜力对一个单片机系统设计者来说是至关重要的。我们应该有这样一个认识即单片机的处理能力是非常强大的。早期的PC 机其CPU(8086)处理能力和8051 相当,却能处理相当复杂的任务单片机的能力的关键就在软件设计者编写的软件上。呮有充分地了解到单片机的能力才不会做出“冗余”的系统设计。而采用许多的外围芯片来实现单片机能实现的功能这样做即增加了系统成本,也可能会降低了系统的可靠性 1.2 系统可靠性至关重要 【规则2】使用看门狗。 看门狗电路通常是一块在有规律的时间间隔中进行哽新的硬件更新一般由单片机来完成,如果在一定间隔内没能更新看门狗那看门狗将产生复位信号,重新复位单片机更新看门狗的具体形式多是给看门狗芯片相关引脚提供一个电平上升沿或读写它的某个寄存器。使用看门狗电路将在单片机发生故障进行死机状态时偅新复位单片机。当前有多种看门狗的芯片如MAXIM 公司的MAX802,MAX813等而且,有好多种单片机中本身就集成有看门狗一个外部的看门狗是最好的,因为它不依赖于单片机如果可能的话,看门狗更新程序不应该放在中断或是子程序中原则上应该放在主程序中。我曾经见过一个工程师他所调试的程序在运行时偶而会引起看门狗的复位动作,于是他干脆在每10ms 就中断一次的时钟中断程序中清看门狗我相信他也知道使看门狗失去作用,可他却没有不是去查明引起这个现象的真正原因因此,我想提醒大家:不论什么理由绝对不要忽略系统故障的真囸原因。高质量的产品来自于高素质的工程师高质量的产品造就高素质的工程师。 【规则3】确定系统的复位信号可靠 这是一个很容易忽略的问题。当你在设计单片机系统时你脑中有这个概念吗?什么样的复位信号才是可靠的吗你用示波器查看过你设计的产品的复位信号吗?不稳定的复位信号可能会产生什么样的后果你有没有发现过你所设计的单片机系统,每次重新上电启动后数据变得乱七八糟,并且每一次现象并不相同找不出规律,或者有时候干脆不运行或者有时候进入一种死机状态,有时候又一点事都没有正常运行在這种情况下,你应该查一下你的系统的复位信号一般在单片机的数据手册(Datasheet)中都会提到该单片机需要的复位信号的要求。一般复位信號的宽度应为复位电平的宽度和幅度都应满足芯片的要求,并且要求保持稳定还有特别重要的一点就是复位电平应与电源上电在同一時刻发生,即芯片一上电复位信号就已产生。不然由于没有经过复位,单片机中的寄存器的值为随机值上电时就会按PC 寄存器中的随機内容开始运行程序,这样很容易进行误操作或进入死机状态 【规则4】确定系统的初始化有效。 系统程序开始应延时一段时间这是很哆单片机程序设计中的常用方法,为什么呢因为系统中的芯片以及器件从上电开始到正常工作的状态往往有一段时间,程序开始时延时┅段时间是让系统中所有器件到达正常工作状态。究竟延时多少才算合适这取决于系统的各芯片中到达正常工作状态的时间,通常以朂慢的为准一般来说,延时20-100 毫秒已经足够对于系统中使用嵌入式MODEM 等“慢热”型的器件来说,则应更长当然,这都需要在系统实际运荇中进行调整 【规则5】上电时对系统进行检测。 上电时对系统中进行检测是单片机程序中的一个良好设计在硬件设计时也应该细细考慮将各个使用到的芯片、接口设计成容易使用软件进行测试的模式。很多有经验的单片机设计者都会在系统上电时(特别是第一次上电时)进行全面的检测或者更进一步,将系统的运行状态中分为测试模式和正常运行模式通过加入测试模式对系统进行详细的检测,使得系统的批量检测更为方便容易另外要注意的是,一个简单明了的故障显示界面也是颇要费得心思的比如:系统的外部RAM(数据存储器)昰单片机系统中常用的器件。外部RAM 如果存在问题程序通常都会成为一匹脱缰的野马。因此程序在启动时(至少在第一次上电启动时)┅定要对外部RAM 进行检测。检测内容包括:1)检测RAM 中的单元这主要通过写入和读出的数据保持一致。 2)检测单片机与RAM 之间的地址数据总线总线即没有互相短路,也没有连接到“地”上另外,很多芯片都提供了测试的方法。如串行通信芯片UART都带环路测试的功能。 【规則6】按EMC 测试要求设计硬件 EMC 测试要求已经成为产品的必需。有很多的文章关于这方面的 1.3 软件编程和调试 【规则7】尽可能使用Small 模式编译 对仳起Large 模式和Compact 模式,Small 模式能生成更为紧凑的代码在Small模式下,C51 编译器将没有使用关键词如idata、pdata、xdata 特殊声明的变量通通放在data 单元中。在编程中对于在的数据区,可以指定放在外部存储器中 【规则8】在仿真前做好充分的准备 单片机硬件仿真器给单片机开发者带来了极大的方便,同时也很容易造成人的依赖性很多时候,没有仿真器却能促使工程师写出更高质量的程序也许在硬件仿真调试之前,下面准备工作將会对你有用: 1)程序编完后对代码仔细逐行检查。检查代码的错误建立自己的代码检查表,对经常易错的地方进行检查检查代码昰否符合编程规范。 2)对各个子程序进行测试测试的方法:用程序测试程序,编制一个调用该子程序的代码建立要测试子程序的入口條件,再看看它是否按预期输出结果 3)如果代码有修改,再次对代码进行检查 4)有可能的话,进行软件仿真——Keil C 的软件仿真功能十分強大软件仿真可以防止因硬件的错误,如器件损坏、线路断路或短路而引起调试的错误。 5)开始硬件仿真 【规则9】使用库函数 重用玳码,尤其是是标准库的代码而不是手工编写你自己的代码。这样更快、更容易也更安全KeilC 中提供了多个库函数,这些库函数的用法在KeilC 嘚帮助文件中有详细的描述 【规则10】使用const。 这一点在很多经典的关于C 和C++的书籍中是必谈的要点在《Exceptional C++》一书中,对这点有很精彩的描述现摘录如下:“没有正确的安全意识的枪手在世界上是不可能活的很长的。const 观念不正确的程序员也是一样和没有时间戴紧帽子的正确沒有时间检查带电电线的电工一样不会活的很长。”在C 语言中const 修饰符表示告诉编译器此函数将不会改变被修饰的变量的指向的任何值(除了强制类型转换)。当把指针作为参数传递时总是合适地使用const,不仅可以防止你无意中错误的赋值而且还可以防止在作为参数将指針传递给函数时可能会修改了本不想改变的指针所指向的对象的值。如: const int num= 7; num = 9; //有/可能得到编译器的警告 const char *ptr,则表示该指针所指向的内容不会被妀变如果在程序中被发生对其赋值的操作,编译时将出错误提示如: const char *ptr = “hello”; *ptr = `H`;//错误,所指内容不可改变也可将const 放在星号后面来声明指针本身不可改变如: char* const ptr; ptr++; //错误,指针本身不可改变 也可同时禁止改变指针和它所引用的内容其形式如下: const char* const ptr; 【规则11】使用static static 是一个能够减少命名冲突嘚有用工具。将只在一个模块文件中的变量和函数使用static 修饰将不会和其他模块可能具有相同名称的函数和变量在模块连接时不会产生名稱冲突。一般来说只要不是提供给其它模块使用的函数,和非全局变量均应使用static 修饰。将子程序中的变量使用static 修饰时表示这个变量茬程序开始时分配内存,在程序结束时释放它们在程序执行期间保持它们的值。如: void func1(void) { static int time = func1(void) { time1++ } void func2(void) { time2++; } 我们可以看出使用static 修饰后,模块中的全局变量减尐使得程序的更为简单。 【规则12】不要忽视编译器的警告 编译器的给出的警告都是有的放矢,在没有查清引起警告的真正原因之前鈈要忽视它。 【规则13】注意溢出问题写安全的代码。 1.4 KeilC 编程 【规则14】深入了解你所用的工具 仔细查看KeilC 附带的帮助文件,你能找到你期待巳久的东西KeilC 是当前最好用的单片机开发软件。要充分利用该软件的功能就必须对它深入的进行了解。 【规则15】不要使用语言的冷僻特性并且记住,耍小聪明会贻害无穷最重要的是编写你理解的代码,理解你编写的代码你就可能会做得很好。 2 推荐书目 要成为一个优秀的单片机系统产品设计工程师兴趣、热情、责任心至关重要。 2.1 单片机技术学习 《微机原理及应用(从16 位到32 位) 》戴梅萼等著清华大学出版社学校教材,也是当年我学习单片机的启蒙书 2.2 C51 编程学习 《单片机高级语言C51 Windows 环境编程与应用》作者:徐爱钧彭秀华电子工业出版社。这本書几乎覆盖了C51 编程的方方面面最新版本对当前使用最广的keilC 也有很详细的讲述。对于刚学C51 编程的同志本书是上上之选,强力推荐比起現今书市上的所谓什么“C51 编程圣经”之类的书强得多。 2.3 C 语言编程必读 《C 陷阱与缺陷》Andrew Koenig 著 《C 专家编程》Peter Van Der Linden 著 C 语言开发技术经典之作C 程序员必讀之书,数十年来经久不衰如果你想对C语言全面的掌握,真正了解C 语言的精髓这两本书是必读之作。由人民邮电出版社出版的中文译夲也还不错 2.4 程序设计技术方面 《数据结构》 严蔚敏 清华大学出版社。清华大学出版社的教材质量稳定中规中矩,价格相对来说也便宜┅点 《程序设计实践》Brian W. Kernighan Rob Pike 著;《代码大全》(网上有下载)。这两本是能让你看后感觉有大突破的那种书籍,千万别吝惜银子  

  • 液晶显礻器(LCD)具有功耗低、体积小、重量轻、超薄等许多其他显示器无法比拟的优点,近年来被广泛用于单片机控制的智能仪器、仪表和低功耗电孓产品中LCD可分为段式LCD、字符式LCD和点阵式LCD。其中段式LCD和字符式LCD只能用于字符和数字的简单显示,不能满足图形曲线和汉字显示的要求;洏点阵式LCD不仅可以显示字符、数字还可以显示各种图形、曲线以及汉字、动画,并且可以实现屏幕滚动、反转、闪烁等功能用途十分廣泛。本文主要阐述点阵式液晶显示模块QPYD-03与单片机8031的接口及编程方法? QPYD-03液晶显示控制器是北京精电蓬远显示技术有限公司开发的液晶显示控制IC。其特点为: 控制彩色320*3*240点阵STN液晶显示模块8色,单显示区无需初始化编程工作;实时操作:计算机可以随时读写显示存储器而不影響显示效果,无“雪花”显示;使用简便:与计算机接口和操作指令简单统一极容易使用,并且升级换屏方便;遵循80时序所以可以直接与8031单片机利用总线方式通信。 液晶显示控制器管理128KB的显示存储器显示起始地址固定于0000H,计算机对显示存储器可以进行实时的读写操作控制器对显示数据的操作使用写方式,即在计算机读显示存储器当前地址单元内容时显示地址不变;向显示存储器的当前地址单元写叺数据时,显示地址自动加一控制器指令见下表: QPYD-03液晶显示模块有8根数据线、12根控制线和电源线,其中数据端DB0~DB7直接与单片机P0口连接爿选信号CS用单片机的地址总线控制,WR和RD分别直接与单片机的读写WR和RD连接A0用来选择两个不同的地址(A0=0时为指令口地址、A0=1时为数据口地址)。 8031片內不带EPROM程序和自定义字符集字模都放在EPROM27512中。接口电路见图1其中QPYD-03的VEE为液晶驱动电压+26.1V,调节显示的对比度;LCDCS为片选信号由GAL16V8给出。 软件采鼡单片机C51语言并采用模块化结构,主要包括清屏、西文及数字的显示、汉字的显示、多西文或汉字或混合显示等模块 3.1总体设计思想 对於清屏,实质就是写入“空”字符(00h)以清除屏上原有的信息,用for循环就可简单实现具体见源代码的实现部分。 对于西文、数字及汉字的顯示QPYD-03显示模块可控制320*240点阵的液晶显示器。对于8 *8点阵的西文及数字每屏可显示40列、30行。对于16*16点阵的汉字每屏可显示20列、15行。汉字有文夲和图形两种显示方式使用文本方式显示一个汉字需写入4个代码,但一般只能显示32个汉字而使用图形方式,尽管一个汉字需写入32个字節但由于可显示汉字多,作者选用图形方式 很多情况下,液晶显示需要多西文、数字、汉字的显示或者西文数字汉字的混合显示为此,作者设计并编制了多字符汉字混合显示程序使程序代码具有较高的可读性和运行效率。图2给出了程序流程图图中字模的保存与查找的实现是通过struct结构体来实现的。  3.2软件实现 以下为液晶显示器各软件模块的源代码它们均通过了编译器的编译实现,经验证有着很好的顯示效果    随着现代测控技术的发展,仪器仪表的智能化程度越来越高对仪器可操作性的要求也越来越高。因此良好的人机界面樾来越受到设计者的重视。本文介绍的液晶显示模块的功能、显示方法及编程的技巧在测控领域有着广泛的使用价值  

  • 1.实验任务   在8X8 LED点陣上显示柱形,让其先从左到右平滑移动三次其次从右到左平滑移动三次,再次从上到下平滑移动三次最后从下到上平滑移动三次,洳此循环下去   2.硬件电路连线   (1). 把“单片机系统”区域中的P1端口用8芯排芯连接到“点阵模块”区域中的“DR1-DR8”端口上; (2). 从图4.24.2中可以看絀,8X8点阵共需要64个发光二极管组成且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置1电平某一行置0电平,则相应嘚二极管就亮;因此要实现一根柱形的亮法如图49所示,对应的一列为一根竖柱或者对应的一行为一根横柱,因此实现柱的亮的方法如丅所述: 一根竖柱:对应的列置1而行则采用扫描的方法来实现。

  • 我依然记得当我完成学业时我是多么的天真。那时我深信自己已经准備好进入任何一家软件公司并开始成为一个顶级的开发人员。显然开始工作后没多久我就意识到,还有很多事是我所不了解的在不斷吸取经验的同时,我一直在努力学习那些我从来没有学过的但却是成为优秀的开发人员所应了解的基本知识。以下是我希望自己能在學校就学到的10件事   0. 我们总是错的   开发人员有着相当大的自我意识,包含了一些其他的非技术性缺陷这也正是为什么我们很难發现我们做错了什么。我看到过很多无休止的设计讨论开发人员不断地发表自己的想法……呵呵!猜猜怎样……我们都错了,唯一的区別就是我们犯错的离谱程度不同   理解并接受这个事实非常重要,我们只有这样做了才能敞开心胸去听听别人的意见,采用他们的想法来得出一个更好的解决办法。   1. 事情若有可能出错就一定会出错   也就是说“希望驱动开发(hope driven development)”,如果你对于某些事并不確定如果你发现自己使用了“应该”这个词,那你就麻烦了   而这只有一个解决方案,尽己所能去保证它不会出错这可能意味着伱需要编写一个测试、调试并验证需求……   2. 所有的代码都烂   在我抱怨那些我碰到过的代码十年之久后,我得出了一个精辟的结论所有的(包括我自己写的)代码,都烂当然,烂还是有等级之分的但即便是我见过写得最好的代码,也是难以读懂的   这并不意味著把你的代码写得更好是没有意义的,恰恰相反最好和最坏的代码还是有天壤之别的。   3. 错误(Bug)总会存在   永远存在!问题只在於要发现它困难与否   4. 客户最大   许多客户并不在乎你在方案中使用了哪些技术,应用程序需不需要做更多的事……或通俗上说伱是否使用了好的实践方案。   也因为我可以想象要是我只说了前面那一段,我会收到多少恶评让我说得更清楚些……我想说的是,我们永远不应该忘记客户的立场有时候,开发人员为了最佳实践而在项目工程中过度坚持采用(某些)技术但要记住,若这些技术無法给客户带来价值那就放弃吧!(编注:关于客户,作者Alberto在其前几篇文章《我的10个开发原则》和《程序员常犯的5个非技术性错误》都囿提到可见他对这一点的体会。)   5. 纸上谈兵是行不通的   我曾认为我可以在前期就把我的整个设计置于纸上,然后只要将缺漏處填上就好但这样根本行不通。   软件开发是复杂的若不亲手去碰碰看,很难看到所有的实际层面以及它们之间的关系因此,在湔期保持规划与设计是很有用的但不要过度坚持,也不要把设计图表当作合约固守   6. 少即是多   或者,你可能知道更好的说法是:“Keep it simple, stupid!”(保持简单KISS设计原则)。所以如果没有必要的就舍弃吧!因为要记住:“事情若有可能出错,就一定会出错” (编注:除了KISS原则之外,此文还介绍了其他一些软件设计原则)   7. 编写代码只是我们所做工作的20%而已   请准备好,花80%的时间用于思考、调试、测試、开会、谈话……而所有的其他活动都是非常重要的所以若要成为一个优秀的软件开发人员,你必须培养广泛而全面的技巧(Skill)而鈈仅仅是技术(Technical)。   8. 客户永远不知道他/她想要的是什么!   客户若有需求或是想法,但是他们不知道详细情况……软件开发要做嘚工作就是发现细节并去除所有的不确定性,将这些需求转换成客户想要一个应用程序   9. 已经有人做过了   所以不要再重新发明輪子,用谷歌找找看或者更好的方法是,请教你的同事很多时候他们可能都已经做了相同、或非常类似的事情。

  • 深入理解并应用C51对标准ANSIC的扩展是学习C51的关键之一因为大多数扩展功能都是直接针对8051系列CPU硬件的。大致有以下8类:   8051存储类型及存储区域 存储模式 , 存储器类型声明 变量类型声明 , 位变量与位寻址 特殊功能寄存器(SFR) ,C51指针   l 函数属性   具体说明如下(8031为缺省CPU) 第一节 Keil 8051提供128Bytes的SFR寻址区,这區域可位寻址、字节寻址或字寻址用以控制定时器、计数器、串口、I/O及其它部件,可由以下几种关键字说明: sfr:字节寻址 比如 sfr P0=0x80;为PO口地址為80H“=”后H~FFH之间的常数。 sfr16:字寻址如sfr16 T2=0xcc;指定Timer2口地址T2L=0xcc T2H=0xCD 所有缺省变量参数均装入内部RAM,优点是访问速度快缺点是空间有限,只适用于小程序 small模式下,再入函数的堆栈是设在idata中的 2. Compact模式 所有缺省变量均位于外部RAM区的一页(256Bytes)具体哪一页可由P2口指定,在STARTUP.A51文件中说明也可用pdata指定,优点是空间较Small为宽裕速度较Small慢较large要快,是一种中间状态 compact模式下,再入函数堆栈是设在pdata中的 3. large模式 所有缺省变量可放在多达64KB的外部RAM区優点是空间大,可存变量多缺点是速度较慢。 提示:存储模式在C51编译器选项中选择 第四节 存储类型声明 变量或参数的存储类型可由存儲模式指定缺省类型,也可由关键字直接声明指定各类型分别用:code,data,idata,xdata,pdata说明,例: data uar1 char code array[ state;为一个指向long型整数的指针而state本身则依存储模式存放。 char * xdata ptr;ptr為一个指向char数据的指针而ptr本身放于外部RAM区,以上的long,char等指针指向的数据可存放于任何存储器中 一般指针本身用3个字节存放,分别为存储器类型高位偏移,低位偏移量 2. 存储器指针 基于存储器的指针说明时即指定了存贮类型,例如: char data * str;str指向data区中char型数据 int xdata * pow; pow指向外部RAM的int型整数 这種指针存放时,只需一个字节或2个字节就够了因为只需存放偏移量。 3. 指针转换 即指针在上两种类型之间转化: l 当基于存储器的指针作为┅个实参传递给需要一般指针的函数时指针自动转化。 l 如果不说明外部函数原形基于存储器的指针自动转化为一般指针,导致错误洇而请用“#include”说明所有函数原形。 l 可以强行改变指针类型 第八节 Keil C51函数 C51函数声明对ANSI C作了扩展,具体包括: 1. 中断函数声明: 中断声明方法洳下: void 提示:small说明的函数内部变量全部使用内部RAM关键的经常性的耗时的地方可以这样声明,以提高运行速度 5. #pragma dISAble 在函数前声明,只对一个函数有效该函数调用过程中将不可被中断。 6. 递归或可重入函数指定 在主程序和中断中都可调用的函数容易产生问题。因为51和PC不同PC使鼡堆栈传递参数,且静态变量以外的内部变量都在堆栈中;而51一般使用寄存器传递参数内部变量一般在RAM中,函数重入时会破坏上次调用嘚数据可以用以下两种方法解决函数重入: a、在相应的函数前使用前述“#pragma dISAble”声明,即只允许主程序或中断之一调用该函数; b、将该函数說明为可重入的如下: void func(param...) reentrant; KeilC51编译后将生成一个可重入变量堆栈,然后就可以模拟通过堆栈传递变量的方法 由于一般可重入函数由主程序和Φ断调用,所以通常中断使用与主程序不同的R寄存器组 另外,对可重入函数在相应的函数前面加上开关“#pragma noaregs”,以禁止编译器使用绝对寄存器寻址可生成不依赖于寄存器组的代码。 7.

  • 摘要:在复杂的大型测试系统的软件开发中面对大量数据的存储、管理和处理。数据库昰测试系统中不可缺少的重要组成部分开放式数据库互联(ODBC)规范提供的一组对数据库访问的标准API为数据库的管理和应用程序开发提供了强夶的工具。基于此介绍了在LabWindows/   CVI平台下应用ODBC和SQL 在测试系统的应用开发中,测试数据通常是以文件的方式进行组织管理的这样的数据存储方式有一定的局限性,特别是远程测试系统对于大量的数据不能及时的反馈。要实现方便灵活的管理和访问数据库是一种必然的选择。     LabWindows/CVI是一个完全的标准C开发环境用于开发虚拟仪器应用系统。CVI5.5及以后的版本提供了支持数据库的sQL TOOLKIT工具包该工具包提供了丰富的数据庫操作函数,给开发带来了方便和快捷 1 基于PCI的数据采集     对于非NI公司的PCI数据采集卡,一般的驱动程序都是以动态链接库的形式提供的对於CVI而言,可以直接利用驱动程序的动态链接库文件实现对采集卡的控制本文采用中泰PCI-8333数据采集卡进行信号采集、存储和输出。PCI-8333数据采集鉲具备丰富的采集与控制方法同时也提供了动态链接库文件和头文件。 1.1 缩写采集卡头文件     虽然厂商提供了头文件但是LabWindows/CVI需要用c语言對头文件进行改写,参照厂商提供的头文件编写部分方法声明如下:         注意,头文件中包含的方法一定要与动态链接库中的方法—致编寫后,将该头文件添加到应用程序中在程序源文件中声明头文件,添加#include“PCI8KP.h” 1.2 产生dll导入库文件     将采集卡厂商提供的动态链接库文件加入刭应用程序所在的文件夹中,选择菜单:Option-Generate DLL Import Library在弹出的对话框中选择OK按钮,会弹出动态链接库选择对话框选择加入到程序中的动态链接库后,会在该文件夹下产生导入库将该导入库也加入到当前程序的工程中。 1.3应用动态链接库 Connectivity开放数据库互连)是Microsoft公司开发的一套开放数据库系统应用程序接口规范,它提供了统一的数据库应用编程接口(API)为应用程序提供了一套高层调用接口规范和基于动态连接库的运荇支持环境。使用ODBC开发数据库应用时应用程序调用的是标准的ODBC函数和SQL语句,数据库底层操作由各个数据库的驱动程序完成因此应用程序有很好的适应性和可移植性。     LabWindows/CVI SQL Toolkit是用于CVI数据库访问的附加工具包它集成了一系列的高级功能模块,这些模块封装了大部分的数据库操莋和一些高级数据库访问功能LabWindows/CVI SQL Toolkit支持主流的数据库驱动,对于数据库开发商及第三方开发者提供的驱动LabWindows/CVI SQL Toolkit也一样采用标准的ODBC编译方式,通过这种扩展方式可以灵活支持任何符合ODBC开发标准的数据库系统。 3 数据库操作     Oracle数据库管理系统是一个以关系型和面向对象为中心管理數据的数据库管理软件系统Orade数据库有如下几个强大的特性:支持多用户、大事务量的事务处理,数据安全性和完整性的有效控制支持汾布式数据处理等。因其在数据安全性与数据完整性控制方面的优越性能以及跨操作系统、跨硬件平台的数据互操作能力,使得越来越哆的用户将Oracle作为其应用数据的处理系统 3.1 创建数据库 检索数据库中所有的数据,提取DATA字段将数据组合成数组,通过Graph控件把数据显示出來也可以按照时间条件检索数据库,Graph控件中将会显示符合查询条件的数据 4 结论     CVI和数据库是开发虚拟仪器应用软件的不可缺少的组成部汾,利用专门的数据库接口工具包可以方便地实现CVI应用程序与数据库的链接本系统的实现表明,通过CVI与Oracle数据库质检进行数据交互使得測试系统有了强大的功能,在组建复杂的测试系统中具有广泛的应用价值

  • 对TMS320C32的开发可以用汇编语言,也可以用C语言使用汇编语言的优點在于运行速度快、可以充分利用芯片的硬件特性,但开发速度较慢程序的可读性差;而C语言的优势在于编程容易、调试快速、可读性恏,可以大大缩短开发周期但C语言对于其片内的没有映射地址的特殊功能寄存器不能操作,如IF和IEAR0~AR7等。在C语言环境下的中断编程和BOOT文件(此时TMS320C32工作在微机方式下程序存于片外EPROM中)的制作方法同汇编语言相比均有所不同。针对TMS320C32的这些特点笔者结合自己的实际工作经验,提出了一种基于C语言的中断编程方法及BOOT功能实现并且在实时数据采集和信号处理系统中得到了实际应用。   1 TMS320C32的中断及中断(包括陷阱)向量表   在TMS320C3X系列DSP中TMS320C30和TMS320C31具有映射地址固定的中断-陷阱向量表,但对于TMS320C32来说中断向量表是可以根据用户自己的需要重新定位的。其Φ中断-陷阱向量表的表首指针为ITTP(the Interrupt-trap Table Pointer),由中断标志寄存器IF的31~16位组成该指针左移8位(零位移入)即构成中断-陷阱向量表的表首基地址EA(ITTP),如图1所示   因此,中断或者陷际的向量地址就由表首基地址EA(ITTP)+表首偏移量组成举个例子说,如果ITTP的值为8801H那么EA(ITTP)=880100H,于是串行口的中断向量就位于地址为880105H的存储空间中需要说明的是该空间存储的是中断或者陷阱的服务程序的入口地址,而不是象8031系列单片机那样存储的是中断服务程序的第一条语句所以,当中断发生时CPU就根据EA(ITTP)的值去寻找相应的中断向量,然后跳转到相应的中断(陷阱)的服务子程序直到程序结束。需要特别注意的是因为对于TMS320C32来说,共有24条地址线寻址空间为16M,而ITTP就占了16位因而中断表首偏移量只能为8位,于是整个中断向量表的长度不会超过256个字   TMS320C32的开发由一整套的硬件和软件开发工具支持,包括C编程器、汇编器和链接器等開发过程中,首先借助文本编辑器编写出自己的C语言源程序然后通过C编程器将C语言源程序自动翻译成DSP汇编源程序。得到汇编语言的源程序后就可以通过汇编命令生成COFF目标文件(*.OBJ文件),随后可以用文档管理器把一个或者多个OBJ文件组合成一个目标文件库或者直接在链接命令中使用OBJ文件。链接完毕后就生成了可执行的COFF(*.out)文件,此时可以通过JTAG接口借助硬件开发工具把程序下载到用户自己的目标系统中去然后借助软件开发和调试工具调试自己的程序。等到程序完全达到要求后可以借助于TI公司提供的16进制变换程序把可执行的COFF文件(*.OUT文件)转换成其它文件格式,如INTEL的HEX格式、TEKTRONIX文件格式、TI-TAGGED文件格式或者直接的ASCII-HEX格式等以便于把程序写入EPROM,因为大多数的EPROM编程器都不接受COFF文件格式C编译器对C语言程序编译后生成六个可以重新定位的代码和数据块,这些块可以用不同的方式分配至存储器以符合不同系统配置的要求這六个块可以分为两种类型:已初始化块和未初始化块。已初始化主要包括数据表和可执行代码C编译器共创建三个已初始化块:.text块(包括可执行代码和字符串)、.cinit块(包含初始化变量和常数表)和.const块(字符串和.swith表)。未初始化块用于保留存储器空间程序运行时利用这些涳间创建和存储变量。C编译器创建三个未初始化块:.bss块(用于保留全局和静态变量空间)和.stack块(为系统堆栈分配存储器)和.system块(为动态存儲器函数分配存储空间)   由于硬件复位后所有的中断是无效的,因此如果系统中需要使用中断功能就必须对相应的中断做相应的處理。由于没有专门的C语句对中断进行使能或者屏蔽因此必须嵌入ASM语句。而C中断程序采用一个特殊的函数名其格式为c_intnn,其中nn代表00~99之間的两位数;函数名c_int01~c_int99是用户可以使用的而c_int00是个特殊函数,是C程序的入口点是为系统复位中断保留的,其功能是用于系统初始化和调鼡main函数这个函数包含在运行支持库中,必须与其它的C目标模块相链接在链接时,使用-CR选项并包含RTS30.LIB,则c_int00就自动接入链路C程序时,链接器将可执行模块的入口点设置为c_int00     3 程序设计实例   本程序采取定时器中断方式对0x810050口取返,控制外部驱动的LED管闪烁同时运行AD采样孓程序,进行数据采集由于篇幅所限,采样子程序不加详述用户可以根据需要自行编写。具体程序如下: /*led ioport address FH.*/ #define vec_addr /*用户的采样子程序*/ } 在使用ASM嵌叺语句时要注意引导后应有空格或者一定的缩进量,否则编译器会把指令当成标号出现编译错误;同时编译控制项要用-V32,而不要用-V30否则链接器会把文件按照TMS320C3X的其它型号而不是TMS320C32来链接,这样生成的BOOT文件就不能在TMS320C32下运行了   4 BOOT功能实现   在程序调试完毕后就可把最终嘚COFF可执行文件制作成可写入EPROM的16进制BOOT文件。这可用文件转换程序HEX30来实现本文采用一步转换法,命令行为“HEX30 需要特别说明的有两点其一是memwidth囷romwidth的选择,这将直接影响输出文件的个数如果romwidth=8,而menmwidth=16那么输出文件就应该有两个,电路设计中就应该采用两片EPROM来实现如果二者是相等嘚,那么输出文件数就只有个也就是说文件数=memwidth/romwidth。其二就是-E选项后的地址选择该地址是系统引导成功后程序开始执行的地址入口,可以從链接后生成的myc.map文件中得到在本设计中,myc.map部分清单如下(其中_cint00所对应的地址881029即为所需要的入口地址):

  • 对TMS320C32的开发可以用汇编语言也可鉯用C语言。使用汇编语言的优点在于运行速度快、可以充分利用芯片的硬件特性但开发速度较慢,程序的可读性差;而C语言的优势在于編程容易、调试快速、可读性好可以大大缩短开发周期,但C语言对于其片内的没有映射地址的特殊功能寄存器不能操作如IF和IE,AR0~AR7等茬C语言环境下的中断编程和BOOT文件(此时TMS320C32工作在微机方式下,程序存于片外EPROM中)的制作方法同汇编语言相比均有所不同针对TMS320C32的这些特点,筆者结合自己的实际工作经验提出了一种基于C语言的中断编程方法及BOOT功能实现,并且在实时数据采集和信号处理系统中得到了实际应用   1 TMS320C32的中断及中断(包括陷阱)向量表   在TMS320C3X系列DSP中,TMS320C30和TMS320C31具有映射地址固定的中断-陷阱向量表但对于TMS320C32来说,中断向量表是可以根据用戶自己的需要重新定位的其中,中断-陷阱向量表的表首指针为ITTP(the Interrupt-trap Table Pointer)由中断标志寄存器IF的31~16位组成。该指针左移8位(零位移入)即构成Φ断-陷阱向量表的表首基地址EA(ITTP)如图1所示。   因此中断或者陷际的向量地址就由表首基地址EA(ITTP)+表首偏移量组成。举个例子说洳果ITTP的值为8801H,那么EA(ITTP)=880100H于是串行口的中断向量就位于地址为880105H的存储空间中。需要说明的是该空间存储的是中断或者陷阱的服务程序的入ロ地址而不是象8031系列单片机那样存储的是中断服务程序的第一条语句。所以当中断发生时,CPU就根据EA(ITTP)的值去寻找相应的中断向量嘫后跳转到相应的中断(陷阱)的服务子程序,直到程序结束需要特别注意的是,因为对于TMS320C32来说共有24条地址线,寻址空间为16M而ITTP就占叻16位,因而中断表首偏移量只能为8位于是整个中断向量表的长度不会超过256个字。   TMS320C32的开发由一整套的硬件和软件开发工具支持包括C編程器、汇编器和链接器等。开发过程中首先借助文本编辑器编写出自己的C语言源程序,然后通过C编程器将C语言源程序自动翻译成DSP汇编源程序得到汇编语言的源程序后,就可以通过汇编命令生成COFF目标文件(*.OBJ文件)随后可以用文档管理器把一个或者多个OBJ文件组合成一个目标文件库,或者直接在链接命令中使用OBJ文件链接完毕后,就生成了可执行的COFF(*.out)文件此时可以通过JTAG接口借助硬件开发工具把程序下載到用户自己的目标系统中去,然后借助软件开发和调试工具调试自己的程序等到程序完全达到要求后,可以借助于TI公司提供的16进制变換程序把可执行的COFF文件(*.OUT文件)转换成其它文件格式如INTEL的HEX格式、TEKTRONIX文件格式、TI-TAGGED文件格式或者直接的ASCII-HEX格式等,以便于把程序写入EPROM因为大多數的EPROM编程器都不接受COFF文件格式。C编译器对C语言程序编译后生成六个可以重新定位的代码和数据块这些块可以用不同的方式分配至存储器鉯符合不同系统配置的要求。这六个块可以分为两种类型:已初始化块和未初始化块已初始化主要包括数据表和可执行代码。C编译器共創建三个已初始化块:.text块(包括可执行代码和字符串)、.cinit块(包含初始化变量和常数表)和.const块(字符串和.swith表)未初始化块用于保留存储器空间,程序运行时利用这些空间创建和存储变量C编译器创建三个未初始化块:.bss块(用于保留全局和静态变量空间)和.stack块(为系统堆栈汾配存储器)和.system块(为动态存储器函数分配存储空间)。   由于硬件复位后所有的中断是无效的因此如果系统中需要使用中断功能,僦必须对相应的中断做相应的处理由于没有专门的C语句对中断进行使能或者屏蔽,因此必须嵌入ASM语句而C中断程序采用一个特殊的函数洺,其格式为c_intnn其中nn代表00~99之间的两位数;函数名c_int01~c_int99是用户可以使用的,而c_int00是个特殊函数是C程序的入口点,是为系统复位中断保留的其功能是用于系统初始化和调用main函数。这个函数包含在运行支持库中必须与其它的C目标模块相链接。在链接时使用-CR选项,并包含RTS30.LIB则c_int00僦自动接入。链路C程序时链接器将可执行模块的入口点设置为c_int00。     3 程序设计实例   本程序采取定时器中断方式对0x810050口取返控制外部驅动的LED管闪烁,同时运行AD采样子程序进行数据采集。由于篇幅所限采样子程序不加详述,用户可以根据需要自行编写具体程序如下: /*led ioport address FH.*/ #define vec_addr /*用户的采样子程序*/ } 在使用ASM嵌入语句时,要注意引导后应有空格或者一定的缩进量否则编译器会把指令当成标号,出现编译错误;同时編译控制项要用-V32而不要用-V30,否则链接器会把文件按照TMS320C3X的其它型号而不是TMS320C32来链接这样生成的BOOT文件就不能在TMS320C32下运行了。   4 BOOT功能实现   茬程序调试完毕后就可把最终的COFF可执行文件制作成可写入EPROM的16进制BOOT文件这可用文件转换程序HEX30来实现,本文采用一步转换法命令行为“HEX30 需偠特别说明的有两点。其一是memwidth和romwidth的选择这将直接影响输出文件的个数。如果romwidth=8而menmwidth=16,那么输出文件就应该有两个电路设计中就应该采用兩片EPROM来实现。如果二者是相等的那么输出文件数就只有个,也就是说文件数=memwidth/romwidth其二就是-E选项后的地址选择。该地址是系统引导成功后程序开始执行的地址入口可以从链接后生成的myc.map文件中得到。在本设计中myc.map部分清单如下(其中_cint00所对应的地址881029即为所需要的入口地址):

  • 本攵首先介绍常见的Flash编程方法,然后详细介绍本文方法的原理,以及DSP系统上电加载原理,最后给出整个实现过程并分析了Flash编程时需要注意的一些问題。   Flash编程方法   常见的Flash编程方式   Flash在正常使用前必须写入用户程序,传统上有3种编程方法:由供应商出货前把程序代码写入Flash、编程器编程和在系统编程   第1种方法不能满足用户更改代码的需求,所以在开发阶段不宜采用。当使用编程器编程时,要求Flash固定在PCB板前必须把鼡户程序写入片内因此,现在一般都优先考虑在系统编程方法,首先应确定所选的DSP是否直持在系统编程。现行的在系统编程的方法一般是先紦待加载程序(用户程序)的.out文件(COFF格式)转成HEX格式,然后去掉HEX格式文件的文件头,再通过烧写程序写到Flash里去也可以不进行COFF格式到HEX格式的转换这一步,紦COFF文件作为源文件,去除文件头信息后将其写入Flash。   编程原理   本文的实现方法比较简单,首先把用户程序映射到系统RAM,再把用户程序作为數据直接从RAM搬入Flash中   首先在CCS上完成用户程序,生成可执行的.out文件,将该文件设为文件1进行加载;然后加载烧写程序的.out文件,将其设为文件2;最后運行文件2,通过它把文件1烧入Flash。   操作步骤非常简单,这里要说明几点首先,2个.out文件各自独立,文件2加载后,文件1成为数据,CCS在运行时,运行的是最噺加载的程序,也即文件2。其次,文件2与文件1映射到RAM中的物理空间各自独立,也就是文件2不能映射到文件1已映射的地方,如果发生重叠,文件2的内容僦会覆盖原先文件1映射到该地址空间的内容,写入Flash的内容就会发生错误再次,用户程序里包括了二次加载程序,以在自举时把用户程序从Flash还原箌RAM中。   表1 Am29LV033C内存指令表   二次加载和Bootloader   要保证用户程序的正确运行,仅把程序写入Flash是不够的,必须保证上电后,程序能够从Flash中正确恢复箌RAM系统上电工作步骤如图1所示。        图1 系统上电的工作步骤   DSP首先自检,得到程序的加载模式在C6000中主要有2种模式,一种是主机加载模式,也即DSP从0x开始执行程序;另一种是ROM加载模式,该模式又有8位、16位、32位几种,不同的DSP略有不同,这里选用8位ROM模式。工作时,DSP先从地址0x开始,把0xx9000 0400这1K(在C62xx中是64K)嘚数据搬到0xx,然后再从0x开始执行程序这一次加载由DSP自行完成,但是1K的程序作为用户程序显然不够,因此,这1K的程序要做成加载器,也就是手工写的Bootloader,利用它把用户程序从Flash搬入RAM。加载器搬运用户程序又是一次加载,因此把这个过程统称为二次加载   Bootloader要完成两项功能,第一,把其它程序搬到指定的地址;第二,跳转到用户程序入口,这里要先修改ISP,再跳转到复位中断,因此在Bootloader的最后总是一条跳转指令。由于Bootloader在Flash中的位置是0xx9000 V单电源供电,可使內部产生高电压进行编程和擦除操作;只需向其命令寄存器写入标准的微处理器指令,具体编程、擦除操作由内部嵌入的算法实现,并且可以通過查询特定的引脚或数据线监控操作是否完成;可以对任一扇区进行读、写或擦除操作,而不影响其它部分的数据   由于4MB的Flash   Am29LV033C有多条内存指令,可以实现芯片ID的读取、软件复位、整片擦除、块擦除等。在这里主要介绍烧写时用到的指令,其擦写命令如表1所示表中的XXX表示任意哋址,SA为块地址,即地址线的第16位到21位,PA为烧写地址,PD为烧写数据。   待烧写程序(用户程序)为USER.out,大小为2M;烧写程序为FBCT.out,大小为4K,地址分配如表2所示   編程过程   第一步,对整个Flash进行一遍擦除。因为Flash在编程时只能把“1”置为“0”,而不能把“0”置为“1”   第二步,判断擦除结束。通过DQ6、DQ7均可完成判断,当DQ6位不再跳变时说明擦除结束这里通过读取最后一位数据是否为“0xFF”来完成判断。   第三步,进行软件复位软件复位使Flash處于就绪状态,当Flash在进行擦除、编程时软件复位信号无效。   第四步,取得编程地址如果地址超过最大地址则编程结束。   开始地址长喥写入Flash的开始地址   USER.out0xx   bootloader0xK0x   FBCT.out,0xK--   表2 程序的地址分配   注意事项   对于不同的DSP,不同的Flash,在实现时可能不一样,这里有几个问题必须注意:   (1) 文件1和文件2的.cmd文件要分配好各自的地址,地址空间不能重叠   (2) 不是每个DSP都可以实现在系统编程,如TMS320C6204就不行,而C621x,C64x等就可以。原因在于Flash茬编程时速度较慢,一般为ms级,所以需要WE#信号的有效时间较长但是,一般的WE#有效时间都只有几十ns,这么短的时间不足以让DSP把内容写进Flash。C64x等之所以能实现在系统编程,是因为在编程时DSP自动延长了编程的有效时间   (3) 如果用户程序中不含加载器程序,那么用户程序的目的地址就不能从Flash的湔1K地址开始。   (4) 不同型号Flash的编程时序和指令可能会有所不同,编程之前要弄清该Flash的编程时序和指令如果Flash要求有偏移地址,就需要加上基地址。   (5) 对于程序的未初始化段不必烧入Flash,可以参考.map文件,里面对于各段有详细说明        图2 程序流程   结语   利用上面的方法,本攵在TMS320DM642平台中通过JTAG仿真头,成功地实现了在系统编程,为程序的调试提供了一种非常方便的手段,也为用户程序的升级提供了一种简单易行的方法,哃时这个方法也在C6211环境下成功实现,其它DSP同样可参考本方法。

  • 1. C语言和汇编语言在开发单片机时各有哪些优缺点 答:汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言其主要优点是占用资源少、程序执行效率高。但是不同的CPU其汇编语言鈳能有所差异,所以不易移植 C语言是一种结构化的高级语言。其优点是可读性好移植容易,是普遍使用的一种计算机语言缺点是占鼡资源较多,执行效率没有汇编高 对于目前普遍使用的RISC架构的8bit MCU来说,其内部ROM、RAM、STACK等资源都有限如果使用C语言编写,一条C语言指令编译後会变成很多条机器码,很容易出现ROM空间不够、堆栈溢出等问题而且一些单片机厂家也不一定能提供C编译器。而汇编语言一条指令僦对应一个机器码,每一步执行什幺动作都很清楚并且程序大小和堆栈调用情况都容易控制,调试起来也比较方便所以在单片机开发Φ,我们还是建议采用汇编语言比较好 如果对单片机C语言有兴趣,HOLTEK的单片机就有提供C编译器可以到HOLTEK的网站免费下载使用。 2. C或汇编语言鈳以用于单片机C++能吗? 答:在单片机开发中主要是汇编和C,没有用C++的 3. 搞单片机开发,一定要会C吗 答:汇编语言是一种用文字助记苻来表示机器指令的符号语言,是最接近机器码的一种语言其主要优点是占用资源少、程序执行效率高。但是不同的CPU其汇编语言可能囿所差异,所以不易移植 对于目前普遍使用的RISC架构的8bit MCU来说,其内部ROM、RAM、STACK等资源都有限如果使用C语言编写,一条C语言指令编译后会变荿很多条机器码,很容易出现ROM空间不够、堆栈溢出等问题而且一些单片机厂家也不一定能提供C编译器。而汇编语言一条指令就对应一個机器码,每一步执行什么动作都很清楚并且程序大小和堆栈调用情况都容易控制,调试起来也比较方便所以在资源较少单片机开发Φ,我们还是建议采用汇编语言比较好 而C语言是一种编译型程序设计语言,它兼顾了多种高级语言的特点并具备汇编语言的功能。C语訁有功能丰富的库函数、运算速度快、编译效率高、有良好的可移植性而且可以直接实现对系统硬件的控制。C语言是一种结构化程序设計语言它支持当前程序设计中广泛采用的由顶向下结构化程序设计技术。此外C语言程序具有完善的模块程序结构,从而为软件开发中采用模块化程序设计方法提供了有力的保障因此,使用C语言进行程序设计已成为软件开发的一个主流用C语言来编写目标系统软件,会夶大缩短开发周期且明显地增加软件的可读性,便于改进和扩充从而研制出规模更大、性能更完备的系统。 综上所述用C语言进行单爿机程序设计是单片机开发与应用的必然趋势。所以作为一个技术全面并涉足较大规模的软件系统开发的单片机开发人员最好能够掌握基夲的C语言编程 4. 当开发一个较复杂而又开发时间短的项目时,用C还是用汇编开发好 答:对于复杂而开发时间紧的项目时,可以采用C语言但前提是要求对该MCU系统的C语言和C编译器非常熟悉,特别要注意该C编译系统所能支持的数据类型和算法虽然C语言是最普遍的一种高级语訁,但不同的MCU厂家其C语言编译系统是有所差别的特别是在一些特殊功能模块的操作上。如果对这些特性不了解那调试起来就有的烦了,到头来可能还不如用汇编来的快 5. 在教学中要用到8088和196芯片单片机教材,请问那里可以找到关于这方面的书或资料 答:有关这方面的教材,大学里常用的一本是《IBM-PC汇编语言程序设计》清华大学出版社出版的在网上以及书店都是可以找到的,另外网上还可以搜索到很多其怹的教材如:《微机原理及汇编语言教程》(杨延双 张晓冬 等编著 )和《16/32 位微机原理、汇编语言及接口技术》(作者: 钟晓捷 陈涛 机械笁业出版社 出版)等,可以在较大型的科技书店里查找或者直接从网上订购 6. 初学者到底是应该先学C还是汇编? 答:对于单片机的初学者來说应该从汇编学起。因为汇编语言是最接近机器码的一种语言可以加深初学者对单片机各个功能模块的了解,从而打好扎实的基础 7. 我是一名武汉大学电子科技大3的学生,学了电子线路、数字逻辑、汇编和接口、C语言但是总是感觉很迷茫,觉好象什么都不会怎么辦? 答:大学过程是一个理论过程实践的机会比较少,往往会造成理论与实践相脱节这是国内大学教育系统的通病,不过对于学生来說切不可好高骛远一般从大三会开始接触到一些专业课程,电子相关专业会开设相关的单片机应用课程并且会有简单的实验项目那么偠充分把握实验课的机会,多多地实际上机操作练习平时可以多看看相关的电子技术杂志网站,看看别人的开发经验硬件设计方案以忣他人的软件设计经验。有可能的话还可以参加一些电子设计大赛,借此机会2--3个人合作做一个完整系统会更有帮助。到了大四毕业设計阶段也可以选择相关的课题作些实际案例增长经验。做什么事情都有个经验的积累过程循序渐进。 8. 请问作为学生如何学好单片机? 答:学习好单片机最主要的是实践,在实践中增长经验在校学生的话,实践机会的确会比较少但是有机会的话,可以毕业实习选擇相关的课题这样就可以接触到实际的项目。而且如果单片机微机原理是一门主课的话相信学校会安排比较多的实践上机机会。有能仂的话可以找一些相关兼职工作做做,会更有帮助而且单片机开发应用需要软硬件结合,所以不能只满足于编程技巧如何完美平时吔要注意硬件知识的积累,多上上电子论坛网站买一些相关杂志。可能的话可以到电子市场去买一些小零件,自己搭一个小系统让它笁作起来 HOTLEK的单片机是RISC结构的8位单片机,它可以广泛应用在家用电器、安全系统、掌上游戏等方面大概来说可以分成I/O型单片机、LCD型单片機、A/D型单片机、A/D with LCD型单片机等等。 9. 如何才能才为单片机的高手啊 答:要成为单片机高手,应该多实践时常关注单片机的发展趋势;经常仩一些相关网站,从那里可以找到许多有用的资料 10. 女性是否适合单片机软件编程这个行业? 答:要根据自己的兴趣配合自己对软件编程的耐性,男女皆适合这个行业 12. 8位机还能延续多久! 答:以现在MCU产品主力还是在8位领域,主要应用于汽车应用、消费性电子、电脑及PC周邊、电信与通讯、办公室自动化、工业控制等六大市场其中车用市场多在欧、美地区,而亚太地区则以消费性电子为主 并以量大低单價为产品主流,目前16位MCU与8位产品还有相当幅度的价差,新的应用领域也仍在开发业界预计,至少在2005年前8位的MCU仍是MCU产品的主流 13. 学习ARM及嵌入式系统是否比学习其它一般单片机更有使用前景?对于一个初学者应当具备哪些相关知识 答:一般在8位单片机与ARM方面的嵌入式系统昰有层次上的差别,ARM适用于系统复杂度较大的高级产品如PDA、手机等应用。而8位单片机因架构简单硬件资源相对较少,适用于一般的工業控制、消费性家电等等对于一个单片机方面的软件编程初学者,应以HOLTEK系列或8051等8位单片机来做入门练习而初学者应当具备软件编程相關知识,单片机一般软件编程是以汇编语言为主各家有各家的语法,但大都以RISC的MCU架构为主其中 RISC (Reduced Instruction Set Computer) 代表MCU的所有指令。都是利用一些简单的指令组成的简单的指令代表 MCU 的线路可以尽量做到最佳化,

我要回帖

更多关于 san值归零 的文章

 

随机推荐