热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

嵌入式软件预处理、通信、中断

预处理器(Preprocessor)1.用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)#defineSECONDS_PER_YEAR(60*60*2

预处理器(Preprocessor)

 

1 . 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)

      #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL

我在这想看到几件事情:

1) #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)

2) 懂得预处理器将为你计算常数表达式的值,因此直接写出你如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。

3) 意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。

4) 如果你在你的表达式中用到UL(表示无符号长整型),那么你有了一个好的起点。记住,第一印象很重要。

 

2 . 写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个。

      #define MIN(A,B) ((A) <= (B) ? (A) : (B))

这个测试是为下面的目的而设的:

1) 标识#define在宏中应用的基本知识。这是很重要的。因为在  嵌入(inline)操作符 变为标准C的一部分之前,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。

2) 三重条件操作符的知识。这个操作符存在C语言中的原因是它使得编译器能产生比if-then-else更优的代码,了解这个用法是很重要的。

3) 懂得在宏中小心地把参数用括号括起来

4) 我也用这个问题开始讨论宏的副作用,例如:当你写下面的代码时会发生什么事?

      least = MIN(*p++, b);   ->((*p++)
 

3. 预处理器标识#error的目的是什么?

 

编译程序时,只要遇到 #error 就会跳出一个编译错误,既然是编译错误,要它干嘛呢?其目的就是保证程序是按照你所设想的那样进行编译的。

 

下面举个例子:

程序中往往有很多的预处理指令

#ifdef XXX

...

#else

 

#endif

 

当程序比较大时,往往有些宏定义是在外部指定的(如makefile),或是在系统头文件中指定的,当你不太确定当前是否定义了 XXX 时,就可以改成如下这样进行编译:

 

#ifdef XXX

...

#error "XXX has been defined"

 

#else

 

#endif

 

这样,如果编译时出现错误,输出了XXX has been defined,表明宏XXX已经被定义了。

 

同步通信和异步通信有什么区别?UART、SPI和I2C分别属于什么类型的通信方式?

同步通信需要相同频率的时钟,逐字符发送接收,发一个收一个,收一个发一个,不能有间隙。

异步通信可以任意间隙,接受端随时准备,发送端任意时刻发送 ,需要加停止位和开始位。

UART异步通信 全双工 2线 RX TX

I2C 同步通信 半双工 2线 SDA SCL

SPI 同步通信 全双工 3线或四线 MOSI MISO SCLK SS(片选)

 

 

SPI:串行同步外设接口,全双工通信,3线或4线式,有MOSI、MISO、NSS、SCK四条线,主机控制时钟频率,有四种工作模式,通过时钟相位和时钟极性来选择,时钟相位是来判断空闲状态下时钟的电平状态,时钟极性是来选择采集数据的跳变沿。发送数据通过主从设备的移位寄存器来实现,主设备先传输高位数据,两个设备通过交换的方式完成一帧数据的传送。SPI优点:传输速度快,简单性,有效性 缺点:占用端口较多

I2C:两线式串行总线,半双工,有两条线,一条时钟线SCL,一条数据线SDA。因为这I2c内部是漏极开路或集电极开路结构,所以必须外接上拉电阻,才能输出高电平,实现线与逻辑。每个设备都自己的地址。I2C引脚发送完数据后会检测自己引脚上的电平状态,如果不一致则退出,实现总线仲裁。从设备可通过控制SCL上的电平状态来控制时钟同步。I2C优点:支持多控,缺点:半双工,速度慢于SPI

UART:异步收发器,两线式,TX和RX,不需要时钟,由起始位停止位及波特率进行标识,一般硬件上由波特率发生器、串口发送器、串口接收器组成。有检错机制:奇偶校验位。UART优点:不需要时钟,传输距离远,有检错机制,缺点:需要波特率的支持,速度慢

 

中断

中断是什么?请简述单片机中断处理的过程

CPU在正常执行程序的过程中,由于内部/外部事件的触发或程序的预先安排引起CPU暂时中断当前正在运行的程序,而转去执行中断服务子程序,待中断服务子程序执行完毕后,CPU继续执行原来的程序,这一过程称为中断;

        中断处理的过程:

        第一步:保护现场,将当前位置的PC地址压栈;

        第二步:跳转到中断服务程序,执行中断服务程序;

        第三步:恢复现场,将栈顶的值回送给PC;

        第四步:跳转到被中断的位置开始执行下一个指令;

相比于正常子函数,中断服务函数有什么特点和需要注意的地方?

相当于正常子函数,中断服务函数的特点是没有输入参数,一般也没有输出参数,此外,调用中断服务函数的方式也有所区别,正常子函数的调用直接在需要的位置写出子函数名即可,程序运行到此即进入子函数内部;调用中断服务函数,需要在程序中开启中断开关,即配置对应中断控制的寄存器,当出现触发条件时(例如某引脚电平信号发生变化,或时间达到某一值),就会进入中断服务函数体内运行

注意地方:中断函数中不宜写太多的代码,这样可能导致中断服务函数还未执行完,因为符合条件,又触发了一次中断,程序就一直卡在中断服务程序中,导致整个系统崩溃。另外,当系统有多个中断时,为防止在执行当前中断服务函数时,被另一个不必要的中断打断,一个可以参考的解决方法时在进入中断时关闭其他中断,并在中断服务函数的最后一句再次开启中断开关。

 

1.BLE,即蓝牙技术,是一种近距离无线通信方式,诞生于1994年,由Ericsson公司首先提出。蓝牙协议的标准版本为802.15.4, 其传输频段为全球公共通用的2.4GHz ISM频段,提供1Mbps的传输速率和10m的传输距离。缺点是高成本、低传输距离、扛干扰能力不强;

2.WiFi(Wireless Fidelity,无线高保真),也是一种短距离无线通信技术,正式名称是802.11b,其工作频率是2.4GHz,最高速率可达11Mbps,覆盖范围可达100m。是以太网的一种无线扩展。

3.NFC(Near Field Communication,近距离无线传输),是由Philips、NOKIA和Sony主推的一种类似于RFID(非接触式射频识别)的短距离无线通信技术。和RFID不同,NFC采用双向的识别和连接,在20cm距离内工作与13.56MHz频率范围内。


推荐阅读
  • 如何在IDEA中安装和配置反编译插件以提高代码审查效率
    在 IntelliJ IDEA 中提升代码审查效率的一种方法是安装和配置反编译插件。首先,进入 IDEA 的设置界面,然后导航到插件管理部分。接下来,搜索 "ideaJad" 插件并进行安装。安装完成后,重启 IDEA 以确保插件生效。这将帮助你在审查二进制文件时更加高效地查看源代码。 ... [详细]
  • Python与R语言在功能和应用场景上各有优势。尽管R语言在统计分析和数据可视化方面具有更强的专业性,但Python作为一种通用编程语言,适用于更广泛的领域,包括Web开发、自动化脚本和机器学习等。对于初学者而言,Python的学习曲线更为平缓,上手更加容易。此外,Python拥有庞大的社区支持和丰富的第三方库,使其在实际应用中更具灵活性和扩展性。 ... [详细]
  • 本文深入探讨了 iOS 开发中 `int`、`NSInteger`、`NSUInteger` 和 `NSNumber` 的应用与区别。首先,我们将详细介绍 `NSNumber` 类型,该类用于封装基本数据类型,如整数、浮点数等,使其能够在 Objective-C 的集合类中使用。通过分析这些类型的特性和应用场景,帮助开发者更好地理解和选择合适的数据类型,提高代码的健壮性和可维护性。苹果官方文档提供了更多详细信息,可供进一步参考。 ... [详细]
  • 解决基于XML配置的MyBatis在Spring整合中出现“无效绑定语句(未找到):com.music.dao.MusicDao.findAll”问题的方法
    在将Spring与MyBatis进行整合时,作者遇到了“无效绑定语句(未找到):com.music.dao.MusicDao.findAll”的问题。该问题主要出现在使用XML文件配置DAO层的情况下,而注解方式配置则未出现类似问题。作者详细分析了两个配置文件之间的差异,并最终找到了解决方案。本文将详细介绍问题的原因及解决方法,帮助读者避免类似问题的发生。 ... [详细]
  • 本文详细探讨了Java集合框架的使用方法及其性能特点。首先,通过关系图展示了集合接口之间的层次结构,如`Collection`接口作为对象集合的基础,其下分为`List`、`Set`和`Queue`等子接口。其中,`List`接口支持按插入顺序保存元素且允许重复,而`Set`接口则确保元素唯一性。此外,文章还深入分析了不同集合类在实际应用中的性能表现,为开发者选择合适的集合类型提供了参考依据。 ... [详细]
  • 本文深入解析了 Apache 配置文件 `httpd.conf` 和 `.htaccess` 的优化方法,探讨了如何通过合理配置提升服务器性能和安全性。文章详细介绍了这两个文件的关键参数及其作用,并提供了实际应用中的最佳实践,帮助读者更好地理解和运用 Apache 配置。 ... [详细]
  • Python学习:环境配置与安装指南
    Python作为一种跨平台的编程语言,适用于Windows、Linux和macOS等多种操作系统。为了确保本地已成功安装Python,用户可以通过终端或命令行界面输入`python`或`python3`命令进行验证。此外,建议使用虚拟环境管理工具如`venv`或`conda`,以便更好地隔离不同项目依赖,提高开发效率。 ... [详细]
  • Jenkins学习精华:自动化构建与持续集成入门指南
    本文综合了网络资源及同事分享的PPT内容,详细介绍了Jenkins在自动化构建与持续集成中的应用。首先涵盖了Jenkins的安装与配置流程,接着阐述了如何根据项目需求设定自动化编译任务,包括确定开发环境、选择合适的编译工具以及实现代码的自动更新等关键步骤。特别强调了在SVN环境中通过命令行实现代码自动拉取的最佳实践。 ... [详细]
  • 大数据应用实例:电视收视率分析企业项目实操第二篇
    本文继续探讨大数据在电视收视率分析中的应用,详细介绍了如何在CentOS系统中进行防火墙管理。针对CentOS 6.5及更早版本,提供了具体的命令操作步骤,包括停止防火墙服务和禁用防火墙启动。此外,还深入讨论了这些操作对数据传输和系统安全的影响,为实际项目实施提供了宝贵的技术参考。 ... [详细]
  • Spring Security 认证模块的项目构建与初始化
    本文详细介绍了如何构建和初始化Spring Security认证模块的项目。首先,通过创建一个分布式Maven聚合工程,该工程包含四个模块,分别为core、browser(用于演示)、app等,以构成完整的SeehopeSecurity项目。在项目构建过程中,还涉及日志生成机制,确保能够输出关键信息,便于调试和监控。 ... [详细]
  • Git基础操作指南:掌握必备技能
    掌握 Git 基础操作是每个开发者必备的技能。本文详细介绍了 Git 的基本命令和使用方法,包括初始化仓库、配置用户信息、添加文件、提交更改以及查看版本历史等关键步骤。通过这些操作,读者可以快速上手并高效管理代码版本。例如,使用 `git config --global user.name` 和 `git config --global user.email` 来设置全局用户名和邮箱,确保每次提交时都能正确标识提交者信息。 ... [详细]
  • 优化后的标题:数据网格视图(DataGridView)在应用程序中的高效应用与优化策略
    在应用程序中,数据网格视图(DataGridView)的高效应用与优化策略至关重要。本文探讨了多种优化方法,包括但不限于:1)通过合理的数据绑定提升性能;2)利用虚拟模式处理大量数据,减少内存占用;3)在格式化单元格内容时,推荐使用CellParsing事件,以确保数据的准确性和一致性。此外,还介绍了如何通过自定义列类型和优化渲染过程,进一步提升用户体验和系统响应速度。 ... [详细]
  • 在进行网络编程时,准确获取本地主机的IP地址是一项基本但重要的任务。Winsock作为20世纪90年代初由Microsoft与多家公司共同制定的Windows平台网络编程接口,为开发者提供了一套高效且易用的工具。通过Winsock,开发者可以轻松实现网络通信功能,并准确获取本地主机的IP地址,从而确保应用程序在网络环境中的稳定运行。此外,了解Winsock的工作原理及其API函数的使用方法,有助于提高开发效率和代码质量。 ... [详细]
  • 在执行 Vim/VM 命令时遇到错误提示:检测到名为
    在使用 Docker 时,通过 Vim 编辑 Dockerfile 文件时遇到了错误提示:“检测到名为 .dockerfile.swp 的交换文件”。这一问题通常是因为上次编辑该文件时意外中断,导致系统生成了临时的交换文件。为了解决这个问题,可以手动删除该交换文件或使用 Vim 的恢复功能来恢复未保存的更改。 ... [详细]
  • 斐波那契数在组合数学中的应用与探索
    斐波那契数列作为数学领域中一个广为人知的数列,不仅拥有丰富的数学性质,还与自然界的诸多现象紧密相连。本文将深入探讨这一数列背后的奥秘,揭示其在组合数学中的广泛应用,并通过具体问题的引入,展示斐波那契数列在解决复杂组合问题时的独特优势。 ... [详细]
author-avatar
手机用户2602927935
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有