单片机工程经验 - 时间片

单片机工程经验 - 时间片

时间片

时间片很好理解,就是把一个任务分成若干个片段,每过一个时间节点就执行一个片段。在无操作系统的情况下,时间片可以非常有效的完成多个任务。它的本质是定时器的复用。

顺序执行

我们来考虑最简单的情况,一盏灯不断闪烁。最简单的方法就是先点亮一盏灯,等待500ms后熄灭,再等待500ms后点亮,如此往复不断循环,大多数的单片机教程里也是这么写的,因为这样很容易理解。

void mian()
{
	while(1)
	{
		open_led();
		delay(500);
		close_led();
		delay(500);
	}
}

这里的delay通常使用的是for循环的方法,因为单片机每次执行语句都需要一个时钟周期的时间,只要算好delay的时间需要多少个时间周期就可以准确的进行延时。

但是这里有个问题,因为在delay中需要一直执行空语句,它会一直霸占MCU,其他代码无法执行,多任务就无法进行。

多任务

如果此时我们需要一盏灯亮灭500ms,另一盏灯亮灭300ms该怎么实现?

其实很简单,我们先找到500和300的最大公约数,也就是100,然后只要delay一次就将计数值加一,这样只要知道计数值是不是就能知道过去了多少时间呢。

void mian()
{
	static unsigned int tick = 0;
	while(1)
	{
		delay(100);
		tick++;
		if(tick%10 == 0)
		{
			open_led();
		}
		else if(tick % 5 == 0)
		{
			close_led();
		}
		
		if(tick%6 == 0)
		{
			open_led_2();
		}
		else if(tick % 3 == 0)
		{
			close_led_2();
		}
	}
}

tick*100就是当前程序已经走过了多少ms,对于第一盏灯,只要tick能被10整除,就开灯,如果不能被10整除但能被5整除就灭灯,这样这盏灯就能在500ms关、1000ms开、1500ms关、2000ms开,第二盏灯也同理。

时间片

经过上述变种我们发现,只要将需要做的所有任务的间隔时间取最大公约数,然后通过计数就能实现多任务工作。

但是通常为了简单,我们会直接取一个非常小的时间来计数,比如1ms,这既符合人类的数字使用习惯,也能很好的被几乎所有整数整除。但是这里我们就要思考一个问题,延时1ms就真的是1ms执行一次嘛?

显然不是,因为即使你写的delay再怎么精准,其他的代码执行也同样需要时间,也许今天的代码执行需要0.5ms,那么你的时间片就是1.5ms,明天的代码执行需要0.7ms,那么你的时间片就是1.7ms。而你如果还是当1ms来计算时间,这种误差会不断的堆叠,最后造成不可预知的后果。

幸好我们的单片机都至少有个硬件定时器,它的时间完全独立于程序,如果将程序放进它的定时器中断中执行就完全不需要考虑由程序执行引起的时间偏移问题。

但这样就真的没有问题了嘛?

我们考虑以下情况,假设我们定时器中断1ms进入一次,而中断中的程序完全执行需要1.3ms,那么会发生什么后果?

上一次中断程序还没执行完全下一次中断已经到来,这样程序会完全陷入到中断中去。这样一来程序的其他中断可能由于优先级问题而完全不会进入,非中断代码则会完全不执行,因此时间片的选择需要大于你的程序执行时间。

大部分时候,我们的中断优先级是需要高于时间片的,因此将程序放在定时器中断中似乎并不是很好的选择。

简易框架

显然存在一种更好的方法,那就是把时间片的计数放到中断中,而将程序放到主循环里,这样既能保证时间片的准确,又能保证其他中断不被时间片的程序影响。这里简单介绍一个时间片框架

static unsigned char flag_1ms;
static unsigned char flag_10ms;
static unsigned char flag_100ms;
static unsigned char flag_1000ms;

void timer_irq() //1ms中断中调用
{
	static unsigned char tick_1ms;
	static unsigned char tick_10ms;
	static unsigned char tick_100ms;
	tick_1ms++;
	if(tick_1ms >= 10)
	{
		tick_1ms = 0;
		flag_10ms = 1;
		tick_10ms++;
		if(tick_10ms >= 10)
		{
			tick_10ms = 0;
			flag_100ms = 1;
			tick_100ms++;
			if(tick_100ms >= 10)
			{
				tick_100ms = 0;
				flag_1000ms = 1;
			}
		}
	}
}

void timer_loop()// while(1)大循环中调用
{
	if(flag_1ms == 1)
	{
		flag_1ms = 0;
		// 1ms时间片程序
	}
	if(flag_10ms == 1)
	{
		flag_10ms = 0;
		// 10ms时间片程序
	}
	if(flag_100ms == 1)
	{
		flag_100ms = 0;
		// 100ms时间片程序
	}
	if(flag_1000ms == 1)
	{
		flag_1000ms = 0;
		// 1000ms时间片程序
	}
}

在定时器中断调用timer_irq()在while(1)大循环中调用timer_loop(),然后将所有的时间片程序写在timer_loop()中,这样就能很好的实现时间片轮询系统了。

当然这个系统还很简陋,但它基本能适用所有单片机,了解基本原理,你也可以实现自己的时间片系统。

  • 15
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
一、设计目的 《单片机原理及应用》课程设计是一项重要的实践性教育环节,是学生在校期间必须接 受的一项工程训练。在课程设计过程中,在教师指导下,应用工程的方法,通过一个简 单课题的设计练习,可使学生初步体验单片机应用系统的设计过程、设计要求、完成的 工作内容和具体的设计方法,了解必须提交的各项工程文件,也达到巩固、充实和综合 运用所学知识解决实际问题的目的。 通过课程设计,应该能加强学生如下能力的培养: (1) 独立工作能力和创造力; (2) 综合运用专业及基础知识,解决实际工程技术问题的能力; (3) 查阅图书资料、产品手册和各种工具书的能力; (4) 工程绘图的能力; (5) 编写技术报告和编写技术资料的能力。 二、设计要求 1 总体要求 (1)独立完成设计任务 (2)绘制系统硬件总框图 (3)绘制系统原理电路图 (4)制定编写设计方案,编制软件框图,完成详细完整的程序清单和注释 (5)制定编写调试方案,编写用户操作使用说明书 (6)写出设计工作小结。对在完成以上文件过程所进行的有关步骤如设计思想、指标 论证、方案确定、参数计算、元器件选择、原理分析等作出说明,并对所完成的设计作 出评价,对自己整个设计工作中经验教训,总结收获和今后研究方向。 2 具体要求 本次工程实践的校内部分主要以单片机为基础,进行单片机软件编程,目的是为了提 高学生的软件编程和系统设计能力,整个设计系统包括两个部分,硬件及软件部分,硬 件部分已经制作成功,学生只需要掌握其原理和焊接相应的元器件,掌握元器件的辨别 和元器件的作用以及应用场所即可,另外对所焊接的电路还需要进行仔细的检查,判断 是否有焊接错误的地方或者短路的地方,对出现的异常情况要能够根据现象判别原因, 并具备解决问题的能力,从而切实提高学生的硬件电子电路的分析、判断能力。 软件编程是本次课程设计的重要环节。在为期两周的工程实践中,将占据主要时间,完 成的软件编程任务主要包括以下几点: 1)、熟悉Keil C51编程平台及相关编程软件 2)、编写、调试蜂鸣器、继电器动作、方波程序并进行软硬件联调 3)、编写、调试LED流水灯(循环显示)程序并进行软硬件联调 4)、编写、调试键盘扫描子程序并进行软硬件联调 5)、编写、调试数码管动态扫描程序并进行软硬件联调 6)、基于交通灯的多功能控制设计 其中前五个内容是后两个内容的基础,主要是编制一些子程序,为后继的整个系统设 计打下基础。 交通灯控制是在五个课题中选做的一个设计,是一个简单的单片机编程设计,来实现 智能交通灯的多功能作用。 三、硬件电路的设计及描述 (一)硬件总框图及原理图 图1 硬件总框图 图2 硬件总原理图 (二)硬件单元电路设计及元器件说明 1) AT89C52单片机 设计中所用的单片机型号为AT89C52 ,其主要功能为: AT89C52是低功耗、高性能的CMOS 8位单片机。片内带有8KB的Flash存储器,且允许在系统内改写或用编程器编程。另外, AT89C52的指令系统和引脚与80C52完全兼容,所以,近几年AT89C52单片机应用极为广泛 。 AT89C52单片机除了含有8KB的Flash存储器外,片内还有256 B的RAM,32条I/O口线,3个16位定时/计算器、6个中断源、1个全双工串行口等。同时, 与80C52一样,有空闲和掉电两种节电运行方式。 AT89C52单片机的结构与8051单片机的结构基本相同,不同之处以下几点: 有CHMOS工艺的节能运行方式、增加了一个16位的定时器T2、片内RAM由128 B增加为256 B、ROM 类型属于Flash存储器。 AT89C52引脚如图7所示: 图7 AT89C52引脚 AT89C52单片机为40脚双列直插封装的8 位通用微处理器,采用工业标准的C51内核,在内部功能及管脚排布上与通用的8xc52 相同,其主要用于会聚调整时的功能控制。功能包括对会聚主IC 内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制 ,红外遥控信号IR的接收解码及与主板CPU通信等。 主要管脚有:XTAL1(19 脚)和XTAL2(18 脚)为振荡器输入输出端口,外接12MHz 晶振。RST/Vpd(9 脚)为复位输入端口,外接电阻电容组成的复位电路。VCC(40 脚)和VSS(20 脚)为供电端口,分别接+5V电源的正负端。P0~P3 为可编程通用I/O 脚,其功能用途由软件定义,在本设计中,P0 端口(32~39 脚)被定义为N1 功能控制端口,分别与N1的相应功能管脚相连接,13 脚定义为IR输入端,10 脚和11脚定义为I2C总线控制端口,分别连接N1的SDAS(18脚)和SCLS(19脚)端口,1 2 脚、27 脚及28 脚定义为握手信号功能端口,连接主板
单片机简介 一台能够工作的计算机要有这样几个部件构成:CPU(进行运算、控制)、 RAM (数据存储)、ROM(程序存储)、输入/输出设备(例如:串行口、并行输出口 等)。在个人计算机上这些部件被分成若干块芯片,安装一个称之为主板的印刷 线路板上。而在单片机中,这些部件全部被做到一块集成电路芯片中,所以就称 为单片机(也称微控制器 MCU),而且有一些单片机中除了上述部份外,还集成 了其它部份如 A/D,D/A 等。体积不大,一般用 40 脚封装, 当然功能多一些 单片机也有引脚比较多的, 如 68 引脚, 功能少的只有 10 多个或 20 多个引 脚,有的甚至只 8 只引脚。 1.2 51 单片机简介 51 单片机是对所有兼容 Intel 8031 指令系统的单片机的统称。该系列单片 机的始祖是 Intel 的 8004 单片机,后来随着 Flash rom 技术的发展,8004 单片 机取得了长足的进展,成为应用最广泛的 8 位单片机之一,其代表型号是 ATMEL 公司的 AT89 系列,它广泛应用于工业测控系统之中。很多公司都有 51 系列的兼 容机型推出,今后很长的一段时间内将占有大量市场。51 单片机是基础入门的 一个单片机,还是应用最广泛的一种。需要注意的是 51 系列的单片机一般不具 备自编程能力。 80C51 是 MCS-51 系列中的一个典型品种;其它厂商以 8051 为基核开发出的 CMOS 工艺单片机产品统称为 80C51 系列。 当前常用的 80C51 系列单片机主要产 品有: Intel(英特尔)的:i80C31、i80C51、i87C51,i80C32、i80C52、i87C52 等; ATMEL(艾德梅尔)的:AT89C51、AT89C52、AT89C2051,AT89S51(RC),AT89S52 (RC)等; Philips(飞利浦)、华邦、Dallas(达拉斯)、Siemens(西门子)等公司的许多产品
### 回答1: Matalbe是一个强大的MATLAB工具箱,可以用来控制单片机。Matalbe支持多种单片机平台,包括Arduino、Raspberry Pi和Microchip PIC等。通过Matalbe的编程接口,可以轻松地进行单片机的控制和通信,实现各种功能。 首先,我们需要在Matalbe中安装适当的支持包,以便与目标单片机进行通信。然后,我们可以使用Matalbe提供的函数和指令来编写控制程序。 Matalbe的控制单片机功能非常丰富。我们可以使用Matalbe的串口通信功能与单片机进行数据交换,通过命令和数据传输来控制单片机的行为。我们还可以利用Matalbe的IO控制功能,设置和读取单片机的引脚状态,实现各种输入和输出操作。 除了基本的控制功能,Matalbe还提供了众多的工具箱和函数,用于开发更复杂的单片机应用。例如,我们可以使用图像和信号处理工具箱来在单片机上进行图像和信号处理。我们还可以使用控制系统工具箱来设计和实现闭环控制系统。此外,通过使用代码生成工具箱,我们可以生成高效的C代码,直接在单片机上运行。 总的来说,Matalbe为控制单片机提供了强大的工具和函数库,使得单片机的编程变得更加简单和灵活。无论您是初学者还是有经验的开发者,都可以通过Matalbe轻松地控制单片机,并实现各种应用。 ### 回答2: Matalbe是一个功能强大的MATLAB支持软件包, 用于控制和编程单片机。它提供了一种高级编程环境,可以实现对单片机的各种控制和操作。 首先,Matalbe提供了许多用于与单片机通信的函数和工具。通过这些函数,您可以轻松地与单片机进行数据交换,发送控制指令或接收传感器数据。 其次,Matalbe具有丰富的数据分析和处理功能。您可以使用MATLAB的各种算法和数学函数来处理和分析单片机采集的数据。这些功能使得单片机在各种应用领域中更加灵活和强大。 此外,Matalbe还提供了一套完善的图形界面工具,用于可视化和监控单片机的运行情况。您可以使用这些工具查看实时数据、绘制曲线图或创建用户界面,以更直观地了解和控制单片机的运行状态。 最后,Matalbe提供了丰富的示例代码和教程,旨在帮助您快速入门和掌握单片机编程。这些资源可以帮助您理解和应用Matalbe的各种功能,加快您的学习和开发进程。 总而言之,Matalbe是一款非常强大和实用的控制单片机的软件包。它提供了丰富的功能和工具,使得单片机编程变得更加简单和高效。无论您是初学者还是有经验工程师,Matalbe都能满足您对单片机的各种控制和应用需求。 ### 回答3: 可用MATLAB软件来控制单片机,其中包括使用MATLAB的Simulink来设计和生成C代码,并通过适当的编译器将C代码烧录到单片机中。MATLAB提供了与多种单片机平台(如Arduino、Raspberry Pi等)兼容的硬件支持包。 通过MATLAB/Simulink进行单片机编程具有以下优势: 1. 图形化编程环境:MATLAB/Simulink提供了可视化编程环境,使得编程变得更加直观和易于理解。用户无需手动编写复杂的C代码,而是通过拖放和连接模块来设计程序功能。 2. 快速原型开发:使用MATLAB/Simulink,用户可以快速创建和测试单片机程序的原型。这减少了开发和调试的时间,加快了产品上市的速度。 3. 丰富的功能库:MATLAB/Simulink提供了广泛的功能库,其中包括用于数字信号处理、控制系统设计、图像处理等的工具包。这使得单片机可以实现复杂的功能,如传感器数据采集、控制算法实现等。 4. 与其他工具的无缝集成:MATLAB/Simulink可以与其他常用软件(如LabVIEW、Python等)无缝集成,从而提供更强大的开发和分析能力。 总之,通过MATLAB/Simulink来控制单片机,可以提高单片机编程的效率和可靠性。拥有丰富的功能库和图形化编程环境,使得单片机应用的开发和调试变得更加简单和快速。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝忧云枫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值