A. 请教单片机多线程的方法
要实现多线程,就需要操作系统了。对于51单片机运行操作系统有点困难。
现在STM32单片机用的越来越多了,因硬件资源多,速度快,更适合运行操作系统。
所以,首先要学习STM32,再学习操作系统,才能实现你的要求。
B. 什么是数据竞争多线程编程如何防止数据竞争单片机编程如何防止数据竞争
创建互斥对象。
简单的说,每个线程相当于一个人,数据相当于广播。你要创建的是一个麦克风。
只有这个人拿到麦克风,才能发广播。
还有什么不懂的,自行网络“互斥对象”
C. 51单片机如何实现多线程多任务有哪些程序可以在“后台”自己运行
51单片机可以实现执行时间片形式的多线程任务,具体做法是:1、弄个表两字节一个单位存一下各个任务的执行地址。2、在中断级别较高的T0定时器中断中,把中断压进堆栈的那两个字节保存到表里。3、用表里别的线程的地址重压进堆栈。4、从中断里退出就可以切到另一个线程继续跑了。
我记得这个在早先2000年那时候的大学计算机系单片机原理专业课里讲过,但是那科挂掉的实在太多,现在好像已经把这些独门绝技大多给砍没了,就剩背背汇编指令集。
D. 51单片机如何实现多线程多任务换距话说,有哪些程序可以在“后台”自己运行
2、51内部没有捕捉器、AD转换和硬件PWM;
3、中断系统在执行中断函数时是需要占用cpu资源的,就是当前程序暂停跑过去执行中断函数,结束了再回去继续;
4、如果是用来设置功能或模式的寄存器,工作完成后其值是不会改变的,会改变的比如uart的数据缓存器以及定时器的时值,这些随时改变的寄存器也不会影响正常工作;
举例中的错误,51单片机定时器能够定时ds最大周期是65535微秒,即65.535毫秒,不存在定时一秒的情况,除非定时中断内用变量累加判断。
E. 单片机有线程吗
大部分单片机可以移植嵌入式实时操作系统的,操作系统内核会分配CPU给各个任务工作,也就是平时说的多线程,或者多任务
F. 单片机中如何实现多线程,多任务
如果不用OS, 可以将不同任务放在定时器中断里, 然后将任务分步骤执行(这大概就叫状态机吧). 比如任务1放在主循环里, 任务2放在定时器1中断里, 任务3放在定时器2中断里. 或者自己利用定时器实现时间片轮换算法. 关键是分配好任务执行的时间片, 以满足对不同事件的响应. 感觉单片机实时性的要求很高.
G. 单片机 同时处理多件事
单片机是不能同时处理多件事情。如果要想同步处理多件事情,只能是先中断正在做的事情,转移到其它需要做的事情上,等事情处理完毕,或者还是处理到一定程度,再转回之前正在做的事情。
一、关于单片机:
单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。从上世纪80年代,由当时的4位、8位单片机,发展到现在的300M的高速单片机。
二、单片机的应用分类:
单片机(Microcontrollers)作为计算机发展的一个重要分支领域,根据发展情况,从不同角度,单片机大致可以分为通用型/专用型、总线型/非总线型及工控型/家电型。
1、通用型
这是按单片机(Microcontrollers)适用范围来区分的。例如,80C51式通用型单片机,它不是为某种专门用途设计的;专用型单片机是针对一类产品甚至某一个产品设计生产的,例如为了满足电子体温计的要求,在片内集成ADC接口等功能的温度测量控制电路。
2、总线型
这是按单片机(Microcontrollers)是否提供并行总线来区分的。总线型单片机普遍设置有并行地址总线、 数据总线、控制总线,这些引脚用以扩展并行外围器件都可通过串行口与单片机连接,另外,许多单片机已把所需要的外围器件及外设接口集成一片内,因此在许多情况下可以不要并行扩展总线,大大减省封装成本和芯片体积,这类单片机称为非总线型单片机。
3、控制型
这是按照单片机(Microcontrollers)大致应用的领域进行区分的。一般而言,工控型寻址范围大,运算能力强;用于家电的单片机多为专用型,通常是小封装、低价格,外围器件和外设接口集成度高。 显然,上述分类并不是惟一的和严格的。例如,80C51类单片机既是通用型又是总线型,还可以作工控用。
H. 51单片机如何实现多线程多任务换距话说,有哪些程序可以在“后台”自己运行 比如定时器,计数
另一种说发是单片机中断里的函数成为前台,而主函数成为后台,这是前后台系统,但多个任务同时运行不能做到,只能是说在单位时间内任务是多任务并行的
I. 我想用单片机(89c51)来实现两个函数程序的同时运行,不知如何实现请教广大朋友,谢谢
你这个应该是两个功能同时实现,渐亮渐暗是用延时实现的PWM,而灯的闪烁其实就是单片机的输出为矩形波,两个功能同时实现时,就是在矩形波的波峰波谷时期加入了PWM。两个波形的叠加(将两个功能柔和在一起)。在灯渐亮渐暗子程序中,一个for循环for(i=1;i<2000;i=i+100)其实就是一个PWM的周期,是相同的、一定的,那么就可以利用判断是第几个周期来决定该周期是否要闪烁,还是关闭(也就是利用了PWM的周期来确定矩形波的周期)。
这个循环for(j=0;j<1;j++)是不是可以去掉呢。。。。。。。。
修改后的程序:调试过了(灯的端口改为P0了)
#include<reg51.h>
sbit green=P0^0;
sbit blue=P0^1;
sbit red=P0^2;
sbit shan=P0^3;
sbit shan2=P0^4;
void delay(int i)
{
while(--i)
{
;
}
}
void bianse1(void)//这个函数程序是控制灯渐亮渐暗
{
int i;
for(i=1;i<2000;i=i+100)
{
if(i%200==0)shan=~shan; /*经过200个PWM周期灯的亮灭交替,改变这个参数可以改变灯的闪烁频率*/
green=0;
blue=0;
red=0;
delay(i);
green=1;
blue=1;
red=1;
delay(2000-i);//红,绿,蓝一起上升
}
for(i=2000;i>0;i=i-100)
{
if(i%200==0)shan=~shan;
blue=1;
green=1;
red=1;
delay(2001-i);
red=0;
green=0;
blue=0;
delay(i);//红蓝绿下降
}
}
void bianse2(void)//这个函数程序是控制灯渐亮渐暗
{
int i;
for(i=1;i<2000;i=i+100)
{
if(i%200==0)shan2=~shan2;
green=0;
blue=0;
red=0;
delay(i);
green=1;
blue=1;
red=1;
delay(2000-i);//红,绿,蓝一起上升
}
for(i=2000;i>0;i=i-100)
{
if(i%200==0)shan2=~shan2;
blue=1;
green=1;
red=1;
delay(2001-i);
red=0;
green=0;
blue=0;
delay(i);//红蓝绿下降
}
}
void shanshuo(void)//这个函数程序是控制灯闪烁
{
int i,k;
for(k=0;k<10;k++)
{
shan=0;
delay(5000);
shan=1;
delay(4000);
}
for(i=0;i<10;i++)
{
shan2=0;
delay(5000);
shan2=1;
delay(4000);
}
}
void main(void)
{
shan=1;
shan2=1;
while(1)
{
bianse1();
bianse2(); /*****两个灯的交替闪烁*****/
green=1;
blue=1;
red=1;
//shanshuo();
}
}
J. 怎么样让51单片机实现伪多线程工作(软件上实现)简单的论述一下,有程序实例更好.
你也知道,51单片机没办法实现多线程操作,所以你已经指明了条件,实现伪多线程工作(软件上实现),也就是软件模拟多线程。
我想你也没指望这个多线程多优秀,只是实验性质,锻炼锻炼编程技巧。这个还是可以实现的,虽然我也没走过。
没查资料,不知道有没有这方面的介绍和可移植的操作系统,仅凭自己想象与你探讨。
其实早期的WINDOWS操作系统,由于CPU 是单核,本质上就是伪多线程,包括现在的ARM 单片机可以实现的UCOSII。
51单片机实现伪多线程要解决两个问题,一个是速度,一个是内存规模。实现方法不过是利用定时中断把CPU的工作分割成时间片,分配给不同的任务。这有点像数码管的动态扫描,只要速度够快,感觉上各个任务的运行就是流畅的。问题的关键在于现场保护和紧急任务的处理,这两项调度好,编制一个伪多线程程序并不难。
但由于51资源有限,真的只能是试验一下。