单片机常见问题简介-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3735|回复: 0

单片机常见问题简介

[复制链接]
发表于 2015-12-9 23:27 | 显示全部楼层 |阅读模式
本帖最后由 豇豆逗逗 于 2015-12-9 23:33 编辑

主要还是师傅给我提出的几个问题,在这里仅代表个人的理解,如果有错误还请指出:
1.12M在单片机中的实际作用:
个人认为这一条对于51单片机来说意义大一些。普通的12T 8051单片机会对晶振的脉冲做12分频作为一个机器周期,对于51的单周期指令即可以在一个机器周期里面完成,还有一些其他的多周期指令。另外还有一点就是对于51单片机来说内部的定时器就可以每1us(1s/1M = 1us)累加1,这样便于计时。但是对于51的串口来说就没那么方便。另外对于一些高级一点的单片机比如AVR,MSP430,STM32这些,都是不需要12分频的,而且绝大部分指令都是在1个周期里面完成,即大约有1MIPS/MHz的运算能力。对于STM32手册上则说明1.25DMIPS/MHz,牵扯到超标量的概念,没有深入了解。

2.中断程序的实现
现实生活中很多正在进行的任务都有可能被打断,比如正好在吃饭,门外有人要敲门,这时候你就要打断吃饭这个任务去执行开门这个任务,CPU里面也经常遇到这种时期。但是CPU执行起来要复杂一些,首先对于中断请求,如果只有一个中断请求,这个好办,CPU响应就是了,如果同时来了多个中断请求,那么CPU就需要仲裁先执行哪个任务,这时候就牵扯到任务的优先级问题,在此也不再赘述。另外还有一种情况,CPU在处理这个中断任务的时候突然又来一个中断请求怎么办,这时候还是需要仲裁,并且如果需要被响应,又牵扯到中断嵌套的问题,在这也先不作说明。CPU处理中断的大概流程就是:受到中断请求,之后仲裁机构仲裁,响应中断函数,保护现场(主要是PC,SP等压栈),执行中断函数,完成中断函数之后恢复现场,继续执行中断之前的任务。

3.中断中使用mcu_sleep函数为什么不合格
中断的本质就是提高系统的响应速度,提高系统的效率。比如用串口中断接收数据,普通的查询方式就是等待接受缓冲区非空标志位的置位,CPU需要等待这个信号的到来,在等待的时候就降低了系统的效率,如果采用中断方式接收,就可以在中断里面处理接收的数据,CPU在之前完全可以做其他事情,不用死等。但是如果在中断里面执行了while(xxx);或者mcu_sleep()这些延时性函数,即让cpu在中断函数里面等待,这将大大增加系统的迟滞性,极大降低了CPU的效率(后续发展了多任务操作系统),所以最好不要在中断里面使用延时这些函数。

4.对于magic number
这个是程序语言里面的一些知识,就是说不知道干嘛的数,不知来源,比如说int buffer[255],这里面的255就是个magic number,突然就出现了,不知来源跟作用,也降低了程序的可读性,所以程序中要尽量避免这种magic number,通常的解决办法都是使用宏定义,比如#define  MAX_NUM  255,在后面写int buffer[MAX_NUM]。细心的同学可能会发现,像在ucos操作系统,fat文件系统里面有很多这样的定义,就是为了防止magic number的出现。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 03:41 , Processed in 0.080122 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表