首页 > 其他 > 详细

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

时间:2020-08-14 01:52:28      阅读:57      评论:0      收藏:0      [点我收藏+]
预处理器(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++) <b ?(*p++) : b)   此时前后两个的*p++  的值已经不是同一个了,多处使用这个宏时,每次的*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频率范围内。

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

原文:https://www.cnblogs.com/dhj183790752/p/13498365.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!