tag 标签: 开发

相关帖子
相关博文
  • 热度 3
    2019-7-30 23:24
    1784 次阅读|
    1 个评论
    1路视频光端机硬件原理详细设计
    1路视频光端机硬件原理详细设计 记录编号: X XXXXX 一、 项目编号: X XXXX 二、 项目名称: 1路视频光端机(国办方案) 三、 版本: X XXXXXX 四、 用模块图表示设计原理 整对 PCB采用2片 EPM3128A 数据复用芯片 1 片国办的 DS92LV1212A / DS92LV1 021 A 芯片 , 1片AD9708 和AD9280 A/D转换芯片 1片MAX488 MAX3232 PCM3008T 芯片 ,组成一对1路视频 1路双向音频 1路双向数据(RS485/422 RS232 ) 的收发数字视频光端机。 整个主板主要分七大部分:电源电路部分、视频模拟电路放大滤波部分、模拟 /数字转换部分、cpld数字信号复用和时钟处理部分、G-LINK 高速串行编解码部分、光模块电路部分、音频数据部分。 五、 各部分原理说明 I 、电源电路 由电源插座引入 220V交流电源,经一块YAS-5.0 AC/DC开关电源模块 产生 +5V/2.4A直流电源供应布在PCB板上的OP691 OP690 LM353 MAX488 芯片设备。 独立的 AD芯片, EPM3128A 数据复用芯片 , DS92LV1 021 A serializer芯片 的电源电路采用AS1117芯片稳压电路构成,产生系统的+3.3V的电源。 1、 AS1117() ① 、供应 AD9280/9708芯片74LC14芯片, EPM3128A 数据复用芯片 ,其电源网络标号是 “+ 3.3 V”。 ② 、供应音频处理芯片 PCM3008T的数字PIN5,其电源网络标号是 “+3.3AU”。 ③ 、供应 RS3232芯片VCC接口,其电源网络标号是 “”。 ④、供应 DS92LV1 021 A serializer芯片,其电源网络标号是 “+3.3LVA” “+3.3LVD” 2 RS3232 芯片PIN3提供 -5V 电压给OPA690 ,其电源网络标号是 “ – 5A ”和 提供给OPA691 ,其电源网络标号为 “ – 5B ”。 3 +5V/2.4A直流电源 供应光收发模块的TTL 电路电源网络标号为“+5V ” . ① 、供应 电压放大器 OPA690 ,其电源网络标号“+5A ” . ② 、供应电流放大器 OPA691 , 其电源网络标号“+5B ” 。 ③ 、供应 MAX488芯片 ,其电源网络标号 “ +5DA ” . ④、供应LM358 芯片,其电源网络标号 “ +5AU ” . 在电源的总输出处加入 L24(22UH/2A)的滤波电感以提高电源的信噪比。 II、 CPLD 芯片 电路部分 该电路采用 EPM3128A数字复用 芯片 。 主要特性如下: · 芯片实现数据并行复用 · QFP1 00 封装, 3.3V 供电。 Ⅲ、 Video 视频部分 本设备视频发射和接收部分主要采用了国办的 OPA690 电压反馈放大芯片,OPA691电流反馈放大 芯片、 LM1881 视频同步分离芯片、LC三阶低通滤波电路、AD9280/9708 模数转换芯片搭建而成。 TX 发射端的视频信号输入先经过 OPA691 电流反馈放大电路部分在传输到三阶8mhz低通滤波电路 传到 AD9280 的ADC 处理传给CPLD的复用 ,再把视频信号传给LVDS 芯片变成高速串行信号输出到 TTL电平的光模块电路转成光信号传到远端接收部分。 RX ⑴ 、 LM1881 视频同步分离器芯片电路 LM1881 行场同步分离模块 ( 视频同步信号提取电路 ) 芯片性能: 1、定时提取视频的同步信息,包括复合同步视频信号和垂直信号、脉冲时沿,在这里应用是分离出复合同步信号给 D7,信号在经过三极管Q1得放大电路 把信号传给CPLD处理、和 通过同步信号分离模块将外输入的视频信号中的行场同步信号分离出来,该分离信号引入 AD9280 。 2、LM1881 的第8脚VCC 5V电压输入,C13 0.1uf C106 0.01uf电容起去耦 提供低阻抗通路 作用。 C14 0.1uf 起耦合作用 C105 470pf电容起滤波作用。 Lm1881 硬件框图 ⑵ 、 OPA691 电流反馈放大芯片 OPA690 电压反馈放大芯片电路 OPA691 将宽带的电流反馈型运算放大器提高到一个崭新的水平。一般情况下工作在 5.1mA 的极低 供电电流,当在更高的供电电流下工作时 ,OPA691可满足高的压摆率 (2100V/us) 及输出功率 (190mA),是多路广播视频接口应用的选择。 OPA690 具有稳定的单位增益、带禁用端的电压反馈型运算放大器,它可提供先前只在宽带电流反馈放大器中才具有的压摆率及满功率带宽。OPA690 采用 +5V 单电源,在超过 150mA的 驱动电流和150MHz 带宽的条件下,提供 1V至4V 的输出动态范围,奠定了其在 RGB 线驱动以及单电源 ADC 输入驱动器中的性能。双路的 OPA2690 可支持高压摆率的差分输入输出,单个三路 的OPA3690 更能实现有源高阶滤波。 特性 · 宽电源范围: 5V 到 12V 的单电源、+/-2.5 到 +/-6V的双电源 · 高输出电流: +/-190mA(+/-250mA限流) · 高压摆率: 2100V/us (OPA691) · 输出电压范围: +/- 5 V TX: OPA691 电流反馈放大电路部分 RX:OPA691 电流反馈放大电路部分- RX:OPA690 电压反馈放大器电路部分 ⑶ 视频 A/D 模拟数字转换部分电路。 AD9280 ADC : ① CMOS 8 bit 编码 32MSPS 采样 ; 可实现数据的多通道传输低电压高速采样 ② 高性能低电压 ,在3V 电压工作模式下功耗为:95mw (3v ),在休眠工作模式下功耗仅为5mw; ③ 可调的芯片参考电压 ; ④ 多种模式选择 见图如下 : TX:AD9280 模转数电路部分 参考电压工作模式设置 :在1V模式下是内部参考电压把REFSENSE 和VREF 连接;在2V模式是把REFSENSE 接地;外部驱动模式是在1V 2V模式增加电阻;外部参考模式是使能给REFTS REFBS VREF pin 信号输入采用 Differential 模式AIN 驱动一个信号输入,REFTS OR REFBS 连接驱动另一个输入,此模式PIN 要打到AVDD/2 才能达到最佳模式. INPUT 输入和参考电压部分的关系是 (REFTS-VREF/2) ≤ AIN ≤ (REFTS+VREF/2) ,是由VREF 输出参考来决定AIN 的范围在顶层参考和底层参考的范围之间比值为1V :2V . 电路在芯片的 REFTF 和 REFBF 搭建了去藕网络-短路两个PIN 并联上10uf和0.1分电容及串上两个0.1uf对接地电容,芯片参考电压VREF PIN 要旁路给AVSS (analog ground) 1.0uf 电容和并上0.1uf电容. AD9280 可以DIFFERENTIAL 输入信号,可以短路REFTS 和REFBS pins 驱动differential 信号,在这种配置下,AD9280 可以接受1V P-P 的信号. AD芯片5-12 pin 是输出8位的并行数据到CPLD 复用芯片.时钟信号的CLK输出到cpld . RX:AD9708 数转模电路部分 AD9708 DAC : ① 高性能低电压数子到模拟转换器 ,在3V 电压工作模式下功耗为:45mw (3v );在5V 的工作电压下功耗为175MW ,在休眠工作模式下功耗仅为20mw @ 5V; ② 模拟和数字部分的电压为图中 AVDD DVDD,支持电压范围再2.7v-5. 5v , 数字部分可以运行在 125MSPS 的时钟速率下 ③ 输出电流在 2MA -- 20ma .外围电阻结合内部参考放大器 参考电压 V REF 来调整 I REF ④ 芯片的每个针脚( pin)的定义见下表: ⑤ 芯片要求输出阻抗大于 100K欧 ,所以电路图中可见芯片的IOUTA IOUTB 输出PIN 的外接电路的加上了51欧的下拉电阻R63 R64及22pf 的C116 C117滤波及采用510欧的R56 R57 电阻对输出信号达到要求的阻抗。 ⑥ 电路中芯片的 FSADJ PIN 要求外接2K欧对地的R67 电阻,用来控制数字信号的输出电流. ⑦ 芯片分模拟和数字两部分,在接地和供电方面也要求,接地 ACOM DCOM 和供电AVDD DVDD 要分开,不能通用。 ⑧ 电路中芯片的 REFLO 参考地和ACOM 模拟地连接,才能REFIO 参考输出电压要达到1.2V ,这样需要REFIO外接补偿 0.1uf 电容。 ⑷ 三阶低通滤波电路部分 。 视频信号经过 OPA691放大后进入8MHZ 的三阶低通滤波电路,对信号的优化后传到AD9280转换芯片进行AD转换处理. Ⅳ LVDS 国办芯片部分 本设备串并数据转换部分采用国办的 DS92LV1021A 和DS92LV1212A 芯片 ,把并行数据转换成高速的串行数据最后传给TTL电平的光模块转称光信号传给远端的设备,在由接收端DS92LV1212A芯片解出串行信号恢复出同步的并行信号。两边采用的同步时钟为16.384MHZ. ⑴ TX :DS921021A 电路部分 ⑵ R X :DS921212A 电路部分 Ⅴ、 AUDIO 部分 本设备得音频部分是采用 PCM3008T 芯片搭建的双向立体声的电路通道。PCM3008T 芯片是低成本数字立体声音频处理芯片,16bit 的ADC 和 DAC ,8khz-48khz 采样、 Ⅵ RS488/422 RS232数据部分 Ⅶ 时钟晶振电路部分 设备时钟采用 Ⅷ 指示灯部分 Ⅸ 光模块 光模块采用的是普通的 1×9针光模块,采用+5V供电, 发射是1.25G PECL电平和155M TTL电平的双向光模块,主芯片工作电压为+3.3V,因此使用交流耦合。 光接收检测信号 ,此信号分两路,送LVDS1021/1212A 光口信号检测输入。经LVDS1021A组成的并转串电路转换成串行光信号送入发送至对端设备。
  • 热度 3
    2019-3-26 09:53
    799 次阅读|
    2 个评论
    成为一个正式的嵌入式主板开发工程师,是一个艰辛的过程,需要开发人员维护和管理系统的每个比特和字节。从规范完善的开发周期到严格执行和系统检查,开发高可靠性嵌入式系统的技术有许多种。今天给大家介绍 7个易操作且可以长久使用的技巧,它们对于确保系统更加可靠地运行并捕获异常行为大有帮助。 技巧 1—— 用已知值填充 ROM 软件开发人员往往都是非常乐观的一群人,只要让他们的代码忠实地长时间地运行就可以了,仅此而已。微控制器跳出应用程序空间并在非预想的代码空间中执行这种情况似乎是相当少有的。然而,这种情况发生的机会并不比缓存溢出或错误指针失去引用少。它确实会发生!发生这种情况后的系统行为将是不确定的,因为默认情况下内存空间都是 0xFF,或者由于内存区通常没有写过,其中的值可能只有上帝才知道。 不过有相当完备的 linker或IDE技巧可以用来帮助识别这样的事件并从中恢复系统。技巧就是使用FILL命令对未用ROM填充已知的位模式。要填充未使用的内存,有很多不同的可能组合可以使用,但如果是想建立更加可靠的系统,最明显的选择是在这些位置放置ISR fault handler。如果系统出了某些差错,处理器开始执行程序空间以外的代码,就会触发ISR,并在决定校正行动之前提供储存处理器、寄存器和系统状态的机会 技巧 2—— 检查应用程序的 CRC 对嵌入式工程师来说一个很大的好处是,我们的 IDE和工具链可以自动产生应用程序或内存空间校验和(Checksum),从而根据这个校验和验证应用程序是否完好。有趣的是,在许多这些案例中,只有在将程序代码加载到设备时,才会用到校验和。 然而,如果 CRC或校验和保持在内存中,那么验证应用程序在启动时(或甚至对长时间运行的系统定期验证)是否仍然完好是确保意外之事不会发生的极好途径。现在一个编程过的应用程序发生改变的概率是很小的,但考虑每年交付的数十亿个微控制器以及可能恶劣的工作环境,医疗仪器应用程序崩溃的机会并不是零。更有可能的是,系统中的一个缺陷可能导致某一扇区发生闪存写入或闪存擦除,从而破坏应用程序的完整性。 技巧 3—— 在启动时执行 RAM 检查 为了建立一个更加可靠和扎实的系统,确保系统硬件正常工作非常重要。毕竟硬件会发生故障。(幸运的是软件永远不会发生故障,软件只会做代码要它做的事,不管是正确的还是错误的)。在启动时验证 RAM的内部或外部没有问题,是确保硬件可以如预期般运作的一个好方法。 有许多不同的方法可用于执行 RAM检查,但常用的方法是写入一个已知的模式,然后等上一小段时间再回读。结果应该是所读就是所写。真相是,在大多数情况下 RAM检查是通过的,这也是我们想要的结果。但也有极小的可能性检查不通过,这时就为系统标示出硬件问题提供了极好的机会。 技巧 4—— 使用堆栈监视器 对许多的嵌入式开发者而言,堆栈似乎是一股相当神秘的力量。当奇怪的事情开始发生,工程师终于被难倒了,他们开始思考,也许堆栈中发生了什么事。结果是盲目地调整堆栈的大小和位置等等。但该错误往往是与堆栈无关的,但怎能如此确定?毕竟,有多少工程师真的实际执行过最坏情况下的堆栈大小分析? 堆栈大小是在编译时就静态分配好的,但堆栈是以动态的方式使用的。随着代码的执行,应用程序需要的变量、返回的地址和其它信息被不断存储在堆栈中。这种机制导致堆栈在其分配的内存中不断增长。然而,这种增长有时会超出编译时确定的容量极限,导致堆栈破坏相邻内存区域的数据。 绝对确保堆栈正常工作的一种方法是实现堆栈监视器,将它作为系统 “保健”代码的一部分(有多少工程师会这样做?)。堆栈监视器会在堆栈和“其它”内存区域之间创建一个缓冲区域,并填充已知的位模式。然后监视器会不断的监视图案是否有任何变化。如果该位模式发生了改变,那就意味着堆栈增长得太大了,即将要把系统推向黑暗地狱!此时监视器可以记录事件的发生、系统状态以及任何其它有用的数据,供日后用于问题的诊断。 大多数实时操作系统( RTOS)或实现了内存保护单元(MPU)的微控制器系统中都提供有堆栈监视器。可怕的是,这些功能默认都是关闭状态,或者经常被开发人员有意关闭。在网络上快速搜寻一下可以发现,很多人建议关闭实时操作系统中的堆栈监视器以节省56字节的闪存空间等等,这可是得不偿失的做法! 技巧 5 - 使用 MPU 在过去,是很难在一个小而廉价的微控制器中找到内存保护单元( MPU)的,但这种情况已经开始改变。现在从高端到低端的微控制器都已经有MPU,而这些 MPU为嵌入式软件开发人员提供了一个可以大幅提高其固件(firmware)鲁棒性(robustness)的机会。 MPU 已逐渐与操作系统耦合,以便建立内存空间,其中的处理都分开,或任务可执行其代码,而不用担心被stomped on。倘若真有事情发生,不受控制的处理会被取消,也会执行其他的保护措施。请留意带有这种组件的微控制器,如果有,请多加利用它的这种特性。 技巧 6 - 建立一个强大的看门狗系统 你经常会发现的一种总是最受喜爱的看门狗( watchdog)实现是,在看门狗被启用之处(这是一个很好的开始),但也是可以用周期性定时器将该看门狗清零之处;定时器的启用是完全与程序中出现的任何情况隔离的。使用看门狗的目的是协助确保如果出现错误,看门狗不会被清零,即当工作暂停,系统会被迫去执行硬件重设定(hardware reset),以便恢复。使用与系统活动独立的定时器可以让看门狗保持清零,即使系统已失效。 对应用任务如何整合到看门狗系统中,嵌入式主板开发人员需要仔细考虑和设计。例如,有种技术可能可以让每个在一定时期内运行的任务标示它们可以成功地完成其任 务。在此事件中,看门狗不被清零,强制被复位。还有一些比较先进的技术,像是使用外部看门狗处理器,它可用来监视主处理器如何表现,反之亦然。对一个可靠的系统而言,建立一个强大的看门狗系统是很重要的。 技巧 7 - 避免易失存储器分配 不习惯在资源有限环境下工作的工程师,可能会试图使用其编程语言的特性,这种语言让他们可以使用易失存储器分配。毕竟,这是一种常在计算器系统中使用的技术,在计算器系统中,只有在有必要时,内存才会被分配。例如,以 C开发时,工程师可能倾向于使用malloc来分配在堆(heap)上的空间。有一个操 作会执行,一旦完成,可以使用free将被分配的内存返回,以便堆的使用。 在资源受限的系统,这可 能是一场灾难!使用易失存储器分配的其中一个问题是,错误或不当的技术可能会导致内存泄漏或内存碎片。 更多资料企鹅爱吧物久零要奇伞武奇, 如果出现这些问题时,大多数的嵌入式系统并没有 资源或知识来监视堆或妥善地处理它。而当它们发生时,如果应用程序提出对空间的要求,但却没有所请求的空间可以使用,会发生什么事呢? 使用易失存储器分配所产生的问题是很复杂的,要妥善处理这些问题,可以说是一个噩梦!一种替代的方法是,直接以静态的方式,简化内存的分配。例如,只要在 程序中简单地建立一个大小为 256字节长的缓冲区,而不是经由malloc请求这样大小的内存缓冲区。此一分配的内存可在整个应用程序的生命周期期 间保持,且不会有堆或内存碎片问题方面的顾虑。 以上嵌入式开发的教程可以让开发技术的人员获取更好嵌入式系统的办法。所有这些技术都是让设计者可以开发出可靠性更高嵌入式系统的秘诀。
  • 2019-1-15 18:02
    757 次阅读|
    0 个评论
    美国限制AI技术出口,中国AI迎来重大利好? 2019-01-11 https://www.esmchina.com/news/4654.html?utm_source=ESMC Article Alert1 AI毕业生月薪4万元起步…… 呵呵,开口就是钱,又是唯钱是图大有钱图的理念。 美国的AI技术和中国的AI技术根本不一样! 打个比喻,美国是开发,中国是生产,各有所长,各尽所能,推动人类进程...... 有意思的是非洲国家对技术不闻不问?
  • 热度 2
    2018-11-16 15:56
    1063 次阅读|
    5 个评论
    不能评论,就这样说说…
    排名自然是这样,后话说:美国算力为王,中国数量占优。正是,美国是地球工厂的开发部科学开发在先,中国是生产部技术应用其后,满足人类普及使用,两者不可或缺。呵呵,哪工程部呢?有的,不但需要排名……
  • 热度 8
    2018-2-7 10:27
    1999 次阅读|
    3 个评论
    一位久经沙场的嵌入式 er站在初学者角度谈谈嵌入式开发与学习的一些问题 在刚刚涉足嵌入式开发的时候,总想找到这样一本书,它可以解决我一些这样那样的疑惑。但是遗憾的是,到现在也没有这样一本书面世,而且我想永远也不可能面世了。因为我的疑惑太多太杂了。这些疑惑在教科书中又难以寻找到答案。 C 教程注重讲C 的语法,编译原理注重讲语法,语义的分析。每一门教科书都是有它的注重,所以那些交叉的问题便成了三不管。市场上的那些自称为《XX 宝典》、《XX 圣经》的书却总是说一些可能连作者自己也没搞清楚的问题。于是我想,我想了解的也许是大家都想了解的吧,那么把我学到的一点东西写出来,大家也许就可以少花点时间在上面,留出宝贵的脑力资源去做更有意义的事。 语言选择, C 还是其他 刚刚涉及嵌入式开发者总是先阅读一些指导类型文章,然后就开始对开发语言的选择踌躇不决。是 C 还是 C++? 还是好像更热门的 JAVA? 不用犹豫,至少目前看来 C 还是你的选择。嵌入式开发的本质是订制开发,硬件平台林林总总,处理能力高下不同,如果想保护你学习精力投资的话, C 是最好的 “ 优绩股 ” 。 C++ 的优点在于它的代码重用,但是效率比 C 低很多,最重要的是,并非所有芯片的编译器都能支持 C++ 。 JAVA 就更不用提及,在一个虚拟平台上开发的优点是不用关心具体的硬件细节,但这不是一个嵌入式开发者的作风,换一种说法,这种开发不能称之为嵌入式开发。 C 被称为高级语言中的低级语言,低级语言中的高级语言,这是因为其一方面有高级语言所具有的接近于人类思想的语言体系,另一方面同时支持地址与位操作。可以方便的与硬件打交道。嵌入式开发必然要操作 IO 、硬件地址,没有位操作和指针你又如何方便做到 ? 嵌入式开发一般流程 嵌入式开发的流程与高层开发大体类似,编码 —— 编译、链接 —— 运行。中间当然可以有联机调试,重新编码等递归过程。但有一些不同之处。 首先,开发平台不同。受嵌入式平台处理能力所限,嵌入式开发一般都采用交叉编译环境开发。所谓交叉编译就是在 A 平台上编译 B 平台上运行的目标程序。在 A 平台上运行的 B 平台程序编译器就被称为交叉编译器。一个初入门者,建立一套这样的编译环境也许就要花掉几天的时间。 其次,调试方式不同。我们在 Windows 或者 Linux 上开发的程序可以马上运行察看运行结果,也可以利用 IDE 来调试运行过程,但是嵌入式开发者却至少需要作一系列工作才能达到这种地步。 目前最流行的是采用 JTAG 方式连接到目标系统上,将编译成功的代码下载运行,高级的调试器几乎可以像 VC 环境一样任意的调试程序。再者,开发者所了解层次结构不同。高层软件开发者把工作的重点放在对应用需求的理解和实现上。 嵌入式开发者对整个过程细节必须比高层开发者有更深的认识。最大不同之处在于有操作系统支持的程序不需要你关心程序的运行地址以及程序链接后各个程序块最后的位置。像 Windows , Linux 这类需要 MMU 支持的操作系统,其程序都是放置在虚拟地址空间的一个固定的内存地址。不管程序在真正 RAM 空间的地址位置在哪里,最后都由 MMU 映射到虚拟地址空间的一个固定的地址。 为什么程序的运行与存放的地址要相关呢 ? 学过汇编原理,或者看过最后编译成机器码程序的人就知道,程序中的变量、函数最后都在机器码中体现为地址,程序的跳转,子程序的调用,以及变量调用最后都是 CPU 通过直接提取其地址来实现的。 嵌入式学习企鹅意义气呜呜吧久零就易。 编译时指定的 TEXT_BASE 就是所有一切地址的参考值。如果你指定的地址与最后程序放置的地址不一致显然不能正常运行。 但也有例外,不过不寻常的用法当然要付出不寻常的努力。有两种方法可以解决这个问题。 一种方法是在程序的最起始编写与地址无关的代码,最后将后面的程序自搬移到你真正指定的 TEXT_BASE 然后跳转到你将要运行的代码处。 另一种方法是, TEXT_BASE 指定为你程序的存放地址,然后将程序搬移到真正运行的地址,有一个变量将后者的地址记录下来作为参考值,在以后的符号表地址都以此值作为参考与偏移值合成为其真正的地址。 听起来很拗口,实现起来也很难,在后面的内容中有更好的解决办法 —— 用一个 BootLoader 支持。另外,一个完整的程序必然至少有三个段 TEXT ( 正文,也就是最后用程序编译后的机器指令 ) 段、 BSS( 未初始变量 ) 段 DATA( 初始化变量 ) 段。前面讲到的 TEXT_BASE 只是 TEXT 段的基址,对于另外的 BSS 段和 DATA 段,如果最后的整个程序放在 RAM 中,那么三个段可以连续放置,但是,如果程序是放置在 ROM 或者 FLASH 这种只读存储器中,那么你还需要指定你的其他段的地址,因为代码在运行中是不改变的,而后两者却不同。这些工作都是在链接的时候完成,编译器必然为你提供了一些手段让你完成这些工作。 还是那句话,有操作系统支持的编程屏蔽了这些细节,让你完全不用考虑这些头痛的问题。但是嵌入式开发者没有那么幸运,他们总是在一个冷冰冰的芯片上从头做起。 CPU 上电复位总是从一个固定的地址去找程序,开始其繁忙的工作。对于我们的 PC 来说这个地址就是我们的 BIOS 程序,对于嵌入式系统,一般没有 BIOS 支持, RAM 不能在掉电情况下保留你的程序,所以必须将程序存放在 ROM 或 FLASH 中,但是一般来讲,这些存储器的宽度和速度都无法与 RAM 相提并论。 程序在这些存储器上运行会降低运行速率。大多数的方案是在此处存放一个 BootLoader , BootLoader 所完成的功能可多可少,一个基本的 BootLoader 只完成一些系统初始化并将用户程序搬移到一定地址,然后跳转到用户程序即交出 CPU 控制权,功能强大的 BootLoad 还可以支持网络、串口下载,甚至调试功能。但不要指望有一个像 PC BIOS 那样通用的 BootLoader 供你使用,至少你需要作一些移植工作使其符合你的系统,这个移植工作也是你开发的一个部分,作为嵌入式开发个入门者来讲,移植或者编写一个 BootLoader 会使你受益匪浅。 没有 BootLoader 行不行 ? 当然可以,要么你就牺牲效率直接从 ROM 中运行,要么你就自己编写程序搬移代码去 RAM 运行,最主要的是,开发过程中你要有好的调试工具支持在线调试,否则你就得在改动哪怕一个变量的情况下都要去重新烧片验证。继续程序入口的话题,不管过程如何,程序最后在执行时都是变成了机器指令,一个纯的执行程序就是这些机器指令的集合。像我们在操作系统上的可运行程序都不是纯的执行程序,而是带有格式的 . 嵌入式学习更多内容请加企鹅意义气呜呜吧久零就易。 一般除了包含上面提到的几个段以外,还有程序的长度,校验以及程序入口 —— 就是从哪儿开始执行用户程序。 为什么有了程序地址还需要有程序的入口呢 ? 这是因为你要真正开始执行的代码并非一定放置在一个文件的最开始,就算放在最开始,除非你去控制链接,否则在多文件的情况下,编译器也不一定将你的这段程序放置在最后程序的最顶端。像我们一般有操作系统支持的程序,只需在你的代码中有一个 main 作为程序入口 —— 注意这个 main 只是大多数编译器约成定俗的入口,除非你利用了别人的初始化库,否则程序入口可以自行设定 —— 即可。显然,带有格式的这种执行文件使用更加灵活,但需要 BootLoader 的支持。有关执行文件格式的内容可以看看 ELF 文件格式。 编译预处理 首先看看文件包含,从我们的第一个 C 程序 Hello World! 开始,我们就使用头文件包含,但是另人惊奇的是,很多人在做了很长时间的开发以后仍然对文件的包含没有正确的认识或者是概念不清,有更多的人却把头文件和与之相关联的库混淆。 为了照顾这些初学者,这里罗嗦一下,其实文件包含的本质就是把一个大的文件截成几个小文件便于管理和阅读,如果你包含了那个文件,那么你把这个文件的所有内容原封不动的复制到你包含其的文件中,效果是完全一样的,另一方面,如果你编译了一些中间代码,如库文件,可以通过提供头文件来告知调用者你的库包含的函数和调用格式,但是真正的代码已经变成了目标代码以库文件形式存在了。至于包含文件的后缀如 .h 只是告诉使用者,这是一个头文件,你用任何别的名字,编译器都一般不会在意。 那些对头文件和库还混淆的朋友应该恍然大悟了吧,其实头文件只能保证你的程序编译不出现语法错误,但是直到最后链接的时候才会真正使用到库,那些只把一个头文件拷贝来就想拥有一个库的人再也不要犯这样的错误了。如果你的工程中源程序数目繁多令你觉得管理困难,把他们全部包含在一个文件中也未尝不可。 另一个初学者常常遇到的问题就是由于重复包含引起的困惑。如果一个文件中包含了另一个文件两次或两次以上很可能引起重复定义的问题,但是没有人蠢到会重复包含两次同一个文件的,这种问题都是隐式的重复包含,比如 A 文件中包含了 B 文件和 C 文件, B 文件中又包含了 C 文件,这样, A 文件实际上已经包含了 C 文件两次。不过一个好的头文件巧妙的利用编译预处理避免了这种情况。在头文件中你可能发现这样的一些预处理: #ifndef __TEST_H__ #define __TEST_H__ … … #endif /* __TEST_H__ */ 这三行编译预处理前两行一般位于文件最顶端,最后文件位于文件最末端,它的意思是,如果没有定义 __TEST_H__ 那么就定义 __TEST_H__ 同时下面的代码一直到 #endif 前参与编译,反之不参与编译。多么巧妙的设计,有了这三行简洁的预处理,这个文件即使被包含几万次也只能算一次。 我们再来看看宏的使用。初学者在看别人代码的时候总是想,为什么用那么多宏呢 ? 看得人一头雾水,的确,有时候宏的使用会降低代码的可读性。但有时宏也可以提高代码的可读性,看看下边这两段代码: 1) #define SCC_GSMRH_RSYN 0x00000001 /* receive sync timing */ #define SCC_GSMRH_RTSM 0x00000002 /* RTS* mode */ #define SCC_GSMRH_SYNL 0x0000000c /* sync length */ #define SCC_GSMRH_TXSY 0x00000010 /* transmitter/receiver sync*/ #define SCC_GSMRH_RFW 0x00000020 /* Rx FIFO width */ #define SCC_GSMRH_TFL 0x00000040 /* transmit FIFO length */ #define SCC_GSMRH_CTSS 0x00000080 /* CTS* sampling */ #define SCC_GSMRH_CDS 0x00000100 /* CD* sampling */ #define SCC_GSMRH_CTSP 0x00000200 /* CTS* pulse */ #define SCC_GSMRH_CDP 0x00000400 /* CD* pulse */ #define SCC_GSMRH_TTX 0x00000800 /* transparent transmitter */ #define SCC_GSMRH_TRX 0x00001000 /* transparent receiver */ #define SCC_GSMRH_REVD 0x00002000 /* reverse data */ #define SCC_GSMRH_TCRC 0x0000c000 /* transparent CRC */ #define SCC_GSMRH_GDE 0x00010000 /* glitch detect enable */ *(int *)0xff000a04 = SCC_GSMRH_REVD | SCC_GSMRH_TRX | SCC_GSMRH_TTX | SCC_GSMRH_CDP | SCC_GSMRH_CTSP | SCC_GSMRH_CDS | SCC_GSMRH_CTSS; 2) *(int *)0xff000a04 = 0x00003f80; 这是对某一个寄存器的赋值程序,两者完成的是完全相同的工作。第一段代码略显冗长,第二段代码很简洁,但是如果你如果想改动此寄存器的设置的时候显然更喜欢看到的是第一段代码,因为它现有的值已经很清楚,要对那些位赋值只要用相应得宏定义即可,不必每次改变都拿笔再重新计算一次。这一点对于嵌入式开发者很重要,有时我们调试一个设备的时候,一个关键寄存器的值也许会被我们修改很多次,每一次都计算每一位所对应得值是一件很头疼的事。 另外利用宏也可以提高代码的运行效率,子程序的调用需要压栈出栈,这一过程如果过于频繁会耗费掉大量的 CPU 运算资源。所以一些代码量小但运行频繁的代码如果采用带参数宏来实现会提高代码的运行效率,比如我们常常用到的对外部 IO 赋值的操作,你可以写一个类似下边的函数来实现: void outb(unsigned char val, unsigned int *addr) { *addr = val; } 仅仅是一句语句的函数,却要调用一个函数,如果不用函数呢,重复写上面的语句又显得罗嗦。不如用下面的宏实现。 #define outb(b, addr) (*(volatile unsigned char *)(addr) = (b)) 由于不需要调用子函数,宏提高了运行效率,但是浪费了程序空间,这是由于凡是用到此宏的地方,都要替换为一句其代替的语句。开发者需要根据系统需求取舍时间与空间。
相关资源
  • 所需E币: 1
    时间: 2 小时前
    大小: 10.75MB
    《精通Linux设备驱动程序开发》是Linux设备驱动程序开发领域的权威著作。全书基于2.6内核,不仅透彻讲解了基本概念和技术,更深人探讨了其他书没有涵盖或浅尝辄止的许多重要主题和关键难点,如PCMCIA、I2C和USB等外部总线以及视频、音频、无线连网和闪存等驱动程序的开发,并讲解了相关的内核源码文件,给出了完整的开发实例。《精通Linux设备驱动程序开发》适合中高级Linux开发人员阅读。
  • 所需E币: 1
    时间: 前天 19:14
    大小: 715.67KB
    上传者: 星空下的屋顶
    零基础ESP8266SDK固件实战开发
  • 所需E币: 2
    时间: 3 天前
    大小: 3.97MB
    上传者: symic
    STM8L051F3快速开发指南
  • 所需E币: 1
    时间: 4 天前
    大小: 13.91KB
    上传者: Argent
    VB是早期比较流程的编程语言,VisualBasic由微软公司开发,是世界上使用人数最多的语言。它源自于BASIC编程语言。VB拥有图形用户界面(GUI)和快速应用程序开发(RAD)系统,可以轻易的使用DAO、RDO、ADO连接数据库,或者轻松的创建ActiveX控件。程序员可以轻松的使用VB提供的组件快速建立一个应用程序。感兴趣的网友们快来下载,练练手吧。
  • 所需E币: 1
    时间: 4 天前
    大小: 7.61KB
    上传者: Argent
    VB是早期比较流程的编程语言,VisualBasic由微软公司开发,是世界上使用人数最多的语言。它源自于BASIC编程语言。VB拥有图形用户界面(GUI)和快速应用程序开发(RAD)系统,可以轻易的使用DAO、RDO、ADO连接数据库,或者轻松的创建ActiveX控件。程序员可以轻松的使用VB提供的组件快速建立一个应用程序。感兴趣的网友们快来下载,练练手吧。
  • 所需E币: 1
    时间: 4 天前
    大小: 19.63KB
    上传者: Argent
    VB是早期比较流程的编程语言,VisualBasic由微软公司开发,是世界上使用人数最多的语言。它源自于BASIC编程语言。VB拥有图形用户界面(GUI)和快速应用程序开发(RAD)系统,可以轻易的使用DAO、RDO、ADO连接数据库,或者轻松的创建ActiveX控件。程序员可以轻松的使用VB提供的组件快速建立一个应用程序。感兴趣的网友们快来下载,练练手吧。
  • 所需E币: 1
    时间: 4 天前
    大小: 92.11KB
    上传者: Argent
    VB是早期比较流程的编程语言,VisualBasic由微软公司开发,是世界上使用人数最多的语言。它源自于BASIC编程语言。VB拥有图形用户界面(GUI)和快速应用程序开发(RAD)系统,可以轻易的使用DAO、RDO、ADO连接数据库,或者轻松的创建ActiveX控件。程序员可以轻松的使用VB提供的组件快速建立一个应用程序。感兴趣的网友们快来下载,练练手吧。
  • 所需E币: 1
    时间: 4 天前
    大小: 63.15KB
    上传者: Argent
    VB是早期比较流程的编程语言,VisualBasic由微软公司开发,是世界上使用人数最多的语言。它源自于BASIC编程语言。VB拥有图形用户界面(GUI)和快速应用程序开发(RAD)系统,可以轻易的使用DAO、RDO、ADO连接数据库,或者轻松的创建ActiveX控件。程序员可以轻松的使用VB提供的组件快速建立一个应用程序。感兴趣的网友们快来下载,练练手吧。
  • 所需E币: 1
    时间: 4 天前
    大小: 15.86KB
    上传者: Argent
    VB是早期比较流程的编程语言,VisualBasic由微软公司开发,是世界上使用人数最多的语言。它源自于BASIC编程语言。VB拥有图形用户界面(GUI)和快速应用程序开发(RAD)系统,可以轻易的使用DAO、RDO、ADO连接数据库,或者轻松的创建ActiveX控件。程序员可以轻松的使用VB提供的组件快速建立一个应用程序。感兴趣的网友们快来下载,练练手吧。
  • 所需E币: 1
    时间: 4 天前
    大小: 55.59KB
    上传者: Argent
    VB是早期比较流程的编程语言,VisualBasic由微软公司开发,是世界上使用人数最多的语言。它源自于BASIC编程语言。VB拥有图形用户界面(GUI)和快速应用程序开发(RAD)系统,可以轻易的使用DAO、RDO、ADO连接数据库,或者轻松的创建ActiveX控件。程序员可以轻松的使用VB提供的组件快速建立一个应用程序。感兴趣的网友们快来下载,练练手吧。
  • 所需E币: 1
    时间: 4 天前
    大小: 4.17KB
    上传者: Argent
    VB是早期比较流程的编程语言,VisualBasic由微软公司开发,是世界上使用人数最多的语言。它源自于BASIC编程语言。VB拥有图形用户界面(GUI)和快速应用程序开发(RAD)系统,可以轻易的使用DAO、RDO、ADO连接数据库,或者轻松的创建ActiveX控件。程序员可以轻松的使用VB提供的组件快速建立一个应用程序。感兴趣的网友们快来下载,练练手吧。
  • 所需E币: 1
    时间: 4 天前
    大小: 568.34KB
    上传者: Argent
    使用单片机可以开发一些常见的智能设备,无需高昂的价格,低成本高稳定性的产品才是市场竞争的王道,掌握单片机的设计思路,使用人类的编程语言去操控机器设备的运转,单片机改变了这个时代。一个既需要懂单片机的硬件基础知识,又需掌握软件上的编程控制的岗位应运而生,即单片机开发工程师,高级一点的叫嵌入式开发工程师,下载我的这些有关单片机开发的应用知识,助你更深入地了解单片机工作原理,增强你的编程动手能力。
  • 所需E币: 0
    时间: 2020-5-21 17:55
    大小: 4.06MB
    上传者: Argent
    想学习PHP编程的网友,可以参考一下附件的文档,相信会对你有所帮助。
  • 所需E币: 0
    时间: 2020-5-20 18:06
    大小: 15.06KB
    上传者: Argent
    模电数电是电路的基础,掌握基础才能更好的理解智能芯片的工作原理,万物互联,没有电路的支持,一切都是废墟。射频无线,创造无限可能,5G的兴起,FPGA的火爆,快来下载基础性的资料吧,让你从零开始掌握底层电路的实现原理。
  • 所需E币: 0
    时间: 2020-5-20 17:15
    大小: 34MB
    上传者: Argent
    模电数电是电路的基础,掌握基础才能更好的理解智能芯片的工作原理,万物互联,没有电路的支持,一切都是废墟。射频无线,创造无限可能,5G的兴起,FPGA的火爆,快来下载基础性的资料吧,让你从零开始掌握底层电路的实现原理。
  • 所需E币: 5
    时间: 2020-5-20 13:10
    大小: 355.46KB
    上传者: htwdb_865194793
    开发一个开关电源产品所需要的基本技能
  • 所需E币: 1
    时间: 2020-5-18 15:25
    大小: 4.4MB
    上传者: samewell2020
    FPGA开发全攻略.pdf
  • 所需E币: 1
    时间: 2020-5-18 15:25
    大小: 1.37MB
    上传者: samewell2020
    FPGA核心知识详解与开发技巧-完整版.pdf
  • 所需E币: 5
    时间: 2020-5-18 15:29
    大小: 1.4MB
    上传者: samewell2020
    FPGA核心知识详解与开发技巧-完整版.pdf
  • 所需E币: 1
    时间: 2020-5-7 21:53
    大小: 26.23MB
    上传者: 星空下的屋顶
    开拓者NiosII开发指南_V1.2.pdf
广告